← research

How I grade every NHL draft pick

What the numbers on my draft page actually mean

July 19, 2026 · Keith Wilcox

There's a draft page on this site that gives every pick since 2000 a score from −1 to +1. Late round guy who turned into a star, that's near +1. Top pick who never played, that's near −1. Zero means the pick gave you what that slot normally gives you.

This is me explaining how that number gets made, because a score nobody can explain isn't worth much. Four pieces:

  1. Turning a career into one number
  2. Figuring out what each draft slot is normally worth
  3. Comparing the two
  4. Handling guys who are still early in their careers

Everything below runs on my own database: every draft pick from 2000 to 2026, and every NHL season those players have played.

Step 1: what's a career worth?

A career is just seasons added up, so I needed a number for one season:

season value = 0.4 × (games played / most games anyone played that season)
             + 0.6 × (points / 90th percentile points at your position that season)

The two denominators are doing the real work.

Using the most games anyone played instead of 82 means the short seasons handle themselves. The 48 game lockout year and the COVID years don't need special treatment.

Using the 90th percentile at your position, that season means a defenseman gets compared to defensemen and 2003 gets compared to 2003. One denominator handles position and era at the same time. Roughly: a first line season is about 1.0, an average NHL season is 0.5 to 0.6, a ten game call-up is 0.05.

Here's one famous season run through it, Daniel Sedin's Art Ross year.

2010-11: max GP = 83, forward p90 points = 62
Sedin: 82 GP, 104 pts
v = 0.4*(82/83) + 0.6*(104/62) = 1.40

So an Art Ross season is worth about 1.4. Full attendance gets you 0.4, and scoring at about 1.7 times the 90th percentile forward gets you the rest.

Stack those up and a career of first line seasons lands around 10 or higher, while a decade as a depth guy lands around 4 to 6. That gap is the point. A star has to clearly beat a guy who played 800 games and didn't score, or the whole scale is useless.

Now the same math on a full career, Jamie Benn's. He went 129th in 2007, so his window is 2007-08 through 2018-19.

 seasonid  k  gamesplayed  points    v
 20092010  3           82      41 0.79
 20102011  4           69      56 0.87
 20112012  5           71      63 0.95
 20122013  6           41      33 0.89
 20132014  7           81      79 1.18
 20142015  8           82      87 1.23
 20152016  9           82      89 1.30
 20162017 10           77      69 1.09
 20172018 11           82      79 1.13
 20182019 12           78      53 0.81

my A = 10.2349
published actual_value = 10.2349
MATCH - you just rebuilt the value metric

Benn comes out at 10.23, which matches what the draft page shows for that pick.

Step 2: what is a draft slot normally worth?

10.23 means nothing until you know what pick 129 usually returns. That's the expected value curve: take every pick at each slot across the finished draft classes, average what they actually produced, smooth it out.

Two choices in there I'd defend if someone asked.

Average, not median. Most picks after about 60 never play an NHL game, so the median outcome back there is exactly zero. Use the median and every late round guy who made it looks like the same perfect steal. The average keeps the lottery ticket value in there, which is what you're actually buying.

picks 61-224 in mature classes: 64% never played an NHL game
median actual value there: 0.0
mean actual value there:   0.68  <- the signal

Simple bins, not fancy smoothing. My first version used a curve fitting method called LOWESS and it broke quietly. With that many zeros in the tail it fit values below zero at the edges, then the "later picks can't be worth more than earlier picks" rule dragged the entire curve down with it. Suddenly pick 100 was worth 0.04 and every late round NHLer scored an identical +0.90.

The fix was boring: average the picks in buckets. Every pick on its own for the top ten, wider buckets as you go later where neighboring picks are basically interchangeable. Averages of numbers that are never negative can't go negative, so that failure can't happen again. Lesson learned. When your data is mostly zeros, boring wins.

Here are the curves.

Chart: Step 2: what is a draft slot normally worth
E(#1)=11.6  E(#31)=2.46  E(#129)=0.61  E(#205)=0.49
trade math: picks 15+22 = 7.8 vs pick 5 alone = 7.1

The cliff is the whole story. The first overall pick is worth about five times pick 31 and fifteen times pick 129.

That last line is what teams actually use a curve like this for. Would you trade picks 15 and 22 for pick 5? By my numbers that's about even, 7.8 against 7.1.

Step 3: the score

score = (actual − expected) / (actual + expected + 1)

Top part is the surplus. Bottom part squeezes it into −1 to +1 and, more importantly, that +1 fixes an edge case. A seventh rounder who never plays has an actual of 0 against an expected of about 0.2, so he scores about −0.17. Barely negative, which is right. You didn't lose much, because that pick wasn't promising much. Without the +1 he'd score −1.00, the same as blowing a top ten pick, which would be ridiculous.

Benn: A=10.23, E(#129)=0.61 -> score = +0.8119
published: +0.8119   <- should match

2000 #205 Henrik Lundqvist   A= 5.97 E= 0.30 -> +0.78
2012 #  1 Nail Yakupov       A= 3.40 E=11.57 -> -0.51
2008 # 11 Kyle Beach         A= 0.00 E= 4.00 -> -0.80
2010 #  1 Taylor Hall        A=10.81 E=11.57 -> -0.03

Read those four rows and you've got the whole scale:

  • Lundqvist, 205th overall: a real career against a slot that expects almost nothing. +0.78.
  • Yakupov, first overall: he actually played 350 NHL games, so he's a disappointment, not a ghost. −0.51.
  • Kyle Beach, 11th overall: never played. −0.80.
  • Taylor Hall, first overall: he produced about exactly what a first overall pick produces. −0.03. Fair value, not a steal.

That difference between "never showed up" and "showed up smaller than you hoped" is on purpose. They're not the same mistake.

Step 4: guys who aren't done yet

You can't hold a 2023 pick to a twelve year standard, so there's a separate curve for every stage of a career: what a slot has produced by year one, by year two, and so on. A pick three years in only gets compared to what his slot had produced by year three. Every summer I rerun it and everybody moves up a year.

This is also where something I'd always believed shows up in the data. Wingers arrive first, defensemen take longer, goalies take longest. I never coded that in anywhere. The curves learned it on their own, because they're fit separately by position and by year.

Chart: Step 4: guys who aren't done yet
Bedard: A=2.82 vs E(#1 F, thru yr 3)=2.68 -> +0.02 (provisional)

Forwards climb first, defensemen lag a couple of years, goalies crawl.

And Bedard sits at about zero against his year three bar, which is what you'd expect from a first overall pick who's tracking like a first overall pick. That number will move every summer as his career and his benchmark grow together.

What this doesn't capture

  • Points aren't everything. A shutdown defenseman's value barely shows up here. Comparing guys to their own position helps, but it doesn't fix it. A WAR style number would.
  • My goalie number is crude: starts, wins, and a save percentage bonus. Fine for draft accounting, not a goalie evaluation.
  • The curve is one average across 2000 to 2014. Drafting has gotten better since, so late picks today are probably worth a bit more than the curve says.
  • No credit for development. If a team turns a fourth rounder into a player, the score gives the pick credit, not the organization. Those are different skills and I'd like to separate them eventually.
Built from the notebook 02_draft_value_explained.ipynb. The models behind it live on this site: shot maps and expected goals on player pages, draft value on the draft tab.
i watch the games

© 2026 i watch the games. All rights reserved.

ThreadsInstagramTwitter