Skip to content

NHL methodology

Every active NHL player gets a grade from A+ to F comparing his actual cap hit to an expected cap hit estimated from a market regression on production.

Expected cap hit

For skaters, the model fits the relationship between production (points per 82 games), usage (time on ice per game), position and signing age to the cap hits of unrestricted-free-agent contracts across the league. The market sample includes UFA-age deals signed in the last 18 months that start next season. Goalies are graded separately by performance-ranked quantile mapping: their performance score is ranked against the current goalie pay distribution instead of being fitted to cap hit.

A three-season blend (60%/30%/10%) smooths year-to-year variance. A weighted isotonic calibration is then fitted on predicted versus actual cap share and linearly interpolated between block centres, so the mapping stays monotone without collapsing the elite tier into a flat step. Above the top block the curve continues with the regression’s log-space slope, then clamps at 20% of the cap. Future-start deals are priced against the cap of the season they begin and marked as such in the model data.

The skater model uses a with points_per_82, toi_per_game_min, is_defence, signing_age. Skater R² is 0.654 on 311 training rows.

Goalie grade: performance-ranked. Goalie grades are performance-ranked. GSAx per 60 is blended over three seasons weighted by shots faced (50% this season, 30% last, 20% the season before, renormalised when a season is missing), then shrunk toward zero for small samples by shots / (shots + 1,500). Eligible goalies (600+ combined shots) are ranked by that score, and each score percentile receives the cap hit at the same percentile of the current goalie pay distribution (goalies with 20+ starts over the last two completed seasons), clamped to the league minimum and 20% of the cap. Goalie pay is hard to predict: it reflects role, team, timing and negotiation, so this is a market benchmark rather than a forecast. Goalies under 600 combined shots are shown as too early to call. The pay distribution currently contains 62 goaltenders with at least 20 starts over the last two seasons. The three-season GSAx blend is 50%/30%/20% by shots faced, with a 1,500-shot shrinkage term; goalies under 600 combined shots are marked too early to call.

Expected goals (xG) and GSAx

The shot model asks a simple question: how likely is this shot to become a goal? It looks at distance and angle to the net, shot type, whether the shot came within three seconds of the same team’s previous shot event (a shot on goal, missed shot or blocked shot) with no faceoff or stoppage in between (a rebound), the strength state from the situation code, and home ice. Only shots on goal and goals count; empty-net shots and shootout attempts are excluded. It is a plain logistic regression trained on the two completed prior seasons, and the coefficients are frozen in the published model data.

Adding up the probability of every shot a goalie faced gives expected goals against (xGA). GSAx is xGA minus the goals he actually allowed: positive means he stopped more than the shot mix predicted. GSAx per 60 divides that by ice time so a backup and a starter can be compared. High-danger shots are shots the model gives an xG of 0.20 or higher; high-danger save percentage is saves on those shots divided by high-danger shots faced.

On 12,996 shots this season, the model’s log loss is 0.313 and AUC is 0.726. League-wide, the model expects 1394.7 goals against 1417 actual goals (98.4% of actual; within the 3% sanity band).

GSAx feeds the goalie performance score, which is blended over three seasons and shrunk for small samples before it is ranked. One partial season is still noisy, so goalie grades carry the Goalie grade: performance-ranked label rather than claiming the same precision as the skater market regression.

Grade

The difference between expected and actual cap hit is a player’s value surplus. Grades are fixed dollar bands on surplus, not percentiles, and apply to every position:

  • A+ — surplus >= +$5M
  • A — +$3M <= surplus < +$5M
  • B — +$1M <= surplus < +$3M
  • C — -$1M < surplus < +$1M
  • D — -$3M < surplus <= -$1M
  • F — surplus <= -$3M

Goalie valuations carry a Goalie grade: performance-ranked label because goalie pay is harder to predict and the performance score is a ranking against the market rather than a regression fit. Goalies are kept out of the default league-wide best-value and worst-contract lists; they appear on the goalie position page, on team pages, and when the position filter is set to G. Entry-level contracts are capped by the CBA, so young stars on ELCs often grade as bargains; the rankings pages let you include or exclude them. A veteran discount label marks a 33-or-older player signed near the league minimum.

Calibration

The acceptance check buckets the training set by predicted cap hit and compares the mean prediction to the mean actual cap hit in each decile. Every decile must land within $750K. The current maximum absolute error is $597K; the check is passing.

Skater calibration by predicted cap-hit decile
Decile n Predicted Actual Diff Within $750K
1 31 $1.3M $1.3M -$26K Yes
2 31 $2.1M $2.2M -$55K Yes
3 31 $2.9M $3.2M -$327K Yes
4 31 $3.4M $3.3M +$148K Yes
5 31 $4M $4.1M -$111K Yes
6 31 $4.1M $4M +$171K Yes
7 31 $5.2M $5.5M -$276K Yes
8 31 $6.2M $6M +$159K Yes
9 31 $7.4M $7.7M -$299K Yes
10 32 $10.2M $9.6M +$597K Yes

