WEEK4: TREND FORECASTING : DSE#3 GROUP2

ลงทุนระยะสั้น หุ้นตัวไหนน่าลุ้น! ลองให้ MACHINE LEARNING ทำนายกัน

Porawat Pongpanich
Jun 7 · 10 min read

Objective: บทความนี้เป็นส่วนหนึ่งของ Data Science Essential Botnoi Classroom หัวข้อ Trend Forecasting โดยใช้สำหรับการเรียนรู้เท่านั้น

สมาชิก DSE#3 กลุ่มที่ 2

สวัสดีครับ !

ผ่านไปแล้วสำหรับโปรเจค 1 & 2 ของพวกเรา ซึ่งท่านผู้อ่านสามารถติดตามบทความของพวกเราได้ตาม Link Medium ด้านล่างนี้

WEEK 1 ออกแบบกิจกรรม Virtual Run แบบไหนให้โดนใจคนสมัคร

WEEK 2–3 [Phishing Detection] รู้ทัน! ก่อนโดนตก…

สำหรับโปรเจค WEEK4:TREND FORECASTING จะเป็นการใช้ Machine Learning เพื่อสร้างโมเดลทำนายข้อมูลที่ประเภทที่เรียกว่า Time Series (อนุกรมเวลา)

อะไรคือข้อมูลประเภท Time Series ?

  • จำนวนลูกค้าที่เข้าร้านA ตั้งแต่ มกราคม-ธันวาคม
  • ยอดขายของสินค้าA ตั้งแต่ปี 2561 ถึง ปัจจุบัน
  • ราคาทองคำตั้งแต่ มกราคม-ธันวาคม
  • จำนวนผู้โดยสารของสายการบินหนึ่งตั้งแต่ปี 1949–1961
  • และอีกมากมาย

ส่วนประกอบของข้อมูลประเภท Time Series (Components of a Time Series)

  • แนวโน้ม (Trend) คือ การเคลื่อนไหวของข้อมูลต่อเนื่องกันในระยะยาว ไม่ว่าจะขึ้นหรือลง
  • ฤดูกาล (Seasonal) คือ การเปลี่ยนแปลงของข้อมูลที่เกิดขึ้นตาม ฤดูกาล หรือช่วงเวลา ซึ่งจะเกิดขึ้นซ้ำๆ กัน ในช่วงเวลาเดียวกัน อาจจะเป็น รายเดือน รายปีก็ได้
  • วัฏจักร (Cyclical) คือ การเคลื่อนไหวของข้อมูลที่มีลักษณะซ้ำ กัน คล้ายกับ Seasonal แต่มีระยะเวลารอบนานกว่า
  • ผิดปกติ (Irregular) คือ การเคลื่อนไหวของข้อมูลที่ไม่มีรูปแบบแน่นอน หรือเป็นเหตุการณ์ที่ผิดไปจากปกติ
  • ** โดยที่ Trend และ Seasonal จะเป็นองค์ประกอบหลัก
https://quantdare.com/decomposition-to-improve-time-series-prediction/

ท่านผู้อ่านน่าจะพอนึกภาพออกแล้วว่า…

ข้อมูลทางธุรกิจหลายๆ ส่วนก็มีลักษณะเป็น Time Series(อนุกรมเวลา) ซึ่งการนำเอาข้อมูลดังกล่าวมาวิเคราะห์ สามารถช่วยในการตัดสินใจหรือวางแผนทางธุรกิจได้เป็นอย่างดี

โดยในปัจจุบัน …

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

โจทย์ของโปรเจค WEEK4 : TREND FORECASTING คือ

ใช่แล้วครับ !

ทำนายหุ้น !

https://www.prachachat.net/finance/news-638345

ซึ่งข้อมูลหุ้นก็มีลักษณะเป็น Time Series เช่นกัน

นั้นก็เพราะกราฟหุ้น คือ การนำราคาหุ้นในแต่ละวันมาเรียงต่อกันเป็นข้อมูลที่เก็บรวบรวมอย่างต่อเนื่องในช่วงเวลาหนึ่ง ๆ

