วิเคราะห์ “หุ้นไทย” ในกระดานตลาดซื้อขาย SET (Stock Exchange of Thailand) ดึงข้อมูลจากหน้าเว็บมาวิเคราะห์ผลโดยการใช้ Python
หลักการวิเคราะห์ข้อมูลหุ้นไทยในตลาด SET จะเริ่มต้นด้วยการเก็บข้อมูลราคาหุ้นของบริษัทต่างๆในตลาดหลักทรัพย์แห่งประเทศไทย (Stock Exchange of Thailand: SET) ทั้งนี้การเก็บข้อมูลราคาหุ้นจะต้องเป็นข้อมูลที่เป็นเวลาจริง (real-time) เนื่องจากตลาดหลักทรัพย์มีการซื้อขายทุกวันและทุกเวลาตามเงื่อนไขของตลาดซึ่งเป็นระบบกำกับดูแลและสั่งสอนผ่านระบบอัตโนมัติ
หลักการวิเคราะห์ข้อมูลหุ้นไทยในกระดานตลาดซื้อขาย SET
จะใช้วิธีการวิเคราะห์เชิงเทคนิคต่างๆ เพื่อดำเนินการวิเคราะห์และวางแผนการลงทุนที่มีความเป็นไปได้สูง โดยมีวิธีการวิเคราะห์หลักๆ ดังนี้
-
วิเคราะห์พื้นฐาน (Fundamental Analysis)
เป็นวิธีการวิเคราะห์ข้อมูลโดยการศึกษาข้อมูลเกี่ยวกับธุรกิจและสภาพการเงินของบริษัท เช่น รายงานการเงิน ผลตอบแทนเงินลงทุน เป็นต้น -
วิเคราะห์ข้อมูลตลาดรวม (Market Overview)
เพื่อทราบข่าวสารที่ส่งผลต่อการลงทุน ซึ่งสามารถเช็คได้จากหน้าเว็บไซต์ต่างๆ เช่น เว็บไซต์ข่าวหุ้นไทย หรือเว็บไซต์ของตลาดหลักทรัพย์แห่งประเทศไทย -
วิเคราะห์ข้อมูลเทคนิค (Technical Analysis)
เป็นวิธีการวิเคราะห์ข้อมูลโดยการใช้เครื่องมือช่วยวิเคราะห์เช่น กราฟราคา และตัวชี้วัดทางเทคนิค เช่น อย่างเช่น ค่าเฉลี่ยเคลื่อนที่ (moving average) หรือแบนด์ดีเวอร์ (Bollinger Band) เพื่อหาจุดเข้าซื้อและขายหุ้นให้เหมาะสม การใช้กราฟแท่งเทียน (Candlestick Chart) หรือ กราฟเส้น (Line Chart) เพื่อหาแนวโน้มของราคาหุ้นว่าเคลื่อนไหวไปทิศทางไหน และใช้ตัวชี้วัดเทคนิคต่างๆ เช่น ค่าเฉลี่ยเคลื่อนที่ของราคา (Moving Average) หรือ ตัวชี้วัดแรงขายและแรงซื้อของตลาด (RSI) เป็นต้น - วิเคราะห์ความสัมพันธ์ระหว่างราคาหุ้นกับตัวชี้วัดต่างๆ (Technical Indicator Analysis)
การใช้ตัวชี้วัดเทคนิค เช่น ค่าเฉลี่ยเคลื่อนที่ (Moving Average) และแบนด์ของค่าเฉลี่ยเคลื่อนที่ (Bollinger Bands) เป็นต้น เพื่อช่วยในการวิเคราะห์การเคลื่อนไหวของราคาหุ้น การวิเคราะห์ความสัมพันธ์ระหว่างราคาหุ้นกับตัวชี้วัดนี้ช่วยให้นักลงทุนสามารถปรับแผนการลงทุนได้อย่างเหมาะสมกับแนวโน้มของตลาด -
วิเคราะห์แนวโน้มของตลาด (Trend Analysis)
เป็นเครื่องมือที่ใช้สำหรับวิเคราะห์แนวโน้มของราคาหุ้นในระยะยาว โดยการวิเคราะห์แนวโน้มจะช่วยให้นักลงทุนสามารถทำความเข้าใจได้ว่าราคาของหุ้นเคลื่อนไหวอย่างไรในระยะยาว และสามารถนำข้อมูลนี้มาวางแผนการลงทุนให้เหมาะสมกับวัตถุประสงค์และระยะเวลาการลงทุนของตนเองได้ -
วิเคราะห์สภาวะเศรษฐกิจของประเทศ
การเปลี่ยนแปลงของเศรษฐกิจส่วนใหญ่จะส่งผลต่อทั้งตลาดหุ้นและบริษัทที่มีการซื้อขายหุ้นในตลาด SET -
วิเคราะห์ข่าวประชาสัมพันธ์ของบริษัท
การประกาศผลการดำเนินธุรกิจหรือข่าวสารอื่นๆ ที่เกี่ยวข้องกับบริษัทในตลาดหุ้น SET อาจมีผลต่อการซื้อขายหุ้นในตลาดนั้นๆ -
วิเคราะห์นโยบายการเงินของธนาคารแห่งประเทศไทย
การปรับเปลี่ยนอัตราดอกเบี้ย หรือนโยบายเศรษฐกิจที่เกี่ยวข้องกับการเงิน ส่งผลต่อการลงทุนในตลาดหุ้น SET -
วิเคราะห์ปัจจัยเฉพาะกิจของบริษัท
ข้อมูลเชิงคุณภาพเกี่ยวกับบริษัท ทั้งเป็นข้อมูลทางการเงิน และข้อมูลต่างๆ เช่น สถิติการขาย กำไรสุทธิ การเปิดสาขาใหม่ และอื่นๆ -
วิเคราะห์ปัจจัยโลก
การเปลี่ยนแปลงทางการเมืองหรือเศรษฐกิจของโลก อาจส่งผลต่อการซื้อขายหุ้นในตลาด SET โดยเฉพาะอย่างยิ่งเมื่อเป็นเหตุการณ์ที่มีผลต่อเศรษฐกิจของประเทศ
การวิเคราะห์ข้อมูลหุ้นไทยตลาด SET ควรเริ่มต้นด้วยการเข้าใจในโครงสร้างของตลาดหลักทรัพย์ โดยปกติแล้ว หุ้นทุกตัวจะถูกกลุ่มเข้าไว้ในกลุ่มหลักทรัพย์ในตลาดหลักทรัพย์ (Equity Market) ที่แบ่งออกเป็นหลายหมวดหมู่ตามเกณฑ์การจัดอย่างไม่เหมือนกัน ซึ่งการจัดอย่างนี้จะช่วยให้นักลงทุนเข้าใจและวิเคราะห์ได้ง่ายขึ้นว่าหุ้นที่ต้องการลงทุนมีความเสี่ยงสูงหรือต่ำแค่ไหน ซึ่งจะมีผลต่อผลตอบแทนที่จะได้รับ และในการวิเคราะห์ข้อมูลหุ้น SET
การดึงข้อมูลหุ้นไทย SET จากหน้าเว็บด้วย Python นั้นมีขั้นตอนหลักๆ ดังนี้
- ใช้ requests library เพื่อเข้าถึงหน้าเว็บไซต์ที่ต้องการดึงข้อมูล
- ใช้ BeautifulSoup library เพื่อดึงข้อมูลที่ต้องการจากหน้าเว็บไซต์ โดยสามารถกำหนดให้ดึงข้อมูลที่ต้องการได้จาก HTML tag ที่ใช้ครอบข้อมูล
- ทำการนำข้อมูลที่ได้จากข้อ 2 มาแปลงเป็นรูปแบบของ DataFrame ของ Pandas โดยการสร้าง list สำหรับเก็บข้อความของทุก element ในแต่ละแถวและทำการแปลง list เหล่านี้เป็น DataFrame
สำหรับการวิเคราะห์ข้อมูลหุ้นไทย SET ด้วย Python นั้น จะมีหลายวิธีการ เช่น การวิเคราะห์ข้อมูลทางการเงินของบริษัทผู้ถือหุ้นใน SET หรือการวิเคราะห์ความเปลี่ยนแปลงของราคาหุ้นใน SET ในช่วงเวลาที่ต่างกัน โดยใช้เครื่องมือทางสถิติ และการพล็อตกราฟต่างๆ เพื่อวิเคราะห์ความเปลี่ยนแปลงของราคาหุ้นใน SET ในแต่ละช่วงเวลาของวัน หรือช่วงเวลาที่กำหนดเอง เป็นต้น
ตัวอย่าง การดึงข้อมูลกระดานหุ้น SET50 เพื่อเตรียมข้อมูลไปวิเคราะห์ต่อไปได้
import numpy as np
import pandas as pd
import requests
from bs4 import BeautifulSoup
# เลือกดึงข้อมูลมาเป็น data set เช่น SET50 , SET100 , SETHD , SETCLMV , SETTHSI , SETWB
stock = 'SET50'
def get_stock_price():
url = "https://portal.settrade.com/C13_MarketSummary.jsp?detail="+stock
print(stock)
source = requests.get(url)
soup = BeautifulSoup(source.content, 'lxml', from_encoding='utf-8')
# เข้าถึงข้อมูล tag div เพื่อ web scraping
div_1 = soup.find('div', class_='table-responsive')
caption = div_1.find('caption', style='text-align: right;').find('span', class_="colorGray")
print(caption.text)
# ข้อมูลตาราง
div_2 = soup.find_all('div', class_='row separate-content')[1]
table = div_2.find('table', class_='table table-info table-hover')
headers = [head.text for head in table.find('thead').find('tr').find_all('th')]
rows = table.find('tbody').find_all('tr')
ls = [] # สร้าง list เพื่อเก็บข้อความของทุก element ในแต่ละแถว
for i, row in enumerate(rows):
# แต่ละ element จะถูกล้อมรอบด้วย tag <th> หรือ <td>
elements = row.find_all('td')
# สร้าง list เพื่อเก็บข้อความของแต่ละ element ในแถวนั้นๆ
ls_elements_in_row = []
for element in elements:
text = element.text
ls_elements_in_row += [text]
ls += [ls_elements_in_row]
df = pd.DataFrame(ls)
df.columns = headers
# บันทึกข้อมูลเป็น CSV
df.to_csv(stock+'.csv', index=False)
return df
get_stock_price()
แสดงผลลัพธ์ได้ คือ
SET50
ข้อมูลล่าสุด 18/03/2023 03:19:56
หลักทรัพย์ เปิด สูงสุด ต่ำสุด ล่าสุด เปลี่ยนแปลง %เปลี่ยนแปลง เสนอซื้อ เสนอขาย ปริมาณ(หุ้น) มูลค่า('000 บาท)
0 ADVANC 208.00 208.00 204.00 206.00 -1.00 -0.48 206.00 207.00 8,669,634 1,784,972.91
1 AOT 71.00 71.25 70.00 70.50 0.00 0.00 70.50 70.75 19,456,519 1,373,351.62
2 AWC 5.40 5.55 5.35 5.40 +0.05 +0.93 5.40 5.45 77,380,150 419,060.32
3 BANPU 10.20 10.50 10.10 10.50 +0.30 +2.94 10.40 10.50 147,959,636 1,534,822.47
4 BBL 151.00 154.50 151.00 153.50 +4.00 +2.68 153.50 154.00 12,275,178 1,877,242.57
5 BDMS 28.50 28.75 28.25 28.50 +0.25 +0.88 28.25 28.50 29,698,502 846,814.78
6 BEM 8.90 8.95 8.40 8.45 -0.45 -5.06 8.40 8.45 132,658,952 1,129,728.79
7 BGRIM 39.75 39.75 38.75 39.00 -0.25 -0.64 38.75 39.00 9,790,590 382,805.62
8 BH 210.00 213.00 210.00 213.00 +1.00 +0.47 212.00 213.00 1,252,231 265,907.82
9 BTS 7.15 7.20 7.00 7.10 0.00 0.00 7.10 7.15 83,081,721 589,824.59
10 CBG 98.00 100.00 97.75 99.25 +1.75 +1.79 99.00 99.25 2,264,392 224,087.75
11 CENTEL 55.00 55.50 53.75 54.25 -0.75 -1.36 54.00 54.25 3,951,679 215,461.07
12 COM7 31.00 31.25 30.25 30.50 -0.25 -0.81 30.50 30.75 7,551,734 231,167.15
13 CPALL 61.00 61.50 60.75 61.25 +0.50 +0.82 61.25 61.50 36,072,201 2,205,823.63
14 CPF 21.30 21.80 21.30 21.70 +0.50 +2.36 21.60 21.70 33,066,913 715,252.70
15 CPN 66.00 67.00 65.75 66.75 +1.25 +1.91 66.50 66.75 11,017,075 732,490.63
16 CRC 44.00 44.25 43.50 44.00 0.00 0.00 43.75 44.00 15,332,295 673,873.11
17 DELTA 986.00 1,020.00 984.00 996.00 +24.00 +2.47 996.00 998.00 3,501,697 3,506,104.26
18 EA 75.00 75.00 72.50 73.00 -1.25 -1.68 73.00 73.25 15,251,793 1,117,299.99
19 EGCO 152.50 153.50 151.50 152.50 +0.50 +0.33 152.50 153.00 1,088,491 165,896.21
20 GLOBAL 19.50 19.50 18.90 19.00 -0.40 -2.06 19.00 19.10 20,719,660 397,402.44
21 GPSC 66.50 67.00 65.50 66.50 +0.25 +0.38 66.50 66.75 3,605,064 238,948.46
22 GULF 50.75 51.25 50.25 50.75 0.00 0.00 50.75 51.00 17,495,812 888,583.75
23 HMPRO 14.20 14.60 14.20 14.40 +0.20 +1.41 14.30 14.40 54,925,809 791,787.79
24 INTUCH 71.75 73.25 71.50 72.50 +0.50 +0.69 72.25 72.50 26,039,026 1,886,292.13
25 IVL 34.50 34.50 33.50 33.75 -0.50 -1.46 33.50 33.75 40,640,991 1,377,206.00
26 JMART 22.40 22.90 22.10 22.40 +0.40 +1.82 22.40 22.50 39,158,061 881,053.48
27 JMT 45.00 47.00 44.50 46.50 +2.75 +6.29 46.50 46.75 20,585,338 944,375.61
28 KBANK 132.00 133.00 130.50 132.00 +2.50 +1.93 132.00 132.50 22,388,765 2,950,465.42
29 KTB 16.70 17.00 16.60 16.80 +0.40 +2.44 16.80 16.90 64,556,231 1,083,947.62
30 KTC 54.00 54.25 53.50 53.75 +0.25 +0.47 53.75 54.00 3,659,466 196,748.04
31 LH 9.55 9.65 9.50 9.60 +0.10 +1.05 9.60 9.65 47,954,283 459,825.33
32 MINT 31.75 32.50 31.75 32.00 +0.25 +0.79 32.00 32.25 22,833,516 731,009.14
33 MTC 32.25 32.75 31.75 32.25 +0.50 +1.57 32.25 32.50 12,064,835 389,678.24
34 OR 20.10 20.40 20.00 20.10 +0.20 +1.01 20.10 20.20 37,198,066 750,079.30
35 OSP 31.75 32.00 31.50 31.50 0.00 0.00 31.50 31.75 6,879,096 217,796.20
36 PTT 29.75 30.25 29.75 30.00 +0.25 +0.84 30.00 30.25 96,955,183 2,903,269.07
37 PTTEP 137.50 141.00 136.50 140.50 +4.50 +3.31 140.00 140.50 16,294,335 2,264,371.62
38 PTTGC 45.00 45.25 43.75 44.25 0.00 0.00 44.25 44.50 22,175,587 982,762.98
39 RATCH <XD> 38.00 38.25 37.50 38.00 -0.75 -1.94 37.75 38.00 6,592,953 249,674.42
40 SAWAD 49.50 50.50 49.00 50.25 +1.00 +2.03 50.00 50.25 6,432,866 320,404.33
41 SCB 101.50 102.50 100.50 101.50 +1.50 +1.50 101.50 102.00 20,425,883 2,074,625.09
42 SCC 320.00 320.00 313.00 315.00 -3.00 -0.94 315.00 316.00 4,160,480 1,313,516.03
43 SCGP 48.25 48.50 45.50 46.00 -1.75 -3.66 46.00 46.25 29,848,986 1,385,333.23
44 TIDLOR 24.00 24.10 23.60 23.70 0.00 0.00 23.70 23.80 13,431,985 319,405.74
45 TISCO 100.50 101.00 100.50 100.50 0.00 0.00 100.00 100.50 4,303,231 432,791.59
46 TOP 49.50 50.25 49.00 50.00 +1.25 +2.56 50.00 50.25 15,575,627 773,430.79
47 TRUE 8.00 8.20 7.85 8.20 +0.20 +2.50 8.15 8.20 114,441,391 924,918.03
48 TTB 1.32 1.35 1.32 1.35 +0.04 +3.05 1.34 1.35 379,502,367 508,749.80
49 TU 14.50 14.70 14.40 14.60 +0.20 +1.39 14.50 14.60 21,492,936 313,557.85
จากโค้ดนี้ เป็นฟังก์ชั่น Python ที่ใช้ในการดึงข้อมูลราคาหุ้น SET50 จากเว็บไซต์ https://portal.settrade.com/C13_MarketSummary.jsp?detail=SET50 โดยใช้เทคนิค web scraping โดยโค้ดจะดึงข้อมูลจาก HTML ที่ได้จากการ request หน้าเว็บไซต์ดังกล่าว จากนั้นจะแยกข้อมูลราคาหุ้น SET50 ออกมาเป็นตาราง (DataFrame) ที่มีหัวข้อตารางเป็นชื่อของแต่ละหุ้น และแถวของตารางเป็นรายละเอียดของแต่ละหุ้น เช่น รหัสหุ้น ชื่อหุ้น ราคาล่าสุด ปริมาณการซื้อขาย และการเปลี่ยนแปลงของราคา ในรูปแบบของข้อความ (text) ที่สามารถนำมาวิเคราะห์ต่อได้ โดยผลลัพธ์ที่แสดงออกมาจะเป็นตารางข้อมูลราคาหุ้น SET50 ที่แสดงรายละเอียดต่างๆ ของแต่ละหุ้นเช่นเดียวกับตารางข้อมูลที่แสดงบนหน้าเว็บไซต์ดังกล่าว
โค้ดด้านบนเป็นฟังก์ชั่น get_stock_price()
ที่ใช้สำหรับดึงข้อมูลราคาหุ้น SET50 จากเว็บไซต์ settrade.com โดยใช้การเรียกใช้งานไลบรารี requests
และ BeautifulSoup
เพื่อ web scraping ข้อมูล
ในฟังก์ชั่น get_stock_price()
นี้ มีการทำงานแบ่งเป็น 2 ขั้นตอนหลักๆ ได้แก่
-
การดึงข้อมูล timestamp จาก div tag ที่มี class=’table-responsive’ ซึ่งเป็นข้อมูลเวลาที่อัพเดตข้อมูลราคาล่าสุดของหุ้น SET50 โดยใช้
.find()
method ของ BeautifulSoup ในการค้นหา element ที่ต้องการ และใช้.text
เพื่อดึงข้อความใน element นั้นๆ ออกมาเป็นข้อมูล timestamp -
การดึงข้อมูลตารางราคาหุ้น SET50 ซึ่งเป็นตารางที่อยู่ใน div tag ที่มี class=’row separate-content’ โดยใช้
.find_all()
method ของ BeautifulSoup ในการค้นหา element ที่ต้องการ และหลังจากนั้นใช้.find_all()
method อีกครั้งเพื่อค้นหา tag ที่อยู่ภายในตาราง (th และ td) และนำข้อมูลออกมาเก็บไว้ในลิสต์ls
ซึ่งสามารถแปลงเป็น DataFrame ของ Pandas ได้
ซึ่งหลังจากดึงข้อมูลเรียบร้อยแล้ว ฟังก์ชั่นจะ return DataFrame ของข้อมูลราคาหุ้น SET50 ที่สามารถนำไปใช้งานต่อได้
# เลือกดึงข้อมูลมาเป็น data set เช่น SET50 , SET100 , SETHD , SETCLMV , SETTHSI , SETWB
stock = 'SET50'
จากโค้ดบรรทัดนี้ สามารถเปลี่ยนแปลงการดึงข้อมูล เพื่อที่จะนำไปวิเคราะห์ข้อมูลต่อไป โดยมีรายละเอียดดังนี้
- SET50
คือ ค่าเฉลี่ยราคาหุ้นของ 50 บริษัทที่มีปริมาณการซื้อขายหุ้นมากที่สุดในตลาดหลักทรัพย์แห่งประเทศไทย โดยมีเกณฑ์ในการเลือกบริษัทคือ ต้องมีความซื้อขายในช่วง 6 เดือนล่าสุดไม่น้อยกว่า 0.1% ของปริมาณซื้อขายรวมของตลาดหลักทรัพย์แห่งประเทศไทย - SET100
คือ ค่าเฉลี่ยราคาหุ้นของ 100 บริษัทที่มีปริมาณการซื้อขายหุ้นมากที่สุดในตลาดหลักทรัพย์แห่งประเทศไทย โดยมีเกณฑ์ในการเลือกบริษัทคือ ต้องมีความซื้อขายในช่วง 6 เดือนล่าสุดไม่น้อยกว่า 0.1% ของปริมาณซื้อขายรวมของตลาดหลักทรัพย์แห่งประเทศไทย - SETHD (SET High Dividend 50 Index)
คือ ค่าเฉลี่ยราคาหุ้นของ 50 บริษัทที่มีการจ่ายเงินปันผลสูง โดยเกณฑ์การคัดเลือกบริษัท คือ ต้องมีการจ่ายเงินปันผลต่อปีมากกว่าหรือเท่ากับ 3% ของมูลค่าหุ้น - SETCLMV (SET CLMV Index)
คือ ค่าเฉลี่ยราคาหุ้นของบริษัทในประเทศในเครือ CLMV (Cambodia, Laos, Myanmar และ Vietnam) โดยมีเกณฑ์ในการคัดเลือกบริษัทคือ ต้องเป็นบริษัทที่มีตลาดหลักทรัพย์ที่แสดงผลได้ดีในประเทศต้นสังกัด - SETTHSI (SET Total Return Index)
คือ อินเด็กซ์ที่รวมทุกหุ้นที่บริษัทมหาชนตลาดหลักทรัพย์แห่งประเทศไทย (SET) มีในตลาดและนับเป็นเกณฑ์การวัดผลประสิทธิภาพของตลาดหลักทรัพย์ไทย โดยสูตรการคำนวณของ SETTHSI จะรวมส่วนของเงินปันผลด้วย หรือจะเรียกว่าเป็นอินเด็กซ์รวมกำไรของ SET ที่เป็นการลดน้ำหนักหุ้นที่ไม่มีการจ่ายเงินปันผล - SETWB (SET Foreign & Local Bond Index)
คือ อินเด็กซ์ที่วัดผลตอบแทนของตลาดหลักทรัพย์ไทยที่เน้นการลงทุนในตราสารหนี้ภายในประเทศและต่างประเทศ (บอนด์) โดย SETWB จะคำนวณขึ้นมาจากเงินต้นของตราสารหนี้และดอกเบี้ยที่ได้รับ โดยอินเด็กซ์นี้จะเน้นเป็นส่วนหนึ่งของการลงทุนที่ปลอดภัยและมีความเสี่ยงต่ำ เพื่อเสริมสร้างความเสถียรให้กับตลาดหลักทรัพย์ไทยโดยรวม
อีกทั้งยังสามารถบันทึกข้อมูลที่ได้ดึงออกมาเป็นไฟล์ CSV เก็บไว้เพื่อนำไปวิเคราะห์ผลต่อไปได้ โดยเขียน Python เพิ่มในฟังก์ชั่น get_stock_price()
คือ
# บันทึกข้อมูลเป็น CSV
df.to_csv(stock+'.csv', index=False)
จากการที่ได้ไฟล์ข้อมูล CSV เพื่อนำมาเป็น Data Set แล้ว จำเป็นต้องเปลี่ยน Column Heading เป็นภาษาอังกฤษ สำหรับใช้ในการวิเคราะห์ข้อมูลตามที่เราต้องการต่อไป โดยสามารถเขียนโค้ด Python ที่นำไปใช้งานเบี้องต้นได้ดังนี้
import pandas as pd
import matplotlib.pyplot as plt
# โหลดข้อมูลจาก URL
url = "https://kittimasak.com/data/SET50.csv"
df = pd.read_csv(url, index_col="Stock")
print(df)
# หาค่าสถิติพื้นฐานของข้อมูล
print(df.describe())
print(df.info())
# พล็อตกราฟ
df[["Open", "Close"]].plot(figsize=(15, 5), title="SET50 Open and Close Price")
plt.bar(df.index, df['Close'])
plt.title('SET50 Index')
plt.xlabel('Stock')
plt.ylabel('Price (Baht)')
plt.show()
# วาดกราฟแสดงการเปลี่ยนแปลงของราคาปิด
df["Change"].plot(figsize=(15, 5), title="SET50 Change Price")
plt.show()
# วาดกราฟแสดงการ % เปลี่ยนแปลงของราคาปิด
df["%change"].plot(figsize=(15, 5), title="SET50 % Change Price")
plt.show()
แสดงผลลัพธ์ได้ คือ
Open High Low Close Change %change Buy Sell \
Stock
ADVANC 208.00 208.00 204.00 206.00 -1.00 -0.48 206.00 207.00
AOT 71.00 71.25 70.00 70.50 0.00 0.00 70.50 70.75
AWC 5.40 5.55 5.35 5.40 0.05 0.93 5.40 5.45
BANPU 10.20 10.50 10.10 10.50 0.30 2.94 10.40 10.50
BBL 151.00 154.50 151.00 153.50 4.00 2.68 153.50 154.00
BDMS 28.50 28.75 28.25 28.50 0.25 0.88 28.25 28.50
BEM 8.90 8.95 8.40 8.45 -0.45 -5.06 8.40 8.45
BGRIM 39.75 39.75 38.75 39.00 -0.25 -0.64 38.75 39.00
BH 210.00 213.00 210.00 213.00 1.00 0.47 212.00 213.00
BTS 7.15 7.20 7.00 7.10 0.00 0.00 7.10 7.15
CBG 98.00 100.00 97.75 99.25 1.75 1.79 99.00 99.25
CENTEL 55.00 55.50 53.75 54.25 -0.75 -1.36 54.00 54.25
COM7 31.00 31.25 30.25 30.50 -0.25 -0.81 30.50 30.75
CPALL 61.00 61.50 60.75 61.25 0.50 0.82 61.25 61.50
CPF 21.30 21.80 21.30 21.70 0.50 2.36 21.60 21.70
CPN 66.00 67.00 65.75 66.75 1.25 1.91 66.50 66.75
CRC 44.00 44.25 43.50 44.00 0.00 0.00 43.75 44.00
DELTA 986.00 1,020.00 984.00 996.00 24.00 2.47 996.00 998.00
EA 75.00 75.00 72.50 73.00 -1.25 -1.68 73.00 73.25
EGCO 152.50 153.50 151.50 152.50 0.50 0.33 152.50 153.00
GLOBAL 19.50 19.50 18.90 19.00 -0.40 -2.06 19.00 19.10
GPSC 66.50 67.00 65.50 66.50 0.25 0.38 66.50 66.75
GULF 50.75 51.25 50.25 50.75 0.00 0.00 50.75 51.00
HMPRO 14.20 14.60 14.20 14.40 0.20 1.41 14.30 14.40
INTUCH 71.75 73.25 71.50 72.50 0.50 0.69 72.25 72.50
IVL 34.50 34.50 33.50 33.75 -0.50 -1.46 33.50 33.75
JMART 22.40 22.90 22.10 22.40 0.40 1.82 22.40 22.50
JMT 45.00 47.00 44.50 46.50 2.75 6.29 46.50 46.75
KBANK 132.00 133.00 130.50 132.00 2.50 1.93 132.00 132.50
KTB 16.70 17.00 16.60 16.80 0.40 2.44 16.80 16.90
KTC 54.00 54.25 53.50 53.75 0.25 0.47 53.75 54.00
LH 9.55 9.65 9.50 9.60 0.10 1.05 9.60 9.65
MINT 31.75 32.50 31.75 32.00 0.25 0.79 32.00 32.25
MTC 32.25 32.75 31.75 32.25 0.50 1.57 32.25 32.50
OR 20.10 20.40 20.00 20.10 0.20 1.01 20.10 20.20
OSP 31.75 32.00 31.50 31.50 0.00 0.00 31.50 31.75
PTT 29.75 30.25 29.75 30.00 0.25 0.84 30.00 30.25
PTTEP 137.50 141.00 136.50 140.50 4.50 3.31 140.00 140.50
PTTGC 45.00 45.25 43.75 44.25 0.00 0.00 44.25 44.50
RATCH <XD> 38.00 38.25 37.50 38.00 -0.75 -1.94 37.75 38.00
SAWAD 49.50 50.50 49.00 50.25 1.00 2.03 50.00 50.25
SCB 101.50 102.50 100.50 101.50 1.50 1.50 101.50 102.00
SCC 320.00 320.00 313.00 315.00 -3.00 -0.94 315.00 316.00
SCGP 48.25 48.50 45.50 46.00 -1.75 -3.66 46.00 46.25
TIDLOR 24.00 24.10 23.60 23.70 0.00 0.00 23.70 23.80
TISCO 100.50 101.00 100.50 100.50 0.00 0.00 100.00 100.50
TOP 49.50 50.25 49.00 50.00 1.25 2.56 50.00 50.25
TRUE 8.00 8.20 7.85 8.20 0.20 2.50 8.15 8.20
TTB 1.32 1.35 1.32 1.35 0.04 3.05 1.34 1.35
TU 14.50 14.70 14.40 14.60 0.20 1.39 14.50 14.60
Volume Value (Baht)
Stock
ADVANC 8,669,634 1,784,972.91
AOT 19,456,519 1,373,351.62
AWC 77,380,150 419,060.32
BANPU 147,959,636 1,534,822.47
BBL 12,275,178 1,877,242.57
BDMS 29,698,502 846,814.78
BEM 132,658,952 1,129,728.79
BGRIM 9,790,590 382,805.62
BH 1,252,231 265,907.82
BTS 83,081,721 589,824.59
CBG 2,264,392 224,087.75
CENTEL 3,951,679 215,461.07
COM7 7,551,734 231,167.15
CPALL 36,072,201 2,205,823.63
CPF 33,066,913 715,252.70
CPN 11,017,075 732,490.63
CRC 15,332,295 673,873.11
DELTA 3,501,697 3,506,104.26
EA 15,251,793 1,117,299.99
EGCO 1,088,491 165,896.21
GLOBAL 20,719,660 397,402.44
GPSC 3,605,064 238,948.46
GULF 17,495,812 888,583.75
HMPRO 54,925,809 791,787.79
INTUCH 26,039,026 1,886,292.13
IVL 40,640,991 1,377,206.00
JMART 39,158,061 881,053.48
JMT 20,585,338 944,375.61
KBANK 22,388,765 2,950,465.42
KTB 64,556,231 1,083,947.62
KTC 3,659,466 196,748.04
LH 47,954,283 459,825.33
MINT 22,833,516 731,009.14
MTC 12,064,835 389,678.24
OR 37,198,066 750,079.30
OSP 6,879,096 217,796.20
PTT 96,955,183 2,903,269.07
PTTEP 16,294,335 2,264,371.62
PTTGC 22,175,587 982,762.98
RATCH <XD> 6,592,953 249,674.42
SAWAD 6,432,866 320,404.33
SCB 20,425,883 2,074,625.09
SCC 4,160,480 1,313,516.03
SCGP 29,848,986 1,385,333.23
TIDLOR 13,431,985 319,405.74
TISCO 4,303,231 432,791.59
TOP 15,575,627 773,430.79
TRUE 114,441,391 924,918.03
TTB 379,502,367 508,749.80
TU 21,492,936 313,557.85
Open Low Close Change %change Buy \
count 50.000000 50.000000 50.000000 50.000000 50.000000 50.000000
mean 78.994400 78.232400 79.176000 0.819800 0.690400 79.075800
std 144.684629 144.178582 145.886259 3.561502 1.872542 145.875834
min 1.320000 1.320000 1.350000 -3.000000 -5.060000 1.340000
25% 21.575000 21.500000 21.875000 0.000000 0.000000 21.800000
50% 44.500000 43.625000 44.125000 0.200000 0.805000 44.000000
75% 71.562500 71.125000 72.000000 0.500000 1.887500 71.812500
max 986.000000 984.000000 996.000000 24.000000 6.290000 996.000000
Sell
count 50.000000
mean 79.384000
std 146.187166
min 1.350000
25% 21.900000
50% 44.250000
75% 72.062500
max 998.000000
<class 'pandas.core.frame.DataFrame'>
Index: 50 entries, ADVANC to TU
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Open 50 non-null float64
1 High 50 non-null object
2 Low 50 non-null float64
3 Close 50 non-null float64
4 Change 50 non-null float64
5 %change 50 non-null float64
6 Buy 50 non-null float64
7 Sell 50 non-null float64
8 Volume 50 non-null object
9 Value (Baht) 50 non-null object
dtypes: float64(7), object(3)
memory usage: 4.3+ KB
None
จากโค้ด Python ที่โหลดข้อมูล SET50 จาก URL แล้วแสดงผลลัพธ์ทั้งหมดด้วยการใช้ Pandas และ Matplotlib pyplot ในการคำนวณค่าสถิติพื้นฐานของข้อมูล เช่น ค่าเฉลี่ย ส่วนต่าง ส่วนสูงสุด ส่วนต่ำสุด เป็นต้น และใช้ Matplotlib เพื่อพล็อตกราฟเพื่อแสดงผลลัพธ์ เช่น กราฟแสดงราคา Open และ Close ของ SET50 ในแต่ละวัน กราฟแสดงการเปลี่ยนแปลงราคาปิด และกราฟแสดงการเปลี่ยนแปลงราคาปิดเป็นเปอร์เซ็นต์ โดยมีการปรับเปลี่ยนสีกราฟ % Change Price เป็นสีแดง โดยโค้ดนี้จะช่วยในการวิเคราะห์และตรวจสอบสถานะของตลาดหุ้น SET50 และช่วยในการตัดสินใจเพื่อลงทุนในตลาดหุ้นได้ตรงกับความเหมาะสมและเป้าหมายที่ต้องการของผู้ใช้งาน
โดยโค้ดด้านบนได้ทำการโหลดข้อมูลจาก URL แล้วนำมาเก็บไว้ในตัวแปร df โดยกำหนด index เป็น Stock
จากนั้นทำการคำนวณค่าสถิติพื้นฐานของข้อมูลด้วย method describe() และแสดงข้อมูลรายละเอียดของ dataframe ด้วย method info()
การวิเคราะห์และพล็อตกราฟต่าง ๆ เพื่อสื่อความหมายของข้อมูลในรูปแบบต่าง ๆ
- ตัวแปร
url
เก็บ URL ของไฟล์ CSV ที่มีข้อมูล SET50 pd.read_csv()
ใช้อ่านไฟล์ CSV และเก็บข้อมูลลงใน DataFramedf
โดยกำหนดindex_col
เป็นคอลัมน์ “Stock” ทำให้คอลัมน์ “Stock” เป็น index ของ DataFramedf.describe()
ใช้แสดงค่าสถิติพื้นฐานของข้อมูลใน DataFrame ที่เป็นตัวเลข เช่น count, mean, min, max, และ percentiles ต่าง ๆdf.info()
ใช้แสดงรายละเอียดของ DataFrame รวมถึงชนิดของข้อมูลแต่ละคอลัมน์ เช่น float64, int64, object เป็นต้นdf[["Open", "Close"]].plot()
ใช้พล็อตกราฟแสดงการเปิด-ปิดราคาของ SET50 โดยกำหนดขนาดของกราฟด้วยfigsize
และกำหนดชื่อกราฟด้วยtitle
plt.bar()
ใช้พล็อตกราฟแท่งแสดงราคาปิดของ SET50 โดยกำหนดตำแหน่งของแต่ละแท่งด้วยdf.index
และกำหนดชื่อกราฟด้วยtitle
และแกน x และ y ด้วยxlabel
และylabel
df["Change"].plot()
ใช้พล็อตกราฟแสดงการเปลี่ยนแปลงของราคาปิดของ SET50 โดยกำหนดขนาดของกราฟด้วยfigsize
และกำหนดชื่อกราฟด้วยtitle
df["%change"].plot()
ใช้พล็อตกราฟแสดงการ % เปลี่ยนแปลงของราคาปิด
โดยทำการพล็อตกราฟเพื่อแสดงข้อมูลดังนี้
- พล็อตกราฟแท่งแสดงราคา Open และ Close ในรูปแบบเวลาเป็นแกน x และ ราคาเป็นแกน y
- พล็อตกราฟเส้นแสดงการเปลี่ยนแปลงราคาของหุ้น SET50
- พล็อตกราฟเส้นแสดงการเปลี่ยนแปลงราคาของหุ้น SET50 เป็นเปอร์เซ็นต์
ผลลัพธ์ที่แสดงออกมาเป็นการแสดงข้อมูลต่างๆ ในรูปแบบของตารางและกราฟเพื่อให้ผู้ใช้งานสามารถดูข้อมูลเบื้องต้นของ SET50 และวิเคราะห์ได้ว่ามีการเปลี่ยนแปลงราคา และ % ของหุ้น SET50 อย่างไรบ้าง
ถ้าต้องการประยุกต์ใช้ Machine Learning และ Deep Learning กับข้อมูล SET สามารถทำได้หลากหลายวิธี โดยสามารถนำมาใช้ในการทำนายการเคลื่อนไหวของราคาหุ้นในอนาคต หรือทำนายค่าผลตอบแทนของการลงทุนในหุ้น SET ในอนาคต เป็นต้น เพื่อที่จะเลือกลงทุนในหุ้นตัวใด
ตัวอย่างของวิธีการนำ Machine Learning มาใช้กับข้อมูล SET ได้แก่การใช้ Algorithm ต่าง ๆ เช่น Decision Tree, Random Forest, K-Nearest Neighbor (KNN), Support Vector Machine (SVM), Neural Network เป็นต้น โดยต้องเตรียมข้อมูลให้เหมาะสมกับการนำไปใช้ Machine Learning ก่อน โดยการทำ Feature Engineering และ Data Preprocessing
ส่วนการนำ Deep Learning มาใช้กับข้อมูล SET สามารถทำได้โดยการใช้ Neural Network หลายชั้น (Deep Neural Network) เพื่อทำนายค่าผลตอบแทนของการลงทุนในหุ้น SET ในอนาคต โดยต้องเตรียมข้อมูลให้เหมาะสมกับการนำไปใช้ Deep Learning โดยการทำ Data Preprocessing และการใช้งาน Network Architecture ที่เหมาะสม โดยสามารถใช้ Framework ต่าง ๆ เช่น Tensorflow, Keras, PyTorch เป็นต้น
อย่างไรก็ตาม การใช้ Machine Learning และ Deep Learning กับข้อมูล SET จำเป็นต้องมีความเข้าใจในหลักการพื้นฐานของ Machine Learning และ Deep Learning อย่างละเอียด และต้องมีความชำนาญในการใช้โปรแกรม Python และ Library ต่าง ๆ ที่เกี่ยวข้อง ซึ่งต้องการเวลาและความพยายามในการศึกษาและปฏิบัติการเป็นอย่างมาก
สามารถศึกษาเรียนรู้ Machine Learning และ Deep Learning เพิ่มเติมได้ที่
- การเรียนรู้ของเครื่องด้วยไพธอน (Machine Learning with Python)
- การเรียนรู้เชิงลึกด้วยไพธอน (Deep Learning with Python)