What is DARKO?

How good is every NBA player, right now?

DARKO forecasts every player's next game, stat by stat, and turns the forecast into one number: DPM, the points per 100 possessions a player adds over an average one. It updates after every game, and its history goes back to 1996-97.

The top-ranked all-in-one metric in HoopsHype's survey of NBA team staff.

523 players rated today
31 seasons, since 1996-97
788,920 player games in the ratings

Reading DPM

DPM, for Daily Plus Minus, is how much DARKO thinks a player adds to his team's scoring margin, in points per 100 possessions, against an average player. Zero is average. It splits into offense and defense, and on both a higher number is better, so +2 on defense means good defense.

It is a forecast: how DARKO expects a player to play in his next game, from every game he has played, the recent ones counting most. It is not a summary of one season. Here is today's league, one dot per player:

+1.8 or better: 50 of the 523 players DARKO rates today, the top 10%. Nearest: Anthony Davis (+1.8), Austin Reaves (+1.8), Jalen Williams (+1.8).

What is +1 worth?

Put a player on a team with four average teammates, at the minutes DARKO projects for him, and the team's rating moves by his DPM times his share of the game. That is how the Roster Lab rates rosters.

  1. DPM +7.1 Nikola Jokic: offense +5.0, defense +2.1
  2. Minutes 34.6 DARKO's projection a game: 72% of the 48
  3. Team rating +4.8 above an average team, with four average teammates
  4. Wins 54 over 82 games, where an average team wins 41
  5. Fair salary $95.8M a season, from his DPM and minutes

Each point of team rating is worth about 2.7 wins, as in the Roster Lab.

How long DARKO remembers

DARKO weighs every game a player has ever played, and each stat forgets at its own speed. It believes a new role within a couple of games and a new shot diet within a few weeks, but a hot shooting month barely moves its view of a shooter: three-point percentage takes about a season and a half to halve. Slide back through the games to see how much one from then still counts.

  1. Starting Role 0% halves in about a game
  2. Minutes Role 1% halves in about 2 games
  3. Playing at all Role 4% halves in about 3 games
  4. Share of shots from three Shot volume 46% halves in about 13 games
  5. Usage Shot volume 56% halves in about 17 games
  6. Assist rate Playmaking 67% halves in about 24 games
  7. Points Scoring 73% halves in about 31 games
  8. Blocks Defense 79% halves in about 41 games
  9. Defensive rebounds Rebounding 81% halves in about 46 games
  10. Offensive rebound rate Rebounding 83% halves in about 54 games
  11. Steal rate Defense 88% halves in about 75 games
  12. Turnovers Playmaking 90% halves in about 1.1 seasons
  13. Free-throw % Shooting 92% halves in about 1.4 seasons
  14. Three-point % Shooting 93% halves in about 1.5 seasons
  15. % at the rim Shooting 95% halves in about 2.5 seasons
  16. Corner three % Shooting 99% halves in about 8 seasons
A game from 14 games ago still counts almost in full for turnovers, free-throw %, three-point %, % at the rim, corner three %, and next to nothing for starting, minutes, playing at all. Half-lives in games during a season, for a 31-year-old; DARKO adjusts them with age.

Inside the model

  1. 1 Every game Box scores, tracking data and play-by-play, since 1996-97.
  2. 2 A memory for every stat Exponential decay and a Kalman filter weigh every game a player has played.
  3. 3 Adjusted For rest, travel and home court, opponents, age, the time of season and team changes.
  4. 4 Combined A gradient-boosted decision tree turns them into a projection for every stat.
  5. 5 DPM The projections become Box DPM; adding on-off data makes DPM.

DARKO is built using a combination of classical statistical techniques and modern machine learning methods. DARKO is Bayesian in nature, updating its projections in response to new information, with the amount of the update varying by player and by stat, depending on DARKO's confidence in its prior estimate.

The inputs for DARKO are NBA box scores, tracking data, and other game-level information from Basketball-Reference.com, NBA.com, and aided by Darryl Blackport's work in creating pbpstats.com. DARKO's ratings cover every player's games since the 1996-97 season: 788,920 of them so far.

DARKO grapples with the core problem facing every fantasy player (and fan): understanding how much of a given player's development or decline in-season reflects real talent changes, and how much is just the random noise that is part of an NBA season. DARKO addresses these issues without any arbitrary endpoints, i.e., without looking at the last X games of a player's career.

DARKO does this by modeling player performance via an exponential decay model, weighing each game a player has ever played by βt, where β is some number between 0 and 1, and 't' is the number of days ago a given game took place. The value of β differs for each stat, selected to best predict future results. A differential evolution optimizer is used to calculate each β.

