Ada satu pertanyaan yang selalu dihindari setiap backtest: apakah kode yang sama, jika diberi pasar yang sama secara live, akan melakukan hal yang sama? Anda tidak bisa menjawabnya dengan lebih banyak backtest. Anda hanya bisa menjawabnya dengan menjalankan strategi terhadap data live dengan semantik eksekusi yang nyata, lalu memeriksa — transaksi demi transaksi — bahwa kedua dunia itu sepakat. Kami melakukan pemeriksaan ini setiap hari, secara otomatis, dan inilah pemburu bug paling produktif di seluruh platform.
Hari pertama: bangun cerminnya
Setiap strategi yang dipromosikan berjalan di node live-nya sendiri yang terisolasi, mengonsumsi stream bursa yang sesungguhnya: kuotasi live untuk fill, spread nyata, jam sesi nyata. Tidak ada state yang dibagi antar strategi (yang ini kami pelajari dengan cara yang pahit — node bersama membuat kueri posisi satu strategi merembes ke strategi lain). Setiap fill dicatat bersama nilai sinyal yang menghasilkannya.
Setiap pagi: putar ulang dan bandingkan
Sebuah job harian mengambil jendela paper tiap strategi, menjalankan kode yang identik lewat mesin backtest pada periode yang sama di atas data katalog, lalu mencocokkan fill satu per satu: sisi yang sama, toleransi timestamp yang sama, ukuran yang sama. Keluarannya bukan korelasi atau sekadar firasat. Keluarannya sebuah tabel: matched, paper-only, replay-only. Strategi yang sehat berada di angka 54 dari 55 cocok. Yang tidak sehat langsung memberi tahu Anda transaksi mana yang menyimpang dan kapan.
Apa yang rusak, sesuai urutan rusaknya
- Fill saat warmup. Node live memberi data historis untuk memanaskan indikator — dan strategi dengan bar handler kustom dengan senang hati bertransaksi di atasnya. Backtest tidak pernah melihat entri hantu itu. Perbaikannya berupa guard di lapisan submission, bukan perbaikan di strategi, karena kalau tidak setiap strategi akan mewarisi bug yang sama.
- Warmup multi-leg yang sekuensial. Sebuah strategi cross-sectional memanaskan satu instrumen pada satu waktu; setiap leg melihat saudaranya kosong dan anchor tidak pernah terinisialisasi. Secara live ia tidak bertransaksi sama sekali; saat diputar ulang ia berjalan normal. Nol transaksi cocok — tapi hanya diff yang menyuarakannya.
- Crash loop akibat presisi tick. Tick aggTrade live tiba dengan presisi yang berbeda dari yang diharapkan instrumen sandbox. Node itu crash berulang karena sebuah assertion yang tak mungkin dipicu backtest, sebab bar katalog sudah ternormalisasi sejak awal.
- Amnesia setelah restart. Restart proses memicu ulang logika entri pada posisi yang sudah ada — untuk strategi rebalancing, sebuah restart diam-diam berubah menjadi rebalance. Dalam live trading itu bukan catatan kaki soal paritas; itu bendera merah yang ada uangnya.
Perhatikan polanya: tak satu pun dari ini adalah bug sinyal. Semuanya bug di batas eksekusi — warmup, state, presisi, restart. Persis itulah kelas kegagalan yang secara struktural tak terlihat oleh backtest, karena di dalam sebuah backtest, mesin backtest adalah batas eksekusi itu sendiri.
Asimetri yang sengaja kami pertahankan
Kedua dunia itu memang sengaja tidak identik. Backtest membebankan setengah spread hasil pemodelan ditambah dampak akar kuadrat di dalam PnL; paper membayar spread nyata pada harga fill dan tanpa model dampak. Menambahkan spread hasil pemodelan ke paper (atau spread nyata ke backtest) akan menghitung ganda. Paritas berarti keputusan yang sama, fill yang sama dalam batas toleransi — bukan PnL yang identik hingga ke bit terakhir. Mengetahui perbedaan mana yang berdasar dan mana yang bug adalah sebagian besar dari disiplin ini.
Backtest adalah hipotesis. Paper trading adalah eksperimennya. Paritas replay adalah buku catatan lab yang menangkap Anda saat sedang membodohi diri sendiri.
Jika Anda menjalankan strategi dan tidak membandingkan perilaku live dengan perilaku hasil replay secara terjadwal, ada satu kategori bug yang belum pernah Anda lihat. Kami menemukan satu kira-kira setiap dua pekan, dan tiap satunya tak terlihat dari dalam backtest.
← Semua artikel
