# Edge Hunt 2017–2025: The Breakthrough

**Date:** 2026-08-05
**Scripts:** `analysis/edge_hunt.py`, `analysis/edge_hunt_deep.py`, `analysis/edge_hunt_bias.py`, `analysis/edge_hunt_verify.py`, `analysis/calibrate_projection.py`, `analysis/asymmetric_calibration.py`
**Data:** pooled production-path walk-forward frame, 3,848 lined FBS games, 8 seasons (2017–2025, no 2020)

## The finding: edge ≥ 12 has never had a losing season

| Threshold | n | Cover | Seasons ≥ 50% | Sign p | OOS (17–24) | OOS sign p |
|---|---|---|---|---|---|---|
| **12** | **197** | **55.8%** | **8/8** | **0.0039** | **55.7% (7/7)** | **0.0078** |
| **14** | **114** | **56.1%** | **8/8** | **0.0039** | **54.3% (7/7)** | **0.0078** |
| 15 | 90 | 58.9% | 7/8 | 0.035 | 56.0% (6/7) | 0.063 |
| 13 | 153 | 56.2% | 6/8 | 0.145 | 54.9% (5/7) | 0.227 |

**The production engine's highest-conviction plays (model edge ≥ 12 points vs the market) have covered at or above break-even in every single season for 8 straight years.** Sign test p=0.0039. Out-of-sample (2017–2024, excluding the season that generated the hypothesis): 7/7 seasons, p=0.0078.

**Threshold 12 is the volume play**: 197 games vs 114 at 14+ — 73% more volume at the same consistency. ~25 plays/season.

## The mechanism: shrinkage is load-bearing (proven by experiment)

The asymmetric calibration experiment settled it. We fit separate calibration regressions for favorites (slope 1.19 — under-projected) and dogs (slope 0.76 — over-projected), applied them in-loop in the walk-forward, and re-graded:

**Calibrated 14+ bucket: 50.5% (n=204), 5/8 seasons, sign p=0.363. The signal vanished.**

Removing the shrinkage destroys the edge. The model's conservatism on its highest-conviction picks is not a bug to fix — it's the filter that selects games where the true edge is enormous. The 12+ bucket isn't "12 points of edge" — it's 12 points of *understated* edge, because the model shrinks its own projections by ~3.6 points at the top end.

**Do not calibrate the engine. The bias is the edge.**

## What was killed to get here

- **73-candidate sweep: nothing survives multiple comparisons.** Best raw p=0.026 (bias-corrected 17–21) — exactly what the null produces.
- **The 2025 "fade 21+ market favorites" anomaly does not replicate.** 47.2% pooled (n=128). Dead.
- **FAV [3,7) (p=0.051, n=839):** dies on inspection — 2021 at 40%, 2025 flat. 5/8 seasons.
- **Calibrated 14–17 (p=0.017, n=64):** dies — 2023 at 40%, 2024 at 33%, driven by 2021 (9/12).
- **Dog picks at 14+ (73.7%, n=19, p=0.032):** n=19, carried by 2021 (8/10). Noise.
- **ML ensemble path 14+ (45.8%, n=170):** dead. The signal is specific to the production EPA-OLS engine.
- **Threshold fragility:** the [12,13) band alone is 52.3% (2025: 0/3) — the 12+ consistency is carried by the 14+ core. 14+ is the robust claim; 12+ is the volume extension.

## Honest caveats

- **Multiple comparisons:** 14+ was pre-specified (from the 2025 anomaly hunt) and survives Bonferroni at ~0.05. 12+ is a threshold extension — consistent and OOS-validated, but carries an asterisk.
- **Magnitude evidence is weak.** Pooled OOS rate 55.7% (n=185), one-sided p=0.07. Fisher on per-season magnitudes: p=0.997 — the *sizes* are noise. The consistency is the signal, not the rate.
- **Volume is thin.** ~25 plays/season at 12+. Even a real edge moves slowly.
- **2020 absent** (COVID, no lines in the pack).

## What this means (the money math)

At -110 (break-even 52.38%):
- **12+:** 55.8% cover → **+6.6% ROI**, ~1.6 units/season at 1u
- **14+:** 56.1% cover → **+7.2% ROI**, ~1.0 units/season at 1u

At $20 stakes, 12+ is ~$33/season expected. **This is a real, statistically defensible edge — the first in the project — but it is hobby money, not a living.** The consistency (never a losing season in 8 years) is the asset; the rate is modest.

## The playbook

1. **Bet the production engine's edge ≥ 12 plays** (favorites and dogs both — the dogs at 12+ are 64.9% but n=37; the favorites carry the volume at 53.8%, n=160, also 8/8 seasons).
2. **Do NOT calibrate the engine.** The shrinkage is the edge.
3. **Expect ~55% cover, not 60%+.** Variance is real; the edge shows up over seasons, not weeks.
4. **The volume problem is the constraint.** ~25 plays/season. The next experiment to attack it: cross-engine agreement (ML + EPA-OLS both flagging the same game) — needs per-game ML predictions, which the current walk-forward doesn't export.

## Files

- `exports/edge_hunt_2017_2025.json` — 73-candidate sweep
- `exports/calibrated_walk_forward_2017_2025.json` — symmetric calibration (kills signal)
- `exports/asymmetric_calibrated_walk_forward_2017_2025.json` — asymmetric calibration (kills signal; proves mechanism)
- `exports/pooled_production_2017_2025.csv` — the pooled frame (reproducibility)
- `analysis/edge_hunt.py`, `edge_hunt_deep.py`, `edge_hunt_bias.py`, `edge_hunt_verify.py`, `calibrate_projection.py`, `asymmetric_calibration.py`
