4 September 2026 · backtesting

Stop dan target Anda sama-sama berada di bar yang sama. Mana yang dipilih backtest Anda?

Stop dan target Anda sama-sama berada di bar yang sama. Mana yang dipilih backtest Anda?

Posisi long dari 84,120. Stop di 84,036, target di 84,271. Bar menit berikutnya muncul: open 84,118, high 84,290, low 84,010, close 84,240.

Kedua level berada di dalam bar itu. Stop tersentuh dan target juga tersentuh, sementara empat angka OHLC sama sekali tidak memberi informasi tentang mana yang terjadi lebih dulu. Backtest Anda tetap menghasilkan angka. Di suatu bagian loop, ada sebaris kode yang memutuskan—mungkin baris yang tak terpikir oleh Anda sebagai asumsi pemodelan saat menulisnya.

Inilah sumber terbesar performa palsu yang saya lihat pada strategi horizon pendek, bahkan lebih besar daripada biaya dan slippage, karena ini tidak tampak seperti asumsi. Ini tampak seperti urusan teknis.

Cara salah pertama: biarkan rangkaian if yang memutuskan

Bentuk yang lazim:

if bar.high >= target:
    exit(target, "tp")
elif bar.low <= stop:
    exit(stop, "sl")

Tak ada yang memilih “target diselesaikan sebelum stop.” Pemeriksaan target hanya ditulis lebih dulu karena itulah jalur yang diharapkan dan itulah yang sedang Anda pikirkan. Tukar posisi kedua cabang itu dan kurva ekuitas berubah; itu saja seharusnya memberi tahu bahwa P&L strategi Anda sebagian ditentukan oleh editor yang Anda pakai.

Saya menjalankan scalper mean-reversion yang sengaja dibuat biasa saja pada BTCUSDT perp selama tiga bulan dengan bar 1 menit, 4,812 trade, stop 0.10% dan target 0.18% dari harga masuk. Sinyalnya sama, biayanya sama, hanya aturan pemecah seri yang berubah.

12.6%trade menyentuh kedua level dalam satu bar
2.31Sharpe, target diselesaikan lebih dulu
0.18Sharpe, stop diselesaikan lebih dulu
0.94Sharpe, diselesaikan dengan bar 1 detik

Seperdelapan trade menanggung seluruh hasilnya. Begitulah hitungan pasangan stop dan target yang ketat: trade yang ambigu adalah trade saat harga bergerak ke dua arah, yang mencakup sebagian besar trade menarik, dan nilai tiap trade bergantung pada lemparan koin sebesar jarak penuh dari stop ke target. 12.6% trade × rentang 0.28% berarti 3.5% dari turnover nosional bruto per unit sampel, jauh melampaui edge strategi yang sebenarnya.

Tingkatnya bergantung pada ukuran bar dibanding jarak antarlevel Anda, dan memburuk cepat saat interval bar makin panjang. Stop dan target sama, sinyal sama, disampel ulang:

Interval barTrade dengan kedua level di dalam satu barSharpe (target lebih dulu)
1s0.3%0.91
1m12.6%2.31
5m34%3.60
15m49%4.42
1h71%5.88

Perhatikan arti sebenarnya dari tabel itu. Bar yang lebih kasar membuat backtest tampak lebih baik. Intuisi setiap peneliti mengatakan bar per jam lebih konservatif: lebih sedikit noise, lebih kecil risiko overfitting terhadap mikrostruktur. Namun, jika aturan intrabar menyelesaikan ambiguitas demi keuntungan Anda, bar yang lebih kasar hanyalah kotak lebih besar yang memungkinkan Anda berasumsi bahwa Anda beruntung. Pada bar 1h, 7 dari 10 trade sepenuhnya bergantung pada aturan tersebut. Backtest itu tidak menguji strategi; yang diuji adalah urutan 2 pernyataan `if` sebanyak 3,400 kali.

Cara salah kedua: menganggap stop terisi pada harga stop

Anggap urutannya sudah Anda bereskan. Stop diselesaikan lebih dulu, Anda mencatat kerugian tepat 0.10% ditambah biaya taker, lalu merasa sudah teliti. Namun, masih ada 2 hal yang keliru.

