Resolve Research
nhl methodology

NHL Methodology

Five layers, not one big model. Goalies get separate treatment because save percentage swings wildly without anchoring to team save quality first.

Skaters, games, teams, rookies, and goalies are projected by their own layer instead of one big model — goalies get separate treatment because save percentage swings wildly without anchoring to team save quality first. The skater impact layer fits roughly a million 5-on-5 shifts to make sure credit goes to the right player.

Five-layer projection: skater impact + games + teams + rookies + goalies

Skater impact is fit on roughly one million 5-on-5 shifts so credit lands on the right player rather than the linemates. Goalies are projected separately with their save% anchored to team save-quality context first — otherwise individual SV% swings wildly and overstates goalie value. Team and game projections compose the skater + goalie layers with shift-level context.

Where the inputs come from

sources
NHL.com / NHL API, natural stat trick, 5-on-5 shift logs
training
Multi-season fit on shift-level data; skater impact uses ~1M shifts
holdout
Each layer cross-season validated; goalie layer holds out one season at a time for SV% calibration

Out-of-sample performance

metric
Per-layer OOS metrics — skater impact rank stability, goalie SV% MAE, team-game Brier
value
Published per release

The skater archetype and per-archetype aging splits are documented in N01–N04 release batches. Goalie aging curves are separate (N03–N04).

What controls the projection

Shift-level credit assignment
Skater impact comes from ~1M 5-on-5 shifts. Without this, a player's stats get inflated by good linemates and deflated by bad ones.
Goalie team-context anchor
Individual SV% is anchored to team save-quality first. Raw SV% mistakes shot quality for goalie skill — anchoring fixes this.
Per-archetype skater aging
Forward / defenseman / scoring-line aging fit separately. Aging tail is steeper for scoring-line forwards than for defensemen.
Goalie aging
Goalie aging is its own curve, fit separately from skaters. The peak age is later than skaters and the decline is more about workload than skill.

Common questions

Why separate layers for skaters and goalies?
Save percentage variance is much higher per-game than skater stats, and it's heavily confounded by team save quality. Treating goalies as a separate layer with a team-save anchor produces calibrated projections; treating them as another skater type does not.
What does '1M 5-on-5 shifts' mean?
The skater impact model is fit on roughly one million individual 5-on-5 shifts across the training window. Each shift attributes credit (or debit) to all players on the ice, so credit lands on the right player rather than their linemates.
How do you project rookies?
Rookies have their own layer — they shrink toward NCAA / KHL / SHL transfer priors. First-year NHL sample is too small to fit a per-player projection without strong priors.
Do you predict individual game outcomes?
Yes — team-game projections produce predicted score margins and win probabilities. The /teams page shows team-level rollups; the /live page shows in-game updates.
What's your training window?
Multi-season fit on shift-level data. Specific seasons are documented in each layer's release notes.