backtest อาจรายงานว่าจับคู่คำสั่งได้ที่ราคาซึ่งตลาดไม่เคยแสดง โดยทั่วไปตัวจำลองอนุมานการส่งคำสั่งที่ดูเป็นไปได้จากข้อมูลที่ไม่ครบถ้วน เช่น ราคาสูงสุดและต่ำสุดของแท่งราคา ราคากึ่งกลาง หรือราคาลิมิตที่มีการซื้อขายแตะถึงเพียงครั้งเดียว ทำให้บันทึกการซื้อขายดูแม่นยำ ทั้งที่ซ่อนสิ่งที่ตลาดเสนอจริงไว้
เริ่มจากถามว่าคำสั่งของคุณสามารถซื้อขายที่ราคาใดได้บ้าง แท่งราคาจากธุรกรรมล่าสุดบอกว่ามีการซื้อขายที่ราคาใดในช่วงเวลาหนึ่ง แต่ไม่ได้บอก bid และ ask ตอนที่คำสั่งของคุณมาถึง มีปริมาณพร้อมซื้อขายอยู่เท่าไร หรือคำสั่งของคุณจะขึ้นไปอยู่หัวคิวได้หรือไม่
ทำไม backtest ของฉันจึงแสดงการจับคู่คำสั่งนอกช่วงราคาตลาด?
ก่อนอื่น ต้องระบุให้ชัดว่า “นอกช่วง” หมายถึงอะไร การจับคู่คำสั่งซื้อที่ต่ำกว่าราคาต่ำสุดของแท่ง หรือคำสั่งขายที่สูงกว่าราคาสูงสุด เป็นข้อผิดพลาดด้านบัญชีหรือการจับเวลาอย่างชัดเจน แต่การจับคู่ภายในช่วงราคาสูงสุดถึงต่ำสุดก็ยังอาจเป็นเรื่องสมมติได้ เพราะราคาอาจเกิดขึ้นก่อนมีคำสั่ง อยู่คนละฝั่งของสเปรด หรือมีปริมาณน้อยเกินกว่าจะจับคู่กับคำสั่งของคุณได้
ลองพิจารณาแท่งราคา 1 นาทีที่เปิดที่ 100.00 ต่ำสุด 99.80 และปิดที่ 100.10 กลยุทธ์ของคุณเห็นแท่งราคาที่สมบูรณ์แล้วส่งคำสั่งซื้อ จากนั้นตัวจำลองจับคู่คำสั่งที่ 99.80 ราคาต่ำสุดนั้นอาจเกิดขึ้นช่วงต้นนาที ก่อนสัญญาณ 50 วินาที แท่งราคาไม่ได้ให้หลักฐานว่า 99.80 ยังมีให้ซื้อหลังจากตัดสินใจแล้ว
| ข้อมูลที่มี | ข้อมูลนี้ยืนยันอะไรได้ | ข้อมูลนี้ยืนยันอะไรไม่ได้ |
|---|---|---|
| แท่ง OHLCV | ช่วงราคาและปริมาณธุรกรรมที่สังเกตได้ในช่วงเวลาหนึ่ง | ลำดับราคา bid และ ask หรือปริมาณที่พร้อมซื้อขายเมื่อคำสั่งมาถึง |
| รายการธุรกรรม | ธุรกรรมที่รายงานพร้อมเวลาและราคา | สภาพคล่องที่ค้างอยู่ในสมุดคำสั่ง หรืออันดับของคุณในคิว |
| ราคาเสนอซื้อขายระดับบนสุด | bid และ ask ที่แสดงดีที่สุด ณ เวลาที่สุ่มเก็บข้อมูล | ความลึกของสมุดคำสั่งที่เกินระดับราคาดีที่สุด หรือราคาเสนอซื้อขายยังคงอยู่ระหว่างการเก็บตัวอย่างหรือไม่ |
| เหตุการณ์ในสมุดคำสั่ง | การเปลี่ยนแปลงของปริมาณที่แสดงและเหตุการณ์ในคิว โดยขึ้นอยู่กับความครอบคลุมของฟีดข้อมูล | สภาพคล่องที่ซ่อนอยู่ การเข้าถึงแพลตฟอร์มซื้อขาย หรือการรับประกันลำดับความสำคัญ |
อีกสาเหตุที่พบได้บ่อยคือการสับสนระหว่างราคากึ่งกลางกับราคาที่ซื้อขายได้จริง หากราคาเสนอคือ bid 99.99 และ ask 100.01 การซื้อที่ราคากึ่งกลาง 100.00 ดูเรียบร้อยดีในรายงาน แต่โดยทั่วไปคำสั่งซื้อแบบ marketable จะจ่ายที่ ask และอาจมีผลกระทบจากขนาดคำสั่งด้วย การถือว่าราคากึ่งกลางเป็นราคาที่จับคู่ได้เป็นการตัดสเปรดออกไปครึ่งหนึ่งอย่างแนบเนียน
คำสั่งลิมิตจะจับคู่ได้เพียงเพราะตลาดแตะราคานั้นหรือไม่?
การแตะราคาเป็นหลักฐานว่ามีการบันทึกธุรกรรมที่ราคาลิมิต แต่ไม่ได้พิสูจน์ว่าคำสั่งที่รออยู่ของคุณจะได้รับการจับคู่ หากมีคำสั่งอื่นอยู่ก่อนหน้า ปริมาณซื้อขายที่ราคานั้นอาจน้อยเกินกว่าจะมาถึงตำแหน่งของคุณในคิว ธุรกรรมที่เห็นยังอาจมาจากแพลตฟอร์มซื้อขายอื่น ขณะที่คำสั่งของคุณรออยู่คนละแห่ง
สมมติว่าคำสั่งลิมิตซื้อของคุณอยู่ที่ 50.00 และตลาดซื้อขาย 200 หุ้นที่ราคานั้นหลังจากคุณส่งคำสั่ง ตัวจำลองที่อิงการแตะราคาจะจับคู่ให้ครบทั้ง 500 หุ้น โมเดลที่ระมัดระวังกว่าจะถามว่ามีการซื้อขายปริมาณเท่าไรที่ราคา 50.00 หรือต่ำกว่าหลังจากคำสั่งมาถึง แล้วจึงคำนึงถึงปริมาณที่คาดว่าจะอยู่ข้างหน้าคิว หากไม่มีข้อมูลสมุดคำสั่งระดับคำสั่ง ปริมาณในคิวนั้นก็เป็นเพียงสมมติฐาน ควรแสดงสมมติฐานนี้ในผลลัพธ์ ไม่ใช่แฝงไว้ราวกับเป็นข้อเท็จจริงแน่นอน
สำหรับระบบวิจัยขนาดเล็ก ฉันอยากระบุสมมติฐานนี้ให้ชัดและทดสอบหลายระดับ มากกว่าทำเหมือนข้อมูลแท่งเทียนบอกลำดับในคิวได้ ช่วงที่เหมาะสมขึ้นอยู่กับแพลตฟอร์ม ขนาดคำสั่ง และความถี่ที่กลยุทธ์ซื้อขาย หุ้นที่มีสภาพคล่องต่ำในช่วงเปิดตลาดกับสัญญาคริปโตที่สภาพคล่องบางตอน 03:00 UTC เป็นปัญหาด้านการส่งคำสั่งคนละแบบ
ควรเลือกโมเดลจับคู่คำสั่งสำหรับข้อมูลแท่งราคาอย่างไร?
เลือกโมเดลให้เหมาะกับทั้งข้อมูลและข้ออ้างของกลยุทธ์ backtest ที่ใช้แท่งราคายังมีประโยชน์กับกลยุทธ์ที่ซื้อขายช้าได้ แต่ราคาที่จับคู่ควรสอดคล้องกับสิ่งที่แท่งราคาแสดงให้เห็นจริง
- กำหนดเวลาตัดสินใจและเวลาที่คำสั่งมาถึง หากสัญญาณใช้ราคาปิดแท่ง ให้ส่งคำสั่งหลังจากแท่งปิด จำลองการซื้อขายจากช่วงเวลาหรือราคาเสนอถัดไปที่มีอยู่ อย่าใช้ราคาต่ำสุดก่อนหน้านี้ของแท่งที่สมบูรณ์แล้ว
- ใช้ฝั่งสเปรดให้ถูกต้อง สำหรับคำสั่งซื้อแบบ marketable ให้เริ่มที่ ask ส่วนคำสั่งขายให้เริ่มที่ bid หากมีเพียงแท่งธุรกรรม ให้ประมาณสเปรดจากแหล่งข้อมูลแยกต่างหาก หรือระบุว่าโมเดลไม่ได้รวมสเปรดไว้
- จำกัดปริมาณที่จับคู่ให้สอดคล้องกับสภาพคล่องที่เป็นไปได้ กำหนดเพดานสัดส่วนการเข้าร่วมจากปริมาณซื้อขายที่สังเกตได้ และรวมค่าธรรมเนียมกับผลกระทบต่อตลาดด้วย ปริมาณรวมของแท่งราคาไม่ได้หมายความว่าปริมาณทั้งหมดพร้อมซื้อขายที่ราคาที่คุณเลือก
- ทดสอบสมมติฐานในสภาวะกดดัน เปรียบเทียบการจับคู่ที่ราคาเปิดถัดไปกับ slippage แบบระมัดระวัง และทดสอบว่าผลลัพธ์ยังอยู่ได้หรือไม่เมื่อการส่งคำสั่งแย่ลง อย่าปรับโมเดลการจับคู่จนกว่ากลยุทธ์จะทำกำไร
สิ่งเหล่านี้เป็นทางเลือกในการสร้างโมเดล ไม่ใช่สูตรสำหรับกู้คืนราคาที่จับคู่จริงเพียงราคาเดียวจากข้อมูลที่ไม่ครบถ้วน หากกลยุทธ์ขึ้นอยู่กับการเก็บกำไรเพียงไม่กี่ basis points ข้อมูลแท่งราคาอาจไม่ใช่หลักฐานที่เพียงพอสำหรับข้ออ้างนั้น
จะหาที่มาของราคาจับคู่ที่เป็นไปไม่ได้ใน backtest ได้อย่างไร?
ไล่ตรวจธุรกรรมที่น่าสงสัยหนึ่งรายการตั้งแต่สัญญาณไปจนถึงบัญชีแยกประเภท แยกเวลาเกิดสัญญาณ เวลาส่งคำสั่ง เวลาที่จำลองว่าคำสั่งมาถึง ข้อมูลตลาดที่เลือกใช้ ราคาที่จับคู่ ปริมาณที่จับคู่ และค่าธรรมเนียมเป็นคนละฟิลด์ จากนั้นตรวจตามลำดับดังนี้:
- ฟีเจอร์คำนวณจากข้อมูลของแท่งที่ยังไม่ปิด ณ เวลาตัดสินใจหรือไม่?
- การจับคู่ใช้ราคาสูงสุด ต่ำสุด หรือราคาปิดของแท่ง ทั้งที่ราคานั้นเกิดก่อนคำสั่งมาถึงหรือไม่?
- คำสั่งซื้อถูกจับคู่กับ bid หรือคำสั่งขายถูกจับคู่กับ ask หรือไม่?
- ปริมาณที่จำลองว่าจับคู่ได้เกินขนาดราคาเสนอที่มีอยู่ หรือเพดานสัดส่วนการเข้าร่วมของโมเดลหรือไม่?
- มีการปัดเศษราคา ใช้ขนาด tick ของสัญญา และคิดค่าธรรมเนียมหลังเลือกราคาที่จับคู่แล้วหรือไม่?
หากตอบคำถามเหล่านี้จากบันทึกการซื้อขายไม่ได้ แสดงว่า backtest ขาดหลักฐานด้านการส่งคำสั่ง เพิ่มฟิลด์ที่จำเป็น จำลองธุรกรรมบางรายการด้วยตนเองโดยเทียบกับข้อมูลดิบ แล้วตรวจว่าราคาที่รายงานมีโอกาสเกิดขึ้นได้ภายใต้โมเดลที่คุณตั้งใจใช้หรือไม่ เส้นทุนที่ดูราบรื่นตรวจไม่พบราคาที่มีอยู่แค่ในตัวจำลอง
← บทความทั้งหมด


