High-Performance Backtest Engines
How to build a backtest engine that runs hundreds of times faster without changing a single PnL number — data layout, caching, adaptive resolution, and architecture, from first speedups to production internals.
- 01
Jul 1, 2026 #algotradingบันไดความเร็วของ Backtest Engine: 298x บน CPU แล็ปท็อป, PnL เหมือนเดิมทุกประการจนถึง Trade สุดท้าย
ห้า implementation ของ parameter sweep 80 combo ชุดเดียวกัน ทุกตัวตรวจสอบแล้วว่าให้ PnL เหมือนกันทุกประการ: pandas rolling.apply ใช้เวลา 69.9 วินาที, numpy 3.1, numba 2.0, parallel numba 0.23 — ความเร็วที่วัดได้จริงเพิ่มขึ้น 298x บน Apple M2 Max โดยไม่เปลี่ยนฮาร์ดแวร์เลย และยังเร็วกว่า baseline แบบ vectorized ที่ทำได้ดีอยู่แล้วประมาณ 13x แต่ละขั้นบันไดให้อะไรบ้าง ทำไม GPU ไม่ใช่ชิ้นส่วนที่ขาดหายไป และคอขวดที่แท้จริงของการค้นหาพารามิเตอร์จำนวนมากอยู่ที่ไหน
- 02
Mar 16, 2026 #algotradingAggregated Parquet Cache: วิธีเร่งความเร็วแบ็คเทสต์หลาย Timeframe ได้หลายร้อยเท่า
วิธีคำนวณ timeframe และ indicator ล่วงหน้าจากแท่งเทียนรายนาที บันทึกลง parquet และนำมาใช้สำหรับการทดสอบกลยุทธ์จำนวนมากโดยไม่ต้องคำนวณซ้ำซ้อน
- 03
Mar 17, 2026 #algotradingAdaptive Drill-Down: แบ็คเทสต์ด้วยความละเอียดข้อมูลแบบยืดหยุ่น ตั้งแต่นาทีจนถึงการเทรดดิบ
วิธีที่ความละเอียดข้อมูลแบบปรับตัวได้ช่วยเร่งความเร็วแบ็คเทสต์และประหยัดพื้นที่จัดเก็บ: drill-down จาก 1m ลงสู่ 1s, 100ms และการเทรดดิบ เฉพาะในจุดที่ราคาเคลื่อนไหวอย่างมีนัยสำคัญหรือปริมาณการซื้อขายพุ่งสูง ไม่ใช่ตลอดทั้งชุดข้อมูลประวัติศาสตร์
- 04
Jul 2, 2026 #algotradingภาษี IPC: เอา Backtest Engine ไปไว้หลัง Socket แล้วเสีย 13% — แต่แทบไม่มีส่วนไหนเลยเป็นความผิดของ Socket
เรา port numba backtest kernel ตัวหนึ่งไปเป็น Rust แบบ line-for-line แล้วเรียกมันข้าม process boundary สี่วิธี พร้อม equivalence gate ที่ยืนยันว่า PnL เหมือนกันทุกประการจนถึง trade สุดท้าย การส่ง price series ทั้งชุดขนาด 1.2 MB ผ่าน Unix socket มีค่าใช้จ่ายประมาณ 2 ms — ราว 0.1% ของงานทั้งหมด การ encode payload เดียวกันด้วย JSON แพงกว่า raw bytes ถึง 1348 เท่า การเรียกแบบ chatty ทีละ combo ส่งข้อมูลซ้ำ 80 ครั้ง และ pattern การเรียกทีละ bar จะต้องจ่าย IPC ล้วนๆ 2.1 วินาทีบนงานที่ใช้เวลา 2.0 วินาที boundary นั้นถูก ภาษีอยู่ที่วิธีที่คุณข้ามมันต่างหาก