1 พฤศจิกายน 2026 · วิจัย

จะวอร์มอัพแบ็กเทสอย่างไรโดยไม่นับลุคแบ็กเป็นผลงาน?

จะวอร์มอัพแบ็กเทสอย่างไรโดยไม่นับลุคแบ็กเป็นผลงาน?

Donchian 20 วันดูไม่เป็นไรในสเปก. เอเจนต์เขียนค่าสูงสุดเคลื่อนที่ 20 บาร์ แบ็กเทสเริ่มที่แถวที่ 1 ของไฟล์ parquet และตลอด 2 สัปดาห์แรก "ไฮ 20 วัน" ก็แค่ค่าสูงสุดสะสมของบาร์ที่มีอยู่. วันที่ 4 มันคือไฮ 4 วัน. กลยุทธ์ที่คุณคิดว่ากำลังทดสอบไม่ใช่กลยุทธ์ที่สร้างฟิลล์ 12 รายการแรก.

ฉันมีโน้ตบุ๊กบนแท่งรายวัน ETHUSDT ที่ Sharpe ทั้งตัวอย่างได้ 1.4. ตัด 20 เซสชันแรกออกแล้วมันตกเหลือ 0.6. เก็บ 20 นั้นไว้แล้วทิ้งส่วนที่เหลือของปีที่ 1 และมันพิมพ์ออกมาเป็น 3.1. ไม่มีใครรั่วข้อมูลวันพรุ่งนี้. กลยุทธ์ใช้ข้อมูลอดีต แค่ว่าไม่พอ และรายงานถือว่าดีลที่ก่อตัวค้างคาเหล่านั้นเป็นหลักฐาน.

1.4Sharpe ทั้งตัวอย่าง รวมหน้าต่างที่ยังไม่ครบ
0.6โค้ดเดียวกันหลัง 20 เซสชันที่ครบแล้ว
3.1Sharpe ถ้าเก็บเฉพาะดีลช่วงเบิร์นอิน

ปล่อยให้หน้าต่างเทรดขณะที่มันยังเติมไม่ครบ

ความเสียหายแบบเดิมคือ min_periods=1. Pandas จะคำนวณค่าเฉลี่ยเคลื่อนที่จากแท่งเดียวถ้าคุณปล่อยให้มันทำ. เอเจนต์ทำแบบนี้ตลอด เพราะ NaN ที่หัวเฟรมรู้สึกเหมือนบั๊ก และการเติมมันทำให้ unit test ขึ้นเขียว.

เป้าหมาย realized vol 20 วันจากผลตอบแทนแค่ 2 จุดสังเกตคือการระเบิดของไซซ์. ความแปรปรวนของตัวเลข 2 ตัวคือการทอยเหรียญ คุณกลับเศษ แล้วโพซิชันแรกใหญ่กว่าความเสี่ยงที่ตั้งใจไว้หลายเท่า. z-score เทียบกับส่วนเบี่ยงเบนมาตรฐานที่เกือบศูนย์เล่นกลเดียวกันพร้อมเครื่องหมาย: กลยุทธ์ดูเหมือนมีจุดเข้าคมกริบที่ไม่โผล่มาอีกเลยเมื่อหน้าต่างซื่อสัตย์.

เบรกเอาต์แย่กว่า เพราะมันดูเหมือนกฎจริง. ช่อง 20 บาร์บนบาร์ที่ 6 คือช่อง 6 บาร์. คุณได้กลุ่มดีลกองกันตอนต้น มักอยู่ในช่วงเงียบที่จะไม่กระตุ้นอินดิเคเตอร์ที่ครบแล้ว. ตลาดเงียบเลื่อนไปนิดหน่อย. ช่องแคบยิง. เส้นอิควิตี้ได้หัววิ่งนำที่ไม่มีปีหลังไหนทำซ้ำ.

Zero-fill และ forward-fill ประดิษฐ์คำโกหกอีกแบบ. RSI ที่ 0 อ่านว่า oversold. ATR ที่ขาดหายเป็น 0 ทำให้หน่วยไซซ์ระเบิด และแบ็กเทสซื้อเต็มโกดังอย่างขยันขันแข็ง. ฉันขอให้ NaN ฆ่าออเดอร์ดีกว่าให้ 0 ประดิษฐ์ออเดอร์ขึ้นมา.

