DEV Community

Attanon Sukkeaw
Attanon Sukkeaw

Posted on

Stock Price Prediction by ML Models

สวัสดีครับ ผมคือ AI Engineer มือใหม่
วันนี้ผมจะมาแชร์ประสบการณ์การทำนายหุ้นโดยใช้รูปแบบ Hybrid-model ซึ่งคือ
การผสมกันระหว่าง LSTM + Transformer Hybrid Model

ซึ่งวันนี้ผมจะมาอธิบายว่า LSTM คืออะไร และ Transformer คืออะไร พร้อมหลักการทำงานของโค้ดที่ผสมระหว่าง 2 models นี้

1.LSTM คือ Long Short‑Term Memory (LSTM) เป็นรูปแบบหนึ่งของ Recurrent Neural Network (RNN) ที่ถูกพัฒนาโดย Sepp Hochreiter และ Jürgen Schmidhuber เพื่อจัดการกับปัญหาการเรียนรู้แบบ “ขึ้นกับบริบทในอดีตระยะยาว” (long-term dependencies) ซึ่ง RNN ปกติทำได้ไม่ดีนัก LSTM จึงเพิ่ม “เซลล์ความจำ” (memory cell) เข้าไปในโครงสร้าง ทำให้สามารถเก็บข้อมูลระยะยาว และเลือกที่จะลืมหรือจดจำข้อมูลที่สำคัญได้

2.Transformer คือ Transformer คือ สถาปัตยกรรมของ Neural Network ชนิดหนึ่ง ที่ออกแบบมาเพื่อแปลงข้อมูลลำดับหนึ่งไปยังลำดับอีกชุดหนึ่ง (Sequence-to-Sequence) หรือจากตัวเข้ารหัส (Encoder) ไปยังตัวถอดรหัส (Decoder)
โดยมักใช้แก้ปัญหาเช่นการแปลภาษาที่ต้องจับความซับซ้อนของ อารมณ์และบริบท ในข้อความได้อย่างแม่นยำ

Transformer ใช้กลไกที่เรียกว่า Self-Attention ซึ่งทำงานโดยการมองหาความสัมพันธ์ระหว่างทุกตำแหน่งของข้อมูลกับทุกตำแหน่งในลำดับเดียวกัน พร้อมกำหนดน้ำหนักความสำคัญให้กับแต่ละตำแหน่ง โดยไม่สนใจว่าระยะห่างของข้อมูลจะอยู่ใกล้หรือไกลกันแค่ไหน ทำให้โมเดลสามารถเข้าใจบริบทในระดับกว้างได้อย่างมีประสิทธิภาพ

การเตรียมข้อมูล Data Preprocessing
ผมจะโหลดข้อมูลหุ้นไฟล์ CSV ซึ่งมี train(1).csv, test(1).csv, sample_submission(1).csv และทำการปรับข้อมูลด้วย MinMaxScaler เพื่อให้อยู่ในช่วง 0 ถึง 1 ซึ่งช่วยให้โมเดลเรียนรู้ได้อย่างมีประสิทธิภาพ จากนั้นผมได้สร้างชุดข้อมูลแบบลำดับโดยการแบ่งข้อมูลราคาย้อนหลังจำนวน 90 วันเป็นอินพุต และใช้ราคาของวันถัดไปเป็นเป้าหมาย โดยจัดรูปแบบข้อมูลให้อยู่ในมิติที่เหมาะสมสำหรับโมเดล

sequential model และ hyper parameters
ผมสร้างโมเดลด้วย Keras โดยใช้ LSTM 3 ชั้นเพื่อจับแนวโน้มข้อมูลระยะสั้น จากนั้นแปลงเป็น embedding แล้วส่งเข้า Transformer block ที่มี multi-head attention 4 หัว เพื่อเรียนรู้ความสัมพันธ์ระยะยาว ใช้ dropout ลดการ overfitting และ GlobalAveragePooling ก่อนส่งผ่าน dense layer ทำนายราคาวันถัดไป ผมตั้งพารามิเตอร์สำคัญ เช่น window size 90, embedding dimension 64, learning rate 0.0005 และ weight decay เพื่อให้โมเดลฝึกได้ดีและเสถียร

*การ Validate ข้อมูล *
การตรวจสอบโมเดล ผมใช้การแยกข้อมูล validation 10% จากชุดฝึก เพื่อประเมินประสิทธิภาพโมเดลในแต่ละ epoch และใช้ EarlyStopping เพื่อหยุดการฝึกหากค่า validation loss ไม่ดีขึ้นภายใน 10 รอบ ช่วยป้องกันการ overfitting และคืนโมเดลที่ดีที่สุดกลับมา__

Pseudo Code
เริ่มต้นโปรแกรม

โหลดข้อมูล train, test, sample_submission

กำหนด hyperparameters:
WINDOW = 90
EMBED_DIM = 64
NUM_HEADS = 4
FF_DIM = 128

ทำการ Normalize ราคาหุ้นใน train ด้วย MinMaxScaler

ฟังก์ชัน create_dataset(data, window):
สำหรับทุกตำแหน่งตั้งแต่ window → สิ้นสุดข้อมูล:
X = ข้อมูลย้อนหลังตามจำนวน window วัน
y = ราคาวันถัดไป
ส่งคืน X, y

สร้างชุดข้อมูล X_train, y_train ด้วย WINDOW ขนาด 90 วัน
ปรับรูป X_train ให้มีรูปแบบ (จำนวนข้อมูล, WINDOW, 1)

สร้างคลาส TransformerBlock:
- Multi-head attention
- Feed-forward network
- Layer normalization + dropout

สร้างโมเดล:
Input: sequence 90 วัน, รูปแบบ (WINDOW,1)
ผ่าน LSTM 3 ชั้น (return_sequences=True ทุกชั้น)
ผ่าน Dense เพื่อแปลงเป็น embedding (EMBED_DIM)
ผ่าน TransformerBlock 1 ชั้น
Global Average Pooling
Dropout
Dense(1) → ให้ผลลัพธ์ราคาวันถัดไป

คอมไพล์โมเดลด้วย optimizer AdamW และ loss = MSE

สร้าง EarlyStopping เฝ้าดู val_loss

ฝึกโมเดลด้วย:
epochs = 100
batch_size = 32
validation_split = 0.1
early stopping

---- เริ่มการพยากรณ์อนาคต ----

นำ WINDOW วันสุดท้ายของ train มาสร้างอินพุตเริ่มต้น

วนซ้ำสำหรับจำนวนวันใน test:
1) โมเดลทำนายราคาวันถัดไป (แบบ scaled)
2) เก็บผลลัพธ์ไว้ใน predictions
3) นำการทำนายใหม่มาต่อท้าย window และเลื่อนหน้าต่างข้อมูล 1 วัน
4) ใช้ window ใหม่ในการทำนายครั้งถัดไป

Inverse transform ผลลัพธ์กลับไปเป็นราคาจริง

โหลด sample_submission
แทนที่คอลัมน์ price ด้วยผลพยากรณ์ทั้งหมด

บันทึก submission.csv

จบโปรแกรม

Top comments (0)