Forward-Look Bias Test Report

Strategy: Demo Lookahead Cheat  |  generated 2026-05-24 08:26

✗ FAIL — potential bias detected

Test 1: Shift-Lookahead

Compute sum(positions × asset_returns) under four position-time alignments. A causal strategy can be "cheated" by using tomorrow's positions — so the lead-1 case must inflate Sharpe substantially. If lagging by 1 day collapses Sharpe MORE than leading boosts it, the strategy already has built-in lookahead.

AlignmentSharpeNotes
same-day  pos[t]·ret[t] 7.140 Strategy's actual mechanism
lag-1  pos[t-1]·ret[t] 7.166 Stale by 1 day. Drop = -0.026
lead-1  pos[t+1]·ret[t] 7.170 Cheat with tomorrow's pos. Gain = +0.030
lead-5  pos[t+5]·ret[t] -0.027 Cheat further

Pass criteria: both must hold —
  • lead_gain ≥ 0.30 (cheating must add Sharpe)
  • lead_gain ≥ 0.80 × lag_drop (asymmetry signature)
Result: FAILED — lead-1 gain +0.030 < 0.3 threshold; strategy may have built-in lookahead (no room to cheat further)

Test 2: Position Autocorrelation

Day-over-day per-asset position autocorrelation. High AC means positions are stable and the shift test is reliable; low AC suggests positions are jumpy and the shift test less informative.

MetricValue
Assets included (≥ 100 active obs) 50
Mean autocorrelation0.798
Median0.797
Min0.778
Max0.816

Pass criteria: mean AC ≥ 0.50
Result: OK — mean AC 0.798 ≥ 0.5 (shift test reliable)

Test 3: Truncate-and-Compare (SKIPPED)

Skipped — to enable, pass truncated_pipeline_fn and truncate_date to run_bias_test(). This is the gold-standard test: it re-runs your strategy with data physically truncated to ≤ T and verifies that day-by-day outputs match the full-data run exactly (modulo the boundary day).

Methodology

Generated by bias_test_kit. See METHODOLOGY.md for the full theory + worked example. The asymmetry check (lead_gain ≥ 0.8 × lag_drop) is the key innovation that catches built-in lookahead even when the absolute lead-gain looks fine — without it, synthetic cheats can slip through.