ฉันยังจับตัวเองพล็อตจากแถว 0 เพราะเดือนว่างทางซ้ายของกราฟดูเหมือนยังไม่เสร็จ. เดือนว่างนั้นต่างหากที่เป็นส่วนที่ซื่อสัตย์.

ตัดเส้นอิควิตี้ แต่เก็บโพซิชันไว้

อันนี้รอดโค้ดรีวิว. คุณคำนวณฟีเจอร์ 20 วันอย่างถูกต้อง ตัด 20 แถวแรกออกจากเส้นที่พล็อต แล้วเผยแพร่ตั้งแต่วันที่ 21 มกราคม. โพซิชันวันที่ 21 มกราคมถูกเปิดวันที่ 14 มกราคม. high-water ของ trailing stop จำนวนพีระมิด เงินสดหลังเบิร์นเหล่านั้น: ทั้งหมดเดินเข้าไปในตัวอย่างที่ "สะอาด".

ความเสียหายคือกลยุทธ์เพเปอร์ที่สตาร์ทในวันที่เขียนไว้ไม่ได้. รีสตาร์ทจากแฟลต ณ จุดเริ่มที่รายงาน แล้วออเดอร์ของสัปดาห์แรกไม่ตรงกัน. บางครั้งแบ็กเทสอยู่ในดีลอยู่แล้วที่ระบบเพเปอร์ไม่มีเหตุผลจะเข้า. บางครั้งระบบเพเปอร์เข้าเพราะลุคแบ็กยังเย็น ขณะที่แบ็กเทสนั่งดูเพราะเดือนที่ซ่อนไว้กินเบรกเอาต์ไปแล้ว. สมุดเปิดสถานะ 2 เล่ม วันเริ่มที่เผยแพร่เพียงวันเดียว.

โฟลด์วอล์กฟอร์เวิร์ดทำแบบนี้เงียบๆ. แต่ละหน้าต่างทดสอบมีหางลุคแบ็กที่คุณไม่พล็อต. ข้ามการจำลองหางนั้น ดีลทดสอบแรกก็เป็นดีลหน้าต่างไม่ครบอีก. จำลองมันแล้วรายงานเฉพาะวันทดสอบ โพซิชันของวันทดสอบขึ้นกับฟิลล์ที่คุณไม่ได้โชว์. เวอร์ชันที่ 2 อาจเป็นทางเลือกงานวิจัยที่ชอบธรรม. การเรียกเช้าแรกของโฟลด์ว่าเป็นโคลด์สตาร์ท ทั้งที่ trailing stop ทำงานจากหางอยู่แล้ว คือวิธีที่นักวิจัย 2 คนได้ Sharpe 2 ค่าจากคอนฟิกเดียว.

ถ้ารีสตาร์ทจากแฟลต ณ วันเริ่มที่เผยแพร่แล้ว P&L เปลี่ยน วอร์มอัพอยู่ในประวัติผลงาน. ข้อมูลลุคแบ็กมีอยู่ได้. ดีลลุคแบ็กมีไม่ได้.

วอร์มอัพเป็นวันปฏิทินทั้งที่ฟีเจอร์ไม่ใช่วัน

"ให้มัน 30 วัน" ทำให้ฟีเจอร์ระบุไม่ครบ. 30 วันปฏิทินบน Donchian 5 นาทีคือหลายพันบาร์เลยลุคแบ็ก 20 คาบ. 30 วันบนฟีเจอร์รายวันที่ต้องการ 20 เซสชันอาจหนาหรือบาง ขึ้นกับวันหยุดสุดสัปดาห์และช่องโหว่.

z-score ของอัตราฟันดิงบนหนึ่งในตลาด perp ของเราได้วอร์มอัพ 30 วัน เพราะสเปกบอก 30 คาบ แล้วมีคนแปลคาบเป็นวันปฏิทิน. ฟันดิงที่นั่นพิมพ์ทุก 8 ชั่วโมง. 30 วันคือประมาณ 90 รอบ settlement. 30 คาบคือ 10 วัน. เบิร์นอินส่วนเกิน 2 เดือนบังเอิญรวมสัปดาห์ดีเพกไว้ด้วย. การตัดมันทิ้งทำให้หน้าต่างไลฟ์ดูกระแสสงบกว่าประวัติจริงของกลยุทธ์. คนโทษความไวต่อวันเริ่ม. วอร์มอัพกินระบอบไปแล้ว.

