เรียนรู้ › EA และเทรดอัตโนมัติ
Data snooping คืออะไร ลอง 200 กลยุทธ์ ตัวที่ดีที่สุดก็อาจเป็นแค่โชค
ยิ่งลองหลายแบบ ยิ่งเจอผู้ชนะปลอม ดู Sharpe ที่พองจากการเลือกตัวที่ดีที่สุด แนวคิด Bonferroni, Reality Check, t > 3, Deflated Sharpe และการทดลองกลยุทธ์สุ่ม 200 ตัว
- ทดสอบกลยุทธ์ที่ไม่มีความได้เปรียบ 100 แบบที่เกณฑ์ 5% จะมีราว 5 แบบผ่านเพราะโชคล้วน ๆ
- ผลของ "ตัวที่ดีที่สุดจาก N ตัว" สูงขึ้นเองตาม N แม้ทุกตัวไม่มีอะไรเลย ต้องเทียบกับตัวเลขที่โชคทำได้ ไม่ใช่เทียบกับศูนย์
- ในการจำลองของเรา ตัวที่ดีที่สุดจากกลยุทธ์สุ่ม 200 ตัวได้ +30R และ t = 3.13 แต่เจอข้อมูลใหม่ได้ −8R
- วิธีแก้คือนับทุกแบบที่ลอง เขียนกติกาก่อนดูผล กันข้อมูลไว้ยืนยัน และเลือกระบบที่เรียบง่าย
Data snooping หรือ multiple testing คือปัญหาที่เกิดเมื่อเราลองกลยุทธ์หลายแบบบนข้อมูลชุดเดียวกัน แล้วหยิบแบบที่ผลดีที่สุดมาใช้ ยิ่งลองมาก ยิ่งมีโอกาสเจอแบบที่ดูดีเพราะบังเอิญ ไม่ใช่เพราะมีความได้เปรียบจริง เรื่องนี้ต่างจาก Overfitting แบบที่เราเคยเล่าตรงที่ ต่อให้แต่ละแบบเรียบง่ายและไม่ได้จูนละเอียดเลย การเลือกตัวที่ดีที่สุดจากหลายตัวก็หลอกเราได้แล้ว บทนี้จำลองให้เห็นด้วยตัวเลขจริง แล้วดูเครื่องมือที่นักวิจัยใช้แก้
ลอง 100 แบบ ผ่าน 5 แบบเพราะโชค
การทดสอบทางสถิติที่เกณฑ์ 5% ถามว่า “ถ้าระบบนี้ไม่มีความได้เปรียบเลย โอกาสที่ผลจะออกมาดีขนาดนี้เพราะโชคมีเท่าไร” ถ้าน้อยกว่า 5% เราเรียกว่าผ่าน
เกณฑ์นี้ออกแบบมาสำหรับการทดสอบ ครั้งเดียว ถ้าเราทดสอบ 100 แบบที่ไม่มีความได้เปรียบเลย
- จำนวนที่คาดว่าจะผ่านเพราะโชค = 100 × 5% = 5 แบบ
- โอกาสที่ไม่มีแบบไหนผ่านเลย = 0.95 ยกกำลัง 100 ≈ 0.6%
- โอกาสที่มีอย่างน้อย 1 แบบผ่าน ≈ 99.4%
พูดง่าย ๆ ถ้าลองมากพอ จะเจอ “ระบบที่ผ่านสถิติ” แน่นอน ไม่ว่าจะมีระบบดีอยู่ในกองหรือไม่ บท Overfitting คืออะไร เล่าเรื่องนี้กับการจูนค่า EA ไว้แล้ว บทนี้จะลงลึกว่ามันพองผลไปเท่าไร และแก้ยังไง
ตัวอย่างคำนวณ: กลยุทธ์ไม่มี edge 200 ตัว
เราสร้างกลยุทธ์สมมติ 200 ตัวด้วยสคริปต์ node แต่ละตัวเทรด 100 ไม้ ทุกไม้มีโอกาส 50% ได้ +1R และ 50% เสีย −1R (R คือหน่วยความเสี่ยงต่อไม้ เช่นเสี่ยง 1% ของพอร์ต) ไม่มีค่า spread ไม่มีความได้เปรียบเลยแม้แต่ตัวเดียว ค่าคาดหวังของทุกตัวคือ 0
ถ้าชนะ W ไม้ ผลรวม = W − (100 − W) = 2W − 100 R
เกณฑ์ผ่าน: ชนะ 59 ไม้ขึ้นไป (+18R ขึ้นไป) เพราะโอกาสที่เหรียญเที่ยงจะออกหัว 59 ครั้งขึ้นไปจาก 100 ครั้ง คือ 4.4% เป็นจำนวนที่ใกล้ 5% ที่สุดโดยไม่เกิน
ผลที่ได้
- ผลรวมเฉลี่ยของ 200 ตัว = −0.4R กระจายตั้งแต่ −24R ถึง +30R
- ได้บวก 89 ตัว ติดลบ 98 ตัว เสมอทุน 13 ตัว
- ผ่านเกณฑ์ 10 ตัว ค่าคาดหวังคือ 200 × 4.43% = 8.9 ตัว ตรงกับที่ควรเป็น
ตัวที่ดีที่สุดชนะ 65 จาก 100 ไม้ ถ้าเห็นตัวเลขนี้ในรายงาน Backtest คงดูน่าตื่นเต้น
- ผลรวม = 2 × 65 − 100 = +30R
- กำไรเฉลี่ยต่อไม้ = 30 ÷ 100 = 0.30R
- ส่วนเบี่ยงเบนมาตรฐานต่อไม้ ≈ 0.959R
- Sharpe ต่อไม้ = 0.30 ÷ 0.959 ≈ 0.31
- t-stat = 0.31 × √100 ≈ 3.13 โอกาสที่เหรียญเที่ยงออกหัว 65 ครั้งขึ้นไปคือ 0.18%
ถ้าดูตัวนี้ตัวเดียว เราจะสรุปว่ามันผ่านสถิติแบบขาดลอย แต่มันคือเหรียญเที่ยง เราแค่หยิบเหรียญที่บังเอิญออกหัวเยอะที่สุดจาก 200 เหรียญ
เอาตัวที่ดีที่สุดไปเจอข้อมูลใหม่
ทีนี้ให้ทุกตัวเทรดต่ออีก 100 ไม้ เป็นข้อมูลที่ไม่ได้ใช้ตอนเลือก (out-of-sample)
- ตัวที่ดีที่สุด จาก +30R เหลือ −8R (ชนะ 46 ไม้)
- 10 อันดับแรก เฉลี่ยจาก +21.4R เหลือ +8R
ผลของ 10 อันดับแรกในรอบนี้ยังเป็นบวก และ 3 ใน 10 ตัวที่ผ่านเกณฑ์ผ่านซ้ำได้อีก ซึ่งมากกว่าที่โชคมักให้ เราไม่ได้สุ่มใหม่เพื่อให้ภาพสวยขึ้น เพราะการรันซ้ำจนได้ภาพที่อยากได้ ก็คือ Data snooping อีกแบบหนึ่ง สิ่งที่บอกความจริงคือการทำการทดลองเดียวกันซ้ำหลายรอบ
เราทำการทดลอง 200 ตัวนี้ซ้ำ 2,000 รอบ
- ตัวที่ดีที่สุดในแต่ละรอบ ได้เฉลี่ย +27.2R ในช่วงทดสอบ ไม่มีรอบไหนต่ำกว่า +18R
- ตัวเดียวกันเจอข้อมูลใหม่ ได้เฉลี่ย 0.0R ได้บวกแค่ 45.9% ของรอบ
- 10 อันดับแรก เฉลี่ยข้อมูลใหม่ 0.0R เช่นกัน
- ตัวที่ผ่านเกณฑ์ ผ่านซ้ำในข้อมูลใหม่ 4.4% เท่ากับโอกาสของเหรียญเที่ยงพอดี
ข้อมูลใหม่ 100 ไม้ก็มีโชคปนอยู่มาก ผลรวม 100 ไม้ของแต่ละตัวมีส่วนเบี่ยงเบนมาตรฐานราว 10R จากโชคอย่างเดียว การยืนยันครั้งเดียวจึงยังไม่พอ ต้องดูว่าผลยืนยันห่างจากสิ่งที่โชคให้ได้แค่ไหน
ตัวที่ดีที่สุดจาก N ตัว พองขึ้นเท่าไร
ยิ่งลองมาก ผลของตัวที่ดีที่สุดยิ่งสูงขึ้นเอง ทั้งที่ไม่มีตัวไหนดีจริง เราจำลองค่าเฉลี่ยของตัวที่ดีที่สุด (2,000 รอบต่อแถว) แล้วเทียบกับสูตรประมาณค่าสูงสุดที่คาดหวังของตัวเลขสุ่มแบบปกติ N ตัว ซึ่ง Bailey และ López de Prado ใช้ในงาน Deflated Sharpe ratio
| จำนวนแบบที่ลอง (N) | ตัวที่ดีที่สุด จากการจำลอง | จากสูตร |
|---|---|---|
| 1 | −0.2R | 0R |
| 10 | +15.4R | +15.7R |
| 100 | +25.0R | +25.3R |
| 200 | +27.2R | +27.7R |
| 1,000 | +32.3R | +32.6R |
(สูตรให้ค่าเป็นหน่วยส่วนเบี่ยงเบนมาตรฐาน คูณด้วย 10R ซึ่งเป็นส่วนเบี่ยงเบนของผลรวม 100 ไม้ แถว N = 1 คือไม่ได้เลือกเลย ค่าคาดหวังจึงเป็น 0)
ตัวเลขโตตาม N เร็วช่วงแรก แล้วค่อย ๆ ช้าลง แต่ไม่หยุด ลองจาก 200 เป็น 1,000 แบบ ผู้ชนะปลอมดีขึ้นอีกราว 5R ฟรี ๆ ในแง่ Sharpe ต่อไม้ ตัวที่ดีที่สุดจาก 200 ตัวที่ไม่มีอะไรเลยคาดว่าจะได้ราว 0.28 ตัวในตัวอย่างของเราได้ 0.31 สูงกว่าโชคแค่นิดเดียว
ผลของตัวที่ดีที่สุดต้องเทียบกับ “ตัวที่ดีที่สุดที่โชคทำได้เมื่อลองเท่านี้แบบ” ไม่ใช่เทียบกับศูนย์
Bonferroni: ลองมากเท่าไร เกณฑ์ต้องสูงเท่านั้น
วิธีที่ง่ายที่สุดคือ Bonferroni correction หารเกณฑ์ด้วยจำนวนแบบที่ลอง
- ลอง 200 แบบ เกณฑ์ = 5% ÷ 200 = 0.025%
- ต้องชนะ 68 ไม้ขึ้นไป จาก 100 ไม้ (โอกาสจากโชค 0.020%) ชนะ 67 ไม้ยังมีโอกาสจากโชค 0.044% ซึ่งเกินเกณฑ์
- ตัวที่ดีที่สุดของเราชนะ 65 ไม้ ไม่ผ่าน
ข้อเสียของ Bonferroni คือเข้มเกินไปเมื่อแต่ละแบบคล้ายกัน เช่น MA 20 กับ MA 21 แทบเป็นระบบเดียวกัน นับเป็น 2 แบบเต็ม ๆ จะทำให้ตัดระบบดีทิ้งได้ แต่ในทางปฏิบัติ สำหรับเทรดเดอร์รายย่อย ปัญหาที่เจอบ่อยกว่าคือนับน้อยเกินไป ไม่ใช่เข้มเกินไป
เครื่องมือจากงานวิจัย
- White’s Reality Check (Halbert White, 2000) แทนที่จะทดสอบทีละแบบ มันทดสอบคำถามว่า “ตัวที่ดีที่สุดในทุกแบบที่ลอง ดีกว่าสิ่งที่โชคให้ได้ไหม” โดยสุ่มข้อมูลซ้ำ (bootstrap) แล้วดูว่าตัวที่ดีที่สุดในข้อมูลสุ่มแต่ละรอบได้เท่าไร
- Hansen’s SPA test (Peter Hansen, 2005) ปรับปรุง Reality Check ไม่ให้ผลอ่อนลงเพราะเรามีแบบแย่ ๆ หรือไม่เกี่ยวข้องปนอยู่ในกองเยอะ
- Harvey, Liu และ Zhu (2016) ในงาน “…and the Cross-Section of Expected Returns” ไล่ดูปัจจัยอธิบายผลตอบแทนหุ้นที่งานวิจัยเสนอมาหลายร้อยตัว และเสนอว่าปัจจัยใหม่ควรมี t-stat มากกว่าราว 3 ไม่ใช่ 2 ตามธรรมเนียม เพราะวงการลองมาเยอะแล้ว ข้อสังเกตจากตัวอย่างของเรา ตัวที่ดีที่สุดจาก 200 ตัวได้ t = 3.13 ผ่านเกณฑ์ 3 ทั้งที่เป็นโชคล้วน เกณฑ์ 3 ไม่ใช่เลขมหัศจรรย์ ยิ่งลองมาก ยิ่งต้องสูงกว่านั้น
- Deflated Sharpe ratio (Bailey และ López de Prado, 2014) ถามว่า Sharpe ที่ได้สูงกว่า Sharpe สูงสุดที่โชคให้ได้เมื่อลอง N แบบหรือไม่ และเผื่อให้กับผลที่ไม่กระจายแบบปกติด้วย
เราคำนวณกับตัวที่ดีที่สุดของเรา (ใช้สูตร Probabilistic Sharpe ratio ที่ปรับด้วย skew และ kurtosis ของผลต่อไม้)
- เทียบกับ Sharpe 0 (เหมือนลองแบบเดียว): ความน่าจะเป็นที่ Sharpe จริงมากกว่า 0 ≈ 99.8% ดูเหมือนแน่นอน
- เทียบกับ Sharpe 0.28 ที่โชคให้ได้เมื่อลอง 200 แบบ: เหลือ ≈ 63% ต่ำกว่าระดับ 95% ที่มักใช้มาก
ตัวเลขชุดเดียวกัน แค่ยอมนับว่าลองไปกี่แบบ ข้อสรุปก็กลับข้าง
บทเรียนจากการทดสอบย้อนหลังของเรา
นับผิด 925 ชุด ในการทดสอบย้อนหลังของเรา เรานับเหตุการณ์ที่ราคาทองคำชนระดับฟิโบนักชีต่าง ๆ จากข้อมูลแท่ง M1 ปี 2022–2026 ได้ 62,867 เหตุการณ์ แล้วไล่จัดอันดับ 8,078 ชุด (ระดับ × ทิศ × TP × SL) เทียบกับการเข้าแบบสุ่ม รอบแรกมี 925 ชุด “ชนะสุ่ม” แต่ทั้งหมดเป็นผลหลอก เพราะสคริปต์ตัดเหตุการณ์ที่ยังไม่รู้ผลภายใน 5 ชั่วโมงทิ้ง บางชุดถูกตัดไป 30–70% ชุดที่ TP ใกล้ SL ไกลจึงดูชนะเกินจริง เพราะครั้งที่ราคาไปถึงเป้าใกล้ ๆ จบเร็วและถูกนับครบ ส่วนครั้งที่ราคาไม่ไปทางเป้ามักค้างนานจนถูกตัดทิ้ง พอคัดเฉพาะชุดที่ค้างไม่ถึง 5% เหลือ 40 ชุด และยังต้องยืนยันกับปีที่แยกไว้ต่อ ปัญหาการวัดแบบนี้รวมกับการลองหลายพันชุด ผลิตผู้ชนะปลอมได้เป็นร้อย
70 เส้นบนจอ มีครั้งหนึ่งเราเห็นราคากลับตัวพอดีที่ระดับ 261.8 ของคลื่นก่อนหน้า ดูเหมือนเส้นฟิโบของคลื่นเก่ายังมีความหมาย แต่ถ้าวาดเส้นของคลื่นเก่า 10 ชุด ชุดละหลายระดับ จะมีราว 70 เส้นบนจอ ย่อมมีสักเส้นตรงจุดกลับตัวเสมอ นี่คือการเลือกตัวอย่างหลังเห็นผล เราจึงวัดการแตะทั้งหมด 241,000 ครั้ง (ทองคำ M1) เทียบกับระดับหลอก (placebo) ที่ไม่ใช่ฟิโบในระยะใกล้กัน ระดับ 261.8 เด้ง 41% ระดับหลอกเด้ง 42% ไม่มีระดับฟิโบไหนเด้งบ่อยกว่าระดับหลอกอย่างมีนัย อ่านเพิ่มเรื่องนี้ได้ใน Hindsight bias
ตัวคุมต้องหน้าตาเหมือนกัน ตัวเทียบหรือ placebo ต้องสร้างให้เหมือนสิ่งที่ทดสอบทุกอย่าง ยกเว้นส่วนที่อ้างว่าเป็นความได้เปรียบ เราเคยใช้ตัวคุมที่สร้างไม่ตรงรูปแบบ แล้วได้ผลว่าดีกว่าตัวคุม ซึ่งเป็นผลหลอกจากตัวคุมเอง
กติกาเขียนไว้ก่อนก็ยังพังได้ สมุดวิจัยของเรากำหนดไว้ตั้งแต่ต้นว่าทุกไอเดียต้องจดก่อนรัน นิยามห้ามเปลี่ยนกลางทาง ปี 2022–2024 ใช้ค้นหา ปี 2025–2026 ใช้ยืนยันเท่านั้น แต่ทำไปสักพัก เราก็เริ่มเลือกตัวกรองจากผลปี 2026 ปีนั้นจึงกลายเป็นข้อมูลที่ใช้เลือกไปแล้ว และตัวกรองหลายตัวก็ดีแค่ปีนั้นปีเดียว
ข้อมูลปี 2022–2025 ในงานนี้เป็นข้อมูลแท่งหรือ tick จำลอง มีแค่ปี 2026 ที่เป็น tick จริง ผลทดสอบย้อนหลังและผลในอดีตไม่ได้บอกผลในอนาคต
กติกาใช้จริง
- นับทุกแบบที่ลอง จดลงสมุดทุกครั้งที่กดรัน รวมแบบที่ทิ้งไป ตัวเลขนี้คือ N ที่ต้องใช้ตัดสิน ถ้าลองไป 50 แบบ ผลของตัวที่ดีที่สุดต้องเทียบกับสิ่งที่โชคให้ได้จาก 50 แบบ
- เขียนกติกาก่อนดูผล จดสมมติฐาน นิยาม และเกณฑ์ผ่านไว้ล่วงหน้า (pre-registration) ถ้าเปลี่ยนเกณฑ์หลังเห็นผล ให้ถือว่าเริ่มการทดลองใหม่
- กันข้อมูลไว้ยืนยันและแตะครั้งเดียว ถ้าเอาข้อมูลยืนยันมาดูแล้วกลับไปแก้ระบบ ข้อมูลนั้นกลายเป็นข้อมูลค้นหาแล้ว Walk-forward ช่วยให้มีช่วงยืนยันหลายช่วง
- เลือกแบบเรียบง่าย ระบบที่มีค่าตั้งน้อย ลองแบบน้อย N ก็เล็ก และผลที่ได้ก็เชื่อได้มากกว่า
- เทียบกับ placebo ที่หน้าตาเหมือนกัน เช่นเข้าแบบสุ่มด้วย SL TP และจำนวนไม้เท่ากัน ถ้าชนะ placebo ไม่ชัด ยังไม่มีหลักฐาน
- ยกเกณฑ์ตาม N ใช้ Bonferroni แบบหยาบ ๆ หรือเทียบกับตารางตัวที่ดีที่สุดจาก N ตัวด้านบน และเผื่อว่าผลจริงจะต่ำกว่า Backtest เสมอ ดู ทำไมผลรันจริงมักต่ำกว่า Backtest
ข้อมูลที่ยังไม่เกิด คือข้อมูลชุดเดียวที่เราแอบดูไม่ได้แน่นอน
ข้อผิดพลาดที่เจอบ่อย
- รายงานแค่ตัวที่ดีที่สุด ไม่บอกว่าลองไปกี่แบบ ทั้งตอนอ่านผลคนอื่นและตอนจดผลตัวเอง ถ้าไม่รู้ N ตัวเลขนั้นอ่านไม่ได้
- นับเฉพาะรอบที่กด Optimize แต่ลืมนับคู่เงิน Timeframe ช่วงเวลาเทรด และไอเดียที่ลองด้วยตาบนกราฟ
- เปิดดูข้อมูลยืนยันซ้ำหลายรอบ ทุกครั้งที่ดูแล้วแก้ ข้อมูลยืนยันก็ถูกใช้ไปอีกครั้ง
- เชื่อ t > 3 หรือ Sharpe สูงโดยไม่ดู N ตัวอย่างของเราได้ t = 3.13 จากเหรียญเที่ยง
- ตัดไม้ที่ยังไม่จบออกจากการนับ ผลจะเอียงเข้าหาระบบ TP ใกล้ SL ไกลทันที
- รันการจำลองซ้ำจนได้ภาพที่ชอบ การเลือกผลจำลองก็คือ Data snooping เหมือนกัน
- ใช้การยืนยันครั้งเดียวที่ไม้น้อยเป็นคำตัดสิน ผลรวม 100 ไม้ที่ไม่มี edge มีส่วนเบี่ยงเบนมาตรฐานราว 10R จากโชคล้วน ๆ ดูการกระจายของผลด้วย Monte Carlo
คำถามที่พบบ่อย
ถ้าผลย้อนหลังผ่านเกณฑ์สถิติ 5% แปลว่าระบบมีความได้เปรียบหรือเปล่า
ยังไม่แน่ ถ้าระบบนั้นเป็นตัวที่ดีที่สุดจากหลายแบบที่ลอง เกณฑ์ 5% ใช้ไม่ได้แล้ว เพราะมันออกแบบมาสำหรับการทดสอบครั้งเดียว ต้องนับจำนวนแบบที่ลองทั้งหมดแล้วยกเกณฑ์ขึ้น หรือทดสอบกับข้อมูลที่ไม่ได้ใช้ตอนเลือก
ต้องนับอะไรบ้างเป็น "หนึ่งแบบที่ลอง"
นับทุกอย่างที่เปลี่ยนแล้วกดรันดูผล ทั้งค่าตั้ง ตัวกรอง ช่วงเวลา คู่เงิน Timeframe และไอเดียที่ทิ้งไปแล้ว รวมถึงสิ่งที่ลองในหัวขณะดูกราฟด้วย ถ้าจำไม่ได้ว่าลองไปกี่แบบ ให้ถือว่ามากกว่าที่คิด
ข้อมูลน้อย ไม่อยากแบ่งไว้ยืนยัน ทำยังไงดี
ลดจำนวนแบบที่ลองแทน เลือกกติกาง่าย ๆ ที่มีเหตุผลรองรับก่อนดูผล แล้วยอมรันเดโมหรือเงินจำนวนน้อยไปข้างหน้าเป็นข้อมูลยืนยัน ข้อมูลที่ยังไม่เกิดคือข้อมูลที่เราแอบดูไม่ได้แน่นอน
เนื้อหานี้เป็นความรู้ทั่วไป ไม่ใช่คำแนะนำการลงทุน การเทรดมีความเสี่ยง อาจสูญเสียเงินลงทุนทั้งหมด