DARKO also combines this exponential decay approach with a modified Kalman filter. Kalman filters are a standard approach used in time-series analysis to model the location of an object for which only noisy measurements are available. Commonly used in fields such as robotics, aviation, rocketry, and neuroscience, it is well suited for sports analysis as well.

A gradient boosted decision tree is used to combine the decay and Kalman projections.

DARKO also accounts for several sports statistics phenomena. These include:

  • Rest/Travel/Home Court Effects: As is widely known, players perform worse on the road or on the second night of a back-to-back. DARKO accounts for these effects on a component-by-component level, and the adjustments themselves update daily in response to new information (e.g., home court advantage has been decreasing in the NBA for some time).
  • Opponent Adjustments: DARKO's projections account for who each team is playing on a given night, accounting for the projected influence of a player's opponents on each individual stat.
  • Aging: DARKO includes an aging curve. Because players improve differently with age in different stats, DARKO uses an independent aging curve for every stat it projects. DARKO also attempts to account for the selection biases which make aging studies very difficult to carry out in sports data.
  • Seasonality: Throughout the NBA, offensive efficiency to start the season is usually relatively low league-wide and increases throughout the year. DARKO accounts for a temporary flattening of the rise in assist rates (and other offensive metrics) around the all-star break. All seasonality effects are calculated separately for each component.
  • Interaction Effects: DARKO accounts for interactions between various box-score components in making its projections. For example, if a player improves both his three-point shooting and his free throw shooting simultaneously, DARKO will be inherently more credulous of such an improvement.
  • Free Agency: Changing teams has a big impact on some box-score components, and DARKO accounts for that. DARKO also gets less confident in its understanding of a player's talent when they change teams, effectively increasing its "learning rate" for these players.

From box scores to DPM

While DARKO is at its core a box-score projection system, it can also be used to generate plus-minus projections, similar in nature to RPM, PIPM, etc. I have called this metric DPM, for "Daily Plus Minus." This metric provides an estimate of how much DARKO thinks each player impacts the score of a game.

Daily Plus Minus is available in two flavors. A box-score-only version (Box DPM), which combines the core box-score metrics to predict player value, and another set (DPM) which adds in on-off data to do the same. Both DPM and Box DPM remain works in progress and may change substantially going forward.

How much the on-off data counts grows with a player's career. Early on DPM is mostly the box score; a few seasons in, mostly on-off, and sooner on defense, where the box score sees less.

Offense 67% box score · 33% on/off
Defense 55% box score · 45% on/off
TodayBox DPMOn/Off DPMDPMWhere DPM sits
Cooper Flagg Rookie season+0.5-0.5+0.1Box On/off
Victor Wembanyama Third season+6.9+6.5+6.7Box On/off
Nikola Jokic Eleventh season+4.7+7.4+7.1Box On/off
On/off's share is its career possessions over possessions plus 10,000 on offense, 6,000 on defense. A season as a starter is about 5,000.

The Active Leaderboard also translates DPM and minutes into an annualized Fair Salary / $ Value estimate.

Rookies and the offseason

DARKO has no NCAA, summer league, or preseason data in it. Before a player's first game, his rating comes from his age, draft slot and height, and then DARKO learns about him as he plays, fastest at the start, as Kon Knueppel's season above shows.

The No. 1 pick, AJ Dybantsa, started at -1.0.

No players from that class have played yet.

