วิเคราะห์ “หุ้นไทย” ในกระดานตลาดซื้อขาย SET (Stock Exchange of Thailand) ดึงข้อมูลจากหน้าเว็บมาวิเคราะห์ผลโดยการใช้ Python

หลักการวิเคราะห์ข้อมูลหุ้นไทยในตลาด SET จะเริ่มต้นด้วยการเก็บข้อมูลราคาหุ้นของบริษัทต่างๆในตลาดหลักทรัพย์แห่งประเทศไทย (Stock Exchange of Thailand: SET) ทั้งนี้การเก็บข้อมูลราคาหุ้นจะต้องเป็นข้อมูลที่เป็นเวลาจริง (real-time) เนื่องจากตลาดหลักทรัพย์มีการซื้อขายทุกวันและทุกเวลาตามเงื่อนไขของตลาดซึ่งเป็นระบบกำกับดูแลและสั่งสอนผ่านระบบอัตโนมัติ

หลักการวิเคราะห์ข้อมูลหุ้นไทยในกระดานตลาดซื้อขาย SET

จะใช้วิธีการวิเคราะห์เชิงเทคนิคต่างๆ เพื่อดำเนินการวิเคราะห์และวางแผนการลงทุนที่มีความเป็นไปได้สูง โดยมีวิธีการวิเคราะห์หลักๆ ดังนี้

  1. วิเคราะห์พื้นฐาน (Fundamental Analysis)
    เป็นวิธีการวิเคราะห์ข้อมูลโดยการศึกษาข้อมูลเกี่ยวกับธุรกิจและสภาพการเงินของบริษัท เช่น รายงานการเงิน ผลตอบแทนเงินลงทุน เป็นต้น

  2. วิเคราะห์ข้อมูลตลาดรวม (Market Overview)
    เพื่อทราบข่าวสารที่ส่งผลต่อการลงทุน ซึ่งสามารถเช็คได้จากหน้าเว็บไซต์ต่างๆ เช่น เว็บไซต์ข่าวหุ้นไทย หรือเว็บไซต์ของตลาดหลักทรัพย์แห่งประเทศไทย

  3. วิเคราะห์ข้อมูลเทคนิค (Technical Analysis)
    เป็นวิธีการวิเคราะห์ข้อมูลโดยการใช้เครื่องมือช่วยวิเคราะห์เช่น กราฟราคา และตัวชี้วัดทางเทคนิค เช่น  อย่างเช่น ค่าเฉลี่ยเคลื่อนที่ (moving average) หรือแบนด์ดีเวอร์ (Bollinger Band) เพื่อหาจุดเข้าซื้อและขายหุ้นให้เหมาะสม  การใช้กราฟแท่งเทียน (Candlestick Chart) หรือ กราฟเส้น (Line Chart) เพื่อหาแนวโน้มของราคาหุ้นว่าเคลื่อนไหวไปทิศทางไหน และใช้ตัวชี้วัดเทคนิคต่างๆ เช่น ค่าเฉลี่ยเคลื่อนที่ของราคา (Moving Average) หรือ ตัวชี้วัดแรงขายและแรงซื้อของตลาด (RSI) เป็นต้น

  4. วิเคราะห์ความสัมพันธ์ระหว่างราคาหุ้นกับตัวชี้วัดต่างๆ (Technical Indicator Analysis)
    การใช้ตัวชี้วัดเทคนิค เช่น ค่าเฉลี่ยเคลื่อนที่ (Moving Average) และแบนด์ของค่าเฉลี่ยเคลื่อนที่ (Bollinger Bands) เป็นต้น เพื่อช่วยในการวิเคราะห์การเคลื่อนไหวของราคาหุ้น การวิเคราะห์ความสัมพันธ์ระหว่างราคาหุ้นกับตัวชี้วัดนี้ช่วยให้นักลงทุนสามารถปรับแผนการลงทุนได้อย่างเหมาะสมกับแนวโน้มของตลาด
  5. วิเคราะห์แนวโน้มของตลาด (Trend Analysis)
    เป็นเครื่องมือที่ใช้สำหรับวิเคราะห์แนวโน้มของราคาหุ้นในระยะยาว โดยการวิเคราะห์แนวโน้มจะช่วยให้นักลงทุนสามารถทำความเข้าใจได้ว่าราคาของหุ้นเคลื่อนไหวอย่างไรในระยะยาว และสามารถนำข้อมูลนี้มาวางแผนการลงทุนให้เหมาะสมกับวัตถุประสงค์และระยะเวลาการลงทุนของตนเองได้

  6. วิเคราะห์สภาวะเศรษฐกิจของประเทศ
    การเปลี่ยนแปลงของเศรษฐกิจส่วนใหญ่จะส่งผลต่อทั้งตลาดหุ้นและบริษัทที่มีการซื้อขายหุ้นในตลาด SET

  7. วิเคราะห์ข่าวประชาสัมพันธ์ของบริษัท
    การประกาศผลการดำเนินธุรกิจหรือข่าวสารอื่นๆ ที่เกี่ยวข้องกับบริษัทในตลาดหุ้น SET อาจมีผลต่อการซื้อขายหุ้นในตลาดนั้นๆ

  8. วิเคราะห์นโยบายการเงินของธนาคารแห่งประเทศไทย
    การปรับเปลี่ยนอัตราดอกเบี้ย หรือนโยบายเศรษฐกิจที่เกี่ยวข้องกับการเงิน ส่งผลต่อการลงทุนในตลาดหุ้น SET

  9. วิเคราะห์ปัจจัยเฉพาะกิจของบริษัท
    ข้อมูลเชิงคุณภาพเกี่ยวกับบริษัท ทั้งเป็นข้อมูลทางการเงิน และข้อมูลต่างๆ เช่น สถิติการขาย กำไรสุทธิ การเปิดสาขาใหม่ และอื่นๆ

  10. วิเคราะห์ปัจจัยโลก
    การเปลี่ยนแปลงทางการเมืองหรือเศรษฐกิจของโลก อาจส่งผลต่อการซื้อขายหุ้นในตลาด SET โดยเฉพาะอย่างยิ่งเมื่อเป็นเหตุการณ์ที่มีผลต่อเศรษฐกิจของประเทศ

