LSTM + embedding model for predicting stock price and how to improve it.

Suphapol Wongsawat
3 min readJun 29, 2021

--

คือก่อนอื่นเลยผมแนะนำให้ไปอ่าน blogนี้ก่อนเพราะ code ส่วนใหญ่ใน project นี้ base บน blog ที่ผมกล่าวถึงนั้นเอง ก็คือการทำงานของแบบ fundamental ของ model ที่ผมเพิ่มเติมมาเนี่ยมันเหมือนเดิมเลย แค่ทำการเพิ่ม feature เข้าไปเพื่อ improve มันขึ้นเท่านั้นเอง

การทำนายหุ้นที่ทำเป็น การทำ forecast ของข้อมูลที่เป็น time series แบบ multivariate โดยการเอา feature ที่มีอยู่มาใส่ stock indicator เพิ่มแล้วใส่ไปใน model ทำให้ใน production model มี feature ได้แก่ High price(ราคาสูงสุด), Low price(ราคาต่ำสุด), Open price(ราคาเปิด), Close price(ราคาปิด), Volume(ปริมาณการซื้อขาย), Adj Close(ราคาปิดที่เปลี่ยนไป), SMA20(simple moving average 20 days), T3(smoothed simple moving average)

Model overview

สำหรับคนที่ต้องการอ่านรายละเอียดของ model ผมแนะนำให้อ่านใน blogนี้ แต่โดยรวมที่แตกต่างกับ code original ก็คือ การทำ feature engineering เพิ่มเติมขึ้นมาโดยการใส่ stock indicator เข้าไปเพิ่มเป็น sequential feature เท่านั้น ในส่วนของ static feature ที่เป็น datetime ไม่มีการเปลี่ยนแปลงอะไร

preprocessing data

เราแบ่ง feature ได้เป็น 2 กลุ่ม กลุ่มแรกคือ sequential feature ได้แก่ Open/Close price, High/Low price, Volume และ stock indicator โดยจะ input ค่าของ feature ไปเป็นลำดับ [High(t-1), Low(t-1), Open(t-1), Volume(t-1), Adj Close(t-1), atr(t-1), …, High(t-n), Low(t-), Open(t-n), Volume(t-n), Adj Close(t-n), atr(t-n)] แล้วเราก็ input feature กลุ่มนี้เข้า RNN layer(โดยใช้ LSTM)

กลุ่มที่สอง คือ static feature ซึ่งเป็น feature ที่เราไม่ต้องมีลำดับ ในที่นี้เรากำหนดให้ categorical feature ทั้งหมดที่สร้างมาจาก datetime เป็น static feature สำหรับ input เข้า embedding layer

กำหนด target

target เราคือ %close price change เทียบกับวันก่อนหน้า โดยเรายังสามารถนำ target ก่อนหน้าไปเป็น sequential feature ได้อีกด้วย

In a nutshell หน้าตา model เราจะเป็นแบบนี้

model architecture

การเลือก stock indicator ที่ดี

การเลือก indicator ที่เหมาะเอามาเป็น feature มันไม่ได้ simple อย่างที่คิด คือ ถ้าเลือกอันที่ถูกต้องมาก มันจะ work มากๆ เช่น SMA หรือ T3 แต่ถ้าเอา indicator ที่ไม่ work มา มันก็จะทำให้พลาดไปเยอะเลยเช่น NATR, WMA, WCL price เป็นต้นครับโดยหลักการเลือก indicator ที่นำมาเป็น feature ของผมก็คือเลือกเอาตัวที่ สามารถคำนวณได้จากราคาปิดตลาด(Close price) เพราะว่าtarget ที่โปรแกรมมันมีหน้าที่หาคือ %close price change นั้นเอง

มาดูกันว่าการใส่ indicator มาเป็น feature จะช่วยได้มากแค่ไหน กราฟ ต่อไปนี้เป็นกราฟที่ได้จากการ นำmodel ที่ train แล้ว 3 แบบมา predict ข้อมูลที่ไม่เคยเห็นมาก่อนโดย train ด้วยข้อมูลจาก 1990–01–01 ถึง 2019–01–01 แล้วมีข้อมูลที่ input จากวันที่ 2019–01–02 ถึง 2021–06–25.

Result

สีน้ำเงิน* = ราคาที่คำนวณจาก % ความเปลี่ยนแปลงแต่ละวัน

*เพราะสีน้ำเงินทับกับสีเหลืองทำให้เห็นแต่สีเหลือง

สีแดง = ราคาที่ model ทำนาย

สีเหลือง = ราคาที่นำมาจากข้อมูลที่มีอยู่

Model ที่ไม่ใส่ indicator

graph ราคา ที่ได้จาก model ที่ไม่ใส่ indicator เพิ่มเติม 100 วัน
Predicted vs True %price change (no indicator) 905 วัน

loss MSE ที่ได้คือ 6.5680 ไม่ค่อยดีเท่าไหรแต่ยังพัฒนาได้อีก

Model ที่ใส่ SMA และ T3 เป็น indicator

graph ราคา ที่ได้จาก model ที่ใส่ SMA และ T3 100 วัน
Predicted vs True %price change (SMA+T3) 905 วัน

loss MSE ที่ได้คือ 6.5266 ดีขึ้นเล็กน้อยแต่ %price change ไม่ค่อยจะดีเท่าไหรเพราะแทบไม่ขยับเลย

Model ที่ใส่ NATR เป็น indicator

graph ราคา ที่ได้จาก model ที่ใส่ NATR 100 วัน
Predicted vs True %price change (NATR) 905 วัน

ถึงแม้ว่า loss ที่ได้ คือ 4.7017 แต่เห็นไหมว่ามันผิดแบบเต็มๆเลยเอาไปใช้ไม่ได้เลยเพราะราคาที่ทำนายได้มันมั่วไปหมดเลย

Precision

ไม่ใส่ indicator: 19%

SME20 และ T3: 50%

NATR: 19%(not usable)

จากจำนวนครั้งที่ model ทายถูกว่าราคาจะขึ้น

การเลือก indicator ของผมมาจาก trial and error แบบ 100% เลยดังนั้นถ้ามีเวลามากกว่านี้อาจจะดันให้ loss ต่ำไปมากว่านี้แต่ว่าผมแนะนำให้ไปลองเล่นเองดีกว่าน่ะครับผมจะทิ้ง link ให้ไปลองเล่นกันดูด้านล่าง

https://lstm-stock-predictor.herokuapp.com/

https://github.com/KatieMarsh/STONK

--

--