และคริปโตกับหุ้นทำให้ตัวเลขเดียวกันเปลี่ยนความหมายโดยไม่มีใครแก้พารามิเตอร์. 20 "วัน" ของ ETH รวมวันเสาร์. 20 เซสชันหุ้นเกือบ 1 เดือนปฏิทิน. คัดลอกลุคแบ็ก 20 วันจากโน้ตบุ๊กหุ้นไปใส่แท่ง perp รายชั่วโมงแล้วคุณได้ช่อง 20 ชั่วโมงในชื่อ 20 วัน. บาร์ที่ถูกต้องบาร์แรกจึงเป็นช่วง 20 ชั่วโมงเข้าไป หรือ 20 วันเข้าไปถ้าฟังก์ชันถัดไปมีการรีแซมเปิล และฉันเคยเห็นทั้งสองแบบใน diff ของเอเจนต์เดียวกัน.

ตรึง timestamp ที่ซื้อขายได้ครั้งแรก

วอร์มอัพเป็นข้อกำหนดด้านข้อมูล ไม่ใช่ตัวอย่างโบนัส. ทุกฟีเจอร์ระบุจำนวนจุดสังเกตที่จบแล้วที่มันต้องการ ในหน่วยที่มันถูกคำนวณ. timestamp ที่ซื้อขายได้ครั้งแรกคือบาร์แรกที่เงื่อนไขเหล่านั้นเป็นจริงทั้งหมด และบัญชีแฟลตจะได้รับอนุญาตให้ส่งออเดอร์.

ฟีเจอร์สเปกมักจะเขียนว่าสิ่งที่ต้องมีจริงๆของทดแทนเงียบ
Donchian 20 วันไฮรายวัน 20 ค่า20 เซสชันที่จบแล้วRunning max ที่ min_periods=1
realized vol 30 วันหน้าต่าง 30 วันผลตอบแทน close-to-close 30 ค่าความแปรปรวน 2 วัน กลับเศษเป็นไซซ์
z-score ของฟันดิง 20 พริ้นต์20 วัน20 รอบ settlement ของฟันดิง20 วันปฏิทิน (~90 พริ้นต์) หรือ 20 บาร์ของไทม์เฟรมผิด
RSI 14 คาบบน 5m14 คาบ14 แท่ง 5 นาทีที่ปิดแล้ว14 วัน หรือ 14 บาร์ที่เติมช่องว่างด้วย forward-fill

P&L ก่อน timestamp นั้นไม่อยู่ในประวัติผลงาน. สถานะก่อน timestamp นั้นอาจยังต้องจำลอง ดังนั้น trailing stop หรือคูลดาวน์เป็นของจริงเมื่อนาฬิกาถึงบาร์ที่ซื้อขายได้ครั้งแรก แต่ฟิลล์เหล่านั้นไม่เข้า Sharpe ไม่เข้าจำนวนดีล และไม่เข้าคณิตศาสตร์ความจุ. แล้วรันการตรวจที่น่าเกลียด: รีสตาร์ทจากแฟลต ณ timestamp นั้น โดยมีลุคแบ็กให้ใช้เป็นข้อมูลอย่างเดียว. ถ้าออเดอร์เปลี่ยน แสดงว่าคุณกำลังส่งดีลที่ซ่อนอยู่.

เพเปอร์เทรดเริ่มด้วยสัญญาเดียวกัน. หน้าต่างทดสอบวอล์กฟอร์เวิร์ดแต่ละอันก็เช่นกัน. ถ้ากราฟดูเหมือนขาดไป 1 เดือน ก็ปล่อยให้มันขาด.

แบ็กเทสวิศวกรรมข้อมูลวอล์กฟอร์เวิร์ดเอเจนต์ AIเพเปอร์เทรด
แชร์XLinkedInFacebookRedditHacker NewsWhatsAppTelegramEmail
← บทความทั้งหมด