Introduction
ข้อมูลส่วนมากมักจะมีรูปแบบเป็น Sequence Data เช่น ข้อความ, ข้อความเสียง, รหัสพันธุกรรม, วิดีโอ หรือ ข้อมูลอนุกรมเวลา (Time-series Data) จำพวกราคาหุ้น การจะนำข้อมูลเหล่านี้ไปใช้เพื่อวิเคราะห์ หรือใช้เพื่อทำนายผลอะไรบางอย่างจะไม่สามารถใช้ Traditional Neural Network Model (Traditional NN) เข้ามาสร้างผลการวิเคราะห์หรือทำนายในส่วนนี้ได้ เนื่องจากการสร้าง Model ที่มีรูปแบบ Input และ Output เป็น Sequence นั้น ตัว Model จะต้องสามารถเรียนรู้และส่งผ่านความรู้จาก Input ไปจนถึง Output เนื่องด้วยข้อมูลที่มีลักษณะเป็น Sequence Data จะต้องใช้ข้อมูล Input ก่อนหน้า (t-1) จึงมีความสำคัญกับการทำนาย Output ที่เราต้องการในลำดับถัดไป (t) เช่น หากเราต้องการทำนายราคาหุ้นในอนาคต เราก็ต้องใช้ข้อมูลราคาหุ้นในอดีตมาใช้เพื่อให้ Model เรียนรู้ ซึ่ง Traditional NN ไม่ได้ถูกออกแบบมาให้มี Memory เพียงพอที่จะใช้สำหรับการทำงานในลักษณะนี้ เพราะฉะนั้นเราจึงต้องใช้ Sequence Model ที่ถูกออกแบบมาโดยเฉพาะ ซึ่งก็มีตั้งแต่ RNN, LSTM, GRU และ Transformer Model ในงานชิ้นนี้เราจะทำการทดลองใช้ Sequence Model ทั้งหมด 4 แบบ และอีก 1 Traditional ML Model กับข้อมูลที่เป็น Sequence Data โดยลองใช้ข้อมูลราคาหุ้นบริษัท บางกอก เชน ฮิสปิทอล จำกัด (มหาชน) (BCH) มาเป็นตัวอย่าง จุดประสงค์ก็คือเพื่อทดลองทำนายราคาหุ้น BCH ในวันถัดไปโดยใช้ราคาหุ้นในวันก่อนหน้าเป็น Input Data ให้ Model เรียนรู้ เมื่อทดลองเสร็จจะทดสอบประสิทธิภาพในการทำนายของแต่ละ Model เปรียบเทียบกันในลำดับถัดไป
Data
ข้อมูลที่ใช้ในการศึกษาเป็นข้อมูลราคาหุ้นบริษัท บางกอก เชน ฮอสปิทอล จำกัด (มหาชน) หรือตัวย่อ BCH ซึ่งจดทะเบียนอยู่ในตลาดหลักทรัพย์แห่งประเทศไทยในหมวดธุรกิจการแพทย์ ข้อมูลที่ใช้ได้แก่ ราคาปิด ราคาเปิด ราคาสูงสุด ราคาต่ำสุด และปริมาณการซื้อขาย ซึ่งเป็นข้อมูลรายวัน ตั้งแต่วันที่ 9 กุมภาพันธ์ 2555 ถึงวันที่ 23 มีนาคม 2565 คิดเป็นจำนวนข้อมูลทั้งหมด 2,469 วัน แหล่งข้อมูลนำมาจาก Bloomberg ซึ่งเป็นผู้ให้บริการข้อมูลทางการเงินที่น่าเชื่อถือ โดยข้อมูลมีการปรับปรุงการเปลี่ยนแปลงของราคาพาร์ให้เป็นพาร์ปัจจุบัน ทำให้สามารถเปรียบเทียบราคาหุ้นในอดีตกับปัจจุบันได้ดียิ่งขึ้น โดยเมื่อนำข้อมูลราคาปิดของหุ้น BCH ในแต่ละวันมาสร้างกราฟดูพบว่าข้อมูลมีลักษณะมีแนวโน้ม(Trend) และฤดูกาล(Seasonal) เราสามารถแก้ปัญหาดังกล่าวด้วยการใช้อัตราผลตอบแทนในการทำนายแทนการใช้ราคาปิด แล้วนำผลตอบแทน (Return) ที่ได้จากการทำนายมาคำนวณราคาอีกครั้ง หลังจากนั้นแบ่งข้อมูลออกเป็น 3 ส่วนคือ
- ข้อมูลสำหรับ Training โมเดลจำนวน 1,958 วัน
- ข้อมูลสำหรับ Validate โมเดลจำนวน 246 วัน
- ข้อมูลสำหรับ Test โมเดลจำนวน 244 วัน
Training Strategy
ในส่วนของการทำ Training Strategy นั้น เราจะแบ่งออกเป็น 3 Sections: Deep Learning Model, Traditional Model และ Traditional Indicator โดยจะแบ่งรูปแบบของการเปรียบเทียบ result ดังนี้
Section1: จะคำนวนค่า MSE และ MAE ของแต่ละ models ของ deep learning: RNN Simple, LSTM, GRU, CNN+LSTM และ RNN Encoder-Decoder โดยจะทำการแบ่ง train set, validation set และ test set เป็นดังนี้ 0.8,0.1,0.1 ตามลำดับ จากนั้นจะนำมาเปรียบเทียบกันและเลือก model ที่ให้ค่า MSE และ MAE น้อยสุดมา
Section2: จะคำนวนค่า MSE และ MAE ของ traditional model: LGBM
Section3: จะคำนวนค่า MSE และ MAE ของ basic indicator: Moving Average
ซึ่งหลังจากที่ได้ The Best Model จาก Section1 มานั้น จะนำมาเปรียบเทียบกับ Result ที่ได้จาก Section2 และ Section3 เพื่อที่จะได้ Compare ว่า Result ที่ได้จากการ Run Deep Learning Model มี Performance ที่ดีกว่าตัว Traditional Model หรือ Basic Indicator ไหม
Result
จากการเปรียบเทียบผลการทำนายราคาหุ้น BCH ในเวลา t+21 ของ Models ทั้ง 7 ตัวพบว่า Model ที่ให้ผลทำนายดีที่สุดคือ RNN แบบ Encoder-Decoder โดยมี MSE — 0.611 และ MAE — 0.614 และโมเดลที่ได้ผลดีรองลงมาคือโมเดล CNN+LSTM ที่มี MSE — 0.995 และ MAE — 0.804 ในขณะที่ Model ที่เหลือจะมีผลแย่กว่าการใช้ Moving Average ในการทำนาย โดยมีรายละเอียดเพิ่มเติมตามรูปภาพด้านล่างนี้
Traditional ML — LightGBM
เราเลือก LightGBM เนื่องจากเป็น Model ที่มีความเร็ว และมีประสิทธิภาพที่สูง จากการใช้ Gradient Boosting หรือ เทคนิคการเรียนรู้ที่จะสร้างโมเดลที่มีความแม่นยำสูง โดยเรียนรู้จากค่าความคลาดเคลื่อนสะสมที่เกิดจากการทำนายของ Model ที่สร้างก่อนหน้า โดยได้กำหนด parameter ต่างๆ ไว้ดังนี้ { ‘boosting_type’: ‘gbdt’, ‘objective’: ‘regression’, ‘metric’:’l2′, ‘num_leaves’:10, ‘max_depth’:5, ‘drop_rate ‘:0.3, ‘reg_sqrt’:True, ‘boost_from_average’:True, ‘learning_rate’: 0.0001, ‘verbose’: 0, } และตั้งค่าในการ train ไว้เป็น num_boost_round=1000, early_stopping_rounds=100, verbose_eval=50 เมื่อนำโมเดลที่ Train เสร็จเรียบร้อยแล้วมาทดสอบกับข้อมูล test set (ข้อมูลแยกไว้เพื่อทดสอบ Model ในตอนสุดท้าย) ได้ผล Mean Squared Error (MSE) : 3.31 และ Mean Absolute Error : 1.51
RNN Simple
Model ถัดมาที่ทางเราเลือกมาทดลองคือ Simple Recurrent Neural Network (RNN Simple) ซึ่งเป็น Network ที่นำ Output จาก State ที่แล้วมาร่วมเป็น Input ด้วย ซึ่งการทำงานจะคล้ายกับการทำงานเป็น Loop เหมือนกับ Neural Network ธรรมดาที่มีหลายๆ ตัว โดยมี Output ต่อกันเป็น Input เข้า Network ใหม่ และเนื่องจาก RNN ใช้ข้อมูลจาก Network ก่อนๆ ทำให้สามารถทำงานได้ดีในข้อมูลแบบ Time Series ซึ่งเหมาะสมกับข้อมูลราคาหุ้น BCH ที่นำมาใช้
จากการรันโมเดล RNN Simple พบว่าค่า MSE = 1.7033 และค่า MAE = 1.0598 และมีเส้นทำนายตามรูปด้านล่าง ซึ่งจากกราฟจะพบว่าโมเดลสามารถทำนายราคาหุ้น BCH ได้ค่อนข้างแม่นยำในช่วงราคาที่มีแนวโน้มขาลง แต่ในขณะที่ราคามีแนวโน้มขาขึ้น Model จะมีความแม่นยำต่ำลง
LSTM
เราได้นำ LSTM มาทดลองใช้กับการทำนายราคาหุ้น BCH โดยนำราคาปิดมาใช้ในการทำนาย โดยเราได้นำราคาปิดรายวันของหุ้นดังกล่าว มาหาผลตอบแทนรายวันเพื่อให้ข้อมูลมีความ Stationary จากนั้นจึงนำข้อมูลมาทำการ Scaling โดยเราได้เลือกการใช้ StandardScaler ในการแปลงข้อมูล ก่อนที่จะนำข้อมูลนั้นเข้าไป Train ในตัวของ Model โดยมี Architecture ของ model ดังนี้
GRU
Gated Recurrent Unit (GRU) เป็น Recurrent Neural Network (RNN) แบบหนึ่ง ที่ออกแบบมาคล้ายๆ Long Short Term Memory (LSTM) แต่จะช่วยแก้ปัญหาเรื่อVanishing Gradient / Exploding Gradient เพราะประสิทธิภาพของ RNN จะแย่ลงถ้าเจอกับ Sequence ยาว ๆ ทำให้มีการออกแบบ GRU ขึ้นมาแก้ปัญหาเหล่านี้ โดยโครงสร้างของ GRU จะมีระบบปิดเปิดการอัพเดทสถานะภายใน RNN ที่คล้ายกับ (LSTM) ที่จะมี Forget Gate แต่มี Parameter น้อยกว่า LSTM เนื่องจากไม่มี Output Gate GRU ที่มีมีประสิทธิภาพใกล้เคียงกับ LSTM ในหลาย ๆ งาน แต่เนื่องจาก Parameter น้อยกว่าทำให้เทรนได้ง่ายกว่า เร็วกว่า และในบางงานที่ Data Set มีขนาดเล็ก พบว่า GRU มีประสิทธิภาพดีกว่า ในที่นี้ทางเราได้ออกแบบเปรียบเทียบค่าการทำนายหุ้นของโรงพยาบาล BCH บริษัท บางกอก เชน ฮอสปิทอล จำกัด (มหาชน)ด้วยหลักการ GRU ซึ่งเป็นหนึ่งในรูปแบบสถาปัตถรยกรรมของ RNN โดยกำหนดให้มี parameter ที่เหมือนกันดังนี้ Learning rate ที่ 0.001 , epoch 30 epoch , batch size 64 ,ข้อมูลราคา และ return ที่ใช้ในการทำนายล่วงหน้า 20 วัน และ drop out ที่ 0.3 และ Optimizer เป็น Nadam โดยแบ่งข้อมูลเป็น Trian 80 % Validation 10 % และข้อมูล Test 10 %
พบว่า GRU มีค่า MSE = 3.6008 , MAE = 1.765 โดยแนวโน้ม (train) การทำนายราคาที่ได้เป็นไปตามรูปด้านล่างซึ่งมีทิศทางที่ใกล้เคียงกับความเป็นจริง แต่ความแม่นยำในเรื่องราคานั้นค่อนข้างต่ำกว่าราคาจริง ( gap price ) และมีประสิทธิภาพด้อยกว่า RNN ประเภทอื่นๆยกเว้น LSTM
RNN Encoder-Decoder
อีกหนึ่ง model ที่ทางเราเลือกนำมาทดลองคือ RNN Encoder-Decoder architecture เพื่อช่วยแก้ปัญหาการใช้แค่ Simple RNN network เพราะการที่ input และ output เป็น sequence ค่อนข้างซับซ้อนเกินไปสำหรับ Simple RNN network ซึ่งการใช้ Encoder-Decoder วิธีการทำงานนั้น ตัว model จะถูกแบ่งออกเป็น 2 ส่วน คือส่วน Encoder ที่รับ input เป็น sequence และส่วน Decoder ที่จะให้ output ออกมาเป็น sequence เช่นกัน จึงทำงานได้ดีกว่า ซึ่งการตั้งค่า parameter ในการทดลองครั้งนี้ กำหนดจำนวน cells สำหรับ encoder และ decoder model ไว้เท่ากับ 20 และเพิ่ม dropout ในส่วน decoder model เท่ากับ 0.3 ซึ่งเมื่อนำ model ที่ train เสร็จเรียบร้อยแล้วมาทดลองทำนายราคาของหุ้น BCH (ในส่วนของ test set) พบว่าได้ผล Mean Squared Error (MSE) : 0.6113 และ Mean Absolute Error : 0.6136
CNN combined with LSTM
ทางเราได้นำความรู้ที่ได้จากการอ่าน paper ของ Eapen, J., Bein, D., & Verma, A. (2019). Novel deep learning model with cnn and bi-directional lstm for improved stock market index prediction. In 2019 IEEE 9th Annual Computing and Communication Workshop and Conference มาทำการประยุกต์ใช้โดยนำ CNN มา combine รวมกันกับ bi-directional LSTM เพื่อที่จะพัฒนาผลลัพธ์ของการทำนาย Return ของ BCH ให้มีความแม่นยำยิ่งขึ้นกว่าการใช้ LSTM โดยได้ทำการใช้ 1D Convolutional layer ทั้งหมด 3 layers โดยแต่ละตัวมี nodes ดังนี้ 128, 256 และ 512 nodes ตามลำดับ โดยในแต่ละ 1D convolutional layer นั้นจะตามด้วย max pooling layer ซึ่งตัว output จะทำการ fatten ก่อนที่จะ feed เข้าสู่ bi-directional LSTM โดยในแต่ละ layer ของ bi-directional LSTM จะทำการเพิ่ม dropout เท่ากับ 0.3 ดังรูปด้านล่าง
ซึ่งเมื่อนำ model ที่ train เสร็จเรียบร้อยแล้วมาทดลองทำนายราคาของหุ้น BCH (ในส่วนของ test set) พบว่าได้ผล Mean Squared Error (MSE) : 0.9945 และ Mean Absolute Error : 0.8041 โดยมีความแม่นยำน้อยกว่า RNN Encoder-Decoder