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: roster turnover vs the October market (2026-27)

Frozen 2026-09-29, before the season's first puck drop on 2026-10-02. The commit containing this file, forward_2026_team_ratings.json and roster_turnover_forward.py is the record. Nothing in them changes after 2026-10-02. Any later change goes in an "Amendments" section below, dated, with both results reported.

Question

Early-season lines lean on last season. Does a team's roster turnover carry information those lines don't already have? Turnover here means: - scoring returning and scoring lost to the portal; - scoring brought in by transfers; - goalie minutes returning; - NHL-drafted freshmen.

Backtest that motivated it (roster_turnover.py, no odds)

  • Data: 2022-2025, Oct-Nov games, 1,299 games, ratings frozen preseason, fit leave-one-season-out.
  • Headline: adding turnover to a regressed-Elo prior improved log losslog lossA score for probability forecasts that punishes confident wrong answers harshly. Lower is better. by 0.0033 (95% CI95% confidence intervalThe range the true value is plausibly in. If this range includes zero, we cannot rule out that the real effect is nothing at all. −0.0138 to +0.0072). It helped in 3 of 4 seasons.
  • Weights (EloElo ratingA rating system, originally from chess, that moves a team up or down based on results and the strength of the opponent. points per 1 SD): returning scoring +21, portal losses −21, incoming transfers +17, goalie minutes +5, drafted freshmen +46.
  • Two choices made after seeing the first run, both disclosed:
  • 2021 dropped: its prior season was COVID-shortened, and the ratios exploded.
  • Features clipped at the 1st/99th percentile.
  • Two bugs found and fixed before these numbers:
  • The goalie feature was empty: goalie_game_stats.started is never populated, so minutes are used instead.
  • An over-strong ridge penalty pinned every weight to about 1 point.

Inputs, frozen

  • Team ratings: forward_2026_team_ratings.json holds each team's regressed preseason Elo and turnover shift. It uses rosters scraped from CHN on 2026-09-29 and coefficients fit on 2022-2025.
  • Odds: OddsPapi snapshots from the Monday cron (oddspapi_backfill.py --recent-days 10). Book preference: Pinnacle > DraftKings > BetRivers > FanDuel > Caesars.
  • Open = first stored pre-game snapshot; last = last one. Both are de-vigged proportionally.
  • Games: 2026-10-02 to 2026-11-30, D-I vs D-I, both teams in the frozen file, a pre-game line present, ties dropped.

Tests, decided now

  1. PRIMARY — does turnover add to the market? - Build p_adj = logistic(logit(p_last) + 0.5 × shift × ln10/400), with shift = home turnover shift − away turnover shift. The 0.5 is an a-priori guess that the market has already priced half. - Pass: the paired-bootstrap 95% CI on mean log-loss difference (p_adj − p_last) lies entirely below 0.
  2. SECONDARY — closing-line value. - Take games where the model's probability differs from the de-vigged opener by ≥ 3 pp and the line has more than one snapshot. Take the model's side. - 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. = how far the market moved toward that side from open to last, in de-vigged probability. - Pass: the 95% CI on mean CLV lies entirely above 0. - ROIreturn on investmentProfit as a percentage of the money wagered. +2% means $2 profit per $100 bet. at the opening price is reported but is NOT a pass criterion: it is too noisy at this sample size.

Decision rule

  • Graded once, after the 2026-12-07 cron has captured November's games. Interim looks are allowed; changes are not.
  • Both fail: the angle is closed.
  • Either passes: extend the same frozen rule through the season before any money is considered. One pass at ~150-250 games is a lead, not an edge.
  • Expected sample: ~150-250 games. Last season OddsPapi had a line for ~30% of D-I games.

Amendments

(none)

On this page

Terms in this report

Related

College hockey betting angles backlog (2026-09-29) College hockey model vs the betting market (first comparison, 2026-09-29)

Source

backtests/college_hockey_eval/PREREG_ROSTER_TURNOVER_2026.md
updated 2026-09-29 22:05