มาทำนายหุ้นให้แม่นยำด้วยโมเดล ARIMA กัน

Krirk Arunoprayote
botnoi-classroom
Published in
3 min readSep 15, 2020

Objective: บทความนี้เป็นส่วนหนึ่งของ Data Science Essential ของ Botnoi Classroom หัวข้อ Trend Forecasting โดยเป็นการใช้ machine learning มาช่วยเลือกซื้อหุ้นจากกลุ่ม SET100

Team Member DSEs G5 : เกริก, เมย์, ฐนวัฒน์, ภาณุ , ไหม

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

โจทย์ในสัปดาห์นี้ เป็นการใช้ machine learning ในการเลือกหุ้นที่อยู่ในกลุ่ม SET100 มาซื้อราคา ATO ในวันที่ 17/9/20 และขาย ATO ในวันที่ 24/9/20

กระบวนการเลือกหุ้น
ก็เป็นไปตาม machine learning pipeline

  1. Get data
  2. Train test split
  3. Train model
  4. Make prediction
  5. Create Pipeline
  6. Select the best stock

1. Get data

ในครั้งนี้เราก็จะใช้ library StarfishX และ pandas_datareader มาช่วยในการดึงข้อมูลหุ้น เราก็เริ่มจากการ import library ที่ต้องการใช้งานมาก่อนเลย

เราก็จะสร้างฟังก์ชั่น getseries เพื่อใช้ดึงเฉพาะราคาปิดที่มีการปรับปรุงแล้ว (Adj Close) ของหุ้นแต่ละตัวออกมา เก็บไว้เป็น series โดยเลือกดึงราคา 1 ปีย้อนหลัง เริ่มจาก 14/9/19 ถึง 14/9/20

ทดลองดูข้อมูลที่เรียกมา พบว่ามีข้อมูล 243 record เก็บไว้เป็น float64

2. Train test split

ในโจทย์นี้เราต้องการจะทำนายราคาเปิดหุ้นในวันที่ 24/9/20 แต่เนื่องจากเราใช้ข้อมูล Adj close ในการเทรนโมเดล เราจึงจะเลือกทำนายราคาปิดของ 7 วันถัดไปนับจากวันที่เรามีข้อมูลล่าสุด (14/9/20) ก็คือราคาปิดของวันที่ 23/9/20 แทน เราจึงเลือกนำข้อมูล 7 วันสุดท้ายไปเป็น test set ส่วนที่่เหลือเป็น train set

3. Train model

ในครั้งนี้ทีมเราเลือกใช้ ARIMA algorithm มาทำนายราคาหุ้น เริ่มจากการเทรนโมเดลโดยเขียนไว้ในฟังก์ชั่น trainmodel

4. Make prediction

หลังจากได้โมเดลแล้ว ก็สามารถทำนายราคาในอีก 7 วันทำการถัดไปโดยใช้ method forecast(steps = 7)

เราก็จะสร้างเป็นฟังก์ชั่น predict ได้ผลลัพธ์เป็นราคาใน 7 วันทำการถัดไปที่โมเดลทำนายออกมา และค่า rmse

และเราอยากรู้เพิ่มว่าหุ้นตัวนี้อยู่ในขาขึ้นหรือไม่ โดยคำนวณว่าราคาที่ทำนายออกมามีค่ามากกว่าราคาล่าสุดใน training data หรือไม่ โดยเก็บไว้ในตัวแปร bull ซึ่งถ้าเป็นขาขาขึ้น ก็จะมีค่าเป็น True ถ้าเป็นขาลงหรือ sideway ก็จะมีค่าเป็น False และให้ฟังก์ชั่น return ค่า bull ออกมาด้วย เพื่อนำไปคัดเลือกหุ้นต่อไป

ลองเรียกใช้ฟังก์ชั่น ก็จะได้ค่า ราคาที่ทำนาย, rmse และ bull

5. Create Pipeline

ตอนนี้เราก็มีฟังก์ชั่นทุกอย่างพร้อมแล้ว ก็จะนำมารวมกันสร้างเป็น pipeline

6. Select the best stock

จากนั้นเราก็จะนำ pipeline ไปรันกับหุ้นทุกตัวในกลุ่ม SET100 เราก็จะเริ่มจากการสร้างรายชื่อหุ้นของกลุ่ม SET100 ก่อน โดยใช้ method getMemberOfIndex

นำ dataframe ที่ได้มาแปลงเป็น list

เนื่องจากจะใช้ yahoo ในการดึงข้อมูลหุ้น จึงต้องเปลี่ยนชื่อหุ้นให้มี .bk ตามหลัง เก็บไว้ใน tslist ใช้สำหรับเตรียมดึงข้อมูลหุ้นใน loop ต่อไป

จากนั้นเราก็จะรัน pipeline กับหุ้นทุกตัวที่อยู่ใน SET100 โดยเราจะคัดเลือกเฉพาะหุ้นที่ทำนายออกมาแล้วอยู่ในขาขึ้น (bull == True) ออกมาเก็บไว้ใน dictionary ของเราที่ชื่อ sdict โดยเก็บชื่อหุ้นไว้คู่กับ error ที่ทำนายออกมา

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

นำ stock ที่ได้มารันโมเดลใหม่อีกครั้ง โดยคราวนี้เอา data มาทั้งหมด ไม่ได้แบ่ง train:test เพื่อจะ predict ราคาในอีก 7 วันข้างหน้า ดูว่า stock ตัวไหนมี %การเพิ่มของราคามากที่สุด ก็จะเลือกตัวนั้น

ได้ผลลัพธ์เป็น dictionary ดังนี้

เลือกหุ้นตัวที่ %การเพิ่มขึ้นของราคาเยอะที่สุด โดยใช้ max()

ก็ได้ผลเป็นหุ้น RBF.bk เป็นหุ้นที่โมเดล ARIMA ทำนายราคาออกมาแล้วมี %การเพิ่มขึ้นของราคามากที่สุด= 2.95% เป็นหุ้นที่เราตัดสินใจเลือกซื้อในครั้งนี้

จากนั้นเราทำฟังก์ชั่นเพื่อพลอตกราฟ prediction ของเรา

ก็เห็นว่า ราคาที่ทำนายมามีแนวโน้มเป็นขาขึ้นชัดเจน ราคา 7 วันถัดไปจากนี้ก็มีแนวโน้มที่จะเพิ่มขึ้น แต่จะแม่นยำหรือไม่ ต้องรอลุ้นผลกันต่อไปครับ

ดู colab ตัวเต็มได้ที่นี่ https://colab.research.google.com/drive/1lbtnjl3zFBpJCQho4_reYW8oV-uFpRQ-?usp=sharing

สรุป

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

--

--

Krirk Arunoprayote
botnoi-classroom

AI enthusiast, currently working as Data Scientist at Botnoi Consulting Co., Ltd.