The 2026 class as a list
  1. AJ Dybantsa No. 1 pick -1.0
  2. Darryn Peterson No. 2 pick -1.9
  3. Cameron Boozer No. 3 pick -2.1
  4. Caleb Wilson No. 4 pick -1.6
  5. Keaton Wagler No. 5 pick -2.1
  6. Mikel Brown Jr. No. 6 pick -2.0
  7. Darius Acuff Jr. No. 7 pick -2.6
  8. Kingston Flemings No. 8 pick -2.1
  9. Morez Johnson Jr. No. 9 pick -2.2
  10. Brayden Burries No. 10 pick -2.0
  11. Yaxel Lendeborg No. 11 pick -1.1
  12. Aday Mara No. 12 pick -2.8
  13. Nate Ament No. 13 pick -2.6
  14. Hannes Steinbach No. 14 pick -3.1
  15. Dailyn Swain No. 15 pick -2.2
  16. Bennett Stirtz No. 16 pick -2.1
  17. Ebuka Okorie No. 17 pick -2.9
  18. Christian Anderson No. 18 pick -2.8
  19. Allen Graves No. 19 pick -2.5
  20. Jayden Quaintance No. 20 pick -3.3
  21. Karim Lopez No. 21 pick -1.9
  22. Labaron Philon No. 22 pick -2.1
  23. Zuby Ejiofor No. 23 pick -2.5
  24. Cameron Carr No. 24 pick -2.3
  25. Sergio de Larrea No. 25 pick -2.1
  26. Tarris Reed Jr. No. 26 pick -2.9
  27. Chris Cenac Jr. No. 27 pick -3.1
  28. Joshua Jefferson No. 28 pick -2.5
  29. Alex Karaban No. 29 pick -2.2
  30. Koa Peat No. 30 pick -2.4
  31. Bruce Thornton No. 31 pick -2.5
  32. Isaiah Evans No. 33 pick -1.9
  33. Meleek Thomas No. 34 pick -2.1
  34. Trevon Brazile No. 35 pick -2.5
  35. Baba Miller No. 36 pick -3.0
  36. Ryan Conwell No. 37 pick -2.3
  37. Braden Smith No. 38 pick -2.3
  38. Dillon Mitchell No. 40 pick -2.2
  39. Otega Oweh No. 41 pick -2.5
  40. Ja'Kobi Gillespie No. 42 pick -2.3
  41. Tyler Bilodeau No. 43 pick -2.6
  42. Maliq Brown No. 44 pick -2.3
  43. Emanuel Sharp No. 45 pick -2.4
  44. Felix Okpara No. 46 pick -3.6
  45. Tyler Nickel No. 47 pick -2.4
  46. Tobi Lawal No. 48 pick -2.4
  47. Bryce Hopkins No. 49 pick -2.4
  48. Jaden Bradley No. 50 pick -2.4
  49. Izaiyah Nelson No. 51 pick -3.1
  50. Henri Veesaar No. 52 pick -3.4
  51. Ugonna Onyenso No. 53 pick -3.3
  52. Nick Martinelli No. 55 pick -2.3
  53. Jaron Pierre Jr. No. 58 pick -2.6
  54. AK Okereke Undrafted -2.6
  55. Alpha Diallo Undrafted -1.5
  56. Arthur Kaluma Undrafted -2.2
  57. Carson Cooper Undrafted -3.5
  58. Ernest Udeh, Jr. Undrafted -3.6
  59. Graham Ike Undrafted -2.8
  60. Jaden Akins Undrafted -2.6
  61. Jaylin Sellers Undrafted -2.1
  62. Josh Dix Undrafted -2.2
  63. Kylan Boswell Undrafted -2.8
  64. Malik Dia Undrafted -2.5
  65. Michael Ajayi Undrafted -2.5
  66. Nate Bittle Undrafted -3.0
  67. Quadir Copeland Undrafted -2.2
  68. Tarik Biberovic Undrafted -2.3
  69. Tobe Awaka Undrafted -3.1
  70. Tre Donaldson Undrafted -2.3
Each dot is a player's rating going into his first NBA game. Hover or tap a dot for his name; click it, or tap it again, for his page. UDFA: undrafted.

Between seasons DARKO keeps projecting every player, pulled back toward average. Until the next season starts, the site shows each player as he stood going into his last game.

Accuracy

While DARKO is not intended to be a DFS tool, given the dearth of other projection systems out there for the NBA, a natural place to test DARKO was to compare how DARKO performs against DFS projections. With one exception, DARKO beat both sites in every stat tested (minutes, points, rebounds, assists, blocks, turnovers, and threes made), some by substantial margins.

The only stat where DARKO lost was in minutes projections. Predictably, playing-time projections are the hardest part of any projection system, and DARKO is no different in this respect.

In HoopsHype's survey of NBA team staff, DPM ranked first among the public all-in-one metrics: 8 of the 29 respondents named it their preferred metric, more than any other; 10 more said they trusted it; 1 said they did not.

“…allowing him to confidently say when a players’ improvement is more signal than noise.”

Cory Jez, the Utah Jazz's former head of analytics, on DPM, to HoopsHype

On the site

Or ask. Ask DARKO, the search in the menu, takes plain questions like "best defenders under 25", "Jokic vs Wembanyama" or "trade Giannis to the Knicks".

Questions

Why did a player's rating move after one game?

DARKO updates every rating after every game. A game that surprises it moves the rating more, and so does a game early in a career, when DARKO knows less. Each player page's Career charts show how a player's rating changes.

How is DPM different from RAPM, EPM or LEBRON?

DPM looks forward: it is DARKO's forecast for a player's next game, built from every game he has played with the recent ones counting most. Most other all-in-one numbers describe a season. Ask them who was best this year; ask DPM who is best now.

Why do the numbers change between seasons?

