Stock Price Prediction (Use 5 Model From Keras)
เนื้อหาภายในเอกสารนี้ถูกเขียนขึ้นและจัดทำโดยนาย ธีระทัศน์ นครินทร์ รหัสนักศึกษา 6730614019 สาขา AISE ปี 2
เรามาเริ่มในหัวข้อแรกจะพูดถึงว่าเราทำไปทำไม
ในส่วนของการสร้างตัวของ AI Prediction เพื่อทำเกี่ยวกับการทำนายราคาหุ้นตามโจทย์ของ Website Stock Price Prediction AISE 2025 | Kaggle โดยใช้โมเดล Machine Learning ในการพัฒนา ข้อมูลที่ได้มาจาก Website Stock Price Prediction AISE 2025 | Kaggle ประกอบไปด้วย ไฟล์หุ้นตั้งแต่ปี 2009 ซึ่งเราจะใช้แค่ไฟล์หุ้นไม่ได้ เราต้องนำมันไปผ่านขั้นตอนเตรียมข้อมูลก่อน และนำไปประมวณผล เพื่อพัฒนาโมเดล NN หรือก็คือ Neural Network เป็นประเภท Sequential Model เพื่อทำนายราคาปิดล่วงหน้า
ในหัวข้อต่อไปจะเป็นเกี่ยวกับ Flowchart การทำงาน และ Pseudo Code
เริ่มแรกด้วย Pseudo Code
เริ่มโปรแกรม
แสดงข้อความ "เริ่มการเทรนกรุณารอจนกว่าจะเสร็จสิ้นกระบวนการณ์"
เตรียมข้อมูล Train โดยเริ่มจาก โหลดไฟล์ train.csv และสั่งให้ เลือกเฉพาะข้อมูลราคาช่วงท้าย 700 แถวสุดท้าย เพราะต้องการตัดข้อมูลที่ไม่จำเป็นออกไปจะได้ทำให้ผลที่เรานำมาคำนวณนั่นมีความแม่นยำมากยิ่งขึ้น และดึงคอลัมน์ price มาเป็นข้อมูลหลักใช้ MinMaxScaler แปลงช่วงราคาให้อยู่ในช่วง [0, 1]
สร้างชุดข้อมูลแบบลำดับเวลาซึ่งเราจะกำหนดเป็น 30 วันซึ่งจะได้เป็น i ตั้งแต่ 30 ถึง ความยาวข้อมูลที่สเกลแล้ว
X[i] = ราคาย้อนหลัง 30 วัน (ตำแหน่ง i - 30 ถึง i-1)
y[i] = ราคาที่ตำแหน่ง i (ราคาวันถัดไป)
แปลง X เป็นรูป (จำนวนตัวอย่าง, 30, 1) เพื่อใช้กับ LSTM ครับ
เตรียมข้อมูล test และจำนวนวันที่จะทำนายเริ่มด้วยโหลดไฟล์ test.csv มาก่อนและกำหนด
steps = จำนวนแถวใน test.csv
last_sequence = ข้อมูลราคาที่สเกลแล้ว 30 วันสุดท้ายจาก train (ใช้เป็น seed เริ่มต้นทำนาย)
all_predictions = ลิสต์ว่าง
ทำ Ensemble LSTM 5 โมเดล สร้างโมเดล LSTM ใหม่ ตั้งค่า EarlyStopping โดยดูจากค่า loss เทรนโมเดลด้วย X_train, y_train ซึ่งเราจะตั้งค่าไว้ที่ 100 Epochs และ batch เป็น 16
current_batch = last_sequence (reshape เป็น (1, 30, 1))
predictions เป็นลิสต์ว่าง
ทำซ้ำ steps ทำนายค่าราคาถัดไปจาก current_batch เก็บค่าที่ทำนายไว้ใน predictions ตัดวันเก่าสุดออก แล้วต่อด้วยค่าที่ได้ทำนายมาใหม่ แปลง predictions จากสเกล [0,1] กลับไปเป็นราคาจริงด้วย scaler.inverse_transform เก็บ predictions ของโมเดลนี้ลงใน all_predictions
รวมผล Ensemble โดยการแปลง all_predictions เป็น array รูป (5, steps, 1) avg_predictions = ค่าเฉลี่ยข้ามแกนโมเดล -> ได้ (steps, 1)
สร้างไฟล์ submission สร้าง DataFrame ที่มีคอลัมน์
id = id จาก test.csv
price = avg_predictions
บันทึกเป็นไฟล์ submission_6730614019_7.csv
แสดงตัวอย่างผลลัพธ์และ plot กราฟ พิมพ์หัวตาราง submission.head() plot กราฟ avg_predictions (สีแดง) แสดงแนวโน้มราคาที่ทำนายได้
จบโปรแกรมครับ
ส่วนถ้าเขียนให้เป็น Flowchart ก็จะได้ 9 ข้อตามนี้เลยครับ
Start
Load & Preprocess train
Create sequences X, y
Load test, กำหนด steps และ last_sequence
วนลูปเทรนโมเดล 5 รอบ + ทำนายล่วงหน้า
เฉลี่ยผลทำนาย (ensemble)
สร้างและบันทึกไฟล์ submission
Plot ผล
End
ต่อมาเราจะมาในส่วนของการเตรียมข้อมูลแล้วอันนี้จะมีหลายส่วนนิดครับ เราจะมี 3 ส่วนหลักๆ เริ่มที่อันแรกก่อนคือผมจะเลือกช่วงเวลาของข้อมูลที่จะนำมาใช้ก่อนก็คือ 700 วันช่วงท้าย ส่วนเหตุผลก็คือ เราจะใช้แค่ข้อมูลที่ใหม่ๆก่อนครับ เพราะข้อมูลเก่าๆมันอาจจะใช้ไม่ได้แล้วเลยใช้อันใหม่ๆจะดีที่สุด
ต่อมาจะทำการ Scaling ด้วย MinMaxScaler แปลงข้อมูลราคาให้อยู่ระหว่าง 0 กับ 1 เพื่อให้การเทรน LSTM มีความแม่นยำมากขึ้นครับ หลังเราคำนวนเสร็จเราก็จะใช้ scaler inverse ต่อเพื่อแปลงข้อมูลที่ได้กลับมาเป็นราคาครับ
ต่อมาทำการสร้าง Sequence โดยให้ lookback มีค่า = 30 เพื่อให้ดูข้อมูลย้อนหลัง 30 วัน Input X[i] จะมีค่า = ราคาย้อนหลัง 30 วันตามที่เรากำหนดไว้ และ Output y[i] จะได้เป็นราคาวันถัดไปก็จะเป็นวันที่ 31 แล้วทำการ Reshape X เป็น Sample timesteps feature จะได้เป็น N, 30, 1 ตามค่าของ LSTM
ต่อมาเรื่องของ โมเดล Sequential + Hyperparameters ในส่วนนี้เราจะไล่โค้ดมาอธิบายเพื่อให้เห็นภาพมากขึ้นโดยเราจะเริ่มจากการสร้าง LSTM ขั้นแรกจำนวน 50 units และให้มันส่ง output ทั้ง sequence ต่อไปให้กับ LSTM ตัวต่อไป และ input shape จะได้เป็น 30, 1 ก็คือ timesteps 30 วัน features 1
ต่อมา LSTM ที่ 2 จะมีจำนวน 50 units และบังคับให้ใช้เฉพาะ output ของ timestep ตัวสุดท้ายก็คือ สรุปข้อมูลทั้งหมดใน 30 วันให้เหลือ อันเดียวเป็นแบบ Vector
ต่อมาจะเป็นในส่วนของ Dense จะมี 25 neurons เพื่อช่วยเรียนรู้ mapping ที่ซับซ้อนระหว่าง representation ของ LSTM กับราคา
ต่อมาจะเป็น Dense 1 ก็คือจะเป็น Output เป็นสเกลราคาหนึ่งค่า ก็คือ ราคาวันถัดไปในรูปแบบที่ถูก scale 0-1
และสุดท้ายทำการ compile model โดยใช้ adam เป็น optimizer เพื่อให้เสถียร และ loss เป็น mean squared error เพราะเหมาะกับ regression ค่าต่อเนื่อง
จบกับ Sequential ต่อมาจะเป็น Hyperparameters
ในการ train เราจะตั้งค่า epochs ไว้ที่ 100 เป็นค่าสูงสุดแต่จะมี EarlyStopping คอยหยุดก่อนถ้า Loss ไม่ดีขึ้นและ batch อยู่ที่ 16 ในส่วนของ EarlyStopping เราใช้ดูค่า training loss และเราตั้ง patience ไว้ที่ 10 ก็คือถ้าค่า loss ไม่ดีขึ้นติดกัน 10 epochs จะหยุดเทรนทันทีและหลังหยุดแล้วจะย้อนกลับไปใช้ weight ที่ได้ค่าที่ดีที่สุดบน train loss ในส่วนของการเทรนเราจะใช้ โมเดลทั้งหมด 5 ตัวในการทำนายและเฉลี่ยค่าออกมาเพื่อลดความผันผวนจากการ Random Weight และช่วยให้ได้ผลที่ดีขึ้น
ต่อมาในส่วนของการ ประเมินผลความถูกต้องหรือ Validate
ถ้าพูดตามตรงสิ่งที่โค้ดที่แนบไว้ ไม่มีการแบ่ง Train และ Validation ที่แยกกันอย่างชัดเจนแต่ใช้ EarlyStopping จากค่า Training loss มา Monitor ถ้าไม่ดีขึ้นติดต่อกัน 10 รอบติด จะหยุดเทรน ที่ทำแบบนี้มันสามารถช่วยป้องกันการเทรนจน overfit มาเกินไปบน Trainset และใช้ Ensemble 5 Model ถ้ามีการ Overfit หรือ random noise จากโมเดลบางตัวค่าเฉลี่ยของ 5 ตัวทั้งหมดนี้จะช่วยให้ผลดูเสถียรมากขึ้น และมีการ plot กราฟเส้นของผลลัพธ์ ที่ได้เพื่อตรวจสอบรูปแบบแนวโน้มด้วย
สามารถดูโค้ดได้ที่ : https://colab.research.google.com/drive/1V5czs5T4Ei_nIQjGkhTk0DRWRNVwnVNG?usp=sharing

Top comments (0)