และมีส่วนประกอบที่เป็น แนวโน้ม(Trend)ขึ้นลง เป็นฤดูกาล(Seasonal) เป็นวัฏจักร (Cyclical) และบางครั้งอาจมีการเคลื่อนไหวของข้อมูลที่ไม่มีรูปแบบแน่นอน (Irregular)

โดยกราฟราคาหุ้นที่นักลงทุนมักพบเห็นกันบ่อยๆ ก็คือ “กราฟแท่งเทียน” จะมีลักษณะที่แตกต่างจากกราฟที่พวกเราได้ยกตัวอย่างไปข้างต้นเล็กน้อย

https://www.zalatrade.com/th/article/216.html

โดยพวกเราจะขออธิบายวิธีดูกราฟแท่งเทียนให้เข้าใจง่าย ดังนี้

ส่วนเส้นที่อยู่ตรงหัวและท้ายแท่งเราเรียกว่า“ไส้เทียน” บอกถึงราคาสูงสุดและราคาต่ำสุดของวันนั้นๆ

หากวันไหนราคาปิดสูงกว่าราคาเปิดตัวแท่งเทียนจะเป็นแท่งโปร่ง(บางโปรแกรมใช้แท่งสีเขียว)
หากวันไหนราคาปิดต่ำกว่าราคาเปิดตัวแท่งเทียนก็จะเป็นแท่งทึบ(บางโปรแกรมใช้แท่งสีแดง)

การเคลื่อนไหวของราคาหุ้น แต่ละวันจะแตกต่างกันออกไป แบ่งออกได้เป็น 3 รูปแบบ

แนวโน้มขาขึ้น(uptrand)
แนวโน้มขาลง(downtrand)
แนวโน้มเคลื่อนที่ไปข้างๆ (Sideways)

สำหรับท่านที่อยากทราบข้อมูลเพิ่มเติมเกี่ยวกับหุ้นสามารถศึกษาได้จากเว็บไซต์ตลาดหลักทรัพย์แห่งประเทศไทย https://www.setinvestnow.com/th/stock

สำหรับโจทย์ของโปรเจคสัปดาห์ที่ 4 ของพวกเรา

  • ทาง Botnoi ให้ทุกกลุ่มสร้างโมเดลทำนายหุ้น และเลือกหุ้นที่คิดว่าทำกำไรได้มากที่สุดมา กลุ่มละ 1 ตัว
  • ซึ่งทางทีมงาน Botnoi จะทำการเข้าซื้อหุ้นตัวดังกล่าวที่ ATO(At the Open) ในวันจันทร์ ที่ 7 มิถุนายน 2564 และขายออกที่ ATO(At the Open) ในวันจันทร์ ที่ 14 มิถุนายน 2564 โดยมีงบประมาณให้กลุ่มละ 20,000 บาท

เรียกว่าเอาผลการทำนายไปทำการซื้อขายจริง กำไรจริง หรืออาจจะขาดทุนจริงกันเลยทีเดียว !

โดยมีเงื่อนไขง่าย ๆ คือ

  • ให้เลือกหุ้นใน SET100 เนื่องจากมีสภาพคล่องสูง ซื้อขายง่ายหน่อย
  • ให้เลือกหุ้นที่ราคาต่ำกว่า 200 บาท (เพราะปกติซื้อหุ้นขั้นต่ำคือ 100 หุ้น)
  • หากได้กำไรจะแบ่ง 50:50 หากขาดทุนทางทีมงาน Botnoi จะรับความเสี่ยงไว้เอง
https://www.posttoday.com/finance-stock/columnist/493118

ไม่รวยตอนนี้ จะรวยตอนไหน !

มาเริ่มกันเลย !

.

.

.

.

อ๋อ! ขอขึ้นคำเตือนก่อนนะครับ

“…การลงทุนมีความเสี่ยง

ผู้ลงทุนควรศึกษาข้อมูลก่อนตัดสินใจลงทุน…”

https://www.eef.or.th/30577-2/

หลังจากได้รับโจทย์จากทางบอทน้อย

เนื่องจากเพื่อนสมาชิกหลายท่านยังไม่เคยศึกษาข้อมูลเกี่ยวกับหุ้นมาก่อน