Pertama, stop adalah pemicu, bukan harga pengisian. Di Binance USDⓈ-M, order STOP_MARKET menjadi order pasar begitu kondisi pemicunya terpenuhi, lalu mengambil likuiditas yang tersedia di buku order. Pada menit yang tenang, slippage-nya hanya satu atau dua tick. Pada menit yang benar-benar memicu stop Anda—menit dengan candle body 40 poin dan rangkaian likuidasi di bawahnya—buku order tipis persis di sisi yang Anda lewati. Dalam sampel saya, setelah mencocokkan pemicu stop dengan rekaman tick, median pengisian berada 1.4 bps melewati pemicu dan persentil ke-95 mencapai 11 bps. Dengan stop 10 bps, pada ekor distribusi Anda menanggung tambahan sepersepuluh dari risiko yang Anda kira sudah ditetapkan.

Kedua, masalahnya lebih samar dan khusus untuk kontrak perpetual: harga mana yang memicunya. Binance secara default menggunakan harga mark untuk order stop, dan harga mark dihitung dari indeks ditambah basis yang dihaluskan, bukan dari trade terakhir di venue itu. Seri OHLC Anda menggunakan harga terakhir. Keduanya adalah seri berbeda, dan selisihnya paling besar saat peristiwa yang memicu stop terjadi.

Harga terakhir (kline Anda)Harga mark (pemicu default)
Sumbertrade di venue iniindeks dari beberapa venue + basis
Perilaku wickpergerakan penuhsangat diredam
Selisih yang umum1–3 bps saat tenang, 20–35 bps pada menit dengan rangkaian likuidasi
Dampak pada backteststop yang terpicu padahal seharusnya tidak, dan sebaliknya

Jadi, wick 25 bps pada rekaman harga terakhir membuat Anda terkena stop dalam backtest, padahal harga mark live tak pernah mendekati pemicu Anda yang berjarak 10 bps. Bisa juga sebaliknya, pada hari ketika indeks bergerak dan venue Anda tertinggal. Jika Anda mengatur workingType ke CONTRACT_PRICE, setidaknya perilaku live akan selaras dengan data Anda. Ini biasanya pilihan yang tepat bagi peneliti, karena mensimulasikan pemicu harga mark dengan jujur berarti membawa seri kedua melalui seluruh mesin pengisian order Anda.

Kejadian yang paling saya ingat: seseorang di tim kami “memperbaiki” strategi dengan mengubah take-profit dari 0.18% menjadi 0.21%. Sharpe naik dari 2.3 menjadi 3.1. Tidak ada edge baru. Targetnya hanya bergeser ke luar bagian distribusi wick 1 menit yang paling tebal, sehingga lebih sedikit trade masuk ke kelompok ambigu tempat kode diam-diam menghadiahkan kemenangan. Mereka mengoptimalkan pemecah seri.

Cara salah ketiga: selalu berasumsi yang terburuk dan menyebutnya konservatif

Reaksi pertama biasanya bersikap pesimistis. Jika kedua level tersentuh, anggap stop yang kena. Selesai, tak ada optimisme lagi, kirim saja.

Dulu saya juga begitu. Cara ini lebih baik daripada alternatifnya, tetapi tetap keliru karena 2 alasan.

Cara ini membunuh strategi yang sebenarnya layak. Penyelesaian pesimistis pada 12.6% trade mengurangi Sharpe strategi ini sebesar 2.1 poin dibanding hasil 0.94 yang ditentukan oleh tick. Jika angka sebenarnya 0.94 tetapi aturan Anda melaporkan 0.18, Anda akan membuang ide itu dan mengerjakan sesuatu yang lebih buruk. Konservatisme yang meleset 2 poin Sharpe bukanlah konservatisme; itu noise yang dibungkus sikap bermoral.

Lebih buruk lagi, cara ini merusak optimisasi. Berikan pemecah seri pesimistis pada sapuan parameter dan optimizer akan belajar menghindari ambiguitas, karena ambiguitas kini menjadi penalti murni. Optimizer akan bergerak ke stop yang lebar dan target yang dekat, atau ke bar lambat ketika kedua level jarang muncul bersamaan, lalu menyajikan parameter yang dipilih berdasarkan aturan pengisian order Anda, bukan kondisi pasar. Ini kegagalan yang sama seperti versi yang terlalu menguntungkan, hanya tandanya berlawanan dan sama-sama tak terlihat di tearsheet.

