Strategy: Demo Lookahead Cheat |
generated 2026-05-24 08:26
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.
| Alignment | Sharpe | Notes |
|---|---|---|
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)
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.
| Metric | Value |
|---|---|
| Assets included (≥ 100 active obs) | 50 |
| Mean autocorrelation | 0.798 |
| Median | 0.797 |
| Min | 0.778 |
| Max | 0.816 |
Pass criteria: mean AC ≥ 0.50
Result: OK — mean AC 0.798 ≥ 0.5 (shift test reliable)
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).
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.