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.
Which devig method matches results? (2026-10-31)
Answer: use exact Shin. For a two-way market it gives exactly the same numbers as the additive method (take half the 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. off each side). Our production "Shin" was a shortcut that over-corrected: it shaded favourites about 0.8pp too far on lopsided lines. Proportional devigdevigRemoving the bookmaker's cut from odds to recover the market's actual implied probability. errs the other way by the same amount. Fixed in [redacted].
On near-even lines (spreads, totals, most props) every method agrees to within about 0.1pp, so the choice barely matters there. It matters on lopsided moneylines and longshot props.
Data
There are 134,560 closing two-way lines that have results, built by build.py into data/closes.parquet. The close is each book's last price for both sides within 6 hours before the start.
| Source | Lines |
|---|---|
| Live odds feed, 2026: MLB, NBA, NCAAB, NHL, tennis (all books, Pinnacle separately) | 66k |
| NFL 2026 game lines and player props, graded with nflverse | 53k |
| nflverse closing lines 2006–2025 (one line per game) | 15.7k |
Pushes and ties are dropped.
Methods compared
- mult: proportional.
- add: additive.
- power.
- shin_exact: solves for z so the fair probabilities sum to 1.
- odds_ratio: Cheung's method.
- shin_prod: the old production code. Its closed-form z is roughly twice the exact z, and it then renormalised the result.
Results
Pooled, all 134,560 lines. The table shows log losslog lossA score for probability forecasts that punishes confident wrong answers harshly. Lower is better. relative to the best method, with standard errors clustered by game.
| Method | Δ log loss ×1000 |
|---|---|
| odds_ratio | 0 (best) |
| shin_exact / add | +0.00 ± 0.01 |
| power | +0.02 ± 0.03 |
| old production Shin | +0.05 ± 0.05 |
| mult | +0.06 ± 0.07 |
Lopsided lines, where the methods disagree (favourite raw-implied ≥ 65%, n = 21,385):
| Favourite win rate | |
|---|---|
| Actual | 69.96% ± 0.62 |
| mult | 69.18% |
| shin_exact / add | 70.07% |
| odds_ratio | 70.14% |
| power | 70.57% |
| old production Shin | 70.84% |
NFL sides, 2006–2025 (n = 3,025 favourites at 65%+): the favourite won 74.3% ± 0.8. Proportional said 73.8%, exact Shin 74.5%, and old production Shin 75.1%. This explains the earlier note that "Shin over-corrects NFL sides" (memory: pickem strategy): that was the shortcut, not Shin itself.
By sport and market: no market has a winner that clears noise once you allow for about 30 groups and 5 comparisons each. - The largest gaps are NCAAB moneylines, where mult is worse by 2.3 ± 1.3, and NFL rushing-yards props, where the old Shin is worse by 0.68 ± 0.27. - Choosing a method per market would be fitting noise, so one method is used everywhere.
Changes made
devig_shinnow solves for z exactly. Every caller ofdevig_auto/devig_shinchanges from 2026-10-31: EV alerts, closing fair probability, paper trading 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. and line shopping.- The 10 paper-trading bets that already had a close were recomputed. Most moved by less than 0.5pp of CLV. The longshot anytime-TD bets moved most: +360 went from −8.7% to −3.5%.
- EV alert history rewritten 2026-10-31 with
scripts/clv/rewrite_fair_exact_shin.py. - Backup:
[redacted].bak_pre_exact_shin_20261031_181223. - Each stored
closing_fair_probwas matched to the snapshot pair that reproduces it under the old formula, then re-devigged with exact Shin. 25 early rows had used proportional or power devig and were matched the same way. - 4,537 of 4,870 rows were rewritten. The other 333 have no pair that reproduces them and were left unchanged: 252 February–March props, 73 May spreads and totals, and 9 point-adjusted props.
- Alert-time fields (
pinnacle_fair,true_prob,edge_pct,ev_pct) were left as they were alerted. -
Effect on reliable rows (n = 3,495): mean
clv_fair_pctwent from +0.30 to +0.14 pp, and the share with positive CLV from 59.3% to 54.7%. Alerts lean toward favourites (the push gate is favourite-only), and the old shortcut gave favourites too high a fair probability at close.Sport Before After MLB −0.34 −0.42 NBA −0.42 −0.54 NCAAB −0.15 −0.45 NFL +1.25 +1.24 NHL +0.76 +0.54 WTA +0.79 +1.11 - Left proportional by design: model inputs and model grading ( nfl/models/joint_score.devig_home,scripts/nfl_model_clv.py, fantasymarket_projection). The joint model tested proportional, power and Shin as a tie.- Untested: markets with more than two outcomes (3-way soccer, first-TD groups) still use proportional, because there were too few graded rows.
Side note
Heavily juiced player props did not consistently lose or win more than priced. - Receptions favourites at 65%+ won 55.6%, against 63.4% priced (n = 809, 108 games, about 2.4 SE). - Passing yards and passing TD favourites won more than priced.
With about 25 groups tested this is consistent with noise. It isn't a lead without a fresh sample.
Run: python3 backtests/devig_calibration/build.py && python3 backtests/devig_calibration/evaluate.py