Between seasons DARKO pulls its projections back toward average. Until the next season starts, the site shows each player as he stood going into his last game.

How does DARKO rate rookies?

From his age, draft slot and height until he plays, and then from his games, fast at first. It has no college, summer league or preseason data.

What are the projected box-score stats?

DARKO's forecast of a player's rates for the rest of the season, per 100 possessions and as shooting percentages, against an average opponent at a neutral site. They change slowly, game to game. Per-game numbers multiply them by his projected minutes and pace.

What are projected minutes?

DARKO's forecast of a player's minutes a game when he plays, from his recent playing time and role. A player ruled out by the official NBA injury report still shows his minutes when healthy, and his page says he is out for his next game. Minutes are the hardest thing any projection system forecasts.

Can I see what DARKO said on a past date?

Yes. The Time Machine, in the menu, sets the leaderboard, the player pages, the Roster Lab and the Fantasy Lab to any day since 1996-97, and Rewind replays a season week by week.

Can I download the data?

Yes: the leaderboard, team pages, Compare, Standings, WOWY, Lineups, Longevity and the Fantasy Lab each have a CSV download.

Glossary

DPM (Daily Plus Minus)
The points per 100 possessions a player adds to his team's margin over an average player, forecast for his next game. Zero is average.
Offense and Defense
DPM's two halves. Higher is better on both.
Box DPM
The version built from box-score projections alone.
On/Off DPM
The version that also uses the team's results with the player on and off the floor.
RAPM
Regularized adjusted plus-minus: team results credited to the players on the floor, shrunk toward average. DARKO's uses play-by-play only, with no box-score prior, and updates daily.
WOWY RAPM
A RAPM-style rating from with-or-without data, built the same way from 1956-57 on.
Projected minutes
DARKO's forecast of a player's minutes a game when he plays.
Fair salary ($ Value)
What a player's on-court value is worth a season, from his DPM and minutes. How it is calculated.
Surplus value
Fair salary minus actual salary. Positive means underpaid.

Origins and thanks

When DARKO started, public basketball stats mostly explained the past. Few projected the future, and fewer did it stat by stat.

DARKO (Daily Adjusted and Regressed Kalman Optimized projections) is an attempt to fill that gap. As will be familiar to baseball fans, DARKO is a basketball projection system similar in concept to Steamer, PECOTA, and ZiPS. To my knowledge, it is one of the few public computer-driven NBA box-score projection systems.

Further, unlike the baseball projection systems listed above (or the CARMELO/RAPTOR projections), DARKO is built from the ground up to update its projections daily, responding to new information as it comes. Instead of just making a projection before the season and leaving users to guess whether a given breakout is "real" or not, DARKO updates its projections for every player in the NBA, for every box-score stat, for every day of the season.

The original introduction

The public basketball stats space has advanced wonderfully over the last decade, most prominently with the explosion of "all-in-one" metrics like RAPM, RPM, LEBRON, and BPM, among others. Excellent research has also been done on a number of other topics, such as positional versatility, clutch performance, shooting luck, and matchups.

However, despite these advances, there has been a relative dearth of focus on forward-looking projections as opposed to backwards-looking explanations, and even less public work on basic box-score metrics (as opposed to "all-in-one" metrics). Krishna Narsu has done excellent work on the "stability" of various stats, and I have contributed myself, but this work has been on a team level. FiveThirtyEight, meanwhile, had been releasing their CARMELO/RAPTOR player projections (FiveThirtyEight has since closed), but these are likewise rolled-up, "all-in-one"-style projections that tell us relatively little about where a player's growth/decline is going to come from.

For an audio primer, listen to Kostya on Canzhi Ye's Sports on Paper podcast (January 2022; also on Apple Podcasts): how DARKO works, listener questions about it, and a range of NBA analytics topics, most of them about prediction.

Acknowledgments

Thanks to almost everyone on NBA twitter for help with DARKO's development. Special thanks to Dan Rosenheck, Nathan Walker, and TangoTiger for inspiration in the design of DARKO, and assistance with the underlying math. Thanks to Andrew Patton for building the original Shiny app. Thanks to Ryan Davis for extensive coding assistance, and to Canzhi Ye for scraping assistance. Thanks to Mike Lehrman and Eric Westlund for additional design discussions. Thanks to Krishna Narsu for providing much of the training data used by DARKO. Thanks to Nate Solon for help researching time-series analysis techniques.

Special thanks to Seth Partnow for making sure I didn't just spend all this time building yet-another-all-in-one-stat. And thanks to Crow for making me build one anyway.

@kmedved | www.darko.app | @anpatt7