การวิเคราะห์ข้อมูลหุ้นไทยตลาด SET ควรเริ่มต้นด้วยการเข้าใจในโครงสร้างของตลาดหลักทรัพย์ โดยปกติแล้ว หุ้นทุกตัวจะถูกกลุ่มเข้าไว้ในกลุ่มหลักทรัพย์ในตลาดหลักทรัพย์ (Equity Market) ที่แบ่งออกเป็นหลายหมวดหมู่ตามเกณฑ์การจัดอย่างไม่เหมือนกัน ซึ่งการจัดอย่างนี้จะช่วยให้นักลงทุนเข้าใจและวิเคราะห์ได้ง่ายขึ้นว่าหุ้นที่ต้องการลงทุนมีความเสี่ยงสูงหรือต่ำแค่ไหน ซึ่งจะมีผลต่อผลตอบแทนที่จะได้รับ และในการวิเคราะห์ข้อมูลหุ้น SET

การดึงข้อมูลหุ้นไทย SET จากหน้าเว็บด้วย Python นั้นมีขั้นตอนหลักๆ ดังนี้

  1. ใช้ requests library เพื่อเข้าถึงหน้าเว็บไซต์ที่ต้องการดึงข้อมูล
  2. ใช้ BeautifulSoup library เพื่อดึงข้อมูลที่ต้องการจากหน้าเว็บไซต์ โดยสามารถกำหนดให้ดึงข้อมูลที่ต้องการได้จาก HTML tag ที่ใช้ครอบข้อมูล
  3. ทำการนำข้อมูลที่ได้จากข้อ 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 ขั้นตอนหลักๆ ได้แก่

  1. การดึงข้อมูล timestamp จาก div tag ที่มี class=’table-responsive’ ซึ่งเป็นข้อมูลเวลาที่อัพเดตข้อมูลราคาล่าสุดของหุ้น SET50 โดยใช้ .find() method ของ BeautifulSoup ในการค้นหา element ที่ต้องการ และใช้ .text เพื่อดึงข้อความใน element นั้นๆ ออกมาเป็นข้อมูล timestamp

  2. การดึงข้อมูลตารางราคาหุ้น 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 และเก็บข้อมูลลงใน DataFrame df โดยกำหนด index_col เป็นคอลัมน์ “Stock” ทำให้คอลัมน์ “Stock” เป็น index ของ DataFrame
  • df.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)