วิเคราะห์หุ้นเชิงลึกแต่ละตัว โดยดึงข้อมูล 3 เดือนย้อนหลังจากกระดานตลาดซื้อขาย SET (Stock Exchange of Thailand) จากหน้าเว็บด้วย Python
เมื่อพิจารณาตลาดซื้อขายหุ้นในระยะยาว ข้อมูลการซื้อขายของหุ้นแต่ละตัวในช่วงเวลา 3 เดือนย้อนหลังมาก็เป็นตัวชี้วัดที่สำคัญในการวิเคราะห์ประสิทธิภาพของหุ้นนั้นๆ โดยการวิเคราะห์ข้อมูลหุ้นแต่ละตัวจะช่วยให้ผู้ลงทุนเข้าใจถึงภาพรวมของตลาดหุ้นในช่วงเวลานั้นๆ และตัดสินใจลงทุนในหุ้นได้อย่างมั่นใจและถูกต้องมากขึ้น เพื่อให้สามารถตัดสินใจการลงทุนได้อย่างถูกต้อง
การวิเคราะห์ข้อมูลหุ้นมีความสำคัญอย่างมากในการตัดสินใจลงทุน โดยเฉพาะในช่วงเวลา 3 เดือนที่ผ่านมาที่มีความเปลี่ยนแปลงของตลาดหุ้นอย่างต่อเนื่อง การเข้าใจและวิเคราะห์ข้อมูลหุ้นในตลาดซื้อขาย SET (Stock Exchange of Thailand) จะช่วยให้นักลงทุนได้ตัดสินใจในการซื้อ-ขายหุ้นในทางที่ถูกต้องและมีประสิทธิภาพมากขึ้น
การวิเคราะห์ข้อมูลหุ้นมีหลายวิธีการ เช่น การวิเคราะห์เทคนิค (technical analysis) และการวิเคราะห์พื้นฐาน (fundamental analysis) ซึ่งสามารถใช้ข้อมูลที่มาจากกระดานตลาดซื้อขาย SET เพื่อทำการวิเคราะห์ได้ โดยข้อมูลหุ้นที่สำคัญในการวิเคราะห์ประกอบด้วย ราคาล่าสุด ปริมาณการซื้อขาย ราคาเปิด-ปิด ราคาสูง-ต่ำ และการเคลื่อนไหวของราคาหุ้น ซึ่งสามารถนำมาวิเคราะห์และสรุปความเป็นไปได้ของราคาหุ้นในอนาคตได้
ข้อมูลในช่วงเวลา 3 เดือนย้อนหลัง (1 ไตรมาส / a quarter) นั้นเป็นข้อมูลที่สมบูรณ์แบบและมีความสมดุลระหว่างข้อมูลปัจจุบันและความเปลี่ยนแปลงของข้อมูลในอดีต นักลงทุนสามารถนำข้อมูลทางการเงิน ข้อมูลกราฟแสดงการเคลื่อนไหวของราคาหุ้น ข่าวสารต่าง ๆ และตัวชี้วัดทางเทคนิคต่าง ๆ เพื่อวิเคราะห์และประเมินความเสี่ยงกับการลงทุนในหุ้นได้
นอกจากนี้ การวิเคราะห์หุ้นโดยนำข้อมูลย้อนหลัง 3 เดือนมาวิเคราะห์ยังช่วยให้นักลงทุนสามารถรับรู้แนวโน้มของราคาหุ้นและความเปลี่ยนแปลงของสถานการณ์ในตลาดหลักทรัพย์ได้อย่างเหมาะสม นอกจากนี้ยังช่วยให้นักลงทุนสามารถวิเคราะห์ระดับความเสี่ยงที่เกี่ยวข้องกับการลงทุนในหุ้นนั้น ๆ และตัดสินใจเกี่ยวกับการซื้อหรือขายหุ้นได้อย่างมีประสิทธิภาพและคุณภาพของการตัดสินใจที่สูงขึ้น
การดึงข้อมูลหุ้นแต่ละตัวใน SET แบบออนไลน์ด้วย Python
- ใช้ requests library เพื่อเข้าถึงหน้าเว็บไซต์ที่ต้องการดึงข้อมูล
- ใช้ BeautifulSoup library เพื่อดึงข้อมูลที่ต้องการจากหน้าเว็บไซต์ โดยสามารถกำหนดให้ดึงข้อมูลที่ต้องการได้จาก HTML tag ที่ใช้ครอบข้อมูล โดยเริ่มต้นให้ติดตั้งไลบรารีนี้โดยใช้คำสั่ง
!pip install beautifulsoup4 pandas requests - ทำการนำข้อมูลที่ได้จากข้อ 2 มาแปลงเป็นรูปแบบของ DataFrame ของ Pandas โดยการสร้าง list สำหรับเก็บข้อความของทุก element ในแต่ละแถวและทำการแปลง list เหล่านี้เป็น DataFrame
ตัวอย่าง การดึงข้อมูลหุ้นมาวิเคราะห์ของบริษัท PTT Public Company Limited
# นำเข้าโมดูล pandas, requests, และ BeautifulSoup
import pandas as pd
import requests
from bs4 import BeautifulSoup
# กำหนด symbol ของหุ้น
symbol = 'PTT'
# สร้างฟังก์ชั่น get_symbol_price สำหรับดึงข้อมูลราคาหุ้น
def get_symbol_price():
url = "https://portal.settrade.com/C04_02_stock_historical_p1.jsp?txtSymbol="+ symbol +"&selectPage=1&max=150&offset=15"
print(symbol)
# ดึงเนื้อหา HTML จาก URL ด้วย requests
res = requests.get(url)
# สร้าง object BeautifulSoup จาก HTML ที่ดึงมา
soup = BeautifulSoup(res.content, 'lxml', from_encoding='utf-8')
# ค้นหาและดึงข้อความที่อยู่ใน tag span ที่มี class เป็น 'stt-remark'
caption = soup.find('span', {'class': 'stt-remark'}).text
print(caption)
# ค้นหาตารางข้อมูลและดึงข้อมูล
table = soup.find('table', {'class': 'table-info'})
headers = ['Date', 'Open', 'High', 'Low', 'Average', 'Close', 'Change', 'Change %', 'Volume (k. shares)', 'Value (M.Baht)', 'SETIndex', 'Value (Change %)']
data = []
for row in table.select('tbody tr'):
row_data = [td.text.strip() for td in row.select('td')]
data.append(row_data)
# สร้าง DataFrame
df = pd.DataFrame(data, columns=headers)
# บันทึกไฟล์ CSV
df.to_csv(symbol+'.csv', index=False)
return df
get_symbol_price()
ผลลัพธ์ที่ได้ คือ
PTT
ข้อมูลล่าสุด 20/03/2023 17:19:12
Date | Open | High | Low | Average | Close | Change | Change % | Volume (k. shares) | Value (M.Baht) | SETIndex | Value (Change %) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 23/02/23 | 32.75 | 32.75 | 32.25 | 32.42 | 32.25 | -0.50 | -1.53 | 48,155.72 | 1,561.26 | 1,652.47 | -0.42 |
1 | 22/02/23 | 33.00 | 33.25 | 32.75 | 32.86 | 32.75 | -0.50 | -1.50 | 35,866.77 | 1,178.43 | 1,659.48 | -0.55 |
2 | 21/02/23 | 33.00 | 33.25 | 32.75 | 32.97 | 33.25 | 0.25 | 0.76 | 42,943.44 | 1,415.99 | 1,668.63 | 0.66 |
3 | 20/02/23 | 33.50 | 33.50 | 32.75 | 33.07 | 33.00 | -0.50 | -1.49 | 43,006.10 | 1,422.10 | 1,657.69 | 0.36 |
4 | 17/02/23 | 32.50 | 33.50 | 32.50 | 33.06 | 33.50 | 0.75 | 2.29 | 58,423.40 | 1,931.77 | 1,651.67 | -0.40 |
… | … | … | … | … | … | … | … | … | … | … | … | … |
101 | 27/09/22 | 36.75 | 37.00 | 36.75 | 36.84 | 36.75 | -0.25 | -0.68 | 55,914.97 | 2,060.69 | 1,610.58 | -0.66 |
102 | 26/09/22 | 37.00 | 37.25 | 36.50 | 36.87 | 37.00 | 0.00 | 0.00 | 55,863.51 | 2,059.96 | 1,621.25 | -0.64 |
103 | 23/09/22 | 37.25 | 37.25 | 37.00 | 37.11 | 37.00 | -0.25 | -0.67 | 38,896.02 | 1,443.32 | 1,631.71 | -0.83 |
104 | 22/09/22 | 37.00 | 37.50 | 36.75 | 37.12 | 37.25 | 0.25 | 0.68 | 60,804.80 | 2,256.85 | 1,645.29 | 0.72 |
105 | 21/09/22 | 37.00 | 37.25 | 36.75 | 36.98 | 37.00 | 0.00 | 0.00 | 46,134.69 | 1,706.10 | 1,633.45 | -0.31 |
106 rows × 12 columns
จากโค้ดเป็นการดึงข้อมูลราคาหุ้นจากเว็บไซต์ settrade.com โดยใช้โมดูล pandas, requests, และ BeautifulSoup ในการดึงข้อมูลและจัดการข้อมูลเพื่อสร้าง DataFrame และบันทึกไฟล์ CSV ข้อมูลราคาหุ้น โดยตัวแปร symbol จะถูกกำหนดเป็น ‘PTT’ ซึ่งเป็นสัญลักษณ์ของหุ้นของบริษัท PTT Public Company Limited ในตารางข้อมูลจะประกอบด้วยหัวข้อ Date, Open, High, Low, Average, Close, Change, Change %, Volume (k. shares), Value (M.Baht), SETIndex, และ Value (Change %) และจะแสดงเป็น DataFrame ที่มีการบันทึกไฟล์ CSV ข้อมูลราคาหุ้นด้วยชื่อไฟล์ ‘PTT.csv’
สามารถดึงข้อมูลหุ้นตัวอื่นมาวิเคราะห์ได้ด้วย โดยการเปลี่ยนค่าตัวแปร symbol เป็นหุ้นตัวอื่นๆ ในโค้ดนี้
# กำหนด symbol ของหุ้น
symbol = 'PTT'
อีกทั้งยังมีการบันทึกออกมาเป็นไฟล์ CSV ตามชื่อหุ้น ในที่นี้ดึงหุ้น PTT ไฟล์ที่ได้ คือ ‘PTT.csv’
# บันทึกไฟล์ CSV
df.to_csv(symbol+'.csv', index=False)
วิเคราะห์ข้อมูลหุ้นพื้นฐาน
จากการที่ได้ดึงข้อมูลหุ้น PTT มาแล้ว ก็นำข้อมูลมาวิเคราะห์สถิติพื้นฐานและแสดงผลออกมาเป็นกราฟ
# นำเข้าโมดูล matplotlib
import matplotlib.pyplot as plt
# สร้างฟังก์ชั่น analyze_stock_price สำหรับวิเคราะห์ข้อมูลราคาหุ้น
def analyze_stock_price(df):
# แปลงข้อมูลราคาหุ้นเป็นตัวเลข
df['Open'] = pd.to_numeric(df['Open'])
df['High'] = pd.to_numeric(df['High'])
df['Low'] = pd.to_numeric(df['Low'])
df['Close'] = pd.to_numeric(df['Close'])
df['Change'] = pd.to_numeric(df['Change'])
df['Change %'] = pd.to_numeric(df['Change %'].str.rstrip('%'))
df['Volume (k. shares)'] = pd.to_numeric(df['Volume (k. shares)'].str.replace(',', ''))
df['Value (M.Baht)'] = pd.to_numeric(df['Value (M.Baht)'].str.replace(',', ''))
df['SETIndex'] = pd.to_numeric(df['SETIndex'].str.replace(',', ''))
# แสดงข้อมูลสถิติพื้นฐาน
print(symbol)
avg_price = df['Close'].mean()
max_price = df['High'].max()
min_price = df['Low'].min()
avg_change = df['Change'].mean()
avg_change_percent = df['Change %'].mean()
avg_valume_kshares = df['Value (M.Baht)'].mean()
avg_value_mbaht = df['Volume (k. shares)'].mean()
avg_setindex = df['SETIndex'].mean()
print('ค่าเฉลี่ยราคาหุ้น:', avg_price)
print('ราคาสูงสุด:', max_price)
print('ราคาต่ำสุด:', min_price)
print('เปลี่ยนแปลงราคาเฉลี่ย:', avg_change)
print('เปอร์เซ็นต์เปลี่ยนแปลงราคาเฉลี่ย:', avg_change_percent)
print('ปริมาณ(พันหุ้น)เฉลี่ย:', avg_valume_kshares)
print('มูลค่า(ล้านบาท)เฉลี่ย:', avg_value_mbaht)
print('SET Index เฉลี่ย:', avg_setindex)
# สร้างกราฟราคาหุ้น Open-Close และ High-Low โดยใช้คอลัมน์ 'Date', 'Open', 'Close', 'High', 'Low'
df.plot(x='Date', y=['Open', 'Close', 'High', 'Low'], figsize=(15, 5), kind='line', title=symbol+' Stock Prices')
plt.show()
# สร้างกราฟแสดงข้อมูลเปลี่ยนแปลงราคาและเปอร์เซ็นต์เปลี่ยนแปลงราคา
df.plot(x='Date', y=['Change', 'Change %'], figsize=(15, 5), kind='line', title=symbol+' Stock Change')
plt.show()
# สร้างกราฟแสดงข้อมูลปริมาณ(พันหุ้น)
df.plot(x='Date', y=['Volume (k. shares)'], figsize=(15, 5), kind='line', title=symbol+' Stock Volume (k. shares)')
plt.show()
# สร้างกราฟแสดงข้อมูลมูลค่า(ล้านบาท)
df.plot(x='Date', y=['Value (M.Baht)'], figsize=(15, 5), kind='line', title=symbol+' Stock Value (M.Baht)')
plt.show()
# สร้างกราฟแสดงข้อมูล SET Inde
df.plot(x='Date', y=['SETIndex'], figsize=(15, 5), kind='line', title=symbol+' Stock SET Index')
plt.show()
df = get_symbol_price()
analyze_stock_price(df)
ผลลัพธ์ที่ได้ คือ
ข้อมูลล่าสุด 20/03/2023 15:30:46
PTT
ค่าเฉลี่ยราคาหุ้น: 33.62735849056604
ราคาสูงสุด: 37.5
ราคาต่ำสุด: 30.75
เปลี่ยนแปลงราคาเฉลี่ย: -0.04481132075471698
เปอร์เซ็นต์เปลี่ยนแปลงราคาเฉลี่ย: -0.12339622641509435
ปริมาณ(พันหุ้น)เฉลี่ย: 1756.183113207548
มูลค่า(ล้านบาท)เฉลี่ย: 52225.31443396226
SET Index เฉลี่ย: 1635.9648113207552
โค้ดนี้เป็นการนำเข้าโมดูล matplotlib และสร้างฟังก์ชั่น analyze_stock_price สำหรับวิเคราะห์และแสดงผลข้อมูลราคาหุ้น SET ของบริษัทที่ต้องการดู โดยการแปลงข้อมูลราคาหุ้นเป็นตัวเลข และแสดงข้อมูลสถิติพื้นฐาน เช่น ค่าเฉลี่ยราคาหุ้น ราคาสูงสุด ราคาต่ำสุด เปลี่ยนแปลงราคาเฉลี่ย เปอร์เซ็นต์เปลี่ยนแปลงราคาเฉลี่ย ปริมาณ(พันหุ้น)เฉลี่ย และ มูลค่า(ล้านบาท)เฉลี่ย
นอกจากนี้ยังสร้างกราฟแสดงข้อมูลราคาหุ้น ปริมาณ(พันหุ้น) และมูลค่า(ล้านบาท) รวมถึง SET Index เพื่อแสดงผลตัวเลขและแนวโน้มของตลาดหุ้นในช่วงเวลาที่ต้องการ
การสร้างฟังก์ชัน analyze_stock_price ซึ่งใช้สำหรับวิเคราะห์ข้อมูลราคาหุ้น โดยมีขั้นตอนการทำงานดังนี้
-
แปลงข้อมูลราคาหุ้นทั้งหมดในตารางให้เป็นตัวเลข เช่น ราคาเปิด (Open) ให้แปลงเป็นตัวเลขด้วยฟังก์ชัน pd.to_numeric และเปลี่ยนแปลงเปอร์เซ็นต์เปลี่ยนแปลงราคา (Change %) เพื่อให้เป็นตัวเลขและลบเครื่องหมาย % ออกด้วยฟังก์ชัน str.rstrip(‘%’) และแปลงตัวอักษรที่ใช้ในการแสดงค่าปริมาณ (พันหุ้น) และมูลค่า (ล้านบาท) เป็นตัวเลขโดยใช้ฟังก์ชัน pd.to_numeric และฟังก์ชัน str.replace(‘,’, ”) เพื่อเอาเครื่องหมาย “,” ออก
-
แสดงข้อมูลสถิติพื้นฐาน เช่น ค่าเฉลี่ยราคาหุ้น (Average Price), ราคาสูงสุด (Maximum Price), ราคาต่ำสุด (Minimum Price), เปลี่ยนแปลงราคาเฉลี่ย (Average Change), เปอร์เซ็นต์เปลี่ยนแปลงราคาเฉลี่ย (Average Change Percent), ปริมาณ(พันหุ้น)เฉลี่ย (Average Volume), มูลค่า(ล้านบาท) เฉลี่ย และ SET Index เฉลี่ย
- สร้างกราฟเพื่อมาประกอบการวิเคราะห์
- สร้างกราฟราคาหุ้น Open-Close และ High-Low โดยใช้คอลัมน์ ‘Date’, ‘Open’, ‘Close’, ‘High’, ‘Low’
- สร้างกราฟแสดงข้อมูลเปลี่ยนแปลงราคาและเปอร์เซ็นต์เปลี่ยนแปลงราคา
- สร้างกราฟแสดงข้อมูลปริมาณ(พันหุ้น)
- สร้างกราฟแสดงข้อมูลมูลค่า(ล้านบาท)
- สร้างกราฟแสดงข้อมูล SET Index
การสร้างกราฟหลายชนิดเพื่อแสดงข้อมูลเกี่ยวกับราคาหุ้นของ PTT โดยกราฟแต่ละอันมีความหมายดังนี้
- กราฟราคาหุ้น Open-Close และ High-Low
แสดงราคาเปิด (Open) และราคาปิด (Close) ของหุ้นในแต่ละวัน รวมถึงราคาสูงสุด (High) และราคาต่ำสุด (Low) ในแต่ละวัน ซึ่งช่วยให้เราสามารถวิเคราะห์แนวโน้มของราคาหุ้นได้ง่ายขึ้น
- กราฟแสดงข้อมูลเปลี่ยนแปลงราคาและเปอร์เซ็นต์เปลี่ยนแปลงราคา
แสดงการเปลี่ยนแปลงของราคาหุ้นในแต่ละวัน (Change) และเปอร์เซ็นต์เปลี่ยนแปลงราคา (Change %) ในแต่ละวัน ซึ่งช่วยให้เราวิเคราะห์การเปลี่ยนแปลงของราคาหุ้นในแต่ละวันได้ง่ายขึ้น
- กราฟแสดงข้อมูลปริมาณ (พันหุ้น)
แสดงปริมาณการซื้อขายหุ้นในแต่ละวันในหน่วยพันหุ้น (Volume (k. shares)) ซึ่งช่วยให้เราเข้าใจว่ามีการซื้อขายหุ้นเป็นจำนวนมากหรือน้อยในแต่ละวัน
- กราฟแสดงข้อมูลมูลค่า (ล้านบาท)
แสดงถึงการเปลี่ยนแปลงของมูลค่าหุ้นต่อวัน โดยจะมีการวิเคราะห์ว่ามูลค่าของหุ้นเปลี่ยนแปลงมากน้อยเท่าไหร่ในแต่ละวัน และสามารถนำมาใช้ในการประเมินปริมาณการซื้อขายหุ้นของนักลงทุน ซึ่งหากมูลค่าของหุ้นมีการเพิ่มขึ้นแสดงว่านักลงทุนซื้อหุ้นเพิ่มขึ้นในวันนั้น และหากมูลค่าลดลงแสดงว่านักลงทุนขายหุ้นไปในวันนั้น - กราฟแสดงข้อมูล SET Index
แสดงถึงการเปลี่ยนแปลงของ SET Index ต่อวัน ซึ่ง SET Index คือ ดัชนีหุ้นที่ใช้วัดความเป็นไปได้ในการเติบโตของตลาดหลักทรัพย์แห่งประเทศไทย โดยเมื่อ SET Index เพิ่มขึ้นแสดงว่าตลาดหลักทรัพย์ไทยกำลังเติบโตอย่างมั่นคง และหาก SET Index ลดลงแสดงว่าตลาดหลักทรัพย์ไทยกำลังไม่ค่อย
การวิเคราะห์หุ้นใช้ Machine Learning ทำนายการเคลื่อนไหวหุ้น
จากที่ได้วิเคราะห์สถิติพื้นฐานแล้ว ก็นำ Data Set มาวิเคราะห์ต่อโดยใช้ Logistic Regression เพื่อทำนายความเคลื่อนไหวของหุ้น PTT ที่ได้เตรียมชุดข้อมูลไว้แล้ว
# นำเข้าโมดูลที่ใช้ในการวิเคราะห์
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
# ดึงข้อมูลราคาหุ้นจากฟังก์ชั่น get_symbol_price
df = get_symbol_price()
# สร้าง feature ใหม่โดยใช้ข้อมูลราคาหุ้นปิดก่อนหน้าแต่ละวัน
df['Prev Close'] = df['Close'].shift(1)
# ลบข้อมูลแถวแรกที่ไม่มีข้อมูลของ feature 'Prev Close'
df.dropna(inplace=True)
# กำหนด target variable โดยกำหนดให้ขึ้นราคาหุ้นในวันถัดไป
df['Target'] = np.where(df['Close'].shift(-1) > df['Close'], 1, 0)
# กำหนด features และ target variable ที่จะนำมาวิเคราะห์
X = df[['Open', 'High', 'Low', 'Prev Close']]
y = df['Target']
# แบ่งข้อมูลเป็น training set และ test set ด้วยสัดส่วน 70:30
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# สร้างโมเดล Logistic Regression และฝึกโมเดลด้วย training set
model = LogisticRegression()
model.fit(X_train, y_train)
# ทำนายค่า target variable สำหรับ test set
y_pred = model.predict(X_test)
# วิเคราะห์ผลลัพธ์โดยใช้ classification report
print(classification_report(y_test, y_pred))
# แสดงค่าความแม่นยำของโมเดล
print('Accuracy: ', model.score(X_test, y_test))
# นำเข้าโมดูล matplotlib
import matplotlib.pyplot as plt
# แสดงกราฟแท่งของค่า target variable
plt.bar(['Decrease', 'Increase'], [len(df[df['Target']==0]), len(df[df['Target']==1])])
plt.title(symbol+' Target Variable')
plt.xlabel('Direction')
plt.ylabel('Count')
plt.show()
# พล็อตกราฟ 2 กลุ่ม โดยแยกตามผลการทำนายของโมเดล (y_pred)
# แสดงคอลัมน์ของ X_test
print(X_test.columns)
# แก้ไขโค้ดการพล็อตกราฟ 2 กลุ่ม Open กับ Prev Close
plt.figure(figsize=[15,5])
plt.scatter(X_test[y_pred==0]['Open'], X_test[y_pred==0]['Prev Close'], color='red', label='Predicted to Decrease')
plt.scatter(X_test[y_pred==1]['Open'], X_test[y_pred==1]['Prev Close'], color='green', label='Predicted to Increase')
plt.title(symbol+' Price: Open - Prev Close')
plt.xlabel('Open Price')
plt.ylabel('Prev Close Price')
plt.legend()
plt.show()
# แก้ไขโค้ดการพล็อตกราฟ 2 กลุ่ม Open กับ Low
plt.figure(figsize=[15,5])
plt.scatter(X_test[y_pred==0]['Open'], X_test[y_pred==0]['Low'], color='red', label='Predicted to Decrease')
plt.scatter(X_test[y_pred==1]['Open'], X_test[y_pred==1]['Low'], color='green', label='Predicted to Increase')
plt.title(symbol+' Price: Open - Low')
plt.xlabel('Open Price')
plt.ylabel('Low Price')
plt.legend()
plt.show()
ผลลัพธ์ที่ได้ คือ
ข้อมูลล่าสุด 20/03/2023 16:01:41
precision recall f1-score support
0 0.68 1.00 0.81 19
1 1.00 0.31 0.47 13
accuracy 0.72 32
macro avg 0.84 0.65 0.64 32
weighted avg 0.81 0.72 0.67 32
Accuracy: 0.71875
โค้ดนี้เป็นการสร้างและฝึกโมเดล Logistic Regression เพื่อทำนายการเคลื่อนไหวของราคาหุ้นว่าจะขึ้นหรือลงในวันถัดไปโดยใช้ข้อมูลราคาหุ้นในวันก่อนหน้านั้นๆ โดยกระบวนการวิเคราะห์ข้อมูลและสร้างโมเดลนั้นได้แบ่งออกเป็นขั้นตอนดังนี้
-
ดึงข้อมูลราคาหุ้นจากฟังก์ชั่น get_symbol_price() ซึ่งส่งคืนข้อมูลเป็น DataFrame ที่มีข้อมูลต่างๆ เช่น ราคาเปิด-ปิด-สูงสุด-ต่ำสุด และปริมาณซื้อขายของหุ้น
-
สร้าง feature ใหม่โดยใช้ข้อมูลราคาหุ้นปิดก่อนหน้าแต่ละวัน (Prev Close) เพื่อนำมาเป็นตัวแปรเพิ่มเติมในการวิเคราะห์
-
กำหนด target variable โดยกำหนดให้ขึ้นราคาหุ้นในวันถัดไป (Target) โดยใช้คำสั่ง np.where() เพื่อกำหนดให้ถ้าราคาหุ้นในวันถัดไปมากกว่าราคาหุ้นในวันปัจจุบันจะเป็น 1 และถ้าน้อยกว่าหรือเท่ากับจะเป็น 0
-
กำหนด features และ target variable ที่จะนำมาวิเคราะห์ โดยเลือก features 4 ตัวคือ Open, High, Low, Prev Close
-
แบ่งข้อมูลเป็น training set และ test set ด้วยสัดส่วน 70:30 โดยใช้ฟังก์ชั่น train_test_split()
-
สร้างโมเดล Logistic Regression และฝึกโมเดลด้วย training set โดยใช้ฟังก์ชั่น fit()
-
ทำนายค่า target variable สำหรับ test set
-
วิเคราะห์ผลลัพธ์โดยใช้ classification report
-
แสดงค่าความแม่นยำของโมเดล
-
แสดงกราฟแท่งของค่า target variable
-
พล็อตกราฟ 2 กลุ่ม โดยแยกตามผลการทำนายของโมเดล (y_pred) โดยแสดงคอลัมน์ของ X_test และแสดงกราฟ 2 กลุ่ม Open กับ Prev Close และกราฟ 2 กลุ่ม Open กับ Low
การสร้างและประยุกต์ใช้โมเดล Logistic Regression เพื่อทำนายการเคลื่อนไหวของราคาหุ้นว่าจะเพิ่มขึ้นหรือลดลงในวันถัดไปโดยใช้ข้อมูลราคาหุ้นในวันก่อนหน้าแต่ละวันเป็น features และกำหนดให้ target variable เป็นการเปลี่ยนแปลงของราคาหุ้นในวันถัดไปโดยถ้าราคาหุ้นในวันถัดไปเพิ่มขึ้นจากราคาหุ้นวันก่อนหน้า target variable จะเป็น 1 ถ้าราคาหุ้นลดลงจะเป็น 0
ผลลัพธ์ที่แสดงออกมาจากโมเดล Logistic Regression ที่ถูกสร้างขึ้นมานั้นคือ classification report ซึ่งแสดงผลการวิเคราะห์โมเดลในแต่ละคลาส ประกอบด้วย precision, recall, f1-score และ support ซึ่งสามารถใช้ในการประเมินความแม่นยำของโมเดลได้
นอกจากนี้ยังมีการแสดงกราฟแท่งที่แสดงจำนวนของการเปลี่ยนแปลงราคาหุ้นในวันถัดไปที่ถูกทำนายโดยโมเดล Logistic Regression และกราฟแสดงการกระจายของข้อมูลราคาหุ้นจาก feature ต่างๆ เช่น Open, Prev Close และ Low โดยแยกสีตามผลการทำนายของโมเดล Logistic Regression ว่าราคาหุ้นจะเพิ่มขึ้นหรือลดลงในวันถัดไป ซึ่งช่วยในการวิเคราะห์และเข้าใจข้อมูลได้ง่ายขึ้น
ผลลัพธ์ที่ได้จากโมเดล Logistic Regression คือค่าความแม่นยำ (accuracy) ที่ประมาณ 72%
การประเมินผล (evaluation metrics) ของแต่ละคลาส แสดงให้เห็นว่า
- สำหรับคลาส 0:
ค่า precision อยู่ที่ 0.68 หมายความว่า จากทั้งหมด 19 ตัวอย่างที่ต้องการทำนายว่าเป็นคลาส 0 โมเดลทำการทำนายถูกต้องประมาณ 68% ของตัวอย่างทั้งหมด ในขณะที่ค่า recall อยู่ที่ 1.00 หมายความว่าโมเดลสามารถตรวจจับข้อมูลทั้งหมดที่เป็นคลาส 0 ได้เป็นอย่างดี โดยมีความแม่นยำถึง 100% และค่า f1-score อยู่ที่ 0.81 ซึ่งเป็นค่าเฉลี่ยความสอดคล้องระหว่าง precision และ recall - สำหรับคลาส 1:
ค่า precision อยู่ที่ 1.00 หมายความว่าโมเดลทำการทำนายถูกต้องทั้งหมด 13 ตัวอย่างที่ต้องการทำนายว่าเป็นคลาส 1 โดยไม่มีค่าผิดพลาด ในขณะที่ค่า recall อยู่ที่ 0.31 หมายความว่าโมเดลมีการตรวจจับข้อมูลที่เป็นคลาส 1 ได้ไม่ครบทุกตัว และค่า f1-score อยู่ที่ 0.47 ซึ่งแสดงถึงความสอดคล้องเฉลี่ยของ precision และ recall
โมเดลที่สร้างด้วยโค้ดนี้มีความแม่นยำ (Accuracy) อยู่ที่ 0.71875 หรือประมาณ 71.88% ซึ่งหมายความว่าโมเดลทำการทำนายได้ถูกต้องสำหรับข้อมูลประมาณ 72% ของข้อมูลทั้งหมดที่ใช้ในการทดสอบ
กราฟแรก แสดงจำนวนของ target variable ที่แยกเป็น 2 กลุ่ม คือ กลุ่มที่เพิ่มราคาหุ้นในวันถัดไป (Increase) และกลุ่มที่ลดราคาหุ้นในวันถัดไป (Decrease) โดยใช้คำสั่ง plt.bar() ซึ่งแสดงว่าจำนวนของ target variable 2 กลุ่มมีความสมดุลกันเล็กน้อย โดยกลุ่ม Decrease มีจำนวนเล็กน้อยกว่ากลุ่ม Increase ซึ่งการเปลี่ยนแปลงราคาหุ้นในแต่ละวันแยกเป็น 2 กลุ่ม คือ การเพิ่มราคาหุ้น (Increase) และการลดราคาหุ้น (Decrease) จากข้อมูลทั้งหมดที่ใช้ในการวิเคราะห์ สามารถสรุปได้ว่าจำนวนของการเพิ่มราคาหุ้นสูงกว่าจำนวนการลดราคาหุ้น
กราฟที่ 2-3 แสดงการพล็อตกราฟของ feature 2 คู่ กลุ่มละ 2 สี ซึ่งแยกตามผลการทำนายของโมเดล Logistic Regression ว่าจะทำนายว่าราคาหุ้นจะเพิ่มหรือลดในวันถัดไป ในกราฟที่สอง เป็นการพล็อตค่า Open กับ Prev Close และในกราฟที่สาม เป็นการพล็อตค่า Open กับ Low จากทั้งสองกราฟ สามารถสรุปได้ว่ามีข้อมูลแตกต่างกันระหว่างกลุ่ม ที่โมเดลทำนายว่าราคาหุ้นจะเพิ่มหรือลด โดยในกราฟแรก เมื่อเปรียบเทียบกับกราฟแรกจะพบว่าการพล็อตกราฟของ feature Open กับ Prev Close จะมีการแตกต่างกันมากกว่าการพล็อตกราฟของ feature Open กับ Low โดยใช้คำสั่ง plt.scatter() แสดงข้อมูลในรูปแบบ scatter plot โดยจุดสีเขียวในกราฟแสดงถึงตัวอย่างของข้อมูลที่โมเดลทำนายว่าราคาหุ้นจะเพิ่มขึ้นในวันถัดไป ซึ่งถูกแบ่งแยกจากจุดสีแดงที่แสดงตัวอย่างของข้อมูลที่โมเดลทำนายว่าราคาหุ้นจะลดลงในวันถัดไป โดยจุดสีเขียวแทนตัวอย่างของข้อมูลที่โมเดลทำนายถูกต้อง และจุดสีแดงแทนตัวอย่างของข้อมูลที่โมเดลทำนายผิดพลาด ในที่นี้จุดสีเขียวและจุดสีแดงถูกแยกเป็นกลุ่มโดยใช้ค่าผลลัพธ์การทำนาย (y_pred) ของโมเดล โดยจุดสีเขียวแสดงผลลัพธ์ที่เป็น 1 (ราคาหุ้นเพิ่มขึ้น) และจุดสีแดงแสดงผลลัพธ์ที่เป็น 0 (ราคาหุ้นลดลง)
การวิเคราะห์หุ้นเชิงลึกโดยใช้ Deep Learning
เป็นวิธีการใช้โมเดลเรียนรู้เชิงลึก (Deep Neural Networks) เพื่อวิเคราะห์ข้อมูลหุ้น โดยการดึงข้อมูล 3 เดือนย้อนหลังจากกระดานตลาดซื้อขาย SET (Stock Exchange of Thailand) จากหน้าเว็บด้วย Python สามารถทำได้โดยใช้เครื่องมือดังต่อไปนี้
-
การดึงข้อมูลหุ้น
สามารถใช้ Python libraries เช่น Pandas หรือ BeautifulSoup ในการดึงข้อมูลจากเว็บไซต์ SET โดยตรง หรือจาก API ของผู้ให้บริการข้อมูลหุ้น โดยข้อมูลที่สามารถดึงได้รวมถึงราคาปิด ราคาเปิด ราคาสูงสุด ราคาต่ำสุด ปริมาณการซื้อขาย ฯลฯ หรือ สามารถดึงข้อมูลจากไฟล์ CSV ที่ได้ทำการบันทึกไว้ โดยใช้คำสั่ง df = pd.read_csv -
การทำ Feature Engineering
เป็นกระบวนการแปลงข้อมูลหุ้นให้อยู่ในรูปแบบที่เหมาะสมสำหรับการนำเข้าโมเดลเรียนรู้เชิงลึก เช่น การคำนวณผลตอบแทนของหุ้นในช่วงเวลาที่กำหนด การคำนวณค่าเฉลี่ยเคลื่อนที่ของราคาหุ้น ฯลฯ -
การแบ่งชุดข้อมูล
หลังจากที่ได้ทำ Feature Engineering เรียบร้อยแล้ว จะต้องแบ่งชุดข้อมูลเป็น 3 ส่วน ได้แก่ Training Set, Validation Set และ Test Set เพื่อใช้ในการเทรนโมเดล เช็คประสิทธิภาพ และทดสอบประสิทธิภาพของโมเดล -
การสร้างโมเดล
สามารถสร้างโมเดลเรียนรู้เชิงลึกด้วย Python libraries เช่น Tensorflow, Keras, PyTorch ฯลฯ โดยโมเดลที่ใช้ในการวิเคราะห์หุ้นเชิงลึกสามารถเลือกใช้ได้หลากหลาย แต่พื้นฐานก็คือ Neural Networks ที่ประกอบด้วย Input Layer, Hidden Layer(s), Output Layer โดยจะมีการเลือกฟังก์ชัน Activation Function สำหรับทุก Layer เพื่อทำให้โมเดลเรียนรู้ได้ดีขึ้น -
การเทรนโมเดล
หลังจากสร้างโมเดลแล้ว จะต้องใช้ Training Set เพื่อเทรนโมเดล โดยจะมีการเลือก Algorithm สำหรับการเทรน เช่น Stochastic Gradient Descent (SGD), Adam ฯลฯ และต้องกำหนด Hyperparameters เช่น Learning Rate, Epochs, Batch Size ให้เหมาะสมกับโมเดลและชุดข้อมูลที่ใช้ -
การประเมินประสิทธิภาพ
หลังจากที่เทรนโมเดลเรียบร้อยแล้ว จะต้องใช้ Validation Set เพื่อประเมินประสิทธิภาพของโมเดล โดยจะมีการคำนวณค่า Metrics เช่น Accuracy, Precision, Recall, F1 Score ฯลฯ เพื่อดูว่าโมเดลมีประสิทธิภาพต่อการวิเคราะห์หุ้นแต่ละตัวไหม -
การทดสอบประสิทธิภาพ
หลังจากที่ประเมินประสิทธิภาพของโมเดลเรียบร้อยแล้ว จะต้องใช้ Test Set เพื่อทดสอบประสิทธิภาพของโมเดลที่ได้ เพื่อดูว่าโมเดลสามารถทำนายราคาหุ้นได้ดีหรือไม่
ตัวอย่าง วิเคราะห์หุ้นเชิงลึกใช้โมเดลเรียนรู้เชิงลึก (Deep Neural Networks) เพื่อทำนายราคาหุ้นจากข้อมูล https://kittimasak.com/data/PTT.csv
import pandas as pd
import numpy as np
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
# ดึงข้อมูลจากไฟล์ CSV
df = pd.read_csv('https://kittimasak.com/data/PTT.csv')
# แสดงข้อมูล 5 แถวแรก
print(df.head())
# แปลงข้อมูลเป็นรูปแบบที่เหมาะสมสำหรับใช้กับโมเดล DNN
# ใช้ราคาปิด (Close) เป็นตัวแปรต้นฉบับ
original_data = df['Close'].values
n_samples = len(original_data)
# แบ่งข้อมูลเป็นชุดข้อมูลสำหรับเรียนรู้ (Training Set) และชุดข้อมูลสำหรับทดสอบ (Testing Set)
# ใช้ข้อมูล 80% เป็น Training Set และ 20% เป็น Testing Set
train_size = int(n_samples * 0.8)
test_size = n_samples - train_size
train_data = original_data[:train_size]
test_data = original_data[train_size:]
# สร้างชุดข้อมูลสำหรับเรียนรู้
def create_dataset(dataset, look_back=1):
X, Y = [], []
for i in range(len(dataset)-look_back-1):
a = dataset[i:(i+look_back)]
X.append(a)
Y.append(dataset[i + look_back])
return np.array(X), np.array(Y)
# กำหนดจำนวนชุดข้อมูลย้อนหลัง (look back) เป็น 3 วัน
look_back = 3
# แปลงชุดข้อมูลเป็นรูปแบบที่เหมาะสมสำหรับใช้กับโมเดล DNN
train_X, train_Y = create_dataset(train_data, look_back)
test_X, test_Y = create_dataset(test_data, look_back)
# สร้างโมเดล DNN
model = keras.Sequential([
keras.layers.Dense(units=64, activation='relu', input_dim=look_back),
keras.layers.Dense(units=32, activation='relu'),
keras.layers.Dense(units=1)
])
# คอมไพล์และเรียกใช้โมเดล
model.compile(optimizer='adam', loss='mean_squared_error')
history = model.fit(train_X, train_Y, epochs=100, batch_size=32, verbose=2, validation_split=0.2)
# แสดงกราฟเทรนด์ค่าความคลาดเคลื่อนและค่าความคลาดเคลื่อนของชุดข้อมูลทดสอบ
train_predict = model.predict(train_X)
test_predict = model.predict(test_X)
# แปลงข้อมูลกลับไปเป็นราคาจริง
train_predict = train_predict[:train_size]
test_predict = test_predict[:test_size]
# แสดงกราฟเทรนด์ค่าความคลาดเคลื่อนและค่าความคลาดเคลื่อนของชุดข้อมูลทดสอบ
plt.figure(figsize=(15,5))
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('PTT: Training and Validation Loss')
plt.legend()
plt.show()
# แสดงกราฟแสดงเทรนด์ของราคาปิดและค่าคาดการณ์ของโมเดลสำหรับชุดข้อมูลทดสอบ
plt.figure(figsize=(15,5))
plt.plot(test_data, label='True Close Price')
plt.plot(test_predict, label='Predicted Close Price')
plt.title('PTT: True and Predicted Close Price')
plt.legend()
plt.show()
ผลลัพธ์ที่ได้ คือ
จากตัวอย่าง เป็นการสร้างโมเดล DNN (Deep Neural Network) สำหรับทำนายราคาหุ้น โดยใช้ข้อมูลราคาปิดของหุ้น PTT ในไฟล์ CSV ที่ถูกดึงมาจากเว็บไซต์ kittimasak.com โดยการทำงานของโมเดลจะประมวลผลข้อมูลเป็นชุดข้อมูลย้อนหลัง 3 วันและทำนายราคาของวันถัดไป
การสร้างและเทรนโมเดล Deep Neural Network (DNN) ด้วย TensorFlow และ Keras เพื่อทำนายราคาหุ้นของบริษัท PTT โดยใช้ข้อมูลราคาปิด (Close) ของหุ้นในช่วงเวลาที่กำหนด โดยจะแบ่งข้อมูลออกเป็นชุดข้อมูลสำหรับเรียนรู้ (Training Set) และชุดข้อมูลสำหรับทดสอบ (Testing Set) โดยใช้ข้อมูล 80% เป็น Training Set และ 20% เป็น Testing Set
โมเดล DNN นี้ มี 3 Hidden Layers ด้วยกัน โดยแต่ละ Hidden Layers จะมีจำนวน Units ต่างกัน คือ 64, 32 และ 1 ตามลำดับ โดยใช้ activation function เป็น relu สำหรับ Hidden Layers แรกสองชั้น และไม่มี activation function สำหรับ Output Layer โมเดล DNN นี้จะมี 3 layers โดยจะประกอบไปด้วย Dense Layers 2 Layers โดยใช้ activation function ชนิด relu และ 1 Layers โดยไม่ใช้ activation function โดยจะคอมไพล์และเรียกใช้โมเดล DNN ด้วย optimizer ชนิด adam และ loss function ชนิด mean_squared_error
การฝึกสอนโมเดลนี้จะใช้ข้อมูล Training Set 80% และ Testing Set 20% โดยมีการใช้งานฟังก์ชัน create_dataset สำหรับแปลงชุดข้อมูลเป็นรูปแบบที่เหมาะสมสำหรับใช้กับโมเดล DNN โดยกำหนดจำนวนชุดข้อมูลย้อนหลัง (look back) เป็น 3 วัน
หลังจากทำการฝึกสอนโมเดลแล้ว จะทำการใช้โมเดลที่ได้ฝึกสอนมาแล้วในการทำนายราคาของชุดข้อมูล Testing Set โดยนำผลลัพธ์ที่ได้จากโมเดลมาแสดงผลเป็นกราฟ เพื่อเปรียบเทียบราคาจริงและค่าคาดการณ์ของโมเดล
กราฟแรก แสดงค่าความคลาดเคลื่อนของโมเดล DNN ในการเทรนตั้งแต่ epoch แรกถึงสิ้นสุดการเทรน โดยแกน x แสดงจำนวน epoch และแกน y แสดงค่า MSE (Mean Squared Error) ของข้อมูลการเรียนรู้และการทดสอบ โดยกราฟนี้ช่วยให้ผู้ใช้งานสามารถดูแนวโน้มการเรียนรู้และการทดสอบของโมเดลได้ว่ามีการเรียนรู้และการทดสอบอย่างไร และจะช่วยปรับแต่งโมเดลให้ดียิ่งขึ้นได้
กราฟที่สอง แสดงเทรนด์ของราคาปิดจริงและค่าคาดการณ์ของโมเดลสำหรับชุดข้อมูลทดสอบ โดยแกน x แสดงช่วงเวลา (วันที่) และแกน y แสดงราคาปิด กราฟนี้ช่วยให้ผู้ใช้งานสามารถดูว่าโมเดล DNN ที่สร้างขึ้นมีความแม่นยำในการทำนายราคาปิดของหุ้นหรือไม่ โดยค่าความคลาดเคลื่อนระหว่างราคาจริงกับค่าคาดการณ์ที่โมเดลทำนายออกมาน้อยเท่าไหร่นั้นจะบอกถึงความแม่นยำของโมเดลในการทำนายราคาปิดของหุ้น