รู้ว่าเสี่ยงแต่คงต้องขอลอง…ลองมาใช้ machine learning มาทำนายหุ้นกันมั้ย
Objective: ผลงานนี้จัดทำขึ้นเพื่อเป็นส่วนหนึ่งของวิชา Data Science Essential รุ่นที่ 2 ของ Botnoi Consulting Classroom หัวข้อ Trend Forecasting
สมาชิก : G2+G4
สวัสดีค่ะ กลับมาพบกันอีกครั้งกับ Weekly Project ครั้งที่ 3 ของ Data Science Essential รุ่นที่ 2 ในสัปดาห์นี้โจทย์ ที่ได้รับมาจากทาง Botnoi ก็คือ “นำ Machine Learning มาวิเคราะห์หุ้น set 100 และให้เลือกหุ้นที่ Model บอกว่าได้ผลกำไรดีที่สุดมา 1 ตัว” หลังจากที่เราได้หุ้นที่ผลกำไรดีที่สุดมา 1 ตัวแล้ว ทาง Botnoi จะเข้าซื้อหุ้นตัวที่ ATO ในวันจันทร์ ที่ 4 มกราคม 2564 และจะขาย ATO ในวันจันทร์ ที่ 11 มกราคม 2564
INTRO
“การลงทุนมีความเสี่ยง…ผู้ลงทุนควรศึกษาข้อมูลก่อนตัดสินใจลงทุน”
หนึ่งในประโยคยอดฮิต ติดหู และ ทิ้งท้ายโฆษณาในโลกของ “การลงทุน”
แน่นอนว่า…ทุกๆคนก็เคยได้ยินจริงมั้ยคะ?
คิดว่าประโยคนี้มีผลต่อการตัดสินใจลงทุนในชีวิตมากน้อยแค่ไหนคะ?
แน่นอนว่า…ประโยคสั้นๆที่ทิ้งท้ายโฆษณานั้นส่งผลต่อการตัดสินใจลงทุนของทุกๆคนอย่างแน่นอน
เนื่องจากก่อนการตัดสินใจลงทุนทุกๆครั้ง ทุกคนย่อมต้องศึกษาข้อมูลต่างๆมาก่อนแล้ว ศึกษาทั้งในเรื่องของข้อมูล ผลประโยชน์ และ ความเสี่ยงที่จะได้รับหลังการลงทุน…
การลงทุนในที่นี้อาจไม่ได้หมายถึงแค่การลงทุนในสังหาริมทรัพย์ หรือ อสังหาริมทรัพย์ แต่สามารถอธิบายถึงการลงทุนทุกๆอย่างที่เกิดขึ้นในชีวิตของเรา เช่น การลงทุนในเรื่องของเวลา หรือ การลงทุนในเรื่องของการศึกษา เป็นต้น แน่นอนว่าการลงทุนทุกอย่างนั้นย่อมมีผลลัพธ์ที่จะเกิดขึ้นตามมาเสมอ ซึ่งเป็นผลลัพธ์ที่เราต้องยอมรับมัน
“ACTION = REACTION”
ถ้าหากว่าเรากับมาพูดในเรื่องของการลงทุนในอสังหาริมทรัพย์ หรือ หุ้น การลงทุนในทุกๆครั้งย่อมมีความเสี่ยงอย่างแน่นอน…จะเป็นไปได้ไหมถ้าเราสามารถลดความเสี่ยงที่เราได้รับและเปลี่ยนความเสี่ยงเหล่านั้นเป็นมูลค่าของการลงทุนแทน…ในที่นี่อาจไม่ได้มีคำตอบที่ชัดเจนให้กับผู้อ่านทุกๆท่านในเรื่องที่จะสามารถเปลี่ยนความเสี่ยงเหล่านั้นได้…แต่หลังจากอ่านบทความนี้แล้ว machine learning อาจกลายเป็นคำตอบหนึ่งหรือกลายเป็นเครื่องมือตัวหนึ่งที่จะช่วยในเรื่องของวิเคราะห์และการตัดสินใจก่อนการลงทุนอย่างแน่นอน
ในบทความนี้จะพาทุกคนไปเรียนรู้วิธีวิเคราะห์หุ้นด้วยกระบวนการ Machine Learning Pipeline กัน
Machine Learning Pipeline
1. Get data
- เตรียมข้อมูลหุ้นมาเก็บไว้ โดยทางกลุ่มของเราเลือกใช้ library starfishx ในการดึงข้อมูลหุ้น
- ติดตั้ง library starfishx เพื่อดึงข้อมูลของตลาดหุ้น
- ใช้ฟังก์ชั่น get_Set100_Symbols() เพื่อเรียกชื่อของหุ้น 100 ตัว ใน Set100
- ใช้ฟังก์ชั่น get_stock() ดึงข้อมูลทางการเงินของหุ้นที่สนใจย้อนหลัง ใส่วันที่เริ่มต้น (start date) วันที่สิ้นสุด (end date) เพื่อกำหนดช่วงข้อมูลหุ้นที่ต้องการ เพิ่มเงื่อนไข OHLC และ Volume เพื่อดึงข้อมูล Open,High,Low ,Close และข้อมูล Volume ของหุ้น
OHLC
- OPEN Price (ราคาเปิด)
- HIGH Price (ราคาสูงสุด)
- LOW Price (ราคาต่ำสุด)
- CLOSE Price (ราคาปิด)
Volume
-ปริมาณการซื้อขายหุ้นในแต่ละวัน
- จากโค้ดได้เลือกหุ้นขึ้นมา 1 ตัว คือ หุ้น PTT เพื่อเป็นตัวอย่างข้อมูลหุ้น
- Import TA-Lib : Talib ย่อมาจาก Technical Analysis Library คือ Library Package ที่เก็บสูตรวิเคราะห์เชิงเทคนิคไว้ สามารถศึกษาเพิ่มเติมจาก URL : https://mrjbq7.github.io/ta-lib/
2. Extract Feature & Label
- ในการวิเคราะห์หุ้นเราจะศึกษาราคาเปิดตลาดเป็นหลัก โดยทำนายกำไร ( return ของราคาเปิด) ของวันที่ขายเทียบกับวันที่ซื้อ
- สร้างคอลัมน์ Return เพื่อคำนวณกำไร (return ของราคาเปิด) ของวันที่ขายเทียบกับวันที่ซื้อ
- Ndays_Ret = จำนวนวันที่ซื้อถึงวันที่ขาย ในที่นี่ Botnoi จะเข้าซื้อหุ้นในวันที่ 4 มกราคม 2563 และ จะขายวันที่ 11 มกราคม 2563 ระยะเวลารวมเป็น 5 วัน เนื่องจากตลาดหุ้น ปิด วันเสาร์ และ วันอาทิตย์
- เพิ่มข้อมูล Lag Return ที่ต้องการศึกษา โดยฟังกชันนี้จะรับค่า Dataframe จำนวนวันที่ซื้อถึงวันที่ขาย จำนวน Column ที่ต้องการ Lag
- สร้างฟังก์ชัน เพื่อดึงงบทุนของหุ้น SET 100 ประกอบด้วย Current Ratio, ROE, ROA, D/E, Total Asset Turnover, Gross Profit Margin, EBIT Margin , Net Profit Margin มาเป็น Feature ในการวิเคราะห์หุ้น
- Talib Indicator ที่ทางกลุ่มของเราเลือกมาใช้ประกอบด้วย EMA (Exponential Moving Average), SMA (Simple Moving Average), WMA (Weight Moving Average) และ MOM(Momentum) โดยใช้ระยะเวลาเฉลี่ย 10 วัน 20 วัน และ 75 วัน
สามารถศึกษาข้อมูลเพิ่มเติมได้ที่ https://www.finnomena.com/daddy-trader/moving-average/
- หลังจากที่เลือก Feature ครบแล้ว เข้าสู่ขั้นตอนการทำ One Hot Encoding โดยนำข้อมูลที่ได้ไปแปลงเป็นตัวเลข เพื่อให้ คอมพิวเตอร์เข้าใจ
- สร้างฟังก์ชัน Stock_train_test_split เพื่อแบ่งข้อมูลออกเป็น 2 ส่วน ได้แก่ 1.Train Dataset 2. Test Dataset และ Drop ข้อมูลที่ไม่ได้ใช้ออกก่อน โดยในที่นี้ Drop col_drop = [‘OPEN’, ‘HIGH’, ‘LOW’, ‘CLOSE’, ‘VOLUME’, ‘Ret’]
- แบ่งขนาดข้อมูล Train Dataset เป็น 80 % และ ข้อมูล Test Dataset เป็น 20 %
- สรุป Feature ที่เอามา Train Model มีดังนี้
3. Prediction model & Evaluation
- ในการสร้าง Prediction Model ทางกลุ่มของเราใช้ Random Forest
- Random Forest เป็น model แบบ ensemble คือ ใช้ model หลายๆ model มาประกอบกันเป็น model ที่ซับซ้อน
ทำการหาค่า root mean squared error เพื่อตรวจสอบความแม่นยำของโมเดล ได้ค่า RMSE ประมาณ 0.05793 ซึ่งมีค่าใกล้เคียง 0 จึงถือว่าโมเดลค่อนข้างมีความแม่นยำสูง
4.Set Up Pipeline
- สร้าง Pipeline เพื่อรวมฟังก์ชันการทำนายหุ้นให้อยู่ในฟังก์ชันเดียว โดยเราจะสร้าง Function ขึ้นมาใหม่ ให้ชื่อว่า main ซึ่งหมายถึง Function หลักที่จะนำไปใช้งาน ประกอบไปด้วย Function ต่างๆ ได้แก่ get_stock, create_Ret, create_RetLags , Create_FinanceRatio, create_talibs_features, Stock_train_test_split, RandomForestRegressor
5.Result + Visualize