พวกเราจึงได้นัดประชุมร่วมกัน โดยได้เพื่อนสมาชิกในกลุ่ม @คุณ ben @คุณ .Pong @คุณ Copter @คุณ Kong @คุณ Wee ได้ช่วยแชร์ความรู้ ประสบการณ์ รวมทั้งแหล่งเรียนรู้ต่าง ๆ ที่จำเป็นต้องรู้เกี่ยวกับหุ้น

หลังจากนั้น พวกเราได้ประชุมร่วมกันอีกครั้ง

โดยได้กำหนดแนวทางการทำโมเดล ดังนี้

  1. เลือกหุ้นจากในกลุ่ม SET100 ที่มีราคาต่ำกว่า 50.- บาท เพื่อสามารถซื้อหุ้นได้จำนวนมากขึ้น
  2. ส่วนของ Data จะใช้ Library starfishX มาช่วยดึงข้อมูลหุ้น ซึ่งฟังก์ชั่น .loadHistData() ของ starfishX สามารถดึงข้อมูล ออกมาได้ดังนี้
  • date = วันที่ของข้อมูล
  • OPEN = ราคาเปิดของวัน
  • HIGH = ราคาสูงสุดของวัน
  • LOW = ราคาต่ำสุดของวัน
  • CLOSE = ราคาปิด
  • VOLUME = ปริมาณการซื้อขาย

3. หา Indicator อื่นๆ มาพิจารณาเพิ่มเติมโดยใช้ Library talib โดยจะขออธิบาย Indicator ที่พวกเราเลือกมาใช้ ดังนี้

  • EMA (Exponential Moving Average)

ซึ่งเป็นรูปแบบในการหาค่า Moving Average ชนิดหนึ่ง โดย EMA จะให้น้ำหนักกับราคาช่วงแรกน้อย และให้ความสำคัญกับราคาช่วงหลังมากกว่า เรียกง่าย ๆ ว่า Indicator ตัวนี้จะแกว่งตามราคาปัจจุบันมากกว่าราคาในอดีต ซึ่งจะเหมาะแก่การนำมาหาสัญญาณซื้อขาย

  • RIS (Relative Strength Index)

ใช้สำหรับวัดค่าการแกว่งตัวของราคาว่าซื้อหรือขายมากไปหรือไม่ ซึ่งเทียบเป็นช่วง 0–100 และมีค่ามาตรฐานอยู่ที่ 30 และ 70 โดยถ้า RSI อยู่ในระดับตํ่ากว่า 30 แนะนำให้ซื้อ เพราะหมายถึง ราคาต่ำเกินไป หรือ ขายมากเกินไปแล้ว (Oversold) แต่ถ้ามากกว่า 70 แนะนำให้ขาย เพราะหมายถึงราคาสูงเกินไป หรือ ซื้อมากเกินไปแล้ว (Overbought)

  • MACD (Moving Average Convergence Divergence)

ใช้สำหรับดูแนวโน้มราคาหุ้นว่าขึ้นหรือลง และ ดูโมเมนตัมของราคาว่ามีแรงมากหรือน้อยขนาดไหน โดย MACD คำนวนมาจาก ผลต่างค่า Exponential Moving Average 12 วัน และ 26วัน

  • StochRSI (Stochastic RSI)

เป็นตัวบ่งชี้การวิเคราะห์ทางเทคนิคที่ใช้ในการพิจารณาว่าสินทรัพย์มีการซื้อมากเกินไปหรือมีการขายมากเกินไปรวมทั้งระบุแนวโน้มของตลาดในปัจจุบัน

  • BETA (Beta coefficient)

เป็นตัวบ่งชี้ราคาของหุ้นตัวนั้นๆ ว่ามีความผันผวนมากแค่ไหนเมื่อเทียบกับตลาด โดย

BETA =1 หมายความว่าราคาหุ้นตัวนั้นเคลื่อนไหวไปในทิศทางเดียวกับตลาด

BETA >1 หมายความว่าราคาหุ้นตัวนั้นเคลื่อนไหวขึ้นลงแรงกว่าราคาตลาด

BETA =0 หมายความว่าราคาหุ้นตัวนั้นขึ้นลงไม่มีความสัมพันธ์ใดๆ กับราคาตลาด

BETA <0 หมายความว่า ราคาหุ้นตัวนั้นขึ้นลงสวนทางกับราคาตลาด

