Every projection on the fantasy page is a number the model produced, and every model is wrong by some amount. This post says how the number is built, then measures the wrongness by category: how far the projection missed last season, and whether it missed by less than writing down what the player did the season before. Everything below comes from the projection run of 2026-09-21 (735 skaters and 97 goalies with enough NHL history to project) and the backtest table it wrote, which scores the method on the 2023-24, 2024-25 and 2025-26 seasons.
How to read this
The backtest holds out a season, projects it from the seasons before, and compares with what happened for players who played 20 or more games. MAE is the mean absolute error on the season total — a points MAE of 9.5 means the typical player's actual total sat about 9.5 points from the projection, either way. Spearman is the rank correlation between projected and actual order, 0 to 1 — the draft-board question, whether the order is right even when the totals are off. Both sit next to the naive baseline: last season's total carried forward unchanged. If the model can't beat that, the method isn't adding anything.
The method
The projection is a per-game rate, adjusted, then multiplied by games. The site shows it two ways: full season (rate × 84 games — the first season at 84, and every total on the page uses that, not 82) and expected (rate × injury-adjusted games). Five steps produce the rate.
1. Three seasons, weighted 6/3/1. The most recent season counts six, the one before it three, the one before that one; the weights were chosen by holdout testing against alternatives. 599 of the 735 projected skaters have all three seasons in the window, 88 have two, 48 have one.
2. Regression by category. Each rate is pulled toward the population by an amount set per category from how repeatable that category measures year to year in our data, and by how many games the rate is built on — a rate from twenty games is pulled much harder than one from two hundred. A category that repeats well is barely touched; one that doesn't is pulled toward the middle. Players with fewer than 20 NHL games in the window (143 skaters in this run) are marked thin_history and kept off the board rather than projected from a handful of games.
3. Age curve. A multiplier by age, applied separately to goals (g_age) and assists (a_age). This is what the run applied, averaged by age bucket:
Concretely: Macklin Celebrini, 20, gets 1.16 on goals and 1.05 on assists; Nikita Kucherov, 33, gets 0.93 on goals and 0.93 on assists.
4. Ice time. The rate is scaled by projected minutes against historical minutes (toi_min vs toi_hist). Before camp the two are close: the average absolute change is 0.51 minutes, and 154 of 735 skaters move by 0.8 minutes or more. When camp lines are synced and the projection rebuilt, line-based ice time replaces this.
5. Team environment and schedule. Each player carries an env_ratio, the model's read of how much the team he'll play for helps or hurts his rate against the environment his history came from. Team averages run from 0.95 (NSH) to 1.06 (COL), so for a player who stays put the effect is small. The extremes belong almost entirely to the 187 skaters who changed teams: Nazem Kadri to COL carries 1.31, Bowen Byram to CHI 0.79. Strength of schedule (sos_factor) is stored too, but in September runs from .993 to 1.000 — it is not moving anyone.
Goalies are a different model: start share normalized within each tandem, save percentage regressed toward the league (projected save percentages span .878 to .914), and wins from the team's expected win rate (.340 to .678 in the run) applied to those starts.
The backtest: skaters, 2025-26
672 skaters with 20+ games. Model first, naive baseline second; lower MAE and higher Spearman are better.
The model beats carry-forward in every skater category on both measures, widest on shots (3.3 fewer per player), hits and blocks; power-play points is the closest race. Two categories the table also scores belong in the honesty column: plus/minus, where the model's Spearman is 0.24 and the naive line's 0.29 — neither is projecting it, treat that column as noise; and games played, where the model's MAE is 12.1 games against 15.9 naive. That is why the page defaults to full-season totals: the injury-adjusted mode is calibrated, but a 12-game typical miss is most of the difference between the two views.
One season earlier, 2024-25 (669 skaters): points 9.4 vs 10.9, goals 4.3 vs 5.0, shots 27.4 vs 33.0, hits 26.9 vs 30.8, blocks 15.6 vs 19.0. And 2023-24 (688 skaters): points 9.8 vs 11.4, shots 29.8 vs 34.9. Same shape three seasons running, which is what makes the 2025-26 row believable rather than lucky.
The backtest: goalies, where it loses
65 goalies with 20+ games in 2025-26. Goals-against average is on the page but not backtested as its own line, so goals against stands in for it.
Say it plainly: the goalie model is not much better than writing down last season. Wins are the one clean win, a 1.0-game edge (7.0 vs 8.0) with a rank correlation of 0.42, against 0.79 for skater points. On starts and saves the naive line ranks goalies better than the model, even though the model's totals are slightly closer. Save percentage is the worst line on the page: an MAE of .013 is the gap between a .905 and a .918 season, and a Spearman of 0.08 means the projected order carries almost no information about the actual order.
Not a one-season fluke. In 2024-25 (62 goalies) the model lost outright to carry-forward on starts (11.0 vs 10.7), saves (286 vs 278), goals against (30.6 vs 27.8), winning only wins (6.8 vs 7.4) and save percentage (.011 vs .014). In 2023-24 (70 goalies) it lost on wins (7.0 vs 6.7) and won the rest. Across three seasons the model can say something about a goalie's quality (save percentage MAE is better every year) and almost nothing about his volume (starts), and volume is the fantasy number. Tandems are decided by coaches in October, not by three seasons of history in September.
What is not in this
The backtest scores players who reached 20 games, so it says nothing about the model's biggest practical miss: the player projected for 70 games who played 30. Rookies and returnees with no NHL history (270 rostered skaters, 44 goalies in this run) get no projection rather than a guess, and thin histories get a flag, not a number. Nothing here uses camp lines, power-play units, roster percentages or ADP — the first two arrive with the camp rebuild, the last two are not in our data. And the projection does not use expected goals: the rates are box-score rates, regressed. Shooting luck gets its own post.
When 2026-27 is over, this post gets a sequel with the same tables and a new row. Until then the fantasy page shows this backtest under "How accurate is this?", and each player's projection page shows the factors from steps 3 to 5 that moved his number.
