1 November 2026 · riset

Bagaimana cara memanaskan backtest tanpa menghitung lookback sebagai kinerja?

Bagaimana cara memanaskan backtest tanpa menghitung lookback sebagai kinerja?

Donchian 20 hari tampak tidak berbahaya dalam spesifikasi. Agen menulis rolling max 20 bar, backtest dimulai pada baris satu file parquet, dan selama dua minggu pertama "high 20 hari" hanyalah running max dari bar mana pun yang ada. Pada hari keempat, itu adalah high empat hari. Strategi yang Anda kira sedang diuji bukanlah strategi yang menghasilkan selusin fill pertama.

Saya punya notebook pada bar harian ETHUSDT di mana Sharpe sampel penuh adalah 1.4. Potong 20 sesi pertama dan angkanya turun ke 0.6. Pertahankan 20 itu dan buang sisa tahun pertama, dan hasilnya mencetak 3.1. Tidak ada yang membocorkan hari esok. Strategi itu memakai masa lalu, hanya saja tidak cukup banyak, dan laporan itu memperlakukan trade yang setengah jadi itu sebagai bukti.

1.4Sharpe sampel penuh, jendela yang belum selesai ikut dihitung
0.6kode yang sama setelah 20 sesi selesai
3.1Sharpe jika Anda hanya mempertahankan trade burn-in

Membiarkan jendela bertransaksi saat masih terisi

Kerusakan yang biasa terjadi adalah min_periods=1. Pandas akan menghitung rolling mean pada satu bar jika Anda membiarkannya. Agen melakukan ini terus-menerus, karena NaN di bagian atas frame terasa seperti bug, dan mengisinya membuat unit test menjadi hijau.

Target realized-vol 20 hari dengan dua observasi return adalah ledakan ukuran posisi. Varians dari dua angka adalah lemparan koin, Anda membaliknya, dan posisi pertama beberapa kali lipat dari risiko yang dimaksudkan. Z-score terhadap standar deviasi yang nyaris nol melakukan trik yang sama dengan sebuah tanda: strategi tampak punya entri setajam silet yang tidak pernah muncul lagi begitu jendelanya jujur.

Breakout lebih parah, karena tampak seperti aturan yang sesungguhnya. Channel 20 bar pada bar keenam adalah channel enam bar. Anda mendapat klaster trade tepat di awal, sering pada periode sepi yang tidak akan memicu indikator yang sudah selesai. Pasar yang sepi bergeser sedikit. Channel yang ketat terpicu. Kurva ekuitas mendapat keunggulan awal yang tidak diulang tahun mana pun kemudian.

Zero-fill dan forward-fill menciptakan kebohongan yang berbeda. RSI di 0 terbaca sebagai oversold. ATR yang hilang bernilai 0 meledakkan ukuran unit, dan backtest dengan patuh membeli satu gudang. Saya lebih suka NaN yang mematikan order daripada 0 yang mengada-adakan order.

Saya masih ketahuan memplot dari baris 0 karena bulan kosong di sisi kiri chart tampak belum selesai. Bulan kosong itulah bagian yang jujur.

Potong kurva ekuitas, pertahankan posisinya

Yang ini lolos code review. Anda menghitung fitur 20 hari dengan benar, membuang 20 baris pertama dari kurva yang diplot, dan memublikasikan dari 21 Januari. Posisi pada 21 Januari dibuka pada 14 Januari. High-water trailing stop, hitungan pyramid, kas setelah burn itu: semuanya masuk ke sampel yang "bersih".

Kerusakannya adalah strategi paper yang tidak bisa dimulai pada tanggal di tulisan. Restart dari posisi flat pada awal yang dilaporkan dan order minggu pertama tidak cocok. Kadang backtest sudah berada dalam trade yang tidak punya alasan untuk dimasuki sistem paper. Kadang sistem paper masuk karena lookback-nya masih dingin, dan backtest duduk di luar karena bulan tersembunyinya sudah mengambil breakout. Dua buku pembukaan, satu tanggal mulai yang dipublikasikan.