4. ในการพิจารณาขั้นจะเลือกข้อมูลที่มีลักษณะ uptrend หรือ downtrend มาพิจารณา ตัดส่วนที่เป็น Sideways ออกไป

5. ทำการแบ่งหุ้นออกเป็นกลุ่มตามที่ตลาดหลักทรัพย์แห่งประเทศไทยกำหนดไว้ เพื่อให้ง่ายต่อการพิจารณาเลือกหุ้น

https://blog.ragnar.co.th/blog/machine-learning-the-future-is-now

มา! เริ่มกันเลย

Library ที่พวกเราเลือกมาใช้สำหรับการสร้างโมเดล ML ในโปรเจคนี้

มาดูขั้นตอนการสร้างโมเดล Machine Learning ของพวกเรากัน

สำหรับท่านผู้อ่านที่อยากดูในส่วนของการ Coding อย่างละเอียด สามารถเข้าไปดูได้ใน Colab ตามลิ้งนี้ https://colab.research.google.com/drive/1ey3VzaU1NQYFC50cUJpZjvDo-y4RnAjy?usp=sharing

1. Get data

1.1 ทำการเรียกข้อมูลเฉพาะชื่อหุ้นกับราคาเปิดจากหน้าเว็บไซต์ของ SET โดยคัดกรองหุ้นใน SET100 ที่มีราคาไม่เกิน 50.- บาท นำมาแปลงเป็น list เก็บไว้ในตัวแปรชื่อ symbol

จะเห็นได้ว่าเหลือหุ้นอยู่จำนวน 70 ตัว จาก 100 ตัว

1.2 ทำการดึงข้อมูลหุ้น โดยใช้ Library starfishX โดยดึงมาเฉพาะหุ้นที่รายชื่ออยู่ในตัวแปร symbol ตามข้อ 1.1

จึงได้ Data หน้าตาแบบนี้
ดูลักษณะของข้อมูล
ดูค่าทางสถิติของข้อมูล

1.3 จัดกลุ่มของหุ้น (Sector Data) โดยแบ่งตามที่ตลาดหลักทรัพย์แห่งประเทศไทยทำการแบ่งไว้ให้

  • โดยใช้วิธีสร้างฟังก์ชั่นแบ่งกลุ่มธุรกิจ โดยเลือกเอาเฉพาะที่อยู่ในกลุ่ม SET100
  • เมื่อได้ list ของชื่อหุ้นแยกเป็นกลุ่มธุรกิจมาแล้ว นำมาใส่ลงในตัวแปรตามชื่อของกลุ่มธุรกิจนั้นๆ
  • เอากลุ่มธุรกิจดังกล่าวใส่ลงใน DataFrame คอลัมน์ ‘’businessSector’’
เพิ่มคอลัมน์ ‘’businessSector’’ เข้ามา
ลองดูว่ามีชื่อกลุ่มธุรกิจอะไรบ้าง
  • นำเอากลุ่มธุรกิจมารวมเป็น Sector ใหญ่ในหมวดอุตสาหกรรม และเอาหมวดอุตสาหกรรมดังกล่าวใส่ลงใน DataFrame คอลัมน์ ‘’industrialSector’’
เพิ่มคอลัมน์ ‘’industrialSector’’ เข้ามา
ดูว่ามีชื่อหมวดอุตสาหกรรมอะไรบ้าง

เมื่อได้ข้อมูลหุ้นมาแล้ว ต่อไปมาดึง Indicator ต่าง ๆ กัน

เริ่มจากดึง EMA และนำมาเก็บไว้ในตัวแปล emptyEMADf
เช็คลักษณะข้อมูลและ Null ที่ได้จากตัวแปร emptyEMADf
เมื่อตรวจสอบข้อมูลเรียบร้อย นำ list ของตัวแปร emptyEMADf ไปใส่ในคอลัมน์ “EMA” ของ DataFrame dfAllStock

