สวัสดีครับ ผมคือ 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)