Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

bias pandangan ke hadapan ujian balik

Bias pandangan ke hadapan ialah penggunaan maklumat masa depan dalam ujian balik yang mengembang hasil. Ketahui cara bias ini berlaku dan cara mengujinya.

Bias pandangan ke hadapan (look-ahead bias) ialah penggunaan maklumat dalam ujian balik (backtest) yang tidak mungkin diketahui oleh sesiapa pada saat dagangan simulasi diletakkan. Keluk ekuiti meningkat, statistik kelihatan cemerlang, dan semuanya runtuh apabila berdepan dengan pesanan sebenar. Halaman ini mentakrifkan bias tersebut, membincangkan tiga mekanisme yang menghasilkannya, dan mengukur setiap satu pada data pasaran sebenar.

Apa itu bias pandangan ke hadapan

Ujian balik adalah satu tuntutan tentang keputusan: pada cap masa ini, dengan maklumat ini, peraturan akan melakukan ini. Tuntutan itu hanya sah apabila setiap input yang dibaca oleh peraturan sudah wujud, dalam bentuk muktamadnya, sebelum cap masa tersebut. Bias pandangan ke hadapan adalah sebarang pelanggaran syarat itu, dan ia senyap. Tiada apa-apa dalam hamparan atau skrip yang merungut apabila baris memulangkan nilai yang dicap lebih lewat daripada keputusan yang diberinya makan.

Tiga pelanggaran merangkumi kebanyakan apa yang muncul dalam amalan. Keputusan yang membaca bar harga yang juga didagangkan di dalamnya. Alam semesta yang dipasang daripada nama yang masih tersenarai hari ini. Medan data yang disemak semula selepas tarikh yang dibawanya.

Mekanisme satu: membuat keputusan pada bar yang juga anda dagangkan

Mulakan dengan peraturan yang kedengaran tidak berbahaya. Beli atas kekuatan, bermakna pada sesi di mana dana ditutup di atas tempat ia dibuka. Dikodkan secara cuai, ujian memasuki pada pembukaan sesi itu dan keluar pada penutupan sesi itu, sementara syarat yang ditapisnya ialah harga penutupan bar yang sama. Tiada siapa yang tahu harga penutupan pada loceng pembukaan.

Panel di bawah menjalankan kedua-dua versi pada SPY, penjejak S&P 500, merentasi sepuluh tahun kalendar. Lajur pertama adalah yang mustahil. Lajur kedua melengahkan syarat yang sama dengan satu sesi, yang merupakan yang terawal akaun yang dibiayai boleh bertindak ke atasnya.

PertanyaanKeputusan bar yang sama vs. ketinggalan satu sesi: SPY, purata keuntungan sesi, 2016-2025
SQL tepat di sebalik setiap nombor
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 year
Run this yourself

Pemisahan itu tidak halus. Dalam 2016 versi bar yang sama purata 0.447% setiap sesi yang layak manakala versi yang dilewatkan purata -0.008%, perbezaan sebanyak 0.455 mata peratusan sehari. Dalam 2025 kedua-duanya membaca 0.636% dan -0.03%. Dengan kira-kira 140 sesi yang layak dalam setahun, perbezaan setengah mata peratusan setiap sesi bergabung menjadi keluk ekuiti yang tidak pernah dicetak oleh akaun langsung.

Keseluruhan kelebihan adalah definisi. Memilih sesi yang ditutup di atas bukaannya, kemudian mengukur buka-ke-tutup pada sesi yang sama, mengukur kuantiti yang dijamin positif. Peraturan itu menemui penapisnya sendiri.

Varian ini bersembunyi dalam data harian sepanjang masa: purata bergerak yang termasuk penutupan hari ini dan digunakan untuk berdagang hari ini, isyarat yang dikira pada harga yang sudah diselaraskan untuk pecahan saham yang belum berlaku, hentian intrahari yang diletakkan pada paras tertinggi sesi yang belum dicetak. Bentuk biasa ialah cap masa keputusan yang terletak lebih awal daripada salah satu inputnya sendiri.

Mekanisme dua: alam semesta yang diambil daripada yang terselamat hari ini

Mekanisme kedua tidak pernah menyentuh peraturan. Ia terletak dalam senarai nama yang dibenarkan untuk dilihat oleh peraturan.

Tarik senarai ticker daripada pembekal data semasa, jalankannya semula sepuluh tahun, dan sampel secara senyap mengecualikan setiap syarikat yang muflis, diambil alih, atau dinyahsenarai sepanjang jalan. Peraturan itu tidak pernah ditawarkan yang kalah. Panel mengukur saiz peninggalan itu: setiap nama yang tersenarai di AS yang berdagang sekurang-kurangnya 200 sesi melebihi $1 dalam tahun kalendar tertentu, bahagian kohort itu yang masih mencetak harga pada Julai 2026, dan pulangan tahun kalendar median bagi keseluruhan kohort di samping median yang terselamat sahaja.