นำวิธีเดียวกันนี้ มาดึงข้อมูล Indicator อื่น ๆ ใส่ในคอลัมน์ของ DataFrame dfAllStock

  • สร้าง indicator RSI ใส่ในคอลัมน์ “RSI” ของ DataFrame dfAllStock
  • สร้าง indicator MACD ใส่ในคอลัมน์ “MACD” , ”MACDsignal” และ “MACDhist” ของ DataFrame dfAllStock
  • สร้าง indicator STOCHRSI ใส่ในคอลัมน์ “STOCHRSIfastk” และ “STOCHRSIfastd” ของ DataFrame dfAllStock
  • สร้าง indicator BETA ใส่ในคอลัมน์ “BETA” ของ DataFrame dfAllStock
  • สร้าง indicator OBV ใส่ในคอลัมน์ “OBV” ของ DataFrame dfAllStock
  • สร้าง indicator Beta ใส่ในคอลัมน์ “BETA” ของ DataFrame dfAllStock

เสร็จสิ้นสำหรับขั้นตอน Get data

2. Cleansing & Transformation

2.1 ทำการเติม 0 ลงไปแทนที่ข้อมูลที่เป็น Null เพื่อให้ข้อมูลสมบูรณ์มากขึ้น

2.2 เพื่อให้ง่ายต่อการพิจารณาข้อมูล จึงทำการแยกข้อมูลออกมาเป็นข้อมูลระยะสั้น (ย้อนหลังประมาณสองสัปดาห์)

เมื่อมาพิจารณาแล้ว พวกเราต้องการหุ้นตัวที่มีความผันผวนมากกว่าราคาตลาด ณ ปัจจุบัน จึงนำค่า BETA มาพิจารณา

โดยค่า BETA ยิ่งเยอะ(>1) แสดงว่าหุ้นตัวนั้น มีค่าขึ้นลงมากกว่าราคาตลาด

ค่า BETA ยิ่งเยอะ ยิ่งมีความเสี่ยงมาก แต่แน่นอนว่าหากเราหวังจะได้กำไรที่มาก ย่อมแปรผันไปตามความเสี่ยงที่มากขึ้นเช่นกัน

เพราะฉะนั้นหุ้นที่มีค่านี้สูงจึงไม่ใช่หุ้นที่เราจะต้องถอยหนี

ตามแนวคิด high risk, high return

2.3 พวกเราจึงทำการเลือกหุ้นที่มีค่า BETA >=1.0

  • ** ณ วันที่ 3/6/64 เหลือหุ้นที่กรองจากค่า Beta ที่มากกว่า 1.0 อยู่ 12 ตัว จากจำนวนหุ้น 70 ตัวได้แก่หุ้น ACE, AMATA, AP, BCH, BTS, CK, CRC, GLOBAL, JMART, MEGA, QH, STEC

2.4 ทำการ plot heatmap มาดูค่า Correlation coefficient ของ feature แต่ละตัว

เสร็จขั้นตอนการ Cleansing & Transformation

3. Feature Extraction

  • โดยสร้างฟังก์ชั่นนำข้อมูลจากคอลัมน์ที่ต้องใช้มาทำ normalized ด้วย Scaler แต่ละตัว

3.1 ลอง normalized dfAllStock ด้วย MinMaxScaler ก่อน

สร้างตัวแปรมาเก็บ DataFrame หุ้นแต่ละตัว

ลองดูหุ้น ACE ที่ normalized ด้วย MinMaxScaler แล้ว

3.2 เขียนฟังก์ชั่นสำหรับทำการ Extract Feature

3.3 ใช้ฟังก์ชั่น extract_feat กับตัวแปร mACEdf และลองดูข้อมูล

ดูลักษณะของข้อมูล mXACE
ดูลักษณะของข้อมูล mXACE
ลองดูข้อมูล mYACE
ดูลักษณะของข้อมูล mYACE

3.4 จากนั้น มาทำ one-hot encoding ข้อมูลส่วนที่เป็น category เพื่อให้ง่ายต่อการเทรนข้อมูล

3.5 มาถึงการแบ่งข้อมูลออกเป็นชุด Train และ Test โดยเราทำการแบ่งข้อมูลออกเป็นชุด Train = 70 % ชุด Test = 30 % ****

เสร็จสิ้นขั้นตอนการ Feature Extraction and Transformation เราจะได้ข้อมูลที่พร้อมสำหรับการนำไปเข้าโมเดลแล้ว

