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)
- The backtest hit its information ceiling.
nrl_historical.csvholds
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. - 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. - 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. - 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_marketduplicate reporting where
lineup_prior_year_v1is 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.*