PertanyaanKemandirian dalam alam semesta: nama yang didagangkan setiap tahun, saham masih tersenarai pada Julai 2026, dan pulangan median
SQL tepat di sebalik setiap nombor
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 year
Run this yourself

Daripada 7063 nama yang melepasi halangan dalam 2015, 52.5% masih berdagang pada Julai 2026. Untuk kohort 2024 angkanya ialah 87.5%, kebanyakannya soal masa berlalu: nama 2024 mempunyai dua tahun untuk hilang dan nama 2015 mempunyai sebelas tahun.

Lajur pulangan membawa bias itu sendiri. Dalam 2017 nama median kembali 7.51% manakala yang terselamat median kembali 11.32%, jurang sebanyak 3.81 mata peratusan yang diberikan secara percuma. Jurang itu positif dalam setiap 10 tahun yang dicarta. Strategi yang diuji pada yang terselamat mewarisinya sebelum membuat satu keputusan, dan peraturan yang menapis kelemahan mewarisi lebih daripada median, kerana nama yang hilang terletak secara tidak seimbang dalam baldi itu.

Pembetulannya ialah alam semesta titik-dalam-masa: senarai nama seperti yang wujud pada setiap tarikh pengimbangan semula, termasuk penyahsenaraian, dengan kedudukan yang dinyahsenarai ditutup pada cetakan terakhirnya dan bukannya digugurkan daripada rekod.

Mekanisme tiga: data yang disemak semula selepas cap tarikhnya

Harga dicap sekali. Fundamental tidak. Angka suku tahunan membawa tarikh akhir suku tahun, dipinda oleh pemfailan kemudian, dan pangkalan data yang hanya menyimpan versi semasa akan dengan senang hati menyampaikan nombor yang dipinda terhadap tarikh asal. Peraturan yang menapis pada nombor itu membaca pembetulan yang mengambil masa berbulan-bulan untuk tiba.

Corak yang sama berjalan melalui senarai keahlian indeks yang dibina semula kepada juzuk semasa, sejarah anggaran penganalisis yang ditulis ganti dengan konsensus akhir, dan pelarasan tindakan korporat yang digunakan ke belakang merentasi keseluruhan siri harga. Dalam setiap kes, rekod yang disimpan ialah gambar masa kini yang memakai tarikh masa lalu.

Dua amalan mengandunginya. Gunakan sumber yang menyimpan vintaj, bermakna nilai seperti yang diketahui pada setiap tarikh dan bukannya nilai seperti yang diketahui sekarang. Apabila vintaj tidak tersedia, gunakan kependaman pelaporan yang cukup murah hati untuk menampung yang sebenar, dan anggap panjang kependaman itu sebagai parameter yang patut diuji dan bukannya butiran yang patut diagak.

Bagaimana rupa keluk apabila masa depan bocor masuk

Bias pandangan ke hadapan mempunyai tandatangan: prestasi yang terletak jauh di atas apa yang ditawarkan oleh pasaran asas. Titik rujukan yang berguna ialah siling pandangan ke belakang (hindsight ceiling), pertumbuhan yang akan dihasilkan oleh ramalan sempurna sehari ke hadapan pada satu instrumen.

PertanyaanSiling pandangan ke belakang: SPY beli dan tahan, tahun yang sama tanpa hari kenaikan terbesarnya, dan pandangan ke hadapan satu hari yang sempurna
SQL tepat di sebalik setiap nombor
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 year
Run this yourself

Siling itu sangat besar. Dalam 2020, pandangan ke hadapan sempurna sehari pada SPY melipatgandakan modal sebanyak 27.7 kali ganda merentasi 253 sesi, berbanding 16.2% untuk hanya memegang dana. Dalam tahun paling tenang daripada sepuluh tahun, 2017, ramalan sempurna yang sama kembali 2.2 kali ganda modal.

Lajur tengah menunjukkan betapa tertumpunya siling itu. Keluarkan sesi yang memperoleh lebih daripada 2%, dan 2020 bertukar daripada 16.2% kepada -44.9%. Kebocoran yang bernilai hanya segelintir sesi itu setahun menggerakkan ujian balik dengan sangat jauh. Keluk dengan pengeluaran yang cetek, kadar hit yang tinggi, dan hari terbaiknya berkelompok pada sesi paling ganas pasaran telah memperoleh audit.

Penentukuran lebih penting daripada mana-mana ambang tunggal. Peraturan yang mendakwa 40% setahun yang lancar selama sedekad mendakwa sebahagian besar siling pandangan ke belakang, dan soalan jujur ialah input mana yang memberitahunya apa yang akan berlaku.