Deciles use cap-equivalent dollars: future-start market rows are normalized to the current cap before bucketing. A separate exhibit buckets by actual cap hit; its bottom deciles include voluntary veteran-discount deals and therefore over-predict by design.

Actual cap-hit decile exhibit
Calibration exhibit by actual cap hit
Decile n Predicted Actual
1 31 $2.1M $903K
2 31 $2.2M $1.5M
3 31 $2.9M $2.5M
4 31 $3.7M $3.3M
5 31 $3.5M $3.9M
6 31 $4.6M $4.6M
7 31 $5.7M $5.4M
8 31 $5.6M $6.2M
9 31 $6.9M $7.6M
10 32 $9.6M $10.8M

Sanity check: top producers

The highest-production skaters should look like stars, not minimum-salary bargains. The table below shows the top 20 by blended points per 82. The production check correlates points per 82 with expected cap hit across the top 50 producers: Spearman 0.503 (threshold 0.5; passing).

Top producers sanity table
# Player P/82 TOI/G Cap hit Expected Grade
1 Connor McDavid C 151.2 23.0 $12.5M $16.3M A
2 Nikita Kucherov RW 132.7 20.7 $9.5M $13.8M A
3 Nathan MacKinnon C 130.2 22.0 $12.6M $14.2M B
4 Leon Draisaitl C 129.3 21.6 $14M $14M C
5 David Pastrnak RW 105.5 20.5 $11.3M $13.5M B
6 Kirill Kaprizov LW 104.2 22.1 $17M $14.1M D
7 Macklin Celebrini C 103.3 21.3 $975K $15.4M A+
8 Jack Hughes C 101.6 21.0 $8M $14.2M A+
9 Jack Eichel C 101.4 20.8 $13.5M $12.9M C
10 Evan Bouchard D 100.6 24.7 $10.5M $13.7M A
11 Nick Suzuki C 99.6 20.8 $7.9M $14M A+
12 Matthew Tkachuk LW 99.4 18.5 $9.5M $8.2M D
13 Martin Necas C 98.4 20.6 $11.5M $13.5M B
14 William Nylander RW 96.7 19.6 $11.5M $10M D
15 Mikko Rantanen RW 96.2 20.5 $12M $10.3M D
16 Mark Stone RW 94.3 19.0 $9.5M $8.6M C
17 Jason Robertson LW 93.4 19.6 $12M $10.1M D
18 Clayton Keller RW 93.0 18.9 $7.2M $10.1M B
19 Mark Scheifele C 92.8 21.3 $8.5M $13.4M A
20 Auston Matthews C 92.3 20.7 $13.3M $13.6M C

Model acceptance: predicted-decile error within $750K and production Spearman above 0.5. Overall: passing. The separate goalie direction check passes 6 of 7 cases; Vasilevskiy grades D. The method is not tuned to force those names.

Limitations

  • Defensive defencemen are undervalued: the model prices production (points) and usage (TOI), so shutdown defenders with low point totals and modest ice time are systematically rated below their true market value.
  • Second contracts for young stars price in projected growth, which a production-based model cannot see.
  • Future-start market deals are priced against a projected 2027-28 cap ($113.5M) and normalized to cap share; the projection may change before the league confirms it.
  • The top-block hand-off is a local log-space linear continuation. It keeps the elite tier rising without a flat step, but it is an extrapolation beyond the training data.
  • Only UFA-age signings train the market curve, so the model is a UFA market benchmark rather than a forecast of RFA or entry-level pricing.
  • Grades are fixed dollar bands on surplus, not position percentiles, so they compare absolute surplus across all positions.
  • Goalie grades are performance-ranked against the current goalie pay distribution, not a regression. Goalie pay is hard to predict: contracts reflect role, team, timing and negotiation, so the ranking is a market benchmark rather than a forecast. GSAx also inherits the error of our own xG shot model.

Data and attribution

  • Production and roster data come from the public NHL APIs (api-web.nhle.com and api.nhl.com/stats/rest). These endpoints are unofficial and can change without notice.
  • Shot-level xG data comes from the public play-by-play feed (api-web.nhle.com/v1/gamecenter/{gameId}/play-by-play), cached outside the database. Only per-season goalie aggregates are stored in D1.
  • Contract data comes from the open nhl-contracts dataset (CC0-1.0), as published by its maintainers. Dataset snapshot updated 2026-11-04.
  • data/contracts.csv and data/upcoming-contracts.csv hold hand-checked overrides only.

Grades and model output update nightly. This is an independent project, not affiliated with the NHL or NHLPA.

See the rankings · Browse teams · About the project