New to these reports? Start here
- Dotted-underlined words have a plain-English definition — hover or tap them. Every term is also on the glossary page.
- "Null" means we found nothing, not that something broke. Most reports here are negative results, on purpose — knowing an idea doesn't work is the point.
- Two questions get asked separately. First, is the effect real? Second, is it already priced into the betting odds? An effect can be completely real and still useless to bet on.
- A "calibration" row is a self-check. It runs the same method on something already known to be true. If that fails, the whole report is unreliable — so it's reported alongside the findings.
- If a confidence interval includes zero, the real effect might be nothing at all, so no claim gets made.
Pre-registration: Q1 passing yards — large model-vs-DK gaps (frozen 2026-11-03)
Do not edit this file, grade.py or frozen_model.json after the commit that adds them.
Corrections go in a dated amendment at the bottom, never by changing the rule.
Where the idea came from (looked at before writing this, so it's a hypothesis, not evidence)
2026 weeks 1–8, 239 graded DraftKings Q1 passing lines (/nfl/props/q1/passing):
- Bets where the model and DK's devigged close differ by 5+ points: 48–31, ROIreturn on investmentProfit as a percentage of the money wagered. +2% means $2 profit per $100 bet. +14.1% (79 bets).
- By gap size, the model's side beat DK's fair price by −1.3 (0–2 pts), −15.0 (2–4), 0.0 (4–6),
+6.5 (6–8), +12.1 (8–10) and +29.9 points (10+).
- That's a steady climb above ~4 points and nothing below. A fitted "only gaps ≥ 6 pts" cutoff and a
"bigger gaps carry more real information" curve both beat the market price on these games. Both
were chosen after looking.
- Against: DK's line moved away from the model's side 44 times vs 26 toward it on 5+ pt edges.
Frozen inputs
- Model:
frozen_model.json, a byte copy ofdata/models/nfl_q1_pass_yds.jsonon 2026-11-03 (sha256 starts87ef58aa5ca8e5da). The grader always uses this copy, even if the live model is refit later. - Prices: DraftKings
player_pass_yds_q1, the last pre-kickoff two-sided quote captured in[redacted]. The full-game consensus center comes from the same capture, exactly asapp/sports/nfl/services/q1_pass_yds.build_trackercomputes it. - Results: the tracker's graded actual Q1 passing yards. Pushes and voids are excluded and reported.
gap = p_model(over) − p_DK(over)at DK's close; the model's side is Over ifgap > 0.
Forward sample
Games kicking off from 2026-11-05T00:00Z (week 9) through the end of the 2027 regular season (games before 2028-01-11T00:00Z). Regular season only.
Tests (graded once, after the window closes)
- Betting rule (primary): bet the model's side at DK's closing price when
|gap| ≥ 6 pts, 1 unit each. Pass if ROI − 1.645 × SE > 0, SE clustered by game. - Shape (primary): among graded lines with
|gap| ≥ 4 pts, regress excess = (model's side won, 1/0) − (DK's devigged probability of the model's side) on|gap|, OLS, SE clustered by game. Pass if the slope is > 0 with a one-sided p < 0.05. That is: the more the model disagrees, the more it's right. - Secondary, reported but not deciding: share of
|gap| ≥ 6lines where DK's line moved toward the model's side from open to close (an edge from stale DK lines would show > 50%); ROI of the|gap| ≥ 4rule; the excess by 2-point bin.
Verdict: "edge supported" needs both 1 and 2 to pass. One without the other gets reported as such.
Power, stated up front
About 9 lines a week reach 6+ points and about 13 reach 4+ (weeks 1–8). Expected: about 250 rule bets (SE ≈ 5.8%), so test 1 passes only if the true ROI is about +10% or better. A true +5% edge would most likely fail; that's accepted.
Looks
- An informational report after 2026 week 18 is allowed (
grade.py --interim). It decides nothing: no change to stakes, rule or window because of it. -
The Q1 page's weekly numbers are monitoring only.
python3 backtests/nfl_q1_passing_shape/grade.py # final (after the window) python3 backtests/nfl_q1_passing_shape/grade.py --interim # informational