NHL Fantasy Hockey Rankings

Your fantasy hockey waiver wire, updated every morning: who's outscoring their draft slot, who's falling short, who's worth a pickup, and the full board of ranked picks.

01

Who's Hot, Who's Not in Fantasy Hockey?

this season vs the board

Ahead of the board

Who is scoring ahead of preseason projections?

PlayerGPPProj P/GPRank
Parker KellyCOL240.37#275
Leo CarlssonANA250.88#61
Evan BouchardEDM381.06#10
Connor McDavidEDM391.56#1
Jack EichelVGK4101.12#15
Artturi LehkonenCOL240.63#158

Waiver wire: who should you pick up?

Ranked outside the formula's top 150 and already scoring.

PlayerGPPProj P/GPRank
Paul CotterVAN460.23#443
Cole PerfettiWPG350.51#200
Owen PowerBUF350.41#239
Vasily PodkolzinEDM350.39#272
Jared McCannSEA450.70#154
Victor OlofssonVGK450.38#310

Buy-low watch

Underperformers: May be available at a discount

Fills in once teams have played five games.

Early days: a few games in, these lists are mostly noise. They settle after about ten games.

02

The Original Draft Board

two projection models

Before the season, we offered two draft lists: a simple math-based formula and a black-box AI trained on historical data. Here are these lists.

Show the exact math

Projected points = projected goals + projected assists, each built the same way (shown for goals; assists identical):

1. weighted rate
     r =  0.70·rate(last yr)
        + 0.20·rate(2 yrs ago)
        + 0.10·rate(3 yrs ago)
     rate = goals ÷ games (per season)

2. regress to the mean
     R =  ( N·r + K·base ) ÷ ( N + K )
     N    = total games over those seasons
     K    = 2 + 0.6·(82 − GP last season)
     base = position median goals/game
            (40+ GP regulars)

3. age factor
     A =  1 + 0.014·(27 − age)   if age ≤ 27
          1 − 0.015·(age − 27)   if age > 27
          (floor 0.82)

4. projected goals = R · A · games
     games = weighted recent GP, max 82
             — counting only seasons in which
             he was already an NHL regular
             (20+ GP, or any season after
             his first 20+ GP season)
             rounded HALF UP: ⌊x + 0.5⌋

rounding of the published columns
     goals and assists are each rounded
     to one decimal, and POINTS IS THEIR
     SUM AS PUBLISHED — the two columns
     on the board always add to the third

Every input is a completed-season box-score number from NHL data — plug a player's last three seasons into the steps above and you'll land on the same number the board shows.

How this treats a rising young player: someone who played a full 82 games gets K ≈ 2, so step 2 barely touches his rate — he's projected close to what he actually did, not dragged toward the league average. And if he's under 27, step 3 nudges him up rather than down. So a young player coming off a career year isn't automatically projected to fall back.
Players who were traded mid-season: the NHL's club-stats feed returns a traded player once per club, each row holding only the games he played there. Those rows are added back into one season before anything is projected — counting stats sum, per-game rates are weighted by games, shooting percentage is recomputed from the merged totals. Nothing is filled in; only what the API returned is merged. Until this was fixed (August 2026) just the last club survived, so Mikko Rantanen's 2024-25 read as 20 games instead of 82, and every traded player was quietly projected low.
Players with no NHL club: the NHL's own player file carries an isActive flag. Anyone it reports as inactive is labelled NO NHL CLUB rather than shown under a team he has left, and he stays on the board at his projected rank — the projection is an honest read of a season he really played, and the label fixes itself the moment he signs. Read the flag literally: it means no current NHL club, which covers retirements, unsigned free agents, players in other leagues and players on minor-league deals alike. We don't guess which.
Why step 4 skips the years before a player arrived: a thin season means two different things — a regular who got hurt, or a prospect who simply wasn't in the league yet. Averaging in a two-game call-up from the year before a player's rookie season used to project a healthy 82-game season forward at 64 games, quietly cutting a fifth off his line. Now only seasons in which he was already an NHL regular count toward his expected games. A veteran's injury-shortened season still counts in full — that's real information about how available he is.
⚠️
What no model here knows. These projections are built from completed-season data only. They do not account for recent events — a training-camp injury, a summer trade, or a change in who a player's linemates will be. It doesn't know if Connor Hellebuyck will play, or if Kirill Marchenko or Dylan Larkin will get traded. Treat every number as a starting point for the argument, not the end of it.
03

The Draft Board

the big board

Every skater in draft-rank order. Filter by position, or sort by goals, assists, or points. The rank is the call we trust most — a player's ordinal slot holds up better than the exact totals, which carry false precision. Treat the goals and assists as the supporting argument, and the tiers as the cliffs where the talent drops off.

Tap G, A or Pts to re-sort · the # column always shows the model's overall draft rank

#PlayerPosTeamGAPts ▾Tier

04

Player vs The League

trajectory & percentiles

Pick a player and see where they rank against everyone at their position — and which way their trend line points. This is how you know whether a name is worth reaching for, or worth waiting on.

The menu lists every skater in the board's order, so you can scan from the top.

League percentiles
Points—th pct
Goals—th pct
Assists—th pct
Faceoff %—th pct

Bars fill once a player is selected — percentiles are computed against everyone who played that position last season.

05

Cheat Sheet & App

take it to the table

Take the board to the table two ways — a spreadsheet you can mark up, or the phone app, which does the crossing-off for you.

↗ Draft live · the phone app The tracker lives in the app now. Tap ✓ to cross a player off as he's taken, ★ to claim him for your team, flip on “hide drafted” for best-available, filter by position and search all 933. It remembers your draft between openings, and it works with no signal.

We used to hand out the tracker as an HTML file. It has been withdrawn, because it did not survive being emailed: iPhone Mail previews an attachment without running its JavaScript, so every button was dead, and Gmail on a desktop shows the file as raw source instead of a page. A spreadsheet travels through email intact, and the app does the live drafting properly.

Model A · The Formula. Take a player's scoring rate over his last three seasons — leaning hardest on the most recent — and pull it toward a normal rate for his position, but only as far as his sample is thin: a full-season player barely budges, a half-season sample gets pulled harder. Then adjust for age — a nudge up if he's young and still climbing, down if he's past his prime. Finally, multiply by the games he's expected to play, counting only the seasons in which he was already an NHL regular: a two-game call-up before a player's rookie year says nothing about how available he'll be, while a veteran's injury year says plenty. It's simple enough to check by hand, and across the last four seasons it beat simply repeating last year's numbers by about —.

Model B · The AI. A machine-learning model that works through years of player history and finds patterns a hand formula would miss. It's tuned so it won't underrate the stars the way a cautious average tends to — the cost is that it can give you a number but can't fully explain how it got there. It also weighs how many games a player has missed in past seasons as a durability signal (that's availability, not medical injury data). Across the last four seasons it beat simply repeating last year's numbers by about —.

What no model here knows. Neither one sees anything that hasn't happened yet — a summer trade, a training-camp injury, a new set of linemates. They only know completed seasons, so treat every number as the start of an argument, not the final word. Source: NHL data.