Strategy Research Bias Checklist
Source: GitHub issue #297 (mandatory checklist referenced by
backtest-expert, theedge-*pipeline,residual-edge-analyzer, andedge-strategy-reviewer). Canonical data: skills/edge-strategy-reviewer/assets/bias_checklist.yaml
Purpose
Backtest and strategy-research results are only as trustworthy as the biases they fail to control for. This checklist enumerates the bias and realism concerns a strategy draft must address before it is considered fit for further work. It is mandatory, not advisory: the reviewer downgrades a draft that leaves a required concern unaddressed.
Checklist items
Every item is required. An item is addressed only when the draft declares
it in its bias_checklist block with a truthy value (a string note, true, or a
dict with addressed: true).
| ID | Concern | Coverage hint (draft text signal) |
|---|---|---|
look_ahead |
Look-ahead bias | point-in-time, as-of, future data |
survivorship |
Survivorship bias | survivorship, delisted, non-surviving |
universe_selection |
Universe selection | universe, selection criteria, constituents |
delisted_securities |
Delisted securities | delist, trading suspended, halted |
earnings_announcement_timing |
Earnings announcement timing | earnings announce/report/date/timing |
split_dividend_adjustment |
Split & dividend adjustment | split, dividend, adjusted, corporate action |
transaction_costs_slippage |
Transaction costs & slippage | transaction cost, commission, slippage, after costs |
short_borrow_availability |
Short borrow availability | short borrow, borrow fee, locate, HTB |
liquidity_capacity |
Liquidity & capacity | liquidity, capacity, ADV, market impact |
parameter_multiplicity |
Parameter multiplicity | parameter grid/count, overfit, multiple configs |
walk_forward_out_of_sample |
Walk-forward & OOS | walk-forward, out-of-sample, OOS, hold-out |
benchmark_attribution |
Benchmark attribution | benchmark, attribution, relative to (index) |
regime_dependence |
Regime dependence | regime, across regimes, risk-on/off, stress |
Declaring coverage in a draft
A strategy draft declares which concerns it has already addressed in an optional
bias_checklist block:
bias_checklist:
look_ahead: "Uses point-in-time snapshots; no look-ahead"
survivorship: "Universe includes delisted names"
universe_selection: "S&P 500 constituents at each rebalance"
# ... any other addressed items ...
Values may be:
- a non-empty string note,
true,- a dict
{addressed: true, note: "..."}for explicit control.
An item is unaddressed when its key is absent, false, an empty string, or a
dict with addressed: false.
Enforcement in edge-strategy-reviewer
The reviewer scores every draft against the checklist when run with the bias flag:
# Use the bundled checklist
python3 skills/edge-strategy-reviewer/scripts/review_strategy_drafts.py \
--drafts-dir reports/edge_strategy_drafts/ \
--bias-checklist \
--output-dir reports/
# Any required item left unaddressed downgrades PASS -> REVISE and clears
# export eligibility (never raises a REJECT).
- Non-scoring: the bias gate never changes the confidence score or the C1–C8 weights.
- Attached output: each reviewed draft gets a
bias_reviewarray (one entry per checklist item withitem_id,title,required,addressed,noted_in_draft,note). - Informational
noted_in_draft: a heuristic that reports whether a concern’s concept text appears anywhere in the draft, so an author can see that a rule is discussed in prose but not yet declared. Escalation is driven only byaddressed.
Drift / consistency
The checklist function is loaded from the YAML in assets, and the semantic table here mirrors it. When items change, update both the YAML and this table together. A drift test enforces that the reviewer loads a non-empty, fully-required checklist so a rule can never be silently dropped.