4. Train&Prediction model

4.2 ใส่ข้อมูลชุด Train คือ mXACE_train และ mYACE_train เข้าไปให้โมเดลทำการเรียนรู้ และทำนายผลออกมา

4.3 Evaluate model :

ทำการวัดผลความแม่นยำของโมเดล ค่า Root Mean Square Error ออกมาเท่ากับประมาณ 1.40
  • ลองพล็อตกราฟออกมาเพื่อดูความแตกต่างระหว่างค่าจริง และค่าที่โมเดลทำนาย พบว่ายังมีความคลาดเคลื่อนค่อนข้างมากเลยทีเดียว

4.4 ลองกลับไป normalized dfAllStock ด้วย StandardScaler และนำเข้ากระบวนการ Extract Feature >Train>Evaluate อีกครั้งพบว่าค่า Root Mean Square Error ออกมาเท่ากับประมาณ 1.19

ค่า Root Mean Square Error ออกมาเท่ากับประมาณ 1.19
ลองพล็อตกราฟออกมาเพื่อดูความแตกต่างระหว่างค่าจริง

4.5 ลองกลับไป normalized dfAllStock ด้วย RobustScaler และนำเข้ากระบวนการ กระบวนการ Extract Feature >Train>Evaluate อีกครั้งพบว่าค่า Root Mean Square Error ออกมาเท่ากับประมาณ 1.40

ค่า Root Mean Square Error ออกมาเท่ากับประมาณ 1.40
ลองพล็อตกราฟออกมาเพื่อดูความแตกต่างระหว่างค่าจริง และค่าที่โมเดลทำนาย

จากการทำ normalized มา 3 รูปแบบพบว่าตอนเทรนโมเดลด้วยวิธีการ normalized แบบ Robust มีค่า error ต่ำที่สุด(จากการทดสอบกับหุ้นหลาย ๆ ตัว) ดังนั้นเราจะใช้วิธีการ normalized แบบ Robust ในการเทรนหุ้นตัวอื่นๆ

4.6 จึงนำกระบวนการทั้งหมดมาทำ Pipeline

5.Predict New Data (Result + Visualize)

โดยจะมีกระบวนการทำนาย ดังนี้

5.1 เรียกวันที่ปัจจุบัน

5.2 เลือกช่วงเวลานำมาใส่ใน DataFrame ที่จะนำมาทำนาย (ในตัวอย่างด้านล่างจะดึงข้อมูลจากวันที่ 21 พ.ค. 2564)

5.3 ดึงข้อมูลหุ้นตัวที่จะนำมาทำนาย (ในตัวอย่างจะเป็นหุ้น ACE)

5.4 สร้าง DataFrame เปล่า ๆ ออกมา แล้วนำมาต่อเข้ากับ DataFrame หุ้นตัวที่ดึงมา (ในตัวอย่างจะเป็น iniACE)

ต่อกันแล้วจะได้ออกมาหน้าตาแบบนี้

6.5 จากนั้นทำการแปลงข้อมูล (Transform) และทำ One-hot encoding

6.6 ทำนายข้อมูล และนำเอาข้อมูลที่ทำนายไปใส่ในคอลัมน์ “OpenPrediction”

6.7 นำคอลัมน์ OpenPrediction มาพล็อตกราฟ (แยกเป็นกราฟจำนวน 2 ระยะ)

สังเกตุได้ว่าหุ้น ACE โมเดลทำนายออกมาได้ไม่ดีนัก โดยที่กราฟสีส้มขึ้นจากจุดล่างเพราะตัวที่มัน predict เองมีค่าอยู่ประมาณนั้น

อ่ะ ไม่เป็นไร!

เราลองเอาวิธีการ Predict New Data (Result + Visualize) ด้านบนมาทำเป็น pipeline เพื่อเอาไปทำนายหุ้นตัวอื่น ๆ กัน

เรียบร้อย !

มาลองดูหุ้นตัวอื่น ๆ กัน

AMATA

AP

BCH

BTS

CK

CRC

GLOBAL

JMART

MEGA

QH

STEC

สรุปผลลลัพธ์จาก Model ของพวกเรา

