ŷTrick

An independent NHL analytics site: an in-house expected-goals model, player cards inferred by a generative player model, descriptive stats, and a shift-by-shift view of every game — all built from public NHL data.

What's here

  • Expected Goals Model. An in-house, per-shot model that scores every unblocked shot by its chance of going in, using shot geometry and pre-shot context.
  • Player cards. For each skater, the skills a generative model infers from every shot and shift — playmaking, shooting, scoring, finishing, defense — isolated from linemates, competition, and arena scorekeeping, plus two aggregates: Net Goals Added per 60 (skill vs a replacement-level player on equal footing) and WAR (wins added over his actual season vs a replacement player). Each card shows units and a within-position percentile.
  • Descriptive stats. Box score and individual rates — shot volume and quality, scoring, penalties.
  • Per-player views. Shot maps, a percentile profile, a full game log, and bio.
  • Game inspection. Every game broken into stints — intervals of constant on-ice personnel — with the exact players, strength state, shot events, and an expected-goals tally for each.

The pages

  • Players — a sortable leaderboard; click through to a player's full card.
  • Teams — each team's roster and schedule.
  • Games — every game, newest first; open one for its stint-by-stint timeline.
  • Models — how the models work, with an interactive player lab, plus the expected-goals model's danger map, calibration, and drivers.
  • About — this page.

The models

Expected Goals Model

A gradient-boosted model scores each unblocked shot using its location and pre-shot context — rebound, rush, shot type, and strength and score state, among others.

The Player Model

The player cards come from a generative model: it writes down how a shift produces shots and goals — who shoots, who creates for teammates, who suppresses, how dangerous the shots are, who converts them — and fits one latent skill per player for each of those verbs, jointly across five seasons. Every skill is isolated from linemates, competition, and arena scorekeeping (the model carries explicit terms for each), and each player gets a per-season skill trajectory with a shared aging curve and a next-season projection. Displayed skills always include the player's age — the aging curve is for understanding and projection, never a normalizer. Assists (primary and secondary) anchor playmaking; the model validates against held-out seasons before we publish it.

Net Goals Added /60plugs a player's inferred skills into the model's own production equations and differences against a replacement-level player — an equal-footing skill read on the same zero as WAR. WAR replays his actual season, swapping him for a replacement-level player in every real stint, and converts the goal difference to wins. The full method, formulas, and honest caveats are in docs/metrics.md; the model itself is specified in docs/generative_model.md.

Data & credit

Everything here is built from public NHL data: the play-by-play API, shift charts (with the NHL HTML time-on-ice reports as a fallback), player landing (bios and handedness), and the league schedule and standings. Team logos and player headshots are served from the NHL's asset CDN.

Everything derived — the xG model, the generative player model behind the cards, and the box, on-ice, and individual stats — is computed in-house from those raw feeds.

The ratings and analysis here are free to use. The underlying NHL data remains the NHL's and stays subject to its terms of use, so please respect those when reusing it.

ŷTrick is an independent project and is not affiliated with or endorsed by the National Hockey League.