{"slug":"look-ahead-bias-in-backtesting","qid":"same_bar_vs_lagged","label":"Same-bar decision vs a one-session lag: SPY, average session gain, 2016-2025","post_title":"Look-Ahead Bias: The Backtest Killer","post_url":"/blog/look-ahead-bias-in-backtesting#q-same_bar_vs_lagged","columns":["year","signal_days","same_bar_avg_pct","lagged_avg_pct","gap_pp"],"rows":[{"year":2016,"signal_days":140,"same_bar_avg_pct":0.447,"lagged_avg_pct":-0.008,"gap_pp":0.455},{"year":2017,"signal_days":139,"same_bar_avg_pct":0.245,"lagged_avg_pct":0.033,"gap_pp":0.212},{"year":2018,"signal_days":127,"same_bar_avg_pct":0.574,"lagged_avg_pct":0.007,"gap_pp":0.567},{"year":2019,"signal_days":138,"same_bar_avg_pct":0.426,"lagged_avg_pct":0.072,"gap_pp":0.354},{"year":2020,"signal_days":147,"same_bar_avg_pct":0.742,"lagged_avg_pct":-0.165,"gap_pp":0.907},{"year":2021,"signal_days":137,"same_bar_avg_pct":0.485,"lagged_avg_pct":0.039,"gap_pp":0.446},{"year":2022,"signal_days":127,"same_bar_avg_pct":0.979,"lagged_avg_pct":-0.028,"gap_pp":1.007},{"year":2023,"signal_days":147,"same_bar_avg_pct":0.533,"lagged_avg_pct":0.054,"gap_pp":0.479},{"year":2024,"signal_days":135,"same_bar_avg_pct":0.422,"lagged_avg_pct":0.006,"gap_pp":0.416},{"year":2025,"signal_days":131,"same_bar_avg_pct":0.636,"lagged_avg_pct":-0.03,"gap_pp":0.666}],"shape":"table","sql":"WITH bars AS (\n    SELECT date,\n           toFloat64(open) AS o,\n           toFloat64(close) AS c,\n           toFloat64(close) > toFloat64(open) AS up_day\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker = 'SPY'\n      AND date >= toDate('2015-12-01')\n      AND date <= toDate('2025-12-31')\n),\nlagged AS (\n    SELECT date, o, c, up_day,\n           any(up_day) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prior_up\n    FROM bars\n)\nSELECT toYear(date) AS year,\n       countIf(up_day) AS signal_days,\n       round(100 * avgIf(c / o - 1, up_day), 3) AS same_bar_avg_pct,\n       round(100 * avgIf(c / o - 1, prior_up), 3) AS lagged_avg_pct,\n       round(100 * (avgIf(c / o - 1, up_day) - avgIf(c / o - 1, prior_up)), 3) AS gap_pp\nFROM lagged\nWHERE date >= toDate('2016-01-01')\nGROUP BY year\nORDER BY year","computed_at":"2026-07-31T08:39:53.650925+00:00","elapsed":0.00373222}