- กราฟแสดงการเปรียบเทียบระหว่าง actual return และ predicted return ของหุ้น BEC ตั้งแต่วันที่ 1 มกราคม 2018 จนถึงวันที่ 28 ธันวาคม 2020
- จากการวิเคราะห์หุ้นทั้งหมดของ set 100 เพื่อหาหุ้นที่มีกำไรมากที่สุด 10 อันดับแรก พบว่าหุ้น BEC มีกำไรมากที่สุด คือ ประมาณ 14% รองลงมาคือหุ้น HANA และ EPG มีกำไรประมาณ 2% และ 1.6% ตามลำดับ
สำหรับหุ้น BEC ที่โมเดลของเราทำนายมานั้น คือ หุ้นของบริษัท บีอีซี เวิลด์ จำกัด (มหาชน) หรือไทยทีวีสีช่อง 3 ที่เราคุ้นเคยกันดี เป็นผู้ผลิต Content ทั้งละคร รายการวาไรตี้ และรายการข่าวผ่านทางทีวีดิจิทัลที่อยู่คู่คนไทยมาอย่างยาวนาน นอกจากนี้ BEC ยังมีรายได้จากการขายเวลาโฆษณา จัดคอนเสิร์ตศิลปินจากต่างประเทศในประเทศไทย มีบริการรับจองและขายบัตรเข้าชมการแสดง (Thai ticket major)
ทั้งนี้ คาดว่าในปี 64 นี้ ราคาหุ้น BEC จะปรับตัวเพิ่มขึ้น จากการที่ BEC ตัดเนื้อร้ายออกไป โดยขายหุ้น “บีอีซี-เทโร” ซึ่งผลประกอบการขาดทุนต่อเนื่องมาหลายปี และคาดว่าจะขาดทุนต่อเนื่องจากผลกระทบของโควิด-19 ทำให้ไม่สามารถจัดงานคอนเสิร์ตได้ นอกจากนี้ยังมีการปรับโครงสร้างองค์กร ลดค่าใช้จ่าย และควบคุมต้นทุนการผลิตละครลง ทำให้ผลประกอบการภาพรวมในไตรมาส 3/63 พลิกกลับมามีกำไร
สำหรับปี 2564 นี้ BEC ได้วางแผนการหารายได้จากช่องทางใหม่ๆ โดยเน้นขายลิขสิทธิ์ละครไปต่างประเทศ และเพิ่มจำนวนละคร Simulcast ผ่านทางช่องทางออนไลน์มากขึ้น นอกจากนี้ BEC ยังเตรียมเปิดตัว 3Plus Platform online ที่จะสร้างรายได้จากค่าสมาชิก และ TV on demand ในส่วนปัจจัยทางเศรษฐกิจที่ค่อยๆฟื้นตัวหลังช่วงโควิด-19 คาดว่าจะส่งผลให้รายได้จากค่าโฆษณาที่หายไป ค่อยๆ ฟื้นกลับมาพร้อมๆ กับบรรยากาศทางเศรษฐกิจที่ดีขึ้นในช่วงปลายปี 2564
Summary
ขั้นตอนการทำ Trend Forecasting ด้วย Machine Learning มีรายละเอียดดังนี้
- Get Data : ดึงข้อมูลจากตลาดหุ้น โดยใช้ library starfishx ในการดึงข้อมูลหุ้น
- Extract Feature & Label : การวิเคราะห์หุ้นครั้งนี้จะทำนายกำไรจากราคาเปิด ของหุ้นใน 7 วันข้างหน้า แต่เนื่องจาก ตลาดปิดเสาร์อาทิตย์ สิ่งที่เราต้องทำนายจริงๆคือ ราคาเปิดในวันพรุ่งนี้ กับราคาเปิดอีก 5 ครั้งถัดไป เพื่อคำนวณกำไร Feature ที่ทางกลุ่มของเราเลือกใช้ประกอบด้วย
- Lag Return เพื่อทำนายกำไร ( return ของราคาเปิด) ของวันที่ขายเทียบกับวันที่ซื้อ
- ข้อมูลสถานะทางการเงินของแต่ละบริษัท ประกอบด้วย Current Ratio,ROE,ROA,D/E,Total Asset Turnover, Gross Profit Margin,EBIT Margin , Net Profit Margin
- Library Talib ประกอบด้วย EMA,SMA,WMA,MOM
3. Prediction Model & Evaluation : เป็นการสร้างโมเดลเพื่อ ทำนายผลลัพธ์ออกมา ซึ่ง Prediction Model เลือกใช้ RandomForest ในการทำนายค่า และ วัดผลค่าด้วย root mean squared error เพื่อตรวจสอบความแม่นยำของโมเดล
4. Set Up Pipeline : เป็นการนำฟังก์ชันที่เราสร้างไว้ทั้งหมดมารวมอยู่ในที่เดียวกัน เพื่อสะดวกต่อการเรียกใช้งาน
5. Result + Visualization : เป็นการนำผลที่ได้มาพล๊อตกราฟ และ แสดงผล ซึ่งในที่นี่ทางกลุ่มอธิบายผลลัพธ์การทำนายหุ้นที่มีผลกำไรมากที่สุดซึ่งก็คือ “BEC”
Future work
พัฒนาโมเดลทำนายหุ้น โดยใช้ LSTM models สำหรับ multivariate time series forecasting ซึ่ง โมเดลนี้จะเป็นการเรียนรู้จากข้อมูลก่อนหน้าและนำมารวมกับข้อมูลที่มีอยู่ เพื่อให้โมเดลสามารถเรียนรู้หุ้นต่อไปเรื่อยๆได้ โดยสาเหตุที่ควรใช้วิธี multivariate time series forecasting นั้น เนื่องจากโมเดลสามารถเรียนรู้จาก features จาก sequence data รองรับ multiple-variate data และสามารถส่งออก variable length sequences ที่สามารถใช้กับ multi-step forecasting ต่อไปได้ คาดว่าการใช้โมเดลนี้จะทำให้ราคาหุ้นไม่กระโดดจากวันก่อนหน้านั้นมาก ส่งผลให้การทำนายน่าจะมีความแม่นยำมากขึ้นกว่าเดิม
ทางกลุ่มของเราหวังว่าบทความนี้จะเป็นประโยชน์แก่ทุกคน และ สามารถนำความรู้ Machine Learning Pipeline ไปพัฒนาต่อยอดในอนาคตได้ ช่วงนี้ Covid-19 ระบาดอีกรอบ ก็ขอให้ผู้อ่านทุกท่านดูแลสุขภาพร่างกาย หมั่นล้างมือบ่อยๆ สุดท้ายนี้ ขออวยพรให้เม่าน้อยที่ติดดอย หลุดดอยไวๆนะคะ
คำเตือน : “การลงทุนมีความเสี่ยง…ผู้ลงทุนควรศึกษาข้อมูลก่อนตัดสินใจลงทุน”