Aturan praktis yang kami gunakan sebelum melakukan hal lain: jika stop_distance + target_distance lebih kecil daripada rentang persentil ke-75 interval bar Anda, asumsi intrabar Anda berdampak lebih besar pada P&L daripada sinyal Anda. Hitung kedua angka itu. Cukup 4 baris kode, dan pemeriksaan ini telah mengakhiri lebih banyak ulasan strategi daripada pemeriksaan tunggal lainnya.

Yang benar-benar berhasil

Jalur harga di dalam bar adalah data. Cari datanya, atau batasi rentang ketidakpastian yang tak bisa Anda ukur.

  1. Selesaikan dengan seri data paling rinci yang Anda punya. Data aggTrades Binance untuk menit yang relevan hanya terdiri dari beberapa ratus baris dan langsung menjawab pertanyaan: level mana yang tersentuh lebih dulu, dan pada harga berapa order terisi saat menyapu buku. Anda tidak perlu data tick untuk seluruh backtest, hanya untuk bar yang ambigu. Dalam sampel saya, jumlahnya 606 menit dari 129,600. Unduhannya kecil, bukan proyek infrastruktur.
  2. Jika data tick tidak tersedia, turunkan satu atau dua tingkat timeframe hanya untuk menentukan urutannya. Gunakan sinyal 15m, lalu tentukan penyelesaian exit dengan bar 1s atau 1m. Ambiguitas turun dari 49% menjadi sebagian kecil dari satu persen, dan sisanya cukup kecil untuk diabaikan dengan jujur.
  3. Selalu laporkan rentangnya. Jalankan setiap backtest 2 kali, dengan penyelesaian optimistis dan pesimistis, lalu tampilkan kedua angka Sharpe itu di samping hasil yang sudah ditentukan. Selisih tersebut adalah ketidakpastian intrabar Anda, dan harus dicantumkan di tearsheet bersama interval kepercayaan yang akan Anda sertakan untuk Sharpe itu sendiri. Jika rentangnya 0.2–2.3, tak ada kesimpulan di dalam rentang itu yang bisa dipercaya.
  4. Lacak tingkat ambiguitas sebagai metrik utama. Metrik itu kami tampilkan di bagian atas setiap kartu strategi, di samping jumlah trade dan turnover. Tingkat di atas sekitar 5% berarti yang sedang diuji adalah logika exit, bukan logika entry.
  5. Modelkan pemicu secara terpisah dari pengisian order. Gunakan seri harga yang benar-benar dipakai venue sebagai pemicu; harga pengisian adalah harga pemicu ditambah slippage yang diambil dari distribusi berdasarkan rekaman tape, bukan harga pemicu itu sendiri.

Di pasar saham, masalah yang sama muncul dengan wujud berbeda. Stop di 62.00 pada saham yang gap turun ke 58.40 semalaman tidak terisi di 62.00; pengisiannya terjadi di suatu harga di bawah harga pembukaan. Backtest bar harian yang mencatat slippage −$0.00 pada gap yang menembus stop akan dengan senang hati menyimpulkan bahwa lapisan stop-loss memperbaiki drawdown Anda. Padahal tidak. Strategi itu hanya tak pernah diuji pada hari-hari yang penting. Hal yang sama terjadi saat perdagangan dihentikan: lelang pembukaan kembali adalah saat stop Anda benar-benar dieksekusi, pada harga yang tak pernah ditunjukkan oleh low bar.

Semua ini bukan hal yang aneh. Intinya, bar hanyalah ringkasan, sedangkan strategi stop dan target bergantung pada urutan kejadian yang dihilangkan oleh ringkasan itu. Ketika mesin paper trading akhirnya menjalankan strategi di pasar live, rekaman pasar punya urutannya sendiri dan tak pernah peduli cabang pernyataan if mana yang Anda tulis lebih dulu.

pengisian intrabarorder stopbacktestingfutures kriptomikrostruktur pasar
← Semua artikel