Cara menguji ujian balik untuk bias pandangan ke hadapan

  • Lengahkan segala-galanya dengan satu bar. Alihkan setiap isyarat satu tempoh penuh kemudian dan jalankan semula. Kelebihan tulen mereput sedikit. Kebocoran runtuh, selalunya kepada sifar.
  • Ganggu masa depan. Ambil data selepas setiap cap masa keputusan, gantikannya dengan hingar atau kocok semula, dan jalankan semula logik keputusan. Setiap keputusan harus keluar sama. Mana-mana keputusan yang bergerak telah membaca sesuatu yang tidak mungkin diketahuinya.
  • Anggap cap masa sebagai data. Untuk setiap input, simpan detik nilai itu tersedia di samping detik yang diterangkannya. Sertai yang tidak pernah membandingkan dua lajur itu tidak boleh menguatkuasakan peraturan.
  • Bina semula alam semesta pada tarikh tersebut. Sertakan nama yang dinyahsenarai dan diambil alih, tutupnya pada cetakan terakhirnya, dan jalankan peraturan yang sama pada kedua-dua alam semesta untuk mengukur sumbangan kemandirian.
  • Ukur terhadap siling. Letakkan pulangan strategi di samping angka beli dan tahan dan angka pandangan ke hadapan sempurna untuk tetingkap yang sama. Jarak dari siling ialah konteks yang tidak diberikan oleh nisbah Sharpe sahaja.

Saiz kedudukan terletak di hilir semua ini. Kadar kemenangan yang melambung memberi makan saiz pertaruhan yang melambung, iaitu di mana saiz kedudukan kriteria Kelly menjadikan ralat perakaunan sebagai pengeluaran. Disiplin yang sama digunakan sebelum modal sebenar bergerak: perdagangan kertas sebelum wang sebenar menguji mekanik pesanan, dan timbunan automatik membawa bahaya yang sama pada kelajuan mesin, diliputi dalam sistem perdagangan AI berbilang ejen. Kesan yang bertahan dalam ujian titik-dalam-masa yang teliti, seperti anomali turun naik rendah, adalah menarik untuk sebab itu.

FAQ

Apakah bias pandangan ke hadapan dalam ujian balik?

Ia adalah penggunaan data dalam dagangan simulasi yang tidak tersedia apabila dagangan itu akan diletakkan. Bentuk biasa ialah membuat keputusan pada bar harga yang juga dilaksanakan oleh dagangan di dalamnya, menapis alam semesta syarikat yang masih tersenarai hari ini, dan membaca angka kewangan yang disemak semula selepas tarikh yang dilampirkan padanya.

Bagaimana anda boleh mengesan bias pandangan ke hadapan?

Lengahkan setiap isyarat dengan satu tempoh penuh dan jalankan semula: kebocoran biasanya runtuh manakala kelebihan sebenar mereput perlahan-lahan. Ujian yang lebih kuat menggantikan semua data selepas setiap cap masa keputusan dengan hingar dan mengesahkan bahawa setiap keputusan keluar tidak berubah.

Adakah bias kemandirian (survivorship bias) sama dengan bias pandangan ke hadapan?

Ia berbeza tetapi bergerak bersama. Bias kemandirian ialah sampel yang dibina daripada nama yang bertahan, dan mengetahui nama mana yang bertahan adalah maklumat dari masa depan, jadi alam semesta hanya yang terselamat ialah kebocoran pandangan ke hadapan yang terletak dalam data dan bukannya dalam peraturan.

Mengapa ujian balik dengan bias pandangan ke hadapan kelihatan begitu baik?

Kebocoran memilih hasil dan bukannya meramalkannya. Dalam panel di atas, menapis sesi pada harga penutupannya sendiri menghasilkan purata keuntungan sesi kira-kira 0.455 mata peratusan di atas versi yang dilewatkan dalam 2016, satu kelebihan yang bersifat definisi dan bukannya diperoleh.

Apakah data titik-dalam-masa?

Data titik-dalam-masa menyimpan setiap nilai seperti yang diketahui pada setiap tarikh sejarah, termasuk angka asal dan setiap semakan kemudian, bersama-sama dengan alam semesta sekuriti seperti yang wujud pada hari itu. Ia adalah rujukan yang diperlukan oleh ujian balik untuk menunjukkan bahawa inputnya wujud sebelum keputusannya.


Setiap angka di atas ialah pertanyaan versi tersimpan ke atas bar harian sebenar. Kembangkan SQL mana-mana panel, atau jalankan ujian kependaman pada peraturan anda sendiri di terminal Strasmore.

#backtesting#look-ahead bias#survivorship bias#quant#research process