Edge deep review — 2026-07-12: why "not good enough," and what delivers

Mandate: the edge is the goal and current results don't clear it. This
review diagnoses why, reports two new results produced during the review
itself, and re-sequences the program. Roadmap and STRATEGY.md updated to match.


Part 1 — why the program hasn't delivered yet (structural, not effort)

  1. The backtest hit its information ceiling. nrl_historical.csv holds
    open and close only. Every remaining question — the Tuesday window,
    intraweek movement, per-book prices, magnitude of lineup news — is
    invisible to it. This is why recent phases keep producing
    "G6 fail by 0.0005": the CSV has no more signal to give. Marginal value
    of another generic backtest phase ≈ zero.
  2. The live evidence loop is underfed. The decisive test
    (rapm_timing_v1 + CLV) has produced no committed evidence yet. Promotion
    needs ≥100 settled trades with CLV; at the current collection rate that's
    never. The bottleneck is collection velocity, not modelling.
  3. Signals were evaluated pooled, hiding the edge. A 54–58% CLA average
    mixes segments ranging from anti-signal to strongly confirmed (see Part 2).
    Betting the pooled signal spends bankroll on the noise half.
  4. Effort fragmentation. Six H2H models that are one model, a parked
    scoring family still nominally "one iteration away," and ops rounds
    competing with edge rounds. Kill-discipline below.

Part 2 — new results from this review (run on full history, committed code)

2a. Cross-market divergence signal — TESTED AND KILLED

New data/edge_signals.py: when the open H2H price and open line disagree
about the margin, does the line correct toward H2H by close?
Answer: not anymore. Pre-2018: 59.5% agreement (z=3.3). 2019–22: 37.4%
(z=−4.1, anti-signal). 2023+: 42.9%. The market internalised this consistency
years ago. Verdict: archived — kept as a worked example of a one-hour
kill; do not revisit without exchange data.

2b. CLA segmentation — THE EDGE HAS AN ADDRESS

New closing_line_agreement_segments() (by edge size / side / era):

Segment logit_rapm_v1 ss_strength_v1 Read
Backing the favourite 62.8% (z=5.5) 65.0% (z=6.9) The confirmed edge
Backing the underdog 41.4% (z=−2.8) 48.7% Coin-flip to ANTI-signal
Edge 5–8pp 61.4% (z=3.4) 56.2% Sweet spot
Era 2023+ 63.0% (z=2.3) 62.3% (z=3.7) Signal alive NOW, not decayed

Interpretation: opening prices systematically underrate favourites that the
models rate even stronger
(the classic favourite–longshot bias, located at
the soft open). Underdog "value" flagged by the same models is the models'
own noise — the market correctly fades it. This immediately defines the next
candidate strategy.

Part 3 — what is next (sequenced, with gates and kills)

N1 — open_fav_v1: the filtered strategy (pre-registered here)

Back the side at OPEN only when ALL of: model edge ≥ 3pp toward the
favourite (open price ≤ ~1.90 for that side); model ∈ {ss_strength_v1,
logit_rapm_v1}; both agree when both signal. Stake via shrunk quarter-Kelly.
- Backtest gate (CLI, --phase open-fav-v1): ROI CI over the filtered
bet set (expect several hundred bets), CLA of the filtered subset ≥ 0.60,
holds in the 2023+ era slice.
- Live: seed as open_fav_v1 paper trades every round from the Monday
open snapshot, CLV-tracked. This coexists with rapm_timing_v1 — same
collection, second strategy.
- Kill: filtered CLA < 0.55 on the backtest → the segment result was
overfit; record and stop.

N2 — live evidence quota (the program's heartbeat, starting R20)

Per round, non-negotiable, visible on /ops: Monday open snapshot; team-list
capture ≤ 30min after drop; timing + open-fav paper trades seeded; per-kickoff
close snapshots; CLV settled ≤ 24h post-round. A missed item is a program
incident, not a chore
— every missed round delays promotion by a week,
which no model work can recover.

N3 — demotions and kills (effective now)

  • cpois family: RETIRED. Two failed gates, no iteration delivered; the
    option to revisit expires until exchange data exists.
  • phase3-rapm-v4 (magnitude calibration): demoted behind N1/N2 — run it
    only if a round has no live work outstanding.
  • H2H feature engineering: frozen. The bench is one model + market; no
    new H2H features without a new information source.
  • Bench pruning (CLI): drop logit_core_market duplicate reporting where
    lineup_prior_year_v1 is identical; diagnostics stay out of headline tables.

N4 — break the data ceiling (human decision, off-season budget)

The only way to materially improve backtests is better data: Betfair
historical exchange prices
(true closes, intraweek paths, depth).
Recommendation: price it in September; if affordable, the 2027 pre-season
backtest re-runs on exchange closes make every instrument sharper. Until
then, live collection (N2) is the sole source of new truth.

N5 — reviewer cadence

After each round's evidence lands: CLV read on both live strategies at 20/40
settled trades (direction only), promotion review at 100. No new model phases
before N1's backtest verdict is in.


Code delivered with this review: data/edge_signals.py (divergence signal +
evaluation), closing_line_agreement_segments() in data/calibration.py,
13 tests. Killed: divergence. Discovered: the favourite-side segment.*