Blog

Backtest report

We dug through old ESPN and Yahoo rankings. The model held up.

Eight preseason ranking boards, 1,438 player comparisons, and one very useful trip through the Wayback Machine.

July 17, 2026· Ball Ranks
Final rollup
1,438
players compared
7 of 8
matchups won
7.81%
weighted error reduced

Rookies excluded. A heavy portion of a rookie ranking is manual scouting analysis, which our live model applies but a backtest cannot run in a hindsight-free way. Every player compared here has at least one prior NBA season.

The method

Same players, same season, no victory lap math.

The version of our projection engine tested here is Model Zero, our published baseline. Every future improvement gets measured against it, and when one earns its keep we ship Model 0.1 and show you what moved.

We only used ranking boards that looked like standard category or head-to-head category fantasy basketball. Points leagues and salary boards stayed outside, where they belong.

For each source, we matched player names to our database, kept only players who actually reached the 20-game scoring floor and had at least one prior NBA season, and re-ranked everybody inside that same pool.

The main score is weighted rank miss. The best actual finisher in each shared pool counts 2x, and that weight declines smoothly to 1x for the last player. Missing a top-10 guy still hurts more than missing the 298th guy, without arbitrary cliffs between ranks 20 and 21.

We also treated the source boards as preseason artifacts, not living documents. ESPN was mostly recovered from archived pages. Yahoo was trickier: the public platform pre-rank pages we found were in-season or postseason, so the clean Yahoo candidates came from Yahoo Sports article pages that embedded Dan Titus category rankings. Not perfect. Better than pretending a December snapshot was a draft board, which would be analytics malpractice wearing a fake mustache.

How much we beat each board by

Positive bars mean Model Zero had the smaller weighted rank miss. Negative bars mean the archived board was closer.

The scoring pool

Every comparison got its own fair little sandbox.

ESPN might rank 150 or 200 players. Yahoo might have 199 or 277. Those are not naturally comparable shapes, so we made a shared pool for each source-year.

First-year players are left out of this comparison entirely, on both sides. A heavy portion of a rookie ranking is manual scouting analysis, which our live model applies but a backtest cannot reproduce honestly — writing those judgements for a past season would mean using the benefit of hindsight. Every player here has at least one prior NBA season.

The held-out 2024-25 season is included only in the expanded companion file used for this article. The original competition residual file stays untouched, because moving the goalposts after the game is frowned upon by most adults and several fantasy commissioners.

Weighted miss, side by side

Orange is Model Zero. Teal is the archived ESPN/Yahoo board. Lower is better, because this is fantasy basketball and pain should be smaller.

Ball RanksESPN/Yahoo
11.89%

Error reduced vs ESPN

Across 5 ESPN boards, our weighted miss was 23.188 ranks. ESPN sat at 26.317.

3.92%

Error reduced vs Yahoo

Our weighted miss was 31.647, against 32.94 for Yahoo. Model Zero was closer overall.

1,438

Joined player rows

This is not one cherry-picked season. It is 8 source-year comparisons after name matching, applying the same 20-game floor, and re-ranking inside the same pool.

A few receipts

Sometimes Model Zero walked in with the answer key.

These are not cherry-picked from our whole database. They are examples from the same joined ESPN/Yahoo comparison rows used above. A perfect call here means our projected rank and the player's actual finish landed in the same slot inside that source's surviving comparison pool.

PlayerSeasonCall
Nikola Jokic2021-22shared-pool actual #1, projected #1
Karl-Anthony Towns2021-22shared-pool actual #7, projected #7
Jimmy Butler2021-22shared-pool actual #13, projected #13
Pascal Siakam2021-22shared-pool actual #38, projected #38
Lou Williams2021-22shared-pool actual #176, projected #176

Also, pain

And sometimes Model Zero needed a timeout.

The misses have a theme: role changes, defensive category spikes, and young-player leaps. Translation: Model Zero is pretty good at measuring yesterday and projecting tomorrow, but the NBA still enjoys throwing a chair through the window.

Christian Braun

2024-25

shared-pool finish #54, projected #227. We would like to thank them for their service and apologize to anyone who drafted responsibly.

Jalen Johnson

2023-24

shared-pool finish #51, projected #203. We would like to thank them for their service and apologize to anyone who drafted responsibly.

Markelle Fultz

2023-24

shared-pool finish #215, projected #68. We would like to thank them for their service and apologize to anyone who drafted responsibly.

Vince Williams Jr.

2024-25

shared-pool finish #234, projected #87. We would like to thank them for their service and apologize to anyone who drafted responsibly.

So what did we learn?

