This site publishes output from an NHL player projection model that lives in a Google Sheet. Everything below describes how a number gets made, so you can judge how much weight it deserves.
Every value on this site
| Term | What it means |
|---|---|
| SOG | Projected shots on goal for the game. |
| G | Projected goals. On the Slate page, the sum across every skater on that team. |
| A | Projected assists. |
| Pts | Projected goals plus assists. |
| BLK | Projected blocked shots. |
| PIM | Projected penalty minutes. |
| Line | Even-strength forward line or defence pair from the posted lineup. |
| PP | Power-play unit from the posted lineup. Unit 1 versus unit 2 is the single biggest driver of projected points for most forwards. |
| Gap | Difference between the two teams' projected skater goals. Not a spread — see the caveat about empty-net and shootout scoring on the Slate page. |
| Opp CA/60 | Shot attempts the opponent allows per 60 minutes at five-on-five. Higher means they give up more volume. |
| Opp HDCA/60 | High-danger chances against per 60, five-on-five. |
| Opp SV% | The opposing starter's save percentage over the full-season window. |
| Shot adj | Multiplier applied to shot volume based on the opponent's chances-against rate versus league average. 1.00 is a neutral matchup. |
| Goalie adj | Multiplier applied to goals based on the opposing starter's save percentage versus league average. |
| Proj | On the Market page, the model's expected count for that stat — the mean of the distribution, not a probability. |
| Win% | Model probability that side wins, from the count distribution around Proj. |
| Mkt% | Probability implied by the price after removing the vig across both sides. |
| EV% | Expected profit per unit staked if the model's probability were correct. It frequently is not. |
| Bias | On the Tracking page, projected minus actual averaged across graded player-games. Positive means the model runs high on that stat. |
| MAE | Mean absolute error — average size of the miss, ignoring direction. |
Where the numbers come from
Three sources feed the model. Daily Faceoff supplies the posted lineup: which line a skater is on, which power-play unit, which penalty -kill unit. Natural Stat Trick supplies the per-player rate data at each strength state, pulled through their API under a rate limit and cached locally so a repeat run costs nothing. The NHL schedule supplies opponents and home/away.
Player identity is matched between Daily Faceoff and Natural Stat Trick by name, with anything ambiguous pushed to a manual review tab rather than guessed. A skater whose ID has not been resolved is simply absent from these pages; he is not silently projected at zero.
The three windows
Every stat is computed three ways. FS is the full prior season. L20 is the player's last twenty games, L10 his last ten. Short windows respond to a line promotion or a role change quickly and are noisy; the full season is stable and stale. This site is currently built on the FS window, and the Players page lets you compare all three for any skater.
Early in a season the windows bridge from the prior season's data to the current one, one at a time, as enough games accumulate to make each window meaningful. Until a window is flipped over, it is describing last season.
How a projection is built
For each skater the model projects even-strength, power-play and penalty-kill ice time from his line and unit assignment, then multiplies each by his per-minute rate for that stat at that strength state. Rates are computed as a season or window total divided by games played and then by time on ice per game, which is the step that turns a twenty-game shot total into a per-game expectation.
Goals use a blended finishing rate rather than a raw shooting percentage: a player's own conversion on high-danger chances, pulled toward a league baseline when his sample is thin. Power-play assists come from projected power-play shot volume times a league assist-per-shot constant, which is the crudest step in the whole model and the first place to look when a power-play-heavy forward's assist number looks wrong.
Matchup adjustment
Three multipliers sit on top of the raw projection. A shot-volume adjustment scales attempts by how many the opponent allows relative to league average. A goalie adjustment scales goals by the opposing starter's save percentage relative to league average. A power-play adjustment scales power-play output by the opponent's penalty kill, weighted by how much of that player's ice time is actually on the power play. All three are ratios against a league mean, so 1.00 means a neutral matchup and the adjustment does nothing.
Props and EV
The Market page compares the model to posted player props from a single book. Counting stats are not normally distributed, so the probabilities come from count distributions instead: a negative binomial for shots, assists and blocks, which are more variable than a Poisson would allow; a Poisson for points; and the Poisson zero for anytime goalscorer. The dispersion parameters are informed guesses, not values fitted to data. Once the tracking table holds a few hundred graded player-games they should be re-estimated from the model's own residuals, and until that happens the probabilities on the Market page are softer than they look.
With one book there is no line shopping and no consensus to anchor to. A large EV% is a disagreement between this model and BetOnline, and prop markets are soft enough that it is occasionally the book — but the base rate strongly favours the explanation that the model is wrong about that player.
How tracking stays honest
The Google Sheet is a live worksheet: every run overwrites the previous day's numbers. That makes it useless as a record. So each time this exporter runs it copies the slate into a local table keyed on date, player, window and stat, inserting only if that key is not already present. The first projection written for a game is the one that gets graded, and it is never revised. Results come from the NHL's own box scores and are matched to projections by name, independent of the projection itself.
Known limitations
- Penalty-kill shooting is hard-coded to zero. Shorthanded goals and shots exist and this model will never project one.
- Power-play assists use a single league-wide assist-per-shot constant, not a player-specific one.
- Team goals on the Slate page are a sum of skater projections, so they exclude empty-net goals and shootout deciders and read low against real finals.
- A skater with no prior-season data falls back to his recent-window ice time as a proxy, which is generous to rookies who have been promoted.
- Lineups are the posted ones. A late scratch, a goalie change after warmups, or an in-game injury is not reflected.
- No travel, rest, back-to-back, altitude, or referee effects.
- Opponent quality enters only through three multipliers. There is no line-versus-line matchup modelling, so a shutdown pair drawing a top line is invisible.