bias pandangan ke depan backtest
Bias pandangan ke depan adalah kebocoran data masa depan ke dalam backtest. Pelajari bagaimana keputusan bar yang sama, survivorship, dan angka revisi menggelembungkan hasil serta cara
Bias pandangan ke depan (look-ahead bias) adalah penggunaan informasi di dalam backtest yang tidak mungkin diketahui siapa pun pada saat perdagangan simulasi dilakukan. Kurva ekuitas menanjak, statistik terlihat sangat baik, dan semuanya runtuh begitu bersentuhan dengan pesanan nyata. Halaman ini mendefinisikan bias tersebut, menguraikan tiga mekanisme yang menghasilkannya, dan mengukur masing-masing pada data pasar nyata.
Apa itu bias pandangan ke depan
Backtest adalah klaim tentang sebuah keputusan: pada stempel waktu ini, dengan informasi ini, aturan akan melakukan ini. Klaim itu hanya berlaku jika setiap masukan yang dibaca aturan sudah ada, dalam bentuk akhirnya, sebelum stempel waktu tersebut. Bias pandangan ke depan adalah setiap pelanggaran kondisi itu, dan ia bersifat diam. Tidak ada apa pun di lembar kerja atau skrip yang mengeluh ketika sebuah baris mengembalikan nilai yang distempel lebih lambat dari keputusan yang diumpankannya.
Tiga pelanggaran mencakup sebagian besar dari apa yang muncul dalam praktik. Sebuah keputusan yang membaca batang harga yang juga diperdagangkan di dalamnya. Sebuah alam semesta yang disusun dari nama-nama yang masih tercatat hari ini. Sebuah bidang data yang direvisi setelah tanggal yang dibawanya.
Mekanisme satu: memutuskan pada batang yang juga Anda perdagangkan
Mulailah dengan aturan yang terdengar tidak berbahaya. Beli saat kuat, artinya pada sesi di mana dana ditutup di atas harga pembukaannya. Jika dikodekan secara ceroboh, pengujian masuk pada pembukaan sesi itu dan keluar pada penutupan sesi itu, sementara kondisi yang disaring adalah harga penutupan batang yang sama. Tidak ada yang tahu harga penutupan pada bel pembukaan.
Panel di bawah menjalankan kedua versi pada SPY, pelacak S&P 500, selama sepuluh tahun kalender. Kolom pertama adalah yang mustahil. Kolom kedua menunda kondisi yang identik satu sesi, yang merupakan waktu paling awal yang bisa ditindaklanjuti oleh akun yang didanai.
SQL tepat di balik setiap angka
WITH bars AS (
SELECT date,
toFloat64(open) AS o,
toFloat64(close) AS c,
toFloat64(close) > toFloat64(open) AS up_day
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= toDate('2015-12-01')
AND date <= toDate('2025-12-31')
),
lagged AS (
SELECT date, o, c, up_day,
any(up_day) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prior_up
FROM bars
)
SELECT toYear(date) AS year,
countIf(up_day) AS signal_days,
round(100 * avgIf(c / o - 1, up_day), 3) AS same_bar_avg_pct,
round(100 * avgIf(c / o - 1, prior_up), 3) AS lagged_avg_pct,
round(100 * (avgIf(c / o - 1, up_day) - avgIf(c / o - 1, prior_up)), 3) AS gap_pp
FROM lagged
WHERE date >= toDate('2016-01-01')
GROUP BY year
ORDER BY yearPemisahannya tidaklah halus. Di 2016 versi batang yang sama rata-rata 0.447% per sesi yang memenuhi syarat sementara versi yang ditunda rata-rata -0.008%, selisih 0.455 poin persentase per hari. Di 2025 keduanya membaca 0.636% dan -0.03%. Dengan kira-kira 140 sesi yang memenuhi syarat dalam setahun, selisih setengah poin persentase per sesi terakumulasi menjadi kurva ekuitas yang belum pernah dicetak oleh akun langsung mana pun.
Seluruh keunggulan itu bersifat definisional. Memilih sesi yang ditutup di atas pembukaannya, lalu mengukur dari pembukaan ke penutupan pada sesi yang sama, mengukur kuantitas yang dijamin positif. Aturan itu menemukan filternya sendiri.
Varian dari ini bersembunyi di data harian sepanjang waktu: rata-rata bergerak yang mencakup penutupan hari ini dan digunakan untuk memperdagangkan hari ini, sinyal yang dihitung pada harga yang sudah disesuaikan untuk pemecahan saham yang belum terjadi, stop intraday yang ditempatkan pada tertinggi sesi yang belum tercetak. Bentuk umumnya adalah stempel waktu keputusan yang lebih awal dari salah satu masukannya sendiri.
Mekanisme dua: alam semesta yang diambil dari yang selamat hari ini
Mekanisme kedua tidak pernah menyentuh aturan. Ia berada di daftar nama yang boleh dilihat oleh aturan.
Tarik daftar ticker dari penyedia data saat ini, jalankan kembali sepuluh tahun, dan sampel secara diam-diam mengecualikan setiap perusahaan yang bangkrut, diakuisisi, atau dihapus dari pencatatan di sepanjang jalan. Aturan itu tidak pernah ditawari yang kalah. Panel mengukur besarnya pengabaian itu: setiap nama yang terdaftar di AS yang diperdagangkan setidaknya 200 sesi di atas $1 dalam tahun kalender tertentu, bagian dari kelompok itu yang masih mencetak harga pada Juli 2026, dan median pengembalian tahun kalender dari seluruh kelompok di samping median dari yang selamat saja.
SQL tepat di balik setiap angka
WITH recent AS (
SELECT DISTINCT ticker
FROM global_markets.stocks_daily_aggs
WHERE date >= toDate('2026-06-15')
AND date <= toDate('2026-07-28')
),
per_name AS (
SELECT toYear(date) AS year,
ticker,
argMin(toFloat64(close), date) AS first_close,
argMax(toFloat64(close), date) AS last_close,
count() AS sessions
FROM global_markets.stocks_daily_aggs
WHERE date >= toDate('2015-01-01')
AND date <= toDate('2024-12-31')
AND close > 1
GROUP BY year, ticker
HAVING sessions >= 200
)
SELECT year,
uniqExact(ticker) AS names_trading,
round(100 * uniqExactIf(ticker, ticker IN (SELECT ticker FROM recent)) / uniqExact(ticker), 1) AS still_listed_pct,
round(100 * quantileDeterministic(0.5)(last_close / first_close - 1, cityHash64(ticker)), 2) AS median_return_all_pct,
round(100 * quantileDeterministicIf(0.5)(last_close / first_close - 1, cityHash64(ticker), ticker IN (SELECT ticker FROM recent)), 2) AS median_return_survivors_pct,
round(100 * (quantileDeterministicIf(0.5)(last_close / first_close - 1, cityHash64(ticker), ticker IN (SELECT ticker FROM recent))
- quantileDeterministic(0.5)(last_close / first_close - 1, cityHash64(ticker))), 2) AS survivor_gap_pp
FROM per_name
GROUP BY year
ORDER BY yearDari 7063 nama yang lolos batas di 2015, 52.5% masih diperdagangkan pada Juli 2026. Untuk kelompok 2024 angkanya 87.5%, sebagian besar karena waktu yang berlalu: nama tahun 2024 punya dua tahun untuk menghilang dan nama tahun 2015 punya sebelas tahun.
Kolom pengembalian membawa bias itu sendiri. Di 2017 nama median mengembalikan 7.51% sementara median yang selamat mengembalikan 11.32%, celah 3.81 poin persentase yang diberikan secara gratis. Celah itu positif di setiap 10 tahun yang digambarkan. Strategi yang diuji pada yang selamat mewarisinya sebelum membuat satu keputusan pun, dan aturan yang menyaring kelemahan mewarisi lebih dari median, karena nama-nama yang lenyap berada secara tidak proporsional di keranjang itu.
Koreksinya adalah alam semesta point-in-time: daftar nama sebagaimana adanya pada setiap tanggal rebalance, termasuk yang dihapus dari pencatatan, dengan posisi yang dihapus ditutup pada cetakan terakhirnya daripada dijatuhkan dari catatan.
Mekanisme tiga: data yang direvisi setelah stempel tanggalnya
Harga distempel sekali. Fundamental tidak. Angka triwulanan membawa tanggal akhir triwulan, diamandemen oleh pengajuan kemudian, dan basis data yang hanya menyimpan versi saat ini akan dengan senang hati menyajikan angka yang diamandemen terhadap tanggal aslinya. Aturan yang menyaring angka itu sedang membaca koreksi yang membutuhkan waktu berbulan-bulan untuk tiba.
Pola yang sama berjalan melalui daftar keanggotaan indeks yang dibangun kembali ke konstituen saat ini, riwayat perkiraan analis yang ditimpa dengan konsensus akhir, dan penyesuaian aksi korporasi yang diterapkan mundur ke seluruh rangkaian harga. Dalam setiap kasus, catatan yang disimpan adalah cuplikan masa kini yang mengenakan tanggal masa lalu.
Dua praktik mengandungnya. Gunakan sumber yang menyimpan vintage, artinya nilai sebagaimana diketahui pada setiap tanggal, bukan nilai sebagaimana diketahui sekarang. Jika vintage tidak tersedia, terapkan jeda pelaporan yang cukup besar untuk menutupi jeda nyata, dan perlakukan panjang jeda itu sebagai parameter yang layak diuji, bukan detail yang layak ditebak.
Seperti apa kurvanya ketika masa depan bocor masuk
Bias pandangan ke depan memiliki tanda tangan: kinerja yang berada jauh di atas apa yang ditawarkan pasar yang mendasarinya. Titik referensi yang berguna adalah batas atas hindsight, pertumbuhan yang akan dihasilkan oleh perkiraan sempurna satu hari ke depan pada satu instrumen.
SQL tepat di balik setiap angka
WITH bars AS (
SELECT date,
toFloat64(close) AS c,
any(toFloat64(close)) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_c
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= toDate('2015-12-01')
AND date <= toDate('2025-12-31')
),
rets AS (
SELECT toYear(date) AS year,
c / prev_c - 1 AS r
FROM bars
WHERE date >= toDate('2016-01-01')
AND prev_c > 0
)
SELECT year,
count() AS sessions,
round(100 * (exp(sum(log(1 + r))) - 1), 1) AS buy_and_hold_pct,
round(100 * (exp(sumIf(log(1 + r), r < 0.02)) - 1), 1) AS without_big_up_days_pct,
round(exp(sum(log(1 + abs(r)))), 1) AS hindsight_ceiling_multiple
FROM rets
GROUP BY year
ORDER BY yearBatas atasnya sangat besar. Di 2020, pandangan ke depan sempurna satu hari pada SPY melipatgandakan modal 27.7 kali lipat selama 253 sesi, dibandingkan 16.2% untuk sekadar memegang dana tersebut. Di tahun paling tenang dari sepuluh tahun, 2017, perkiraan sempurna yang sama mengembalikan 2.2 kali lipat modal.
Kolom tengah menunjukkan seberapa terkonsentrasinya batas atas itu. Keluarkan sesi yang naik lebih dari 2%, dan 2020 berubah dari 16.2% menjadi -44.9%. Kebocoran yang hanya bernilai segenggam sesi itu per tahun menggerakkan backtest sangat jauh. Kurva dengan drawdown dangkal, tingkat keberhasilan tinggi, dan hari-hari terbaiknya terkumpul pada sesi paling keras pasar telah mendapatkan audit.
Kalibrasi lebih penting daripada ambang batas tunggal mana pun. Aturan yang mengklaim 40% per tahun yang mulus selama satu dekade mengklaim sebagian besar batas atas hindsight, dan pertanyaan jujurnya adalah masukan mana yang memberi tahu apa yang akan terjadi.
Cara menguji backtest untuk bias pandangan ke depan
- Tunda semuanya satu batang. Geser setiap sinyal satu periode penuh kemudian dan jalankan ulang. Tepi asli sedikit membusuk. Kebocoran runtuh, seringkali menjadi tidak ada.
- Ganggu masa depan. Ambil data setelah setiap stempel waktu keputusan, ganti dengan kebisingan atau pengocokan ulang, dan jalankan ulang logika keputusan. Setiap keputusan harus keluar identik. Keputusan apa pun yang bergerak telah membaca sesuatu yang tidak mungkin diketahuinya.
- Perlakukan stempel waktu sebagai data. Untuk setiap masukan, simpan momen ketika suatu nilai tersedia di samping momen yang dijelaskannya. Penggabungan yang tidak pernah membandingkan dua kolom itu tidak dapat menegakkan aturan.
- Bangun kembali alam semesta sesuai tanggal. Sertakan nama yang dihapus dari pencatatan dan diakuisisi, tutup pada cetakan terakhirnya, dan jalankan aturan yang sama pada kedua alam semesta untuk mengukur kontribusi survivorship.
- Ukur terhadap batas atas. Tempatkan pengembalian strategi di samping angka beli dan tahan serta angka pandangan ke depan sempurna untuk jendela yang sama. Jarak dari batas atas adalah konteks yang tidak diberikan oleh rasio Sharpe saja.
Penentuan ukuran posisi berada di hilir semua ini. Tingkat kemenangan yang meningkat memberi makan ukuran taruhan yang meningkat, di situlah penentuan ukuran posisi kriteria Kelly mengubah kesalahan akuntansi menjadi drawdown. Disiplin yang sama berlaku sebelum modal nyata bergerak: perdagangan kertas sebelum uang sungguhan menguji mekanisme pesanan, dan tumpukan otomatis membawa bahaya yang identik pada kecepatan mesin, dibahas di sistem perdagangan AI multi-agen. Efek yang bertahan dari pengujian point-in-time yang cermat, seperti anomali volatilitas rendah, menarik justru karena alasan itu.
Tanya Jawab
Apa itu bias pandangan ke depan dalam backtesting?
Ini adalah penggunaan data dalam perdagangan simulasi yang tidak tersedia saat perdagangan akan dilakukan. Bentuk umumnya adalah memutuskan pada batang harga yang juga dieksekusi perdagangan di dalamnya, menyaring alam semesta perusahaan yang masih tercatat hari ini, dan membaca angka keuangan yang direvisi setelah tanggal yang melekat padanya.
Bagaimana cara mendeteksi bias pandangan ke depan?
Tunda setiap sinyal satu periode penuh dan jalankan ulang: kebocoran biasanya runtuh sementara tepi asli membusuk dengan lembut. Tes yang lebih kuat mengganti semua data setelah setiap stempel waktu keputusan dengan kebisingan dan memastikan bahwa setiap keputusan keluar tidak berubah.
Apakah bias survivorship sama dengan bias pandangan ke depan?
Keduanya berbeda tetapi berjalan bersama. Bias survivorship adalah sampel yang dibangun dari nama-nama yang bertahan, dan mengetahui nama mana yang bertahan adalah informasi dari masa depan, sehingga alam semesta hanya yang selamat adalah kebocoran pandangan ke depan yang terletak di data, bukan di aturan.
Mengapa backtest dengan bias pandangan ke depan terlihat sangat bagus?
Kebocoran memilih hasil daripada memprediksinya. Di panel di atas, menyaring sesi pada harga penutupannya sendiri menghasilkan rata-rata keuntungan sesi sekitar 0.455 poin persentase di atas versi yang ditunda di 2016, keuntungan yang bersifat definisional daripada diperoleh.
Apa itu data point-in-time?
Data point-in-time menyimpan setiap nilai sebagaimana diketahui pada setiap tanggal historis, termasuk angka asli dan setiap revisi kemudian, bersama dengan alam semesta sekuritas sebagaimana adanya pada hari itu. Ini adalah referensi yang dibutuhkan backtest untuk menunjukkan bahwa masukannya sudah ada sebelum keputusannya.
Setiap angka di atas adalah kueri tersimpan dan berversi melalui batang harian nyata. Perluas SQL panel mana pun, atau jalankan uji tunda pada aturan Anda sendiri di terminal Strasmore.