Model Zero is not magic. It still whiffs on role explosions, defensive-stat jumps, and the occasional player who wakes up one morning as a category monster. But against real archived boards from ESPN and Yahoo, it reduced weighted rank error overall. That is the point: not vibes, not brand names, not a confident paragraph written in September. Tested predictions.

SourceSeasonPlayersError reduced by
ESPN2021-22182+2.83
ESPN2022-23188+0.89
ESPN2023-24143+1.04
Yahoo2023-24244+2.74
ESPN2024-25140+6.98
Yahoo2024-25233+1.51
ESPN2025-26131+4.85
Yahoo2025-26177-0.98

The receipts drawer

Every ranked player from every source-year.

Pick a board below. The first rank is the ESPN/Yahoo preseason rank, the second is our preseason projected rank, and the third is where the player actually finished. Orange rows mean our projected rank was closer inside the shared comparison pool. Teal rows mean the source beat us. Gray means everybody gets to be equally smug.

89
we were closer
91
ESPN closer
2
ties

ESPN 2021-22

Sorted by the original ESPN preseason rank. Miss columns use the same re-ranked 20-game pool as the benchmark.

Ball RanksESPN
#PlayerESPN projectedOur projectedActual finishESPN missOur missCloser call
1Nikola Jokic#10#10#100Tie
2Stephen Curry#2-4#3-3#643Ball Ranks closer
3Luka Doncic#3-24#22-5#27245Ball Ranks closer
4Damian Lillard#4-42#8-38#464137Ball Ranks closer
5Giannis Antetokounmpo#5-3#12+4#834Source closer
6Karl-Anthony Towns#6-1#70#710Ball Ranks closer
7James Harden#7-3#2-8#1038Source closer
8Kevin Durant#8+6#9+7#267Source closer
9Anthony Davis#90#4-5#905Source closer
10LeBron James#10+6#57+53#4653Source closer
11Nikola Vucevic#11-20#15-16#312016Ball Ranks closer
12Jayson Tatum#12-3#11-4#1534Source closer
13Bradley Beal#13-52#10-55#654952Source closer
14Bam Adebayo#14-22#16-20#362220Ball Ranks closer
15Joel Embiid#15+12#5+2#3122Ball Ranks closer
16Kyrie Irving#16+11#6+1#5111Ball Ranks closer
17Julius Randle#18-117#46-89#1359869Ball Ranks closer
18Zach LaVine#19-25#24-20#442519Ball Ranks closer
19Devin Booker#200#29+9#2019Source closer
20Russell Westbrook#21-200#71-150#22113281Ball Ranks closer
21Rudy Gobert#22+4#35+17#18317Source closer
22Paul George#23+1#14-8#2208Source closer
23Chris Paul#24+5#40+21#19421Source closer
24Trae Young#25+14#18+7#11137Ball Ranks closer
25Jimmy Butler#26+13#130#13120Ball Ranks closer
26Khris Middleton#27-13#42+2#40142Ball Ranks closer
27Brandon Ingram#29-34#23-40#633337Source closer
28Deandre Ayton#30-12#21-21#421421Source closer
29Clint Capela#31-37#25-43#683640Source closer
30Domantas Sabonis#32-9#32-9#41119Ball Ranks closer
31Tobias Harris#33-24#27-30#572428Source closer
32Fred VanVleet#35+12#26+3#2393Ball Ranks closer
33Jrue Holiday#36+2#39+5#3415Source closer
34Ja Morant#37-8#110+65#451061Source closer
35Jonas Valanciunas#38-1#49+10#39410Source closer
36Donovan Mitchell#39+13#41+15#261015Source closer
37LaMelo Ball#40+16#34+10#241310Ball Ranks closer
38DeMar DeRozan#41+24#36+19#172119Ball Ranks closer
39Myles Turner#43+22#20-1#21181Ball Ranks closer
40Christian Wood#44-39#61-22#833615Ball Ranks closer
41Jaylen Brown#45-17#620#62183Ball Ranks closer
42De'Aaron Fox#46-40#33-53#863746Source closer
43Malcolm Brogdon#47-6#45-8#5386Ball Ranks closer
44CJ McCollum#48-8#58+2#56104Ball Ranks closer
45Kristaps Porzingis#49+33#17+1#16291Ball Ranks closer
46Shai Gilgeous-Alexander#51+21#28-2#30162Ball Ranks closer
47Norman Powell#52-20#60-12#72207Ball Ranks closer
48Andre Drummond#53-104#83-74#1578046Ball Ranks closer
49Mikal Bridges#540#44-10#5438Source closer
50Robert Covington#55+3#63+11#52013Source closer
51Kemba Walker#56-132#54-134#1888986Ball Ranks closer
52Anthony Edwards#57+9#79+31#48531Source closer
53Kyle Lowry#58-2#65+5#6057Source closer
54Tyrese Haliburton#59+34#43+18#252918Ball Ranks closer
55Terry Rozier#60+27#59+26#332226Source closer
56Gordon Hayward#61-10#69-2#71103Ball Ranks closer
57Jaren Jackson Jr.#62+25#50+13#372013Ball Ranks closer
58John Collins#63+14#19-30#491029Source closer
59Mike Conley#64-15#77-2#79143Ball Ranks closer
60RJ Barrett#65-205#144-126#27010533Ball Ranks closer
61Dejounte Murray#66+54#52+40#124940Ball Ranks closer
62Jerami Grant#67+8#66+7#5959Source closer
63Buddy Hield#68-41#68-41#1093126Ball Ranks closer
64Jarrett Allen#69+41#55+27#283627Ball Ranks closer
65Richaun Holmes#70-38#31-77#1082862Source closer
66Lonzo Ball#71+42#51+22#293722Ball Ranks closer
67Miles Bridges#72+40#82+50#323549Source closer
68PJ Washington#73-25#75-23#981812Ball Ranks closer
69Andrew Wiggins#74-59#95-38#1334523Ball Ranks closer
70Klay Thompson#75+11#72+8#64911Source closer
71Bogdan Bogdanovic#76-2#64-14#7818Source closer
72Chris Boucher#77-65#47-95#1424873Source closer
73D'Angelo Russell#79+6#78+5#7359Source closer
74Draymond Green#810#70-11#8104Source closer
75Jordan Clarkson#82-76#141-17#158541Ball Ranks closer
76Jusuf Nurkic#83-16#81-18#99117Ball Ranks closer
77OG Anunoby#84+26#48-10#58218Ball Ranks closer
78Pascal Siakam#85+47#380#38400Ball Ranks closer
79Rui Hachimura#87-152#122-117#2397842Ball Ranks closer
80Darius Garland#88+53#104+69#354564Source closer
81Robert Williams III#90+76#30+16#146716Ball Ranks closer
82Jakob Poeltl#91+25#90+24#661924Source closer
83Coby White#92-82#109-65#1745231Ball Ranks closer
84Kevin Porter Jr.#93-89#153-29#182531Ball Ranks closer
85Dennis Schroder#94-92#103-83#1865441Ball Ranks closer
86Steven Adams#95-74#134-35#169478Ball Ranks closer
87Eric Bledsoe#96-95#177-14#191556Ball Ranks closer
88Lauri Markkanen#97+20#100+23#771724Source closer
89Caris LeVert#98-49#76-71#1473347Source closer
90Ricky Rubio#99-30#130+1#1292111Ball Ranks closer
91Bobby Portis#100+33#118+51#672747Source closer
92Joe Ingles#101-162#127-136#2637042Ball Ranks closer
93Danilo Gallinari#103-47#116-34#1503114Ball Ranks closer
94Harrison Barnes#104+17#102+15#871417Source closer
95Marcus Smart#105+23#67-15#82208Ball Ranks closer
96Bojan Bogdanovic#106-25#167+36#1311632Source closer
97Moses Brown#107-297#139-265#4048452Ball Ranks closer
98Devonte' Graham#109-70#121-58#1793822Ball Ranks closer
99Kyle Kuzma#110+14#175+79#961563Source closer
100Thaddeus Young#111-165#132-144#2766845Ball Ranks closer
101Wendell Carter Jr.#112+36#97+21#763123Ball Ranks closer
102Cole Anthony#113-13#196+70#126746Source closer
103Saddiq Bey#114+8#112+6#1061215Source closer
104Mason Plumlee#115-153#136-132#2685936Ball Ranks closer
105Kyle Anderson#116-55#74-97#1712961Source closer
106Derrick Rose#117-10#128+1#127411Source closer
107Malik Beasley#118-78#105-91#1963946Source closer
108Kelly Olynyk#119-75#86-108#1943659Source closer
109Mitchell Robinson#120+36#37-47#843240Source closer
110Kelly Oubre Jr.#121-27#94-54#1481333Source closer
111Gary Trent Jr.#122+72#101+51#506247Ball Ranks closer
112Jae'Sean Tate#124-40#96-68#1641939Source closer
113Josh Richardson#125-28#107-46#1531324Source closer
114Montrezl Harrell#127-11#106-32#138316Source closer
115T.J. McConnell#128-9#115-22#13717Source closer
116Marvin Bagley III#129-93#193-29#222371Ball Ranks closer
117Daniel Gafford#132+25#164+57#1072550Source closer
118Dillon Brooks#133+11#146+24#1221227Source closer
119Evan Fournier#134-20#80-74#154848Source closer
120Donte DiVincenzo#135-79#114-100#2143042Source closer
121Kevin Huerter#136-5#91-50#141231Source closer
122Obi Toppin#137-105#347+105#2423624Ball Ranks closer
123Keldon Johnson#138+36#113+11#1023317Ball Ranks closer
124Isaiah Stewart#139-12#89-62#151139Source closer
125Al Horford#140+93#124+77#477971Ball Ranks closer
126Doug McDermott#141-112#215-38#253334Ball Ranks closer
127Will Barton#142+30#160+48#1123042Source closer
128Elfrid Payton#143-286#270-159#429549Ball Ranks closer
129Delon Wright#144-60#92-112#2041858Source closer
130Grayson Allen#145+5#188+48#1401234Source closer
131Kevin Love#146+29#135+18#1173025Ball Ranks closer
132Lou Williams#147-205#298-54#352440Ball Ranks closer
133Jalen Brunson#148+57#172+81#915062Source closer
134Spencer Dinwiddie#149-11#154-6#16047Source closer
135Nicolas Batum#150+34#120+4#1163513Ball Ranks closer
136James Johnson#151-166#307-10#317376Ball Ranks closer
137Aaron Gordon#152+32#174+54#1203342Source closer
138Immanuel Quickley#153-40#185-8#19358Source closer
139Alec Burks#154+31#147+24#1233227Ball Ranks closer
140Terrence Ross#155-153#119-189#3083260Source closer
141Darius Bazley#156-10#219+53#166933Source closer
142Brandon Clarke#157+56#85-16#101535Ball Ranks closer
143Jarred Vanderbilt#158+37#158+37#1213833Ball Ranks closer
144Thomas Bryant#161-64#53-172#22510101Source closer
145Aleksej Pokusevski#162-97#306+47#2591617Source closer
146Josh Jackson#163-196#204-155#3593219Ball Ranks closer
147Talen Horton-Tucker#164-46#181-29#21011Tie
148Hamidou Diallo#165-52#259+42#217319Source closer
149Killian Hayes#166-60#318+92#226625Source closer
150Isaiah Hartenstein#167+35#299+167#1323764Source closer
151De'Andre Hunter#168-63#125-106#231538Source closer
152Luguentz Dort#169+45#202+78#1244450Source closer
153Bruce Brown#170+51#199+80#1195054Source closer
154Landry Shamet#171-127#258-40#298172Ball Ranks closer
155Monte Morris#172+61#163+52#1115945Ball Ranks closer
156Reggie Jackson#173-17#211+21#1901521Source closer
157Goran Dragic#174-95#284+15#269711Source closer
158Davis Bertans#175-168#123-220#3431759Source closer
159Tyrese Maxey#176+121#268+213#55106119Source closer
160Derrick White#177+102#84+9#759114Ball Ranks closer
161Nickeil Alexander-Walker#178-110#190-98#288917Source closer
162Tomas Satoransky#179-178#217-140#3571513Ball Ranks closer
163Carmelo Anthony#180+80#247+147#1007580Source closer
164Blake Griffin#181-105#205-81#28659Source closer
165Shake Milton#182-89#197-74#271110Source closer
166Cody Zeller#183-149#182-150#332824Source closer
167Dwight Howard#184-73#328+71#257721Source closer
168Chuma Okeke#185+71#126+12#1146920Ball Ranks closer
169Otto Porter Jr.#186+76#143+33#1107436Ball Ranks closer
170Malik Monk#187+69#236+118#1186864Ball Ranks closer
171Serge Ibaka#188-85#133-140#273443Source closer
172Tim Hardaway Jr.#189+6#162-21#183342Ball Ranks closer
173Ivica Zubac#190+77#99-14#113754Ball Ranks closer
174Dorian Finney-Smith#191+94#137+40#978943Ball Ranks closer
175Malachi Flynn#193-181#244-130#374412Source closer
176Tyler Herro#194+109#108+23#859825Ball Ranks closer
177Kira Lewis Jr.#195-200#274-121#39536Source closer
178Nerlens Noel#196+52#56-88#1445765Source closer
179Seth Curry#197+108#165+76#899761Ball Ranks closer
180Eric Gordon#198-13#209-2#2113112Ball Ranks closer
181Matisse Thybulle#199+111#149+61#8810054Ball Ranks closer
182Zach Collins#200+5#263+68#1953726Ball Ranks closer