The next 10-30 seconds.
Do they actually exist in the numbers or is this simply a phenomenon that we as hockey fans have collectively constructed in our heads?
Anyone who has watched enough hockey knows that there are moments that you just have to stand up for. These sweat-inducing, high-stakes moments where the next 10-30 seconds feels like the difference between getting ahead or falling behind are an essential part of the game.
Do they actually exist in the numbers or is this simply a phenomenon that we as hockey fans have collectively constructed in our heads?
Momentum = the probability your team records a shot attempt in the next 30 seconds.
To answer this question, I built a pipeline that analyzes NHL play-by-play + boxscore + shift charts across completed games.
This report documents an end-to-end hockey analytics pipeline that constructs “momentum windows” from play-by-play events, trains predictive models for near-future shot generation, estimates causal effects of interpretable in-window patterns, and quantifies team-level faceoff “set-play” performance and prevention.
Data were collected via community-documented NHL endpoints, primarily under two base domains: api-web.nhle.com for schedule/score and gamecenter data, and api.nhle.com/stats/rest for shift charts.
score · gamecenter · shiftchartsEach event is assigned a game_time_sec defined as seconds from game start. Team attribution uses event owner fields when present, otherwise a player ID mapped to team via shift charts.
game_time_secFeature window: 30 seconds of “what just happened.” Outcome window: the next 30 seconds. Updated every 5 seconds.
[t, t+30) → [t+30, t+60)A shot attempt is defined as any of the event types shot-on-goal, missed-shot, blocked-shot, or goal.
shot · miss · block · goalAll raw API responses were cached to disk as JSON to make the pipeline restartable and to avoid repeated API calls. Processed tables were stored as Parquet for speed.
To do that, I broke the games into overlapping windows: 30 seconds of “what just happened,” the next 30 seconds, updated every 5 seconds.
The design is motivated by recent work that combines micro-event weighting, sequence modeling, and causal estimation, but is implemented using only publicly accessible NHL endpoints.
I emphasized methodological clarity, reproducibility, and logical validity for a hockey-analytics audience.
Coaches often care about “set plays” off faceoffs: immediate, designed actions that lead to shots. I therefore define a direct, clip-friendly KPI.
OZ For Rate asks whether the same team records a shot attempt in the 10 seconds after an offensive-zone faceoff. DZ Against Rate asks whether the opponent records one after a defensive-zone faceoff.
For each offensive-zone faceoff, define success as a shot attempt by the same team in the next 10 seconds.
SOZ = 1{∃ shot attempt in [tf, tf + 10]}For each defensive-zone faceoff a team takes, define conceded success as an opponent shot attempt in the next 10 seconds.
SDZ, against = 1{∃ opponent shot}Set-Play Index = OZ For Rate − DZ Against Rate. It contrasts creation vs prevention using a common time horizon.
How well do you cash in, and prevent the opponent from cashing in right back?| TEAM | OZ DRAWS | WIN RATE | OWN SHOT ≤10s | OPP SHOT ≤10s | ELIGIBLE |
|---|
A momentum signal at fine temporal resolution: a predictive model for short-horizon offense, or the probability of a shot attempt in the next 30 seconds.
This defines the predictive target: near-future shot probability. By shifting the label to the next 30 seconds, the model predicts future offense from current micro-events rather than re-describing the same window.
Regular-season rolling folds and the playoff transport holdout are reported separately.
Within a 30-second feature window, these estimates ask what is the causal effect of a treatment on the probability that the team records at least one shot attempt in the next 30 seconds.
An offensive-zone faceoff increased near-future shot probability by 10.65 percentage points.
A defensive-zone faceoff reduced near-future shot probability by 5.18 percentage points.
A giveaway in the final five seconds of the feature window reduced near-future shot probability by 6.07 percentage points.
Everything in this analysis is built using public NHL play-by-play, boxscore, and shift chart data because that is what I have access to. Public data tells you what happened and when. Team-level data tell you how, why, and whether it was repeatable.
Two offensive-zone faceoffs can look identical in public data. One could be a scripted set play that creates a clean shot; another could be a broken play salvaged by individual skill. The difference between just saying that a team is good after OZ draws and actually knowing why is substantial.
A low-danger point shot through traffic and a one-timer off a cross-ice pass both count as shot attempts. Without shot location, pre-shot movement, defensive pressure, and goalie positioning, the model measures shot generation, not shot quality.
A D-to-D pass intercepted at the blue line, a middle-lane feed picked off, and a bobbled puck under pressure can all be coded as the same event type. Tracking data would tell us whether the turnover came from pressure, poor spacing, or a bad decision.
There is no puck tracking, player coordinates, shot quality, or manpower context. Windows overlap, team attribution can require inference from shift charts, and causal estimates depend on consistency, positivity, and no unmeasured confounding conditional on the chosen covariates.
Team-level data could separate designed execution from improvised recovery, and shot quantity from shot danger.
Winger depth, weak-side defense positioning, center stick orientation, and pre-draw alignment.
Shot location, shot type, pre-shot movement, defensive pressure, and goalie positioning.
Pressure-induced errors, outlet availability, defensive gap control, and opponent posture.
The methodology and interpretation on this site draw directly from the December 27, 2025 white paper and the Faceoff Moment Economy post, with minor edits for page layout and grammar.