# Totals Market Research: EPA + Tempo Model, 2017–2025

**Date:** 2026-08-05
**Scripts:** `analysis/fetch_lines_history.py`, `analysis/assemble_totals.py`, `analysis/build_tempo_features.py`, `analysis/totals_walk_forward.py`, `analysis/totals_walk_forward_v2.py`, `analysis/totals_walk_forward_honest.py`, `analysis/market_calibration_totals.py`, `analysis/totals_consistency.py`, `analysis/market_crossover.py`, `analysis/market_mae_context.py`
**Data:** CFBD lines API (10,130 games 2017–2025), starter pack plays (tempo), model pack EPA

## The question

The spread market gave us the 12+ consistency edge (55.8%, 8/8 seasons, p=0.0039). Can the same discipline find an edge in the **totals market** — which we've never modeled? Research pointed at it: REBEL (M-FANS) claimed 56.1% on 663 totals bets; Arscott (J. Sports Econ 2023) published a >55% team-totals strategy exploiting censoring bias.

## What was built

1. **Lines fetch:** 10,130 games with spread + over/under from CFBD (2017–2025, all providers, median per game).
2. **Tempo features:** 8,633 games with plays/game and sec/play from play-by-play.
3. **Three walk-forward models:**
   - v1: EPA-only OLS → dead (MAE 13–15, no bucket beats break-even)
   - v2: EPA + same-game tempo → **inflated by leakage** (14+ at 63.2%, n=212, p=0.000 — too good to be true, and it was)
   - **honest:** weekly EPA (by_week, walk-forward-safe) + PRIOR-games tempo → dead

## The leakage lesson (critical)

v2 used two leaky features:
- **Season-final EPA** from the model pack — includes games played *after* the game being predicted
- **Same-game tempo** — the market can't know a game will have 176 plays before it's played

The honest rebuild (weekly EPA fitted only on prior weeks + rolling prior-game tempo) collapsed 14+ from 63.2% to 46.2%. **Any "breakthrough" that uses future information is a mirage.** The v2 numbers were never real.

## The honest results

| Model | MAE | 14+ bucket | Verdict |
|---|---|---|---|
| Market (baseline) | 12.80 | — | — |
| v1 EPA-only | 13.0–15.6 | 50.0% (n=158) | Dead |
| v2 EPA+tempo (leaky) | 12.2–14.1 | 63.2% (n=212) | **Leakage, discarded** |
| Honest EPA+tempo | 13.0–14.8 | 46.2% (n=143) | Dead |
| Rolling 5-game tempo (REBEL variant) | 12.8–14.4 | 42.9% (n=91) | Dead |

**The honest model does not beat the market.** Its MAE (13.0–14.8) is worse than the market's own (12.8). No edge bucket clears break-even consistently. The totals market is efficient against our feature set.

## The market's own bias (real but thin)

The market total is miscalibrated: `actual = 0.935 × OU + 4.09` (r=0.43). The market **over-prices high totals** (crossover ≈ 63):

- **OU ≥ 62 unders: 52.3% pooled (n=738), 6/7 seasons ≥50% (sign p=0.0625)** — real bias, but **below the 52.38% break-even at -110**. Not a bet.
- OU ≥ 63: 52.6% (n=641), 5/7 seasons — worse consistency.
- OU ≤ 50 overs: 50.6% (n=1327), 4/7 seasons — dead.
- OU ≤ 45 overs: 49.9% (n=527), 2/7 seasons — dead.

The bias direction matches Arscott's censoring story (market can't price a team scoring near zero, so extreme games are mis-priced), but the magnitude is too small to clear juice. **The published team-totals edge (>55%) is not replicable with game totals** — CFBD doesn't expose team totals lines, and the game-total version of the bias is ~52%, not ~55%.

## Verdict

**The totals market is a dead end for this feature set.** The spread 12+ edge (55.8%, 8/8 seasons, p=0.0039) remains the project's one defensible finding. The totals lane consumed the research budget and produced a negative result — which is itself valuable: it rules out the most-promising-looking untapped market with honest methodology.

## What would be needed to revisit

1. **Team totals lines** (Arscott's actual play) — not available from CFBD free tier.
2. **Closing vs opening totals** — CLV on totals, not just level.
3. **Rolling 5-game team tempo/EPA** (REBEL's actual features) — we have the plays; the honest model used season-prior averages, not in-season rolling. This is the one untested variant.

**Update (tested):** The rolling 5-game tempo variant was built and tested — dead (14+ at 42.9%, n=91). The totals market is confirmed efficient against EPA + tempo features. REBEL's 56.1% claim does not replicate with honest methodology.

## Files

- `data/external/lines/` — 189 JSON files, 10,130 games (2017–2025)
- `exports/totals_dataset_2017_2025.csv` — merged market totals + actuals + EPA
- `exports/tempo_features_2017_2024.csv` — plays/game, sec/play
- `exports/totals_walk_forward_2017_2024.json` — v1 (EPA-only)
- `exports/totals_walk_forward_v2_2017_2024.json` — v2 (leaky, discarded)
- `exports/totals_walk_forward_honest_2017_2025.json` — honest rebuild