ปรากฎว่าจากกราฟหุ้นทั้ง 12 ตัวที่แสดงให้ดูข้างต้น พบว่าโมเดลที่ทำขึ้นมีความแม่นยำในระดับหนึ่ง แต่ยังมีหุ้นบางตัวที่ไม่สามารถทำนายได้

ซึ่งพอจะสรุปได้ว่า…

แม้เราจะไม่สามารถทำนายเทรนด์ของหุ้นได้อย่างแม่นยำ 100 เปอร์เซ็นต์ เนื่องจากเทรนด์ของหุ้นอาจะขึ้นลงตามปัจจัยที่ไม่สามารถคาดเดาได้ หรือเรียกง่าย ๆ ว่ามีส่วนของการเคลื่อนไหวที่ไม่มีรูปแบบแน่นอน (Irregular) อยู่เยอะ

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

ขั้นตอนการเลือกหุ้น

พวกเราได้ทำการเลือกหุ้นที่น่าจะมีแนวโน้มว่าจะขึ้น (uptrend) จากกราฟด้านบน คือ AMATA , AP , BCH , GLOBAL และได้ทำการโหวตเลือก โดยหุ้นตัวที่ได้รับคะแนนโหวตสูงสุดคือ AMATA

เพิ่มเติม

Sentiment Analysis

  1. สร้างฟังก์ชั่นดึงจากสำนักข่าว และ influencer ที่ได้ Tweet เกี่ยวกับข่าวสารหุ้นโดยดึงมาเฉพาะ 3,250 tweets ล่าสุดของแต่ละ account ได้ข้อมูลออกมา

2. ทำการ Clean Data

  • ทำการตัดข้อความที่เป็น link ให้กดเข้าไปตามอ่านข่าวต่อ
  • ตัดช่องว่างหน้าหลังของ Text (ถ้ามี)
  • ทำการตัดคอลัมน์ที่ไม่มีข้อความออกไป (กรณีนี้ผู้ Tweet อาจ Tweet เป็นรูปภาพไม่มีข้อความ)

3. ทำการหาว่าจาก Tweet ที่เราดึงมา มีการกล่าวถึงหุ้น 12 ตัวที่เราคัดไว้หรือไม่ และทำการแยกชื่อหุ้นออกมาใส่ในคอลัมน์ stock_name และสร้าง DataFrame ใหม่ที่คอลัมน์ stock_name อยู่ด้วย

4. ทำ Sentiment Analysis โดยใช้ pythainlp

https://pythainlp.github.io/docs/1.7/api/sentiment.html

ตัวอย่าง: เมื่อใส่คำว่า “วันนี้อากาศดีจัง”

sentiment = pos(positive) คือ ข้อความนี้เป็นข้อความเชิงบวกนั้นเอง

  • ทำการหาข้อ Sentiment ของข้อความ และเพิ่มไว้ในคอลัมน์ sentiment
  • ทำการเลือกมาเฉพาะข้อมูล 3 เดือนล่าสุด นำมากำหนดค่าให้กับ Sentiment โดยกำหนดให้ pos = +1 Neg=-1

4.3 มาดูค่าของหุ้นแต่ละตัว

  • ** แต่อย่างไรก็ตามเมื่อลองนำเอาค่า sentiment ด้านบนมาพิจารณาแล้ว พบว่ายังมีความคลาดเคลื่อนอยู่พอสมควร ข้อมูลข้างต้นจึงใช้สำหรับประกอบการพิจารณาเลือกหุ้นเท่านั้น ไม่ได้นำเข้าเป็น Feature สำหรับเทรนโมเดล

สำหรับท่านผู้อ่านที่สนใจสามารถเข้าไปดูรายละเอียด Coding ได้ตามลิ้งนี้https://colab.research.google.com/drive/1WgBbz-ygwg3rbDOlPojQkHGIdBXeY2oF?usp=sharing#scrollTo=K999JAoM4VOY

ข้อมูลงบการเงิน

Visualise เกี่ยวกับ Performance ของหุ้นแต่ละตัว ซึ่งทาง @คุณ Copter ได้ทำไว้ให้สำหรับดูประกอบการตัดสินใจเลือกหุ้น

Overall

By Sector

Stock

botnoi-classroom

This publication consists of articles related to Data…

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store