เรียนรู้ › EA และเทรดอัตโนมัติ
Walk-forward analysis คืออะไร ทดสอบ EA แบบเลื่อนหน้าต่าง ไม่หลอกตัวเอง
หาค่าบนช่วงหนึ่ง ทดสอบบนช่วงถัดไปที่ไม่ได้ใช้เลือก แล้วเลื่อนต่อ อธิบายแบบ rolling กับ anchored, Walk-forward efficiency และตัวอย่างคำนวณทีละรอบ
- Walk-forward คือหาค่าบนช่วงหนึ่ง ทดสอบบนช่วงถัดไปที่ไม่ได้ใช้เลือก แล้วเลื่อนไปทำซ้ำหลายรอบ
- ผลที่เชื่อได้คือผลช่วงทดสอบต่อกันทุกรอบ ไม่ใช่ผลช่วงหาค่า
- Walk-forward efficiency = ผลช่วงทดสอบต่อปี ÷ ผลช่วงหาค่าต่อปี ใช้ดูคร่าว ๆ ว่าผลหายไปเท่าไร
- หาค่าทั้งช่วงครั้งเดียว ตัวเลขจะสวยเกินจริงเกือบทุกครั้ง เพราะเลือกโดยรู้อนาคตแล้ว
- ถ้ากลับไปแก้ระบบจนช่วงทดสอบดูดี ช่วงทดสอบนั้นกลายเป็นช่วงหาค่าทันที
Walk-forward analysis (ทดสอบแบบเลื่อนหน้าต่าง) คือวิธีทดสอบ EA ที่หาค่าตั้งบนข้อมูลช่วงหนึ่ง แล้วเอาค่านั้นไปรันบนช่วงถัดไปที่ไม่ได้ใช้เลือก จากนั้นเลื่อนทั้งสองช่วงไปข้างหน้าแล้วทำซ้ำ ผลที่ได้คือผลทดสอบหลายช่วงที่ระบบ “ไม่เคยเห็น” ตอนเลือกค่า ใกล้กับสิ่งที่จะเจอตอนรันจริงมากกว่า Backtest ที่จูนทั้งก้อน
ทำไม Backtest ที่จูนทั้งก้อนถึงหลอกเรา
ทุกครั้งที่กด Optimization แล้วหยิบชุดค่าที่ผลดีที่สุด เราให้ข้อมูลในอดีตเลือกค่าให้ ผลของชุดที่ชนะจึงมีโชคของช่วงนั้นติดมาด้วยเสมอ ยิ่งลองหลายชุด โชคยิ่งปนมาก รายละเอียดเรื่องนี้อยู่ในบท Overfitting: เลือกที่ราบ ไม่ใช่ยอดแหลม
ปัญหาที่สองคือตลาดเปลี่ยนนิสัย ค่าที่ดีที่สุดเมื่อ 3 ปีก่อนอาจไม่ใช่ค่าที่ดีที่สุดวันนี้ (ตลาดเปลี่ยน regime) ถ้าหาค่าครั้งเดียวบนข้อมูล 5 ปี เท่ากับเลือกค่าที่รู้แล้วว่าตลาดทั้ง 5 ปีเป็นยังไง ซึ่งตอนรันจริงเราไม่มีวันรู้ล่วงหน้า
Walk-forward ทำงานยังไง
ศัพท์สองคำที่ต้องรู้
- In-sample (IS) ช่วงข้อมูลที่ใช้หาค่า ผลช่วงนี้ดีเพราะเราเลือกให้มันดี
- Out-of-sample (OOS) ช่วงข้อมูลที่ไม่ได้ใช้เลือกค่า ผลช่วงนี้คือของที่ใกล้ความจริงกว่า
ขั้นตอน
- กำหนดช่วงหาค่า เช่น 2 ปี และช่วงทดสอบ เช่น 6 เดือน
- หาค่าบนช่วงหาค่า ด้วยเกณฑ์ที่ตั้งไว้ก่อน
- รันค่านั้นบนช่วงทดสอบ 6 เดือนถัดไป จดผลไว้ ห้ามแก้อะไร
- เลื่อนทั้งสองช่วงไปข้างหน้า 6 เดือน แล้วกลับไปข้อ 2
- ต่อผลช่วงทดสอบทุกรอบเข้าด้วยกัน นี่คือผล Walk-forward
เลื่อนได้สองแบบ
- Rolling ช่วงหาค่ายาวเท่าเดิม ข้อมูลเก่าหลุดออกไปเรื่อย ๆ ตามตลาดได้ไวกว่า แต่ใช้ข้อมูลน้อยกว่า
- Anchored ช่วงหาค่าเริ่มที่ต้นข้อมูลเสมอ และยาวขึ้นทุกรอบ ค่านิ่งกว่า แต่ข้อมูลยุคเก่ายังดึงค่าไว้แม้ตลาดเปลี่ยนไปแล้ว
ตัวอย่างคำนวณ: ระบบ MA ตัวเดียว บนตลาดที่เปลี่ยนนิสัย
เราสร้างซีรีส์ราคาสมมติด้วย node ไม่ใช่ตลาดจริง ราคาเริ่มราว 85 แกว่งอยู่ระหว่าง 73–132 สามปีแรกราคามีรอบขึ้นลงยาว ส่วนสองปีหลังรอบสั้นลงมาก ปน noise สุ่มทุกแท่ง นับ 250 แท่งเป็น 1 ปี
ระบบง่ายที่สุด ราคาปิดอยู่เหนือ SMA (ค่าเฉลี่ยราคาปิด n แท่ง ดู เส้นค่าเฉลี่ย MA) ให้ถือ Buy อยู่ใต้ให้ถือ Sell ถือ 1 หน่วยตลอด หักต้นทุน 0.1 จุดทุกครั้งที่กลับฝั่ง ค่าที่ให้เลือกคือ n = 10, 20, … 200 รวม 20 ค่า เกณฑ์เลือกคือกำไรสุทธิสูงสุดในช่วงหาค่า
| รอบ | MA ที่เลือก | ช่วงหาค่า (จุดต่อปี) | ช่วงทดสอบ 6 เดือน (จุด) | ช่วงทดสอบ (จุดต่อปี) |
|---|---|---|---|---|
| 1 | 70 | 25.4 | +13.9 | 27.9 |
| 2 | 60 | 22.3 | +10.6 | 21.2 |
| 3 | 20 | 29.2 | −14.5 | −29.1 |
| 4 | 80 | 25.1 | +13.2 | 26.4 |
| 5 | 80 | 22.4 | +16.1 | 32.2 |
| 6 | 160 | 24.3 | +0.4 | 0.8 |
“ต่อปี” คือปรับให้เทียบกันได้ ช่วงหาค่า 2 ปีหารด้วย 2 ช่วงทดสอบ 6 เดือนคูณ 2
รอบ 3 เป็นรอบที่ช่วงทดสอบตรงกับจุดเปลี่ยนนิสัยพอดี ช่วงหาค่าเลือก MA 20 ซึ่งเป็นยอดแหลม (กำไร 58.4 จุด ขณะที่ MA 10 ได้ 28.1 และ MA 30 ได้ 31.3) แล้วขาดทุนทันทีในช่วงทดสอบ ส่วนรอบ 1, 4, 5 ช่วงทดสอบดีกว่าช่วงหาค่า นั่นคือโชคของ 6 เดือน ไม่ใช่ระบบเก่งขึ้น
คำนวณผลรวม
- ช่วงทดสอบต่อกัน 6 รอบ = 13.94 + 10.59 − 14.54 + 13.22 + 16.12 + 0.39 ≈ 39.7 จุด ใน 3 ปี = 13.2 จุดต่อปี
- ช่วงหาค่าเฉลี่ย = (25.38 + 22.28 + 29.19 + 25.13 + 22.45 + 24.29) ÷ 6 = 148.72 ÷ 6 = 24.8 จุดต่อปี
- Walk-forward efficiency (WFE) = 13.24 ÷ 24.79 = 0.53 หรือ 53%
ตรวจกลับ 24.79 × 0.534 = 13.24 ตรงกับผลช่วงทดสอบ แปลว่าราวครึ่งหนึ่งของผลที่เห็นในช่วงหาค่าหายไปเมื่อเจอข้อมูลใหม่
เทียบกับหาค่าครั้งเดียวทั้ง 5 ปี ค่าที่ดีที่สุดคือ MA 80 ได้ 98.88 จุด ใน 5 ปี = 19.8 จุดต่อปี ดูดีกว่าผล Walk-forward 19.78 ÷ 13.24 = 1.49 เท่า ทั้งที่เป็นระบบเดียวกัน ส่วนต่างนี้คือผลของการเลือกโดยรู้แล้วว่าตลาดทั้ง 5 ปีเป็นยังไง
ซีรีส์เดียวอาจบังเอิญ เราจึงสร้างซีรีส์แบบเดียวกันอีก 200 ชุด (เปลี่ยนแค่ noise สุ่ม) เฉลี่ยแล้วช่วงหาค่าได้ 30.5 จุดต่อปี ช่วงทดสอบได้ 12.1 จุดต่อปี การหาค่าครั้งเดียวทั้ง 5 ปีรายงาน 23.3 จุดต่อปี และสูงกว่าผล Walk-forward ใน 182 จาก 200 ชุด อีก 39 ชุดผล Walk-forward ติดลบ ทั้งที่ผลช่วงหาค่าเฉลี่ยเป็นบวกทุกชุด
Walk-forward efficiency ใช้ยังไง
WFE คือผลช่วงทดสอบต่อปี หารด้วยผลช่วงหาค่าต่อปี แนวคิดนี้เป็นที่รู้จักจากงานของ Robert Pardo เรื่องการทดสอบระบบเทรด ใช้ตอบคำถามเดียว คือผลที่เห็นตอนหาค่า เหลือรอดถึงข้อมูลใหม่กี่ส่วน
- ใกล้ 100% ผลแทบไม่หาย ดีเกินไปจนต้องเช็คว่ามีข้อมูลอนาคตรั่วเข้าไปหรือเปล่า
- ราว 50% ขึ้นไป หลายตำราใช้เป็นเกณฑ์คร่าว ๆ ว่าพอรับได้
- ต่ำมาก หรือติดลบ ผลช่วงหาค่าส่วนใหญ่เป็นโชคของช่วงนั้น
ตัวเลขนี้หยาบ อย่าใช้ตัวเดียวตัดสิน ในตัวอย่าง 6 รอบข้างบน ถ้าตัดรอบ 3 ออกรอบเดียว WFE กระโดดจาก 53% เป็นราว 91% (21.7 ÷ 23.9) ดูคู่กับ 3 อย่างนี้เสมอ
- มีกี่รอบที่ช่วงทดสอบขาดทุน
- ค่าที่เลือกในแต่ละรอบกระโดดไปมาหรือนิ่ง (ในตัวอย่าง กระโดดจาก 20 ไป 80 ไป 160)
- Drawdown ในช่วงทดสอบ เทียบกับช่วงหาค่า
ควรแบ่งกี่รอบ และช่วงยาวเท่าไร
- ช่วงทดสอบต้องมีไม้มากพอ ถ้าช่วง 6 เดือนมีแค่ 5 ไม้ ผลรอบนั้นเป็นแค่เหรียญ ให้ยืดช่วงทดสอบ หรือทดสอบหลายตลาดเพิ่ม
- สัดส่วนที่นิยม ช่วงหาค่ายาวกว่าช่วงทดสอบราว 3–5 เท่า ตัวอย่างในบทนี้ใช้ 4 เท่า (2 ปีต่อ 6 เดือน)
- รอบมากกว่าดีกว่า 2–3 รอบยังบอกอะไรได้น้อย ช่วงทดสอบรวมกันควรครอบทั้งช่วงตลาดวิ่งและช่วงตลาดนิ่ง
- ความถี่ที่หาค่าใหม่ ควรเท่ากับที่จะทำจริงตอนรัน ถ้าทดสอบด้วยการหาค่าใหม่ทุก 6 เดือน แต่ใช้จริงตั้งครั้งเดียวแล้วทิ้งไว้ 3 ปี ผลทดสอบก็ไม่ได้วัดสิ่งที่เราทำ
ส่วน rolling หรือ anchored ดีกว่า ไม่มีคำตอบตายตัว ในซีรีส์ตัวอย่าง anchored ได้ 8.9 จุดต่อปี แย่กว่า rolling เพราะข้อมูลยุคก่อนเปลี่ยนนิสัยยังดึงค่าไว้ แต่เฉลี่ย 200 ชุด ทั้งสองแบบใกล้กันมาก (11.7 กับ 12.1)
เลือกค่าแบบไหนในแต่ละรอบ
กฎเลือกค่าต้องเขียนไว้ก่อนเริ่ม และใช้กฎเดียวกันทุกรอบ ถ้าแต่ละรอบเลือกด้วยสายตา ผล Walk-forward ก็ปนการตัดสินใจหลังเห็นผลแล้ว
กฎที่หลายคนใช้คือเลือกกลาง ที่ราบ ค่าที่ค่าข้าง ๆ ก็ดีด้วย แทนยอดแหลม (อธิบายในบท Overfitting) ในรอบ 3 ของตัวอย่าง กฎนี้จะเลือก MA 70 แทน MA 20 และขาดทุนน้อยลง (−9.1 แทน −14.5 จุด) แต่พูดตรง ๆ ว่าเฉลี่ย 200 ชุด กฎที่ราบไม่ได้ช่วยในของเล่นนี้ (11.1 กับ 12.1 จุดต่อปี) ที่ราบกันโชคจาก noise ได้ แต่กันตลาดเปลี่ยนนิสัยไม่ได้ อย่างหลังนี้ Walk-forward ทำหน้าที่ฟ้องให้เห็นแทน
ช่อง Forward ใน MT5 Strategy Tester
ในแท็บ Settings ของ Strategy Tester มีช่อง Forward เลือกได้ 1/2, 1/3, 1/4 หรือกำหนดวันที่เอง MT5 จะแบ่งช่วงท้ายของข้อมูลไว้ ทำ Optimization บนช่วงแรก แล้วทดสอบชุดค่าบนช่วงท้าย ผลช่วงท้ายแสดงแยกในแท็บ Forward
ข้อนี้คือการแบ่ง ครั้งเดียว ไม่ใช่ Walk-forward หลายรอบ ถ้าต้องการหลายรอบ ให้รัน Optimization ซ้ำเอง เลื่อนวันที่เริ่มและวันที่สิ้นสุดทีละช่วง แล้วจดค่าที่เลือกกับผลช่วงทดสอบลงตาราง และระวังกับดักใหญ่ ถ้าเลื่อนดูแท็บ Forward แล้วหยิบชุดที่ผล Forward ดีที่สุด ช่วง Forward นั้นก็ถูกใช้เลือกค่าไปแล้ว อ่านวิธีอ่านตัวเลขในรายงานได้ที่ อ่านรายงาน Backtest ของ MT5
บทเรียนจากการทดสอบของเรา: กฎถูก แต่ทำลายเอง
ในการทดสอบย้อนหลังของเราบนทองคำ (XAUUSD) M1 สมุดวิจัยชุดหนึ่งตั้งกฎไว้ตั้งแต่บรรทัดแรก ค้นหาด้วยปี 2022–2024 ยืนยันด้วยปี 2025–2026 และห้ามเลือกสูตรจากปียืนยัน
แต่ข้อมูลที่มี tick จริงมีแค่ปี 2026 ปีก่อนหน้าเป็น tick ที่เครื่องสร้างจากข้อมูลราคา (ดู คุณภาพข้อมูล tick) ปี 2026 จึงเป็นปีที่ข้อมูลดีที่สุด และน่าใช้ที่สุด ไม่นานการทดสอบก็เริ่มเลือกค่าบนปี 2026 อย่างเดียว ซ้อนหลายชั้น
ผลของระบบรวมชุดหนึ่งที่คัดและรวมจากปี 2026 (มกราคม–กันยายน tick จริง ขนาด 0.10 lot ทุน 10,000 ดอลลาร์)
- ปี 2026 ที่ใช้เลือก: +43,963 ดอลลาร์ 1,832 ไม้ Profit factor 1.47
- ชุดเดียวกันปี 2025 ที่ไม่ได้ใช้เลือก: −694 ดอลลาร์ และ Drawdown ของ equity สูงถึง 61%
- ปี 2024: −197 ดอลลาร์
ข้อสรุปที่จดไว้คือ “เลือกจากปี 2026 = in-sample ซ้อน” ปียืนยันที่ถูกใช้เลือกแล้ว ไม่ใช่ปียืนยันอีกต่อไป และยังมีความยุ่งเพิ่ม ช่วงทดสอบที่เหลือเป็นปีที่ข้อมูลคุณภาพต่ำกว่า พอผลแย่ลงจึงแยกไม่ออกเต็มที่ว่าเพราะระบบ หรือเพราะข้อมูล
กติกาที่ใช้ต่อจากนั้นคือ ปีล่าสุดใช้หาไอเดีย และเชื่อได้เมื่อมันบอกว่าระบบไหน “ตาย” ส่วนการตัดสินค่าตัวเลขใช้หลายปี การยืนยันด้วยแค่สองปีก็หลอกได้ เพราะสองปีนั้นอาจบังเอิญเป็นปีที่ระบบได้ผลทั้งคู่ ทั้งหมดนี้เป็นผลทดสอบย้อนหลัง ผลในอดีตไม่ได้บอกผลในอนาคต และไม่ใช่ผลตอบแทนที่ควรคาดหวัง
ช่วงทดสอบใช้ได้ครั้งเดียว ทันทีที่เราดูผลแล้วกลับไปแก้ระบบ มันกลายเป็นช่วงหาค่า
Walk-forward ผ่านแล้ว ทำอะไรต่อ
ผ่าน Walk-forward แปลว่าระบบรอดจากการเลือกค่าแบบหลอกตัวเองได้ระดับหนึ่ง ยังไม่ได้แปลว่าจะได้กำไร ขั้นถัดไปที่ควรทำ
- ใช้ลำดับไม้จากช่วงทดสอบ ไม่ใช่ช่วงหาค่า ไปทำ Monte Carlo เพื่อดูว่า Drawdown แย่ได้แค่ไหน แล้วตั้งความเสี่ยงต่อไม้จากตรงนั้น (ความเสี่ยง 1% ต่อไม้)
- เผื่อผลจริงแย่กว่าช่วงทดสอบอีก เพราะ spread และ slippage (ทำไมผลจริงไม่เท่า Backtest)
- รันบัญชี demo หรือเงินน้อยก่อน และวางวิธีดูแลระบบตอนรันจริง (รัน EA บน VPS)
ผลที่ใช้ตัดสินใจคือผลช่วงทดสอบต่อกัน ไม่ใช่แถวบนสุดของตาราง Optimization
ข้อผิดพลาดที่เจอบ่อย
- รายงานผลช่วงหาค่าเป็นผลระบบ ตัวเลขช่วงหาค่าดีเพราะเราเลือกให้ดี ผลที่บอกอะไรได้คือช่วงทดสอบเท่านั้น
- แอบดูช่วงทดสอบ ดูผลช่วงทดสอบแล้วกลับไปเพิ่มตัวกรอง เปลี่ยนช่วงค่า หรือเปลี่ยนกฎเลือก แล้วรันใหม่จนสวย ช่วงทดสอบกลายเป็นช่วงหาค่า เหมือนในบทเรียนปี 2026 ของเรา
- เปลี่ยนวิธีแบ่งหลังเห็นผล ลองช่วงหาค่า 1 ปี 2 ปี 3 ปี แล้วเลือกแบบที่ Walk-forward ดีสุด ก็คือ Optimization อีกชั้นหนึ่ง
- รอบน้อย ไม้น้อย 2 รอบ รอบละ 10 ไม้ ให้ WFE ที่แกว่งจนไม่มีความหมาย
- ข้อมูลอนาคตรั่ว อินดิเคเตอร์ที่คำนวณด้วยแท่งที่ยังไม่ปิด หรือตัวกรองที่ตั้งเกณฑ์จากสถิติทั้งช่วง ทำให้ช่วงทดสอบดูดีเกินจริง
- เชื่อว่าผ่านแล้วจะผ่านตลอด Walk-forward วัดอดีตที่เลื่อนไปทีละช่วง ตลาดข้างหน้าเปลี่ยนนิสัยได้อีก ระบบต้องถูกเฝ้าดูต่อหลังเริ่มรันจริง
คำถามที่พบบ่อย
Walk-forward ต่างจากแบ่งข้อมูลเป็นสองส่วนธรรมดายังไง
แบ่งสองส่วนคือทดสอบครั้งเดียว ผลขึ้นกับว่าช่วงทดสอบบังเอิญเป็นตลาดแบบไหน Walk-forward ทำซ้ำหลายรอบบนหลายช่วงเวลา และยังจำลองสิ่งที่เราจะทำจริง คือหาค่าใหม่เป็นระยะด้วยข้อมูลล่าสุด
Walk-forward efficiency เท่าไรถึงดี
ไม่มีเส้นตายตัว หลายตำราใช้ราว 50% ขึ้นไปเป็นเกณฑ์คร่าว ๆ แต่ตัวเลขนี้แกว่งมากเมื่อมีไม่กี่รอบหรือไม่กี่ไม้ ให้ดูคู่กับจำนวนรอบที่ช่วงทดสอบขาดทุน และ Drawdown ในช่วงทดสอบด้วย
MT5 ทำ Walk-forward ให้อัตโนมัติไหม
ช่อง Forward ใน Strategy Tester แบ่งช่วงท้ายของข้อมูลไว้ทดสอบครั้งเดียว ไม่ได้เลื่อนหน้าต่างให้ ถ้าต้องการหลายรอบ ต้องรัน Optimization ซ้ำเองโดยเลื่อนวันที่ทีละช่วง
เนื้อหานี้เป็นความรู้ทั่วไป ไม่ใช่คำแนะนำการลงทุน การเทรดมีความเสี่ยง อาจสูญเสียเงินลงทุนทั้งหมด