Fold walk-forward melakukan ini secara senyap. Setiap jendela uji punya ekor lookback yang tidak Anda plot. Lewati simulasi ekor itu dan trade uji pertama kembali menjadi trade jendela yang belum selesai. Simulasikan dan laporkan hanya hari uji, dan posisi hari uji itu bergantung pada fill yang tidak Anda tampilkan. Versi kedua itu bisa menjadi pilihan riset yang sah. Menyebut pagi pertama fold sebagai cold start, padahal trailing stop sudah live dari ekornya, adalah cara dua peneliti mendapatkan dua Sharpe dari satu konfigurasi.

Jika restart dari posisi flat pada tanggal mulai yang dipublikasikan mengubah P&L, warmup ada di dalam track record. Data lookback boleh ada. Trade lookback tidak boleh.

Warmup dalam hari kalender ketika fiturnya bukan hari

"Berikan 30 hari" membuat fitur tidak terspesifikasi. Tiga puluh hari kalender pada Donchian 5 menit adalah ribuan bar melewati lookback 20 periode. Tiga puluh hari pada fitur harian yang membutuhkan 20 sesi bisa gemuk atau kurus, tergantung akhir pekan dan lubang data.

Z-score funding-rate di salah satu venue perp kami mendapat warmup 30 hari karena spesifikasinya mengatakan 30 periode dan seseorang menerjemahkan periode menjadi kalender. Funding di sana tercetak setiap delapan jam. Tiga puluh hari adalah sekitar 90 settlement. Tiga puluh periode adalah sepuluh hari. Dua bulan ekstra burn-in kebetulan mencakup seminggu depeg. Membuangnya membuat jendela live tampak lebih tenang daripada sejarah nyata strategi itu. Orang-orang menyalahkan sensitivitas tanggal mulai. Warmup-nya telah menelan rezim itu.

Dan kripto versus ekuitas membuat angka yang sama berubah makna tanpa siapa pun mengedit parameter. Dua puluh "hari" ETH mencakup hari Sabtu. Dua puluh sesi ekuitas hampir satu bulan kalender. Salin lookback 20 hari dari notebook saham ke candle perpetual per jam dan Anda punya channel 20 jam dengan nama 20 hari. Bar valid pertama kemudian entah 20 jam kemudian, atau 20 hari kemudian jika suatu fungsi belakangan melakukan resample, dan saya pernah melihat keduanya dalam diff agen yang sama.

Kunci stempel waktu pertama yang dapat diperdagangkan

Warmup adalah persyaratan data, bukan sampel bonus. Setiap fitur menyebutkan jumlah observasi selesai yang dibutuhkannya, dalam satuan yang dipakai untuk menghitungnya. Stempel waktu pertama yang dapat diperdagangkan adalah bar pertama di mana semua itu benar dan akun yang flat akan diizinkan mengirim order.

FiturApa yang biasanya dikatakan spesifikasiApa yang sebenarnya harus adaPengganti diam-diam
Donchian 20 hari20 high harian20 sesi selesaiRunning max dengan min_periods=1
realized vol 30 harijendela 30 hari30 return close-to-closeVarians dua hari, dibalik menjadi ukuran
z-score funding 20 print20 hari20 settlement funding20 hari kalender (~90 print), atau 20 bar pada timeframe yang salah
RSI 14 periode pada 5m14 periode14 bar lima menit yang sudah ditutup14 hari, atau 14 bar dengan celah yang di-forward-fill

P&L sebelum stempel waktu itu tetap di luar track record. State sebelum stempel waktu itu mungkin masih perlu disimulasikan, sehingga trailing stop atau cooldown sudah nyata ketika jam mencapai bar pertama yang dapat diperdagangkan, tetapi fill itu tidak masuk ke Sharpe, jumlah trade, atau matematika kapasitas. Lalu jalankan pemeriksaan yang jelek: restart dari posisi flat pada stempel waktu itu, dengan lookback tersedia sebagai data saja. Jika order berubah, Anda sedang mengirimkan trade tersembunyi.

Paper trading dimulai dengan kontrak yang sama. Demikian pula setiap jendela uji walk-forward. Jika chart tampak kehilangan sebulan, biarkan hilang.

backtestingrekayasa datawalk-forwardagen AIpaper trading
← Semua artikel