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.
NFL player props: do books overprice overs?
2026-10-11. Script: over_under.py, results in over_under_results.json.
Data: 2026 weeks 1–5, 65 games. Closing two-sided prices at 8 books: 17,377 Over/Under pairs (rushing yards, receiving yards, receptions, passing yards, pass TDs). Outcomes come from nflverse. A player who took a snap with no stat row counts as 0; one who took no snap is void (2,185 voided).
Results
Primary (pre-declared): overs hit 47.95% against a fair 49.78%, a gap of −1.8 pp (SE 1.4, z=−1.3). That leans toward unders but is not significant.
- It isn't book shading. Pinnacle's gap (−1.9 pp) is the same as the soft books' (−0.9 to −2.2 pp). Every book priced the same overs that didn't hit, so this looks like a season-wide outcome (a low-yardage start), not retail shading.
- No star-player effect. Split by line size, low −2.1, mid −2.4, high −1.2 pp. The popularity hypothesis is not supported.
- By market:
| Market | Gap | z |
|---|---|---|
| Rushing yards | −5.6 pp | −2.7 |
| Receiving yards | −1.7 pp | −1.0 |
| Receptions | −2.2 pp | −1.3 |
| Passing yards | +3.2 pp | +0.8 |
| Pass TDs | +3.1 pp | +0.7 |
- Rushing is the one standout, but it is not reliable. It is one of five markets, so it should be discounted for multiple testing. Pinnacle shows it too (−5.2 pp). Week 1 went the other way (+4.9 pp), then weeks 2 and 4 were −14 and −9 pp. Unders at the best price returned +5.0% (SE 4.4).
- Betting every Under loses −2.3% at the listed price and −1.6% at the best price across books.
Anytime TD: soft books post Yes only. Their Yes implied probability sits 0.9–3.0 pp above Pinnacle's no-vig Yes. Betting every Yes loses 8–23% per bet (the Yes side carries a large vigvigThe bookmaker's built-in cut. It is why a coin-flip bet at -110 needs you to win about 52.4% of the time just to break even.). Pinnacle's fair Yes vs hits: −2.0 pp, z=−1.2. There is nothing to take, since No isn't offered.
Verdict
No over-shading by book that a bettor could use. The rushing-unders lean matches Pinnacle's, reversed in week 1, and doesn't survive multiple testing.
To settle it, test rushing-yards closing lines from a past season. The Odds API historical endpoint costs about 10 credits per game per snapshot, so a full 2025 season is about 2,900 credits. Or re-run this script at the end of the season on our own capture (free).
Late scratches: do books re-price teammates, and do some leave them stale?
2026-10-11. Script: late_scratch.py, results in late_scratch_results.json.
Definition of a scratch: a WR, TE or RB listed Questionable or Doubtful on the final injury report, game-day inactive, and with a prop at the open. Only 6 team-games qualify with game-day snapshots: Pittman (wk 2), Nacua (wk 2), A. Mitchell (wk 3), McLaurin and K. Allen (wk 4), Fant (wk 4). Many Questionable/Doubtful scratches were backups with no prop, so books never expected them to play.
Books re-price. Teammates' receiving and rushing lines that rose between the game-day morning snapshot (≥3 h before kickoff) and the final one:
| Team-games | Rose | Fell |
|---|---|---|
| Lost a scratch (6) | 39% (SE 8) | 10% |
| Questionable player played (10) | 10% | 18% |
| No question marks (114) | 14% | 13% |
The direction is right in both comparison groups: teammates go up when the player sits, and slightly down when he plays.
No stale book. Share of a book's final teammate lines below the cross-book median line:
| Book | Scratch games | Its normal rate |
|---|---|---|
| BetMGM | 31% | 23% |
| BetRivers | 41% | 35% |
| FanDuel | 14% | 16% |
| Pinnacle | 18% | 14% |
| DraftKings | 1% | 8% |
| Bovada | 1% | 8% |
BetMGM and BetRivers always run lower lines; scratches add nothing beyond that.
Outcomes: the sample is too small to say anything. For scratch teammates, Over vs fair was +0.6 pp (SE 7.6), and the Over at the lowest line returned −1% (SE 12, 77 bets).
Verdict
Books move teammates' lines on late scratches, and none lags beyond its normal habit. Six team-games can't show a profit either way.
Limitation: our snapshots are ~3–6 h, ~1.5–3 h, ~1 h and ~15 min before kickoff. Insider news often lands before the morning snapshot, so this measures the game-day re-pricing that is left, not the first minutes after the news. Re-run at season end for about 4× the sample.
Soft-book props that beat Pinnacle's no-vig price
2026-10-11. Scripts: pinnacle_edge.py (results in pinnacle_edge_results.json,
bets in pinnacle_edge_bets.json) and pinnacle_sharpness.py.
The rule: bet a soft book whose price beats Pinnacle's no-vig price, taken from the same snapshot at the same line, by 3% or more. Take one bet per player, market and side, the first time it qualifies. Weeks 1–5 cover 74 games. Pinnacle posts props only about 2–6 h before kickoff, so almost every signal is on game day. The open-phase split has 2 bets.
| Bets | Record | Signal EV | "CLVclosing line valueWhether you got a better price than the market settled at. Widely used as a faster signal of skill than profit, which takes ages to measure." vs Pinnacle close | ROIreturn on investmentProfit as a percentage of the money wagered. +2% means $2 profit per $100 bet. | |
|---|---|---|---|---|---|
| All | 556 | 162–394 | +6.3% | +5.5% (z 19.6) | −7.3% (SE 6.3) |
| Anytime TD Yes | 385 | 80–305 | +7.2% | +6.6% | −11.9% (SE 8.6) |
| Two-sided (yds, rec, pass TDs) | 171 | 82–89 | +4.3% | +2.7% | +3.1% (SE 8.2) |
The CLV is not evidence. Pinnacle's price barely moves after it posts, so EV measured against its close mostly repeats the signal.
Anytime TD is an artifact of how the vig is removed. On these bets:
| P(Yes) | |
|---|---|
| Actual hit rate | 20.8% (SE 2.1) |
| Pinnacle no-vig, vig split proportionally | 25.8% |
| Pinnacle no-vig, power method | 23.8% |
| Soft-book break-even | 24.2% |
Re-scored with the power method, the average bet is −4.1% EV. Proportional devigging puts too little of the vig on the longshot Yes.
Pinnacle isn't the sharp reference for props. At the final snapshot, on the same player and line (8,327 pairs), soft-book log losslog lossA score for probability forecasts that punishes confident wrong answers harshly. Lower is better. minus Pinnacle's is −0.0003 (SE 0.0005). It is within noise of zero at every book. A soft book disagreeing with Pinnacle is as likely to be Pinnacle's error. That fits the two-sided bets: they hit 48.0% against Pinnacle's no-vig 49.4% and a break-even of 47.3%.
Verdict
No edge from Pinnacle-referenced line shopping on NFL player props. Don't build an alert on it. The two-sided +3.1% is noise: confirming a 4% edge on results would take about 2,500 bets.
Soft-book props vs a leave-one-out consensus
2026-10-12. Script: consensus_edge.py (results in consensus_edge_results.json,
bets in consensus_edge_bets.json).
The rule: the fair price is the average no-vig price (power method) of the OTHER books quoting the same line in the same snapshot, with at least 3 of them. Bet when a book beats it by 3% or more, once per player, market and side. Two-sided markets only: anytime TD has no No side to devigdevigRemoving the bookmaker's cut from odds to recover the market's actual implied probability. except at Pinnacle.
The consensus is no sharper. Per book, own log loss minus its leave-one-out consensus's log loss is within noise of zero for all 8 books (SEs about 0.0006). The pooled +0.0002 is guaranteed by convexity, since an average of probabilities can't score worse than the books' average. It is not evidence.
| Threshold | Bets | Record | Hit / fair / break-even | ROI |
|---|---|---|---|---|
| 1% | 455 | 237–218 | 52.1 / 52.4 / 51.3 | +2.4% (SE 4.0) |
| 3% (primary) | 100 | 54–46 | 54.0 / 52.7 / 50.7 | +8.6% (SE 9.1) |
| 5% | 20 | 9–11 | 45.0 / 54.1 / 51.0 | −9.8% (SE 20.7) |
ROI doesn't rise with the threshold. Half of the 3% bets are at Pinnacle (49 bets, +22% ± 14), but that's one slice of many. Consensus CLV is +3.1% (SE 0.5), against a +4.1% signal. That is partly circular, because the reference barely moves.
Verdict
No demonstrated edge. A +2–9% lean, with every cut within noise. The cheap next step is to keep re-running this script as the season's capture grows (free, about 20 bets a week). Don't build an alert unless the 3% ROI holds up at about 500+ bets.
Early prop lines far from the other books
2026-10-12. Script: opening_outliers.py (results in
opening_outliers_results.json, quotes in opening_outliers_bets.json).
The rule: works in line units, so books on different points and juice compare. Each book's main two-sided quote becomes an implied median (point + SD × z of its power-devig fair P(over)). In open/checkpoint snapshots, a book is an outlier when its median minus the median of at least 3 other books, less that book's usual offset in the market, is ≥ 2 SD of such deviations. Bet the side the outlier favours at its own line and price, once per book, player and market, and measure against the other books' closing median. Pass yds, rush yds, rec yds and receptions; 2,921 early quotes in 55 games, nearly all more than 72h before kickoff.
Early lines are already tight. 1 SD of deviation is 3.0 pass yds, 1.0–1.2 rush/rec yds and 0.1 receptions, so a "2 SD outlier" is only about 6 pass yds or 2 rush/rec yds. Book habits are small too: BetRivers −2.0 and Fanatics −1.6 pass yds; everything else within ±0.7.
Outliers do converge, and mostly the outlier book moves. At 2 SD the outlier book closes 56% (SE 7) of the gap and the other books 32% (SE 7).
| Cut | Quotes | CLV (yds) | CLV (EV) | Record | ROI |
|---|---|---|---|---|---|
| Non-outliers | 2,758 | +0.4 | −4.9% (SE 0.1) | 1417–1341 | −3.3% (SE 1.0) |
| ≥ 1.5 SD | 348 | +1.7 | −1.6% (SE 0.3) | 172–176 | −6.8% (SE 3.9) |
| ≥ 2 SD (primary) | 163 | +1.8 | −0.8% (SE 0.5) | 82–81 | −4.4% (SE 7.0) |
| ≥ 2.5 SD | 79 | +2.0 | +0.1% (SE 0.8) | 36–43 | −14.5% (SE 12.8) |
Betting the outlier gains about 4pp of closing value over an ordinary quote, which is roughly the vig. Even the biggest outliers only reach break-even CLV. No market or side stands apart; BetOnline (n=10) and BetMGM (n=5) show positive CLV on samples too small to mean anything.
Verdict
No edge. Off-market early lines are real and do get corrected, but the gaps are a yard or two and the correction just pays for the juice. Don't build an alert. Re-running it at season end is free if the capture keeps more books in the open snapshots.