รู้ว่าเสี่ยงแต่คงต้องขอลอง…ลองมาใช้ machine learning มาทำนายหุ้นกันมั้ย

Supitchaya Tantisiriwat
Jan 5 · 5 min read
Image for post
Image for post

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 เพื่อดึงข้อมูลของตลาดหุ้น
Image for post
Image for post
  • ใช้ฟังก์ชั่น get_Set100_Symbols() เพื่อเรียกชื่อของหุ้น 100 ตัว ใน Set100
Image for post
Image for post
  • ใช้ฟังก์ชั่น get_stock() ดึงข้อมูลทางการเงินของหุ้นที่สนใจย้อนหลัง ใส่วันที่เริ่มต้น (start date) วันที่สิ้นสุด (end date) เพื่อกำหนดช่วงข้อมูลหุ้นที่ต้องการ เพิ่มเงื่อนไข OHLC และ Volume เพื่อดึงข้อมูล Open,High,Low ,Close และข้อมูล Volume ของหุ้น

OHLC

- OPEN Price (ราคาเปิด)

- HIGH Price (ราคาสูงสุด)

- LOW Price (ราคาต่ำสุด)

- CLOSE Price (ราคาปิด)

Volume

-ปริมาณการซื้อขายหุ้นในแต่ละวัน

Image for post
Image for post
  • จากโค้ดได้เลือกหุ้นขึ้นมา 1 ตัว คือ หุ้น PTT เพื่อเป็นตัวอย่างข้อมูลหุ้น
Image for post
Image for post
  • Import TA-Lib : Talib ย่อมาจาก Technical Analysis Library คือ Library Package ที่เก็บสูตรวิเคราะห์เชิงเทคนิคไว้ สามารถศึกษาเพิ่มเติมจาก URL : https://mrjbq7.github.io/ta-lib/
Image for post
Image for post
Image for post
Image for post

2. Extract Feature & Label

  • ในการวิเคราะห์หุ้นเราจะศึกษาราคาเปิดตลาดเป็นหลัก โดยทำนายกำไร ( return ของราคาเปิด) ของวันที่ขายเทียบกับวันที่ซื้อ
  • สร้างคอลัมน์ Return เพื่อคำนวณกำไร (return ของราคาเปิด) ของวันที่ขายเทียบกับวันที่ซื้อ
  • Ndays_Ret = จำนวนวันที่ซื้อถึงวันที่ขาย ในที่นี่ Botnoi จะเข้าซื้อหุ้นในวันที่ 4 มกราคม 2563 และ จะขายวันที่ 11 มกราคม 2563 ระยะเวลารวมเป็น 5 วัน เนื่องจากตลาดหุ้น ปิด วันเสาร์ และ วันอาทิตย์
Image for post
Image for post
  • เพิ่มข้อมูล Lag Return ที่ต้องการศึกษา โดยฟังกชันนี้จะรับค่า Dataframe จำนวนวันที่ซื้อถึงวันที่ขาย จำนวน Column ที่ต้องการ Lag
Image for post
Image for post
Image for post
Image for post
  • สร้างฟังก์ชัน เพื่อดึงงบทุนของหุ้น SET 100 ประกอบด้วย Current Ratio, ROE, ROA, D/E, Total Asset Turnover, Gross Profit Margin, EBIT Margin , Net Profit Margin มาเป็น Feature ในการวิเคราะห์หุ้น
Image for post
Image for post
  • 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/

Image for post
Image for post
  • หลังจากที่เลือก Feature ครบแล้ว เข้าสู่ขั้นตอนการทำ One Hot Encoding โดยนำข้อมูลที่ได้ไปแปลงเป็นตัวเลข เพื่อให้ คอมพิวเตอร์เข้าใจ
Image for post
Image for post
Image for post
Image for post
  • สร้างฟังก์ชัน 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 %
Image for post
Image for post
  • สรุป Feature ที่เอามา Train Model มีดังนี้
Image for post
Image for post

3. Prediction model & Evaluation

  • ในการสร้าง Prediction Model ทางกลุ่มของเราใช้ Random Forest
  • Random Forest เป็น model แบบ ensemble คือ ใช้ model หลายๆ model มาประกอบกันเป็น model ที่ซับซ้อน
Image for post
Image for post

ทำการหาค่า root mean squared error เพื่อตรวจสอบความแม่นยำของโมเดล ได้ค่า RMSE ประมาณ 0.05793 ซึ่งมีค่าใกล้เคียง 0 จึงถือว่าโมเดลค่อนข้างมีความแม่นยำสูง

Image for post
Image for post

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
Image for post
Image for post

5.Result + Visualize

Image for post
Image for post
  • กราฟแสดงการเปรียบเทียบระหว่าง actual return และ predicted return ของหุ้น BEC ตั้งแต่วันที่ 1 มกราคม 2018 จนถึงวันที่ 28 ธันวาคม 2020
Image for post
Image for post
Image for post
Image for post
  • จากการวิเคราะห์หุ้นทั้งหมดของ 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 มีรายละเอียดดังนี้

  1. Get Data : ดึงข้อมูลจากตลาดหุ้น โดยใช้ library starfishx ในการดึงข้อมูลหุ้น
  2. 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 ระบาดอีกรอบ ก็ขอให้ผู้อ่านทุกท่านดูแลสุขภาพร่างกาย หมั่นล้างมือบ่อยๆ สุดท้ายนี้ ขออวยพรให้เม่าน้อยที่ติดดอย หลุดดอยไวๆนะคะ

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

Reference

  1. https://colab.research.google.com/drive/1iTl5ZuSwgiGGvayuy3ddAPJeegqzJN7d#scrollTo=-LX1f7NzUTlv
  2. https://mrjbq7.github.io/ta-lib/
  3. https://www.finnomena.com/daddy-trader/moving-average/

botnoi-classroom

This publication consists of articles related to Data…

Supitchaya Tantisiriwat

Written by

An Arts Graduate who’s studying programming

botnoi-classroom

This publication consists of articles related to Data science and AI written from Botnoi’s data scientists and students.

Supitchaya Tantisiriwat

Written by

An Arts Graduate who’s studying programming

botnoi-classroom

This publication consists of articles related to Data science and AI written from Botnoi’s data scientists and students.

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