วัดผลระบบเทรดยังไงให้รู้ว่าดีจริง? คำตอบสั้นที่สุดของเราคือ ให้ระบบไปสู้กับการเข้าแบบสุ่มที่ใช้กติกาออกเดียวกัน — เรียกว่าด่าน random baseline ถ้าระบบชนะโยนเหรียญไม่ได้ ตัวเลข backtest สวยแค่ไหนก็ไม่มีความหมาย บทความนี้เล่าจากคดีจริง: บอท 2 ตัวของเราเองที่ถูกจับขึ้นเขียงด้วยวิธีนี้ แล้วผลออกมาว่ามันแย่กว่าการสุ่มล้วน ๆ
กราฟกำไรสวย ๆ สัญญาอะไรกับเรา
ความเชื่อพื้นฐานของคนทำระบบเทรดคือ ถ้า backtest ได้กำไร แปลว่าจุดเข้า (entry) ของเรา “มีของ” — อ่านตลาดออก จับจังหวะได้ เหนือกว่าคนทั่วไป
แต่มีตัวแปรแอบแฝงอยู่สองตัวที่รับเครดิตแทน entry ได้เสมอ: หนึ่งคือสภาพตลาดช่วงนั้น (ตลาดขาขึ้นทำให้ระบบ buy อะไรก็ได้ดูฉลาด) และสองคือกติกาออก (SL/TP ที่ตั้งไว้ดี ๆ ก็ทำกำไรเองได้โดย entry ไม่ต้องเก่งเลย)
คำถามที่ระบบส่วนใหญ่ไม่เคยถูกถามคือ กำไรนี้มาจาก entry จริง ๆ หรือมาจากสองตัวนั้น การชันสูตรครั้งนี้ของเราเริ่มจากคำถามนี้แหละ
เราเทสยังไง: จับบอทสู้กับการโยนเหรียญ
เคสตั้งต้น: บอทของเราตัวหนึ่ง (ตอนนี้ถูกฆ่าทิ้งไปแล้ว) ขาดทุนต่อเนื่องจนต้องขึ้นโต๊ะชันสูตร คำถามแรกไม่ใช่ “แก้ตรงไหน” แต่คือ “ตลาดช่วงนั้นมันเลวร้ายจนใครก็เจ๊ง หรือบอทเราห่วยเอง”
วิธีแยกสองอย่างนี้ออกจากกันคือสร้างคู่เทียบที่โง่ที่สุดเท่าที่จะโง่ได้:
- เข้าเทรดแบบ random ล้วน ๆ ไม่มีสัญญาณ ไม่มีอินดิเคเตอร์
- แต่ใช้ SL/TP ชุดเดียวกับบอทเป๊ะ ๆ บนข้อมูลช่วงเดียวกัน
- รันซ้ำ 500 รอบ เพื่อให้เห็นการกระจายของผล ไม่ใช่ฟลุ๊กรอบเดียว
เหตุผลที่ต้องรันหลายร้อยรอบ เราเขียนแยกไว้ในเรื่องขนาดตัวอย่างที่เชื่อถือได้จริง — รอบเดียวหรือสิบรอบบอกอะไรไม่ได้เลย
ผลที่เจอ: random ชนะบอทขาดลอย
ผลออกมาแบบไม่ต้องเถียงกันต่อ:
| ตัววัด | บอทของเรา | random entry (SL/TP เดียวกัน) |
|---|---|---|
| ผลงาน | ขาดทุนต่อเนื่อง | เฉลี่ย +358bps |
| จำนวนรอบทดลอง | — | 500 รอบ |
| รอบที่ติดลบ | ตัวจริงติดลบ | 0 ใน 500 รอบ |
อ่านตารางนี้อีกที: การเข้ามั่ว ๆ 500 รอบ ไม่มีแม้แต่รอบเดียวที่ขาดทุน แปลว่าตลาดช่วงนั้น “พ้นผิด” อย่างสมบูรณ์ — ใครเข้าตอนไหนก็ควรได้กำไร ขอแค่ออกด้วยกติกาชุดนั้น
ส่วนบอทที่มีสัญญาณ มีตรรกะ มีความตั้งใจดี กลับขาดทุน สรุปแบบขำไม่ค่อยออก: entry ของบอทไม่ได้แค่ “ไม่มีของ” แต่มันเลือกจังหวะเข้าได้แย่กว่าการสุ่มอย่างเป็นระบบ
ทำไมบอทถึงแย่กว่าโยนเหรียญ
พอแงะศพต่อ สาเหตุจริงกลับไม่ได้อยู่ที่ฝั่ง entry อย่างเดียว — ฆาตกรตัวจริงคือฝั่ง exit ที่ไม่เคยถูกเทสแยกเลย
เราเทส entry กันเป็นเรื่องเป็นราว แต่ exit มักถูกตั้งครั้งเดียวแล้วลืม ทั้งที่ exit คือครึ่งหนึ่งของระบบ พอ entry กับ exit ถูกเทสรวมกันเป็นก้อนเดียวตลอด เราไม่มีทางรู้ว่าตัวไหนสร้างกำไร ตัวไหนกำลังเลื่อยขาเก้าอี้อยู่
การทดลอง random baseline คือเครื่องแยกชิ้นส่วนนี้: พอตรึง exit ไว้แล้วสุ่ม entry ผลที่ออกมาคือมูลค่าของ exit + ตลาดล้วน ๆ ส่วนต่างระหว่างระบบจริงกับ random คือมูลค่าที่แท้จริงของ entry — ในเคสเรา ส่วนต่างนั้นติดลบ
อีกกลไกที่ทำให้เราหลงเชื่อบอทมานาน: ระบบที่ตายแล้วมักดูดีในเงื่อนไขที่มันถูก fit มา เหมือนเคส EMA cross ที่เคยงามใน backtest แล้วพังคามือ และบางทีปัญหาไม่ใช่กลยุทธ์ด้วยซ้ำ แต่เป็นข้อมูลที่ใช้เทส แบบเคสทอง breakout ที่ตายเพราะ feed ห่วย
บทเรียนที่เอาไปใช้ได้
- exit คือครึ่งหนึ่งของระบบ แต่แทบไม่มีใครเทสแยก — ถ้าคุณไม่เคยเทส exit เดี่ยว ๆ คุณยังไม่รู้ว่ากำไรมาจากไหน
- ทุกระบบต้องผ่านด่าน “ชนะ random ที่ใช้กติกาออกเดียวกัน” ก่อนจะเชื่อว่า entry มีของจริง — ไม่ผ่าน = ยังไม่ต้องคุยเรื่องอื่น
- paper kill rule ต้องผูกพัน ไม่ใช่ไว้ต่อรอง — ตั้งเกณฑ์ฆ่าระบบไว้ล่วงหน้าแล้วทำตาม ไม่ใช่พอถึงเวลาแล้วขอ “ดูอีกสักอาทิตย์”
- ระบบขาดทุนไม่ได้แปลว่าตลาดร้าย และระบบกำไรไม่ได้แปลว่า entry เก่ง — ต้องมี baseline ถึงจะแยกออก
เทส random baseline เองได้ยังไง
ขั้นตอนย่อสำหรับเอาไปทำเอง (รายละเอียดวิธีวัดผลแบบอื่น ๆ อยู่ในหมวดวิธีเทสระบบของเรา):
- แกะกติกาออกของระบบให้ครบ: SL, TP และเงื่อนไขปิดไม้ทุกแบบ ห้ามตกหล่น เพราะนี่คือตัวแปรที่ต้องตรึงไว้
- เขียนสคริปต์สุ่มจุดเข้าบนข้อมูลช่วงเดียวกับที่ระบบจริงรัน โดยใช้กติกาออกจากข้อ 1 เป๊ะ ๆ
- รันซ้ำหลายร้อยรอบ (เราใช้ 500 รอบ) เก็บผลตอบแทนของทุกรอบไว้เป็นการกระจาย
- เอาผลของระบบจริงไปวางบนการกระจายนั้น — ถ้าระบบอยู่แถวกลาง ๆ หรือต่ำกว่า แปลว่า entry ไม่มีของ
- ถ้าไม่ผ่าน ให้ทำตาม kill rule ที่ตั้งไว้ล่วงหน้า ไม่ต่อรอง ไม่ขอโอกาสที่สอง
ระบบที่ดีจริงต้องกล้าขึ้นเขียงนี้ ถ้าคุณไม่กล้าเอาระบบตัวเองไปสู้กับการโยนเหรียญ นั่นอาจเป็นคำตอบอยู่ในตัวแล้ว