Backtesting และ forward testing – วิธีการและข้อผิดพลาดในการทดสอบ
Backtest ที่กลยุทธ์ทำกำไรได้ 280% ต่อปีนั้นส่วนใหญ่เป็นเรื่องสมมติ ไม่ใช่เพราะตั้งใจโกหก แต่เพราะข้อผิดพลาดเชิงวิธีการที่ผู้ทดสอบมองไม่เห็น Look-ahead bias, survivorship, curve fitting, ต้นทุนที่สร้างแบบจำลองต่ำกว่าความเป็นจริง, การเลือกช่วงข้อมูล, การ optimise พารามิเตอร์บนข้อมูลทั้งหมด, การเพิกเฉยต่อสภาวะตลาด – ข้อผิดพลาดใดข้อหนึ่งเหล่านี้สามารถ ลำพัง เปลี่ยนกลยุทธ์ที่ขาดทุนให้กลายเป็นผู้ชนะที่ดูเหมือนดี ในกระบวนการตรวจสอบระดับมืออาชีพ backtest เดียวไม่เคยเพียงพอ – กลยุทธ์ต้องผ่าน walk-forward, Monte Carlo bootstrap, out-of-sample และ forward test 30 – 90 วันบน demo ด้วย tick stream จริงก่อนจะสัมผัสเงินทุน เทรดเดอร์รายย่อยควรลอกหลักการ ไม่ใช่ขนาดของโครงสร้างพื้นฐาน ในบทความนี้เราวางวิธีการทั้งหมด – พร้อมเกณฑ์ทางสถิติที่เป็นรูปธรรม, สคริปต์ Python bootstrap ตัวอย่าง, แบบจำลองต้นทุนสำหรับ MT4/MT5, กฎการกระทบยอด backtest กับ forward และรายการข้อผิดพลาด 8 ข้อที่มักเปลี่ยน backtest ที่ดีให้กลายเป็น live ที่ขาดทุนในไตรมาสแรกหลังการนำไปใช้งาน
- Backtest ตอบคำถามว่า "กลยุทธ์นี้เคยทำเงินได้ในอดีตหรือไม่", forward test ตอบว่า "มันกำลังทำเงินได้ ตอนนี้ หรือไม่?" การทดสอบสองแบบที่แตกต่างกันพร้อมข้อผิดพลาดที่ต่างกัน – ไม่มีอันใดแทนอีกอันได้
- ข้อผิดพลาดเชิงวิธีการ 6 ประการ: look-ahead bias, survivorship, curve fitting / overfitting, cherry picking, ต้นทุนที่สร้างแบบจำลองต่ำ และ data snooping แต่ละอย่างสามารถเปลี่ยนระบบที่ขาดทุนให้เป็นผู้ชนะที่ดูเหมือนได้ลำพัง
- Walk-forward analysis คือมาตรฐานอุตสาหกรรม: in-sample 70% ของข้อมูลสำหรับ calibration, out-of-sample 30% สำหรับการตรวจสอบ, เลื่อน window ไปข้างหน้า หากไม่มีสิ่งนี้คุณกำลัง optimise บน noise ในอดีต
- เกณฑ์ทางสถิติ: N = 30 เทรดน้อยเกินไป (ช่วงความเชื่อมั่น WR ±15 pp), N = 200 ให้ ±5 pp, N = 500 ให้ ±3 pp กลยุทธ์ที่มี 24 เทรดใน backtest คือความหวัง ไม่ใช่หลักฐาน
- Forward test อย่างน้อย 30 วัน demo ก่อนบัญชีจริงขนาดเล็กและ 90 วัน micro account ก่อน sizing เต็ม ตัวเลขเหล่านี้ไม่ใช่สำหรับการตรวจสอบทางสถิติเต็มรูปแบบ – มันคือ ขั้นต่ำเชิงปฏิบัติการ เพื่อตรวจจับรูรั่วที่ใหญ่ที่สุด
1. Backtest เทียบกับ forward test – คำถามที่ต่างกัน คำตอบที่ต่างกัน
ผู้เริ่มต้นส่วนใหญ่ทำผิดพลาดอย่างหนึ่ง: หลังจากได้ backtest ที่ดีพวกเขาตัดสินว่ากลยุทธ์พร้อมแล้ว แต่มันไม่ได้เป็นแบบนั้น Backtest ตรวจสอบประวัติศาสตร์ forward test ตรวจสอบการดำเนินการในปัจจุบัน ในทางปฏิบัติสิ่งเหล่านี้คือตัวกรองสองอย่างที่แตกต่างกัน: backtest ดักจับสถิติ forward ดักจับการดำเนินการจริง, latency, slippage และว่าเทรดเดอร์คลิกตามกฎจริงหรือไม่
Backtest – คำถามเชิงประวัติศาสตร์
Backtest ถามว่า: "ถ้ากลยุทธ์ทำงานมา 3 – 10 ปีที่แล้ว มันจะมีพฤติกรรมอย่างไร?" คำตอบดีเท่ากับ คุณภาพของข้อมูล และ คุณภาพของแบบจำลองต้นทุน Backtest เป็นแบบ ย้อนหลัง ดังนั้น:
- มันรวดเร็ว – คุณสามารถทดสอบข้อมูล 5 ปีได้ใน 10 นาที
- มันผลิตตัวอย่างขนาดใหญ่ – หลายร้อยถึงหลายพันเทรด
- มันช่วยให้เปรียบเทียบตัวแปรพารามิเตอร์ได้ – ซึ่งเป็นข้อผิดพลาดที่ใหญ่ที่สุดด้วย (overfitting)
- มันไวต่อ คุณภาพของข้อมูล – tick ที่ไม่ดี, แท่งเทียนที่หายไป, แบบจำลองต้นทุนที่ผิดพลาด = ผลลัพธ์ที่ไร้ค่า
Backtest ไม่ตอบ ว่ากลยุทธ์ทำงาน ตอนนี้ หรือไม่ สภาวะตลาดปี 2018 – 2022 อาจไม่มีอยู่ในปี 2024 – 2026
Forward test – คำถามเชิงคาดการณ์
Forward test ถามว่า: "กลยุทธ์กำลังทำกำไร ตอนนี้, ในสภาวะตลาดปัจจุบัน, ภายใต้เงื่อนไขการดำเนินการจริง หรือไม่?" มันเป็นแบบ คาดการณ์ – ข้อมูลไหลแบบ real time ดังนั้น:
- มันช้า – เพื่อรวบรวม 100 เทรดที่ 5 เทรดต่อสัปดาห์ คุณต้องการ 5 เดือน
- มันผลิตตัวอย่างขนาดเล็กกว่า – forward test รายย่อยส่วนใหญ่จบที่ 30 – 80 เทรด
- มันขจัด look-ahead bias ตามคำนิยาม – ข้อมูลในอนาคตไม่มีอยู่จริงทางกายภาพ
- มันวัดเงื่อนไขการดำเนินการจริง – spread ภายใต้ความเครียด, slippage, requote, bridge latency
ตารางเปรียบเทียบ: backtest จะไม่ตรวจจับอะไร, forward จะไม่ตรวจจับอะไร
| ประเภทข้อผิดพลาด | ตรวจจับโดย backtest? | ตรวจจับโดย forward? |
|---|---|---|
| Look-ahead bias (ข้อมูลอนาคตในการตัดสินใจ) | ไม่ – นี่คือต้นกำเนิดของภาพลวงตา | ใช่ – ข้อมูลอนาคตไม่มีอยู่ทางกายภาพ |
| Parameter curve fitting | บางส่วน – เฉพาะ walk-forward เท่านั้น | บางส่วน – ปรากฏหลังจาก N เพียงพอหรือการเปลี่ยนแปลงสภาวะตลาด |
| ต้นทุนที่สร้างแบบจำลองต่ำ (slippage, requote) | บางส่วน – ขึ้นอยู่กับคุณภาพของแบบจำลอง | ใช่ – ต้นทุนจริงวัดโดยตรง |
| การเปลี่ยนแปลงสภาวะตลาดนับตั้งแต่ข้อมูลอดีต | ไม่ – ทำงานบนข้อมูลเก่า | ใช่ – ทำงานบนสภาวะตลาดปัจจุบัน |
| ความไม่สามารถของเทรดเดอร์ที่จะปฏิบัติตามกฎ (วินัย) | ไม่ – backtest ถือว่ามีการดำเนินการที่สมบูรณ์แบบ | ใช่ – มนุษย์จริงที่คีย์บอร์ด |
| จำนวนเหตุการณ์ทางสถิติของ edge (N = 300+ ที่จำเป็น) | ใช่ – backtest ให้ตัวอย่างขนาดใหญ่ | ไม่ – forward ที่ 5 เทรดต่อสัปดาห์ให้ N = 80 ในครึ่งปี |
การกระทบยอด Backtest กับ Forward – ขั้นตอนการควบคุม
ตัวตรวจจับ look-ahead bias และข้อผิดพลาด data feed ที่ทรงพลังที่สุด: การเปรียบเทียบ signal ทีละตัว Export จาก backtest และจาก forward ในรูปแบบ CSV แบบรวม:
timestamp_utc, broker_server_time, pair, setup_id, direction, entry_rule_hash,
entry_price, sl_price, tp_price, trigger_bar_close, source
30 – 60 วันแรกของ forward สร้าง signal บนแท่งเทียนจริง ในช่วงเดียวกันคุณเรียกใช้ backtest บนข้อมูลเก็บถาวรจากวันเหล่านั้น คุณเปรียบเทียบไฟล์ทั้งสอง: divergence > 5 – 10% ของ signal = สัญญาณเตือน สาเหตุที่เป็นไปได้: look-ahead ใน indicator, repaint, data feed ที่แตกต่างกัน, bug ในโค้ดกลยุทธ์
timestamp_utc และ broker_server_time โบรกเกอร์ MT4/MT5 บางรายใช้เวลาเซิร์ฟเวอร์ GMT+2/GMT+3 พร้อม DST เสมอ normalise ไปที่ UTC ก่อน แล้วจึงเปรียบเทียบ2. ข้อผิดพลาดในการทดสอบ – look-ahead, survivorship, curve fit, overfitting
ข้อผิดพลาดเหล่านี้เป็น เชิงวิธีการ ไม่ใช่เชิงความคิด ปัญหาไม่ได้อยู่ที่ผู้ทดสอบไม่มีประสบการณ์หรือขี้เกียจ – ปัญหาอยู่ที่เครื่องมือทดสอบ (MT4 Strategy Tester, MT5, สคริปต์กำหนดเอง) เองที่ยอมให้เกิดข้อผิดพลาด หากผู้ทดสอบไม่รู้ว่าต้องมองหาอะไร
ข้อผิดพลาดที่ 1: Look-ahead bias
ระหว่างแท่งเทียน กลยุทธ์ใช้ข้อมูลที่จะทราบเฉพาะ หลังจาก แท่งเทียนปิด ตัวแปรที่พบบ่อยที่สุด:
- การตัดสินใจระหว่างแท่งเทียนบนพื้นฐานของราคาปิด กลยุทธ์คำนวณ SMA-20 จาก 20 แท่งเทียนล่าสุดรวมถึงแท่งเทียนปัจจุบันและเข้าเมื่อ "แท่งเทียน M5 ปิดเหนือ" ในความเป็นจริง: ในวินาทีที่ 240 ของแท่งเทียน M5 คุณยังไม่รู้ว่ามันจะปิดอย่างไร
- Indicator ที่มี look-back rounding ZigZag, Fractals, Andrews Pitchfork – รีเฟรช ย้อนหลัง แท่งเทียนที่เมื่อ 10 วันก่อนถูกทำเครื่องหมายว่าเป็น swing high อาจไม่ใช่หลังจากข้อมูลใหม่มาถึง
- ข้อมูลพื้นฐานที่มี publication lag CPI ของเดือนมีนาคมเผยแพร่เมื่อวันที่ 12 เมษายน แต่ในฐานข้อมูลมีวันที่ "มีนาคม" กลยุทธ์ที่ใช้ "CPI มีนาคมในการตัดสินใจวันที่ 1 เมษายน" ใช้ข้อมูลที่ไม่มีอยู่ในขณะนั้น
รายการ constructions ที่ต้องการการทดสอบ anti-repaint ใน MT4/MT5:
- ZigZag, Fractals, Andrews Pitchfork – รีเฟรชย้อนหลังตามคำนิยาม
- Heikin-Ashi, SuperTrend, Hull MA และ channels กำหนดเอง – ต้องผ่านการทดสอบ anti-repaint ก่อนใช้งานใน backtest
- Custom indicators จาก MQL Market ที่ไม่มีซอร์สโค้ด – กล่องดำที่ตรวจสอบไม่ได้ ปฏิเสธอัตโนมัติ
- การตัดสินใจ intrabar บน
Close[0]ใน MT4 – ใน MT4Close[0]ระหว่างแท่งเทียนคือ bid ปัจจุบัน ไม่ใช่ราคาปิดที่ยังไม่มีอยู่
ข้อผิดพลาดที่ 2: Survivorship bias
คุณทดสอบกลยุทธ์บนตะกร้าคู่สกุลเงินปี 2024 ปัญหา: บางคู่ที่ "ทำงานได้ดี" ในปี 2018 อาจมีสภาพคล่องหรือเงื่อนไขการดำเนินการที่แตกต่างกันอย่างมากในปัจจุบัน การตรวจจับ: ในการทดสอบตะกร้าคู่ ใช้รายการคู่ที่ ใช้งานอยู่ในปัจจุบัน ไม่ใช่รายการในอดีต
ข้อผิดพลาดที่ 3: Curve fitting
คุณทดสอบกลยุทธ์ด้วยพารามิเตอร์ SMA-20 เทียบกับ SMA-22 เทียบกับ SMA-25 เทียบกับ SMA-30, RSI(11) เทียบกับ RSI(14) เทียบกับ RSI(17), เกณฑ์ ATR ตั้งแต่ 0.8 ถึง 1.5 รวม 4 × 3 × 8 = 96 combinations โดยความน่าจะเป็นล้วนๆ combination บางอย่าง จะให้ผลลัพธ์ backtest ที่ยอดเยี่ยม – นั่นคือคณิตศาสตร์ ไม่ใช่ความสามารถของกลยุทธ์
การตรวจจับ: parameter heatmap หากพารามิเตอร์ที่ optimal คือ isolated peak ที่ล้อมรอบด้วยผลลัพธ์ที่อ่อนแอ – กลยุทธ์ถูก curve-fitted หากพารามิเตอร์ที่ optimal คือ plateau (combinations ที่อยู่ใกล้เคียงหลายอย่างให้ผลลัพธ์ที่ดีพอๆ กัน) – กลยุทธ์มี edge ที่แข็งแกร่ง
ข้อผิดพลาดที่ 4: Overfitting
Curve fitting คือ overfitting ในระดับพารามิเตอร์ Overfitting เต็มรูปแบบคือการเพิ่ม กฎและตัวกรอง ให้กับกลยุทธ์เพื่อตอบสนองต่อเทรดที่ขาดทุนเฉพาะใน backtest "ฉันเพิ่มตัวกรอง: ฉันไม่เข้าในวันอังคารหลัง 14:00 CET" – เพราะเทรดที่ขาดทุนสองครั้งใน backtest เป็นวันอังคารหลัง 14:00 กฎที่เพิ่ม หลังจาก เหตุการณ์จริงเป็น overfitting บน noise
กฎเชิงปริมาณที่เข้มงวด: ถ้าคุณ optimise พารามิเตอร์อิสระมากกว่า 4 ตัวบนตัวอย่างที่มีเทรดน้อยกว่า 200 ครั้ง overfitting คือ สมมติฐาน baseline การตรวจสอบ กฎในทางปฏิบัติสำหรับรายย่อย: จำนวนพารามิเตอร์ที่ optimise × 30 ≤ จำนวนเทรดในตัวอย่าง
ข้อผิดพลาดที่ 5: ต้นทุนที่สร้างแบบจำลองต่ำ
MT4 Strategy Tester เริ่มต้นด้วย spread คงที่ (เช่น 1.0 pip บน EUR/USD ตลอด 5 ปี) ความเป็นจริง: spread ของ EUR/USD แกว่งจาก 0.3 pips ในช่วง LON+NY full liquidity ถึง 4 – 8 pips ในช่วง rollover และ 8 – 25 pips ในนาทีแรกหลัง macro releases
มิติที่สอง: slippage Backtest ถือว่ามีการดำเนินการที่ราคาในฐานข้อมูลพอดี ความเป็นจริง: 0.2 – 0.5 pips slippage ในสภาวะปกติ, 1 – 3 pips บน volume breakouts, 5 – 15 pips หลัง releases
ประการที่สาม: swap (ต้นทุน carry) กลยุทธ์ swing ที่ถือ position 3 – 8 วันจ่าย swap ทุกวัน กลยุทธ์ที่มี expectancy +0.4R ต่อเทรดซึ่งเทรดทั่วไปใช้เวลา 5 วันอาจสูญเสีย swap ที่ทำให้ edge หายไปทั้งหมด
3. Walk-forward analysis – วิธีตรวจสอบกับตัวอย่างขนาดเล็ก
Walk-forward analysis (WFA) คือมาตรฐานอุตสาหกรรมสำหรับการตรวจสอบกลยุทธ์ – อธิบายโดย Robert Pardo ใน The Evaluation and Optimization of Trading Strategies[2] แนวคิด: แทนที่จะ optimise พารามิเตอร์บนชุดข้อมูลอดีตทั้งหมด เราแบ่งมันออกเป็น window in-sample (IS) และ out-of-sample (OOS), optimise บน IS, validate บน OOS จากนั้นเลื่อน window ไปข้างหน้าและทำซ้ำ
โครงแบบ 70/30 มาตรฐาน
- ข้อมูลทั้งหมด: 5 ปี (2020-01-01 ถึง 2024-12-31)
- In-sample: 70% = 3.5 ปี (2020-01-01 ถึง 2023-06-30) – calibrate พารามิเตอร์ที่นี่
- Out-of-sample: 30% = 1.5 ปี (2023-07-01 ถึง 2024-12-31) – ทดสอบ ครั้งเดียว บนข้อมูลนี้ด้วยพารามิเตอร์ IS
กฎเหล็ก: พารามิเตอร์ ต้องไม่ ถูกแตะต้องหลังจากการทดสอบ OOS ถ้า OOS ให้ผลลัพธ์ที่อ่อนแอและคุณกลับไปที่ IS เพื่อ "ปรับแต่ง" แล้วทดสอบ OOS ใหม่ คุณเพิ่งเปลี่ยน OOS ให้เป็น IS ที่สอง นั่นคือ overfitting เต็มรูปแบบ
Rolling walk-forward – เวอร์ชันขั้นสูง
| ขั้นตอน | In-sample (calibration) | Out-of-sample (ทดสอบ) |
|---|---|---|
| 1 | 2020-01 ถึง 2022-12 (3 ปี) | 2023-01 ถึง 2023-06 (6 เดือน) |
| 2 | 2020-07 ถึง 2023-06 (3 ปี) | 2023-07 ถึง 2023-12 (6 เดือน) |
| 3 | 2021-01 ถึง 2023-12 (3 ปี) | 2024-01 ถึง 2024-06 (6 เดือน) |
| 4 | 2021-07 ถึง 2024-06 (3 ปี) | 2024-07 ถึง 2024-12 (6 เดือน) |
ถ้ากลยุทธ์ทำงานใน 3 – 4 จาก 4 windows คุณมี ผู้สมัคร edge ที่แข็งแกร่งตามตัวอย่าง ถ้ามันทำงานใน 1 – 2 – กลยุทธ์ไวต่อสภาวะตลาด ถ้ามันทำงานใน 0 – 1 – กลยุทธ์เป็นเรื่องสมมติ
4. Monte Carlo บน backtest – ทำไม backtest เดียวจึงไม่เพียงพอ
Backtest แสดง การรับรู้ ประวัติศาสตร์อย่างหนึ่ง กลยุทธ์ที่มี 100 เทรดใน backtest มีโอกาสเข้า 100 ครั้งเฉพาะในช่วง 5 ปี Monte Carlo บน backtest จำลองว่ากลยุทธ์อาจมีพฤติกรรมอย่างไรใน ประวัติศาสตร์ทางเลือก
วิธีการพื้นฐานสองวิธี
Trade bootstrap (การสุ่มลำดับ): นำรายการผลลัพธ์เทรด 200 ครั้ง (เช่น +1.5R, -1R, +2.2R, -1R, +0.8R, ...) และดึงแบบมีการแทนที่ 200 เทรดเข้าสู่ประวัติศาสตร์ใหม่ ทำซ้ำ 1,000 ครั้ง
Block bootstrap: แนวคิดเดียวกันแต่ดึง blocks ของเทรดต่อเนื่อง (เช่น 10 เทรดในแต่ละครั้ง) รักษา time correlations สำหรับกลยุทธ์ FX, block bootstrap ที่มี blocks 10 – 20 เทรดสมจริงกว่า naive single-trade bootstrap
สิ่งที่คุณคำนวณจาก 1,000 ประวัติศาสตร์ทางเลือก
- ผลตอบแทนประจำปีมัธยฐาน – ศูนย์กลางของการกระจาย ดีกว่าค่าจาก backtest เดียว
- เปอร์เซ็นต์ไทล์ที่ 5 – ใน 5% ของสถานการณ์ ผลตอบแทนจะอ่อนแออย่างนี้หรือแย่กว่า นี่คือกรณีที่เลวร้ายที่สมจริงของคุณ
- Maximum drawdown ที่เปอร์เซ็นต์ไทล์ที่ 95 – ใน 5% ของสถานการณ์ DD จะใหญ่อย่างนี้หรือใหญ่กว่า คุณรับได้ทางจิตใจและการเงินหรือไม่?
- ความน่าจะเป็นของการล้มละลาย – เปอร์เซ็นต์ของสถานการณ์ที่บัญชีลดลงต่ำกว่าเกณฑ์ (เช่น -30%)
สคริปต์ Python – block bootstrap สำหรับกลยุทธ์ Forex
วิธีรันโดยไม่ต้องใช้สภาพแวดล้อมการพัฒนา: ไปที่ colab.research.google.com (ฟรี ต้องใช้บัญชี Google), คลิก "New Notebook", วางโค้ดด้านล่างในเซลล์, import รายการผลตอบแทน R ของคุณจากไฟล์ CSV – การรันใช้เวลา 2 นาที
import numpy as np
import pandas as pd
def block_bootstrap_strategy(trades_R, n_simulations=1000, block_size=10):
"""
Block bootstrap บนรายการผลลัพธ์เทรดที่แสดงใน R
"""
n_trades = len(trades_R)
block_size = min(block_size, n_trades)
n_blocks = int(np.ceil(n_trades / block_size))
final_returns = []
max_drawdowns = []
ruin_count = 0
risk_per_trade = 0.01 # 1% ต่อเทรด
for sim in range(n_simulations):
block_starts = np.random.randint(0, n_trades - block_size + 1, n_blocks)
sim_trades = np.concatenate([trades_R[s:s + block_size] for s in block_starts])[:n_trades]
equity = 1.0
equity_curve = [1.0]
for r in sim_trades:
equity *= (1.0 + r * risk_per_trade)
equity_curve.append(equity)
equity_curve = np.array(equity_curve)
peak = np.maximum.accumulate(equity_curve)
drawdown = (equity_curve - peak) / peak
final_returns.append(equity - 1.0)
max_drawdowns.append(drawdown.min())
if drawdown.min() < -0.30:
ruin_count += 1
return {
'median_return': np.median(final_returns),
'p05_return': np.percentile(final_returns, 5),
'p95_return': np.percentile(final_returns, 95),
'p95_max_dd': np.percentile(max_drawdowns, 5),
'ruin_probability': ruin_count / n_simulations,
'mean_return': np.mean(final_returns),
}
# ตัวอย่างการใช้งาน
trades = np.array([1.5, -1.0, 2.2, -1.0, 0.8, -1.0, 1.3, 1.7, -1.0, 0.5,
-1.0, 2.1, -1.0, 1.4, 0.9, -1.0, 1.8, -1.0, 1.1, -1.0])
trades = np.tile(trades, 10) # จำลอง 200 เทรด
results = block_bootstrap_strategy(trades, n_simulations=2000, block_size=10)
print(f"Median return: {results['median_return']*100:.1f}%")
print(f"5th percentile return: {results['p05_return']*100:.1f}%")
print(f"95th percentile max DD: {results['p95_max_dd']*100:.1f}%")
print(f"Probability of ruin (DD > 30%): {results['ruin_probability']*100:.2f}%")
5. Forward testing – demo, paper trade, micro account
Forward testing มีสามขั้นตอนที่สมจริงเพิ่มขึ้นและต้นทุนข้อผิดพลาดที่สูงขึ้น การย่อการตรวจสอบไม่ได้ขจัดความเสี่ยง – มันถ่ายโอนความเสี่ยงไปยังบัญชีจริง
ขั้นตอนที่ 1: Demo (อย่างน้อย 30 วัน)
บัญชี demo ของโบรกเกอร์, data stream เดียวกับบัญชีจริง, เงื่อนไขการดำเนินการที่เหมือนกัน ในทางทฤษฎี ข้อดี:
- ไม่มีความเสี่ยงเงินทุน – ข้อผิดพลาดในการดำเนินการและกลยุทธ์ไม่มีต้นทุน
- การทดสอบการรวมระบบ – ว่า alerts ทำงาน, EA เริ่มต้น, กฎถูกโค้ดอย่างถูกต้อง
ข้อเสีย:
- Demo slippage มักดีกว่า live – โบรกเกอร์ต้องการให้คุณเปิดบัญชีจริง ดังนั้น demo จึงดำเนินการที่ดีกว่า
- ไม่มีความเสี่ยงด้านจิตใจจาก margin – demo ไม่กระตุ้นสัญชาตญาณการอยู่รอดที่ทำให้ลังเลในการเข้าและแก้ไข stop-loss ด้วยตนเอง
30 วันของ demo ต้องตอบคำถามที่โหดร้าย: alerts ทำงานเมื่อจำเป็นหรือไม่, EA ไม่สูญเสีย signal หรือไม่, โบรกเกอร์แสดง spread ที่แตกต่างจาก tester หรือไม่ เกณฑ์ขั้นต่ำ: 30 วันและ 30 เทรด นี่ไม่ใช่ตัวอย่างที่มีนัยสำคัญทางสถิติ – มันเป็นการตรวจสอบความสมเหตุสมผลของโครงสร้างพื้นฐาน
ขั้นตอนที่ 3: Live micro account (อย่างน้อย 90 วัน)
บัญชีจริงด้วย sizing ขั้นต่ำ (0.01 – 0.05 lots, เงินทุน 200 – 500 EUR/USD) เป้าหมาย: ทดสอบกลยุทธ์ภายใต้เงื่อนไข ความเสี่ยงจริง ไม่ใช่ทดสอบรายได้
ลำดับการเปลี่ยนผ่าน – เกณฑ์
| จากขั้นตอน | ไปขั้นตอน | เกณฑ์การเปลี่ยนผ่าน |
|---|---|---|
| Backtest | Demo | WFA OOS บวก, Monte Carlo: เปอร์เซ็นต์ไทล์ที่ 5 > 0, ruin prob < 2%, แบบจำลองต้นทุนที่สมจริง |
| Demo | Micro account | 30+ วัน, 30+ เทรด, expectancy ใน ±0.15R ของ backtest |
| Micro account | Full sizing | 90+ วัน, 60+ เทรด, expectancy ใน ±0.1R ของ backtest, drawdown ในช่วง, วินัยที่รักษาไว้ |
เวลารวมจาก backtest ถึง full sizing: 4 – 6 เดือน
6. เกณฑ์ทางสถิติ – N, p-value, ช่วงความเชื่อมั่น
รายย่อยมักดู backtest ที่มี 30 เทรด เห็น WR 60% และคิดว่า "กลยุทธ์มี WR 60%" สถิติบอกว่า: ด้วยตัวอย่าง 30 เทรด WR จริงของกลยุทธ์อยู่ในช่วงความเชื่อมั่น 41 – 77% ที่ความน่าจะเป็น 95%
ช่วงความเชื่อมั่น WR เทียบกับตัวอย่าง
| จำนวนเทรด (N) | WR จากตัวอย่าง | ช่วงความเชื่อมั่น 95% | บอก edge จาก noise ได้หรือไม่? |
|---|---|---|---|
| 30 | 60% | 41 – 77% (±15 pp) | ไม่ – อาจเป็น WR < 50% (ขาดทุน) |
| 100 | 60% | 50 – 69% (±10 pp) | อ่อนแอ – อยู่บนขอบเขต WR 50% |
| 200 | 60% | 53 – 67% (±5 pp) | ใช่ – ด้วยความเชื่อมั่น 95% WR > 50% |
| 500 | 60% | 55 – 64% (±3 pp) | ใช่ – ความเชื่อมั่นสูงใน edge |
สรุปเชิงปฏิบัติการ: กลยุทธ์ที่มีเทรดน้อยกว่า 100 ครั้งใน backtest ยังไม่ผ่านการตรวจสอบทางสถิติ กลยุทธ์ที่มี 200+ เทรดคือขั้นต่ำที่ยอมรับได้
7. การสร้างแบบจำลองต้นทุน: spread, slippage, swap, commission ในการทดสอบ
การสร้างแบบจำลองต้นทุนต่ำเกินไปเป็นข้อผิดพลาดที่สามารถเปลี่ยนกลยุทธ์ใดก็ได้ให้เป็นผู้ชนะใน backtest แบบจำลองต้นทุนเต็มรูปแบบมีสี่องค์ประกอบ
Spread: คงที่ เทียบกับ ตัวแปร
| โมเดล | ลักษณะ | เมื่อใดควรใช้ |
|---|---|---|
| Spread คงที่ (เช่น 1.0 pip ราบ) | ค่าเริ่มต้น MT4, ง่าย, ประเมินผลลัพธ์สูงเกินไปในช่วงที่มี liquidity น้อย | เฉพาะสำหรับการตรวจสอบความสมเหตุสมผลครั้งแรก ไม่ใช่สำหรับการตรวจสอบ |
| Spread เฉลี่ย (จากประวัติโบรกเกอร์) | ค่าเฉลี่ย 6 – 12 เดือน ค่าเดียว | สำหรับกลยุทธ์ intraday ในช่วงที่มี liquidity สูง |
| ตัวแปรตามเวลาของวัน | Spread ขึ้นอยู่กับชั่วโมง | มาตรฐานสำหรับกลยุทธ์ intraday และ swing |
| Tick-by-tick ตัวแปร (Tick Data Suite, Dukascopy) | Spread จริงสำหรับทุกวินาทีของประวัติ | กลยุทธ์ scalping, news trading, การตรวจสอบระดับมืออาชีพ |
MAE/MFE – การวินิจฉัยสำหรับแบบจำลองการดำเนินการและ exit
Maximum Adverse Excursion (MAE) และ Maximum Favorable Excursion (MFE) เป็น การวินิจฉัยที่สำคัญที่สุด สำหรับว่าปัญหาอยู่ที่ entry, exit หรือตัวกลยุทธ์เอง[11]
8. Cherry picking และการคัดเลือก signal – บาปที่พบบ่อยที่สุดของผู้ทดสอบ
Cherry picking เชิงวิธีการคือกระบวนการที่ผู้ทดสอบ (โดยรู้ตัวหรือไม่) ปฏิเสธส่วนหนึ่งของ signal ของกลยุทธ์ เก็บ "ที่ดี" และรายงานผลลัพธ์
Cherry picking สามแบบ
แบบที่ 1: "ฉันข้าม signal ที่ดูไม่ดี" กลยุทธ์สร้าง signal แต่ผู้ทดสอบประเมิน context ด้วยตนเอง – "signal นี้อยู่ในเฟสที่ผิด ฉันจะข้ามมัน" ใน backtest คุณนับเฉพาะ signal ที่ "ดูดี" ปัญหา: การตัดสิน "ดูดี" แบบย้อนหลังถูกปนเปื้อน – คุณรู้ว่าแท่งเทียนหลัง signal จบอย่างไร
แบบที่ 2: "ฉันกรองย้อนหลังตามผลลัพธ์" ผู้ทดสอบเห็นใน backtest ว่าเทรดที่ขาดทุนมักเป็นวันอังคารตอนเช้า เพิ่มตัวกรอง "ฉันไม่เทรดวันอังคารตอนเช้า" ตัวกรองนี้ไม่มีสมมติฐานอิสระ ถูกเพิ่มหลังจากดูผลลัพธ์
ตัวกรองทางกลสำหรับ cherry picking: จำนวน signal ที่ข้าม – ถ้า > 10% ของ signal ถูกปฏิเสธ น่าสงสัย ถ้า > 30% เป็น cherry picking แทบแน่นอน
9. ข้อผิดพลาดที่พบบ่อยที่สุดในการทดสอบ
ข้อผิดพลาดที่ 1: การ optimise พารามิเตอร์บนชุดข้อมูลทั้งหมด
ผู้ทดสอบใช้ MT4 Optimization Mode ทดสอบ 200 combinations ของพารามิเตอร์บนข้อมูล 5 ปีทั้งหมด เลือกอันที่ให้ +180% ไม่มี walk-forward ไม่มี OOS นี่คือ curve fitting คลาสสิก แก้ไข: แบ่งข้อมูล 70/30 เสมอ optimise บน IS เท่านั้น validate ครั้งเดียวบน OOS
ข้อผิดพลาดที่ 2: ตัวอย่างเล็กเกินไป
Backtest 6 เดือนที่มี 24 เทรดไม่ใช่ backtest – มันเป็นเกร็ดเล็กน้อย ขั้นต่ำ: ข้อมูล 3 ปี, 200+ เทรด Optimal: ข้อมูล 5 – 10 ปี, 500 – 2,000 เทรด
ข้อผิดพลาดที่ 3: Backtest บน bid เท่านั้น
แพลตฟอร์ม backtest บางอันใช้เฉพาะ bid (ราคาขาย) ตามค่าเริ่มต้น เทรด long ที่เปิดบน bid และปิดบน bid = ไม่มีการสร้างแบบจำลอง spread แก้ไข: ใน MT4 ตั้งโมเดล "Every tick" ด้วย TDS ใน MT5 ใช้ "Every tick based on real ticks"
ข้อผิดพลาดที่ 7: ไม่มีการติดตามกลยุทธ์หลังการนำไปใช้งาน
กลยุทธ์ผ่าน backtest, demo, micro account ไปยัง full sizing หลังจาก 6 เดือนเทรดเดอร์ไม่รู้ว่าในไตรมาสปัจจุบันกลยุทธ์มี expectancy -0.1R แทนที่จะเป็น +0.3R กลยุทธ์ต้องถูกติดตาม หลังการนำไปใช้งาน: การตรวจสอบ expectancy รายไตรมาสเทียบกับช่วงความเชื่อมั่น Monte Carlo รายละเอียดใน บทความ 15.5
10. Checklist – กลยุทธ์พร้อมสำหรับ live หรือยัง
รวม 20 คะแนน ใน 5 หมวด: การตรวจสอบทางสถิติ (5), ข้อผิดพลาดเชิงวิธีการ (6), แบบจำลองต้นทุน (4), forward test (3) และวินัยเชิงปฏิบัติการ (2) เกณฑ์ขั้นต่ำในการเปิด full sizing: 20/20
การตรวจสอบทางสถิติ (5 คะแนน)
- Backtest ครอบคลุมข้อมูลอย่างน้อย 3 ปี (optimal 5 – 10 ปี)
- ตัวอย่างเทรด ≥ 200 (ขั้นต่ำที่ยอมรับได้), ≥ 500 (การตรวจสอบที่แข็งแกร่ง)
- Walk-forward analysis ผ่านอย่างดี (OOS expectancy ใน ±0.15R ของ IS)
- Monte Carlo bootstrap: ผลตอบแทนประจำปีเปอร์เซ็นต์ไทล์ที่ 5 > 0, ruin probability (DD > 30%) < 2%
- การทดสอบทางสถิติ: p-value (binomial / t-test) < 0.05
ข้อผิดพลาดเชิงวิธีการ (6 คะแนน)
- ไม่มี look-ahead bias – กลยุทธ์ใช้เฉพาะข้อมูลจากเวลา t หรือก่อนหน้า
- ไม่มี survivorship bias – ทดสอบบนตะกร้าคู่ที่ใช้งานอยู่ในปัจจุบัน
- ไม่มี curve fitting – parameter heatmap แสดง plateau ไม่ใช่ isolated peak
- ไม่มี overfitting – ทุกกฎและตัวกรองมีเหตุผล ex-ante
- ไม่มี cherry picking – signal ที่ข้าม < 10%, เหตุผลที่กำหนดก่อนการทดสอบ
- ไม่มี data snooping – นี่ไม่ใช่กลยุทธ์ที่ 30 ที่ผ่านการทดสอบจากบันทึก
แบบจำลองต้นทุน (4 คะแนน)
- Spread สร้างแบบจำลองเป็นตัวแปร (ตามเวลาของวันหรือ tick-by-tick) ไม่ใช่คงที่
- Slippage สร้างแบบจำลองแบบ dynamic (static หรือ ATR-based ใน 3 regime)
- Swap สร้างแบบจำลองสำหรับกลยุทธ์ swing (ต่อทิศทาง, triple Wednesday)
- Commission สร้างแบบจำลองสำหรับกลยุทธ์ scalping
Forward test (3 คะแนน)
- Demo 30+ วัน, 30+ เทรด, expectancy ใน ±0.15R ของ backtest
- Live micro account 90+ วัน, 60+ เทรด, expectancy ใน ±0.1R ของ backtest
- Drawdown ระหว่าง forward ไม่เกินเปอร์เซ็นต์ไทล์ที่ 95 จาก Monte Carlo
วินัยเชิงปฏิบัติการ (2 คะแนน)
- การดำเนินการ: ความสอดคล้องของ signal ระบบกับการดำเนินการจริง > 95%
- แผนการติดตามหลังการนำไปใช้งานที่กำหนดไว้ – การตรวจสอบ expectancy รายไตรมาสเทียบกับ Monte Carlo CI
20/20 – กลยุทธ์พร้อมสำหรับ full sizing 17 – 19 – กลับไปทำให้สิ่งที่หายไปสมบูรณ์ ต่ำกว่า 17 – กลยุทธ์ยังไม่พร้อม
FAQ – คำถามที่พบบ่อย
การตรวจสอบกลยุทธ์เต็มรูปแบบจาก backtest ถึง live ใช้เวลานานแค่ไหน?
MT4 Strategy Tester เพียงพอสำหรับการตรวจสอบหรือไม่?
จะทำอย่างไรถ้ากลยุทธ์ของฉันมีเทรดเพียง 50 ครั้งใน backtest?
แหล่งอ้างอิง
- Lo A.W., MacKinlay A.C., A Non-Random Walk Down Wall Street, Princeton University Press, 1999
- Pardo R., The Evaluation and Optimization of Trading Strategies, Wiley, 2008
- Aronson D., Evidence-Based Technical Analysis, Wiley, 2007
- Bandy H.B., Quantitative Technical Analysis, Blue Owl Press, 2015
- Chan E., Quantitative Trading, Wiley, 2009
- Kaufman P.J., Trading Systems and Methods, Wiley, 6th ed., 2020
- CME Group – educational materials (cmegroup.com/education)
- Bank for International Settlements (BIS), Triennial Central Bank Survey of Foreign Exchange Markets, 2022/2023
- Tharp V.K., Definitive Guide to Position Sizing, IITM, 2008
- Tomasini E., Jaekle U., Trading Systems, Harriman House, 2009
- Sweeney J., Maximum Adverse Excursion, Wiley, 1997
- López de Prado M., Advances in Financial Machine Learning, Wiley, 2018
- European Securities and Markets Authority (ESMA), Decision (EU) 2018/796 (esma.europa.eu)
- National tax authorities of EU member states – capital gains tax on financial instruments