LUMA
LeaderboardsPlayersResearch
NBAWNBA
LUMA Paper №3

Introducing xPTS:
Expected Points, Basketball's xG

Ayomide Awoyemi · Research Fellow, Luma Basketball Research

July 17, 2026 · Expected Points v1

The following is xPTS v1 data. xPTS v3 can be found here.

Good day to you reader. I hope you are having a good day as you stumble upon this paper. My name is Ayo and, as much as I love basketball, I am Nigerian, thus soccer, or rather football is in my blood. Grew up playing it, studying it with my father. I routinely keep up with it through the Premier League and the UCL primarily and am currently really enjoying watching this World Cup with my father. If you tuned into any World Cup games this year, one of the things you'll see repeatedly on game summaries and even in missed games is expected goals per team.

I want to take some time and write a quick blog explaining a new stat that I tinkered with and created that borrows from the concept one of the foundational analytics in football, that being xG.

2026 FIFA World Cup quarterfinals ranked by xG

What Is xG?

xG is football's statistical measure of a shot as it relates to its goal.

Given the skill of an average player, how good of a goal opportunity was a shot?

It strips away the luck and skill differentiation and focuses on the process of the shot in isolation.

Every shot is given a quality grade between 0 and 1, with 1 representing a guaranteed goal. A shot graded with an xG of 0.10,  means over 100 times it would be statistically expected to be a goal 10 times (1/10).

For added reference, a penalty kick typically has an xG of about 0.79.

xG is calculated from hundreds of thousands of shots, using factors such as:

  • Distance and angle to the goal
  • The type of pass that led to the shot
  • The body part that used a shot
  • Defender proximity
  • Goalkeeper positioning
  • And so forth

What makes xG so intriguing to me is that, over a long enough sample size, teams that lead in xG win proportionally — it's a beautiful proxy for process over results. Over a single season the correlation is considerably less, only around 48%, and that's exactly where the differences in luck and skill of conversion show up. (more on this later)

XG is also extremely versatile in the context it provides and the stories you can tell with it. You can use XG on a team level over the course of a season or seasons to see their relative strength and performance.

You can constantly see XG tables right next to the actual league tables and see the differences between actual performance and expected performance. You can also do it between teams on a game-by-game level to see whether a team should have "won" a game, or to better ascertain the approximate game state.

And Even cooler, you can do it on a player-by-player basis: to see how much better or worse a player's finishing was compared to the league average.

A player such as Harry Kane, who has been playing extremely well in this World Cup, consistently overperforms as xG while there are other players who underperform. A lot of nuance can come with this too, as even the ability to rack up xG both on a player and team level is a testament to at least their chance creation.

Watching this World Cup reminded me of a conversation I had with my best friend from when we were watching the Man U game about how cool it would be to bring the concept of XG to basketball. I spent a week-ish tinkering with models and created xPTS, my iteration of basketball's version of xG.

What Is xPTS?

xPTS are the expected point valuation of each field goal and free throw attempt compared to league average.

It grades each shot attempt on a scale from 0 to 3, based on how many points that shot would be expected to produce if taken by a league-average NBA player, though in practice no shot exceeds approximately 2. It completely strips out luck and individual conversion skill, aiming only to quantify shot quality.

xPTS(shot) = league PPP of the shot’s bin (zone × distance × shot family × possession context)
xPTS(free throw) = league FT% × 1
Total xPTS = Σ bin value of every field goal attempt + league FT% × free throw attempts

A proper xPTS formula uses a granular location shot chart, in which you divide the basketball court into different shot zones, as well as defender-distance data. More on this later.

Prior Art

Though novel in its approach, xPTS is not the first attempt at quantifying NBA shot quality.

EPV (Expected Possession Value) was created by Daniel Cervone, Alex D'Amour, Luke Bornn, and Kirk Goldsberry in 2014. It is a full-possession simulator that prices every moment of a possession in terms of expected points: sprints, passes, screens, dribbles, shots, and everything in between. It is a very beautiful creation, but it requires proprietary SportVU tracking data, including player and ball coordinates captured at 25 frames per second, which the league stopped making public after 2016. It is extremely closed-source. EPV is also not shot-level. It values the entire possession as a flowing chain, so you cannot isolate "this shot was worth X" the way xG or xPTS does. It also cannot be decomposed into scored versus created.

qSQ (Quantified Shot Quality) developed by Second Spectrum is the most similar to xPTS in spirit because it grades each shot based on what a league-average shooter would be expected to do with it. qSQ uses actual defender distance on every shot, along with shooter velocity and the positions of the closest and next-closest defenders. It is the gold standard for shot quality and is also entirely proprietary. No one outside the league can see the model, the data, or the outputs. It produces a probability, expressed as expected eFG%, rather than an additive points currency, so it cannot be summed into a season total or decomposed as Xpts.

EPAA (Expected Points Above Average) was developed by Williams, Schliep, Fosdick, and Elmore and published as an academic paper in 2024. It uses Bayesian hierarchical modeling to evaluate shooters relative to league average while adjusting for shot difficulty. It is a rigorous academic contribution, but it is a player-ranking tool rather than a scoring currency. You cannot sum it into a team total or divide it into scored and created value. It also does not include defender distance.

The Bin

The key point of xPTS is deciding where to average out. Where does an average shot begin?

If we say the value of an NBA shot is about 1.09 points per attempt right now, how granular do we want to get? A wide-open layup, and a contested pull-up three have different expected shot values.

You can get as granular as you want. The question is what a good stopping point is, because it has a huge effect on the resulting expected-point averages and totals.

On one hand, one could count every unique combination of location, distance, shot type, defensive pressure, possession context, and so on across the roughly 219,000 recorded shots and give each one its own expected value.

You would be conserving all available context and getting the purest expected value, but you would also be creating thousands of extremely thin categories. As a result, the expected-value averages would be unusable because they would be so unstable.

A halfcourt heave from the left, taken with 20 seconds remaining, with a defender five feet away in semi-transition, cannot have happened more than 10 times in a season. If a team somehow hit 4 of the 8 they attempted, the raw value per shot spikes to 1.50 points a shot, on a shot that in reality is worth closer to 0.90.

On the other hand, you could have fewer but extremely large shot categories. These would produce stable averages, but also unusable numbers. The meaningful differences between attempts and shot contexts would be lost.

A wide-open catch-and-shoot transition three from the right corner is meaningfully different from a self-created, semi-contested pull-up three. These shots have different expected-point values intuitively, and we expect them to differ in both shot difficulty and expected-point valuation.

My initial solution was creating the concept of a bin, a repeatable, systematic definition of a shot type. Each field goal attempt is placed into a bin based on four characteristics:

  • Court zone: 14 zones
  • Shot distance: two-foot increments
  • Shot family: drive, cut, catch-and-shoot, self-created, alley-oop, or putback
  • Possession context: halfcourt, transition, second-chance, or off-turnover
Drive
0 to 2 ft, center
halfcourt
1.39
xPTS

This codified approximately 707 bins per season across roughly 219,000 field goal attempts.

The average bin looks like the following:

The average bin
Driving layup · center of the paint · 0–2 ft from the rim · halfcourt
8,786shots
1.39xPTS

For this bin, there is no need for any other adjustment as the sample size over the 29 years makes the expected point value extremely stable. Though there are shot types and bins that encompass rare shots, such as a second-chance catch-and-shoot from the right wing, 22 to 24 ft. away from the rim.

A thinner bin
Second-chance catch-and-shoot · right wing · 22–24 ft
5shots
1.99raw

As for this bin, two lucky makes on five attempts make that raw average 1.99, extremely unreliable. 

Though, because of the hierarchical nature of the bins (zone × distance × family × context), each one sits inside a broader parent bin that only keeps its location as the primary signifier. The parent bin pools every shot taken from that spot with that hierarchical location.

I then run a Bayesian regression that pulls the thin bin’s shaky average back toward the fat, stable location parent bin. In this case. weighing the bin’s 5 attempts against 50 attempts’ worth of the parent location average.

The rarer the bin, the fewer samples within it, the more prominent the regression, and the more it leans on its parent.

1.995 shots (raw)
+
0.87parent zone, 1,135 shots
=
0.97final xPTS

The formula combines the 5 shots of raw data with 50 shots’ worth of the zone average, so the final price becomes 0.97 xPTS instead of 1.99. Right now there actually aren’t that many thin bins, so this regression tactic is barely used, as the numbers below show:

2.1%
of all shots fall in bins with fewer than 50 attempts
95%
of shots fall in bins with at least 100 attempts

Here is a sampling of bins across the value spectrum.

Shot
Location
Dist
Context
Coverage
xPTS
Alley-oop
Rim
0-2 ft
halfcourt
Open
1.77
Cut
Rim
0-2 ft
halfcourt
Open
1.74
Drive
Rim
0-2 ft
transition
Open
1.62
Layup
Rim
0-4 ft
halfcourt
Open
1.39
Layup
Rim
0-4 ft
halfcourt
Smothered
1.11
Catch & shoot
Three
22-24 ft
halfcourt
Open
1.17
Putback
Rim
0-2 ft
2nd chance
Contested
1.14
Catch & shoot
Three
24-26 ft
halfcourt
Smothered
0.99
Pull-up
Three
24-26 ft
halfcourt
Open
1.05
Pull-up
Paint
4-10 ft
halfcourt
Open
1.09
Pull-up
Paint
4-10 ft
halfcourt
Smothered
0.91
Jump shot
Paint
4-10 ft
halfcourt
Smothered
0.50

A sampling of the 707 bins. Most rows stand alone, but a few are paired open versus smothered so you can see how much the nearest defender moves the price.

The 2015–16 Season and Defender Distance

The 2015–16 NBA season is the only season for which the complete xPTS formula can be calculated using all four inputs:

  • Shot location
  • Shot family
  • Possession context
  • Actual defender distance

As it is the only season with publicly available defender-distance data for individual shots, drawn from "leaked" SportVU tracking data.

For every other season, both before and after 2015–16, I use an approximated version of xPTS that prices shots using the aformentioned location, shot family, and possession context, but wihotut defender distance. This approximated version is essentally a shot location router and captures roughly 77% of the accuracy estbalished by the full formula.

The Final Product

Put all of this together and you are left with xPTS: a beautifully additive and decomposable measure of shot quality that is extremely versatile. Here are a few of the ways I have found to use it.

Player leaderboards. Because it is additive, you can build a leaderboard of the expected points a player created, whether by his own shot or by the pass that set one up, over a given season. The board below does exactly that.

Team leaderboards. Sorting teams by expected wins derived from xPTS chance creation and suppression.

A player’s own baseline for over and underperformance. The league-average foundation can be swapped for a player’s own averages from each shot location, giving you a player-specific xPTS. Over a stretch of games you can then see how much better or worse he is shooting by his own standards.

Football Adjacent Game by game summaries: Summaries that show  who created the better statistical chances and the distribution of it. A team can lose the scoreboard and still have won the shot quality.

Presence and geometry RAPM. Even cooler, you can measure how a player’s presence bends his team’s offensive and defensive geometry, and its chance creation on both ends, a different flavor of regularized adjusted plus-minus. More on that below.

⚲

#
Player
Scored
Created
X Score
Actual
Shots

xPTS Scored is the sum of xPTS on a player's own shots. xPTS Created is the xPTS of the shots his passes generated. X Score adds the two together. The 2015-16 board is starred because it uses real per-shot defender distance.

Expected Wins

One of the best uses of xPTS is having a game-by-game comparison, with xPTS being a stand-in for chance creation or a quantification of a team's process. You can add up each player's xPTS on two separate teams for each game and then compare which team should have won. A very rudimentary comparison of which team should have “analytically won.”

Cleveland CavaliersCLE
108–121Final · ECF Game 3 · May 23, 2026
NYKNew York Knicks
109.4 Expected pointsxPTS 103.3
43.4…from three-point attempts29.0
39.8…from shots at the rim36.6
11.2…from midrange16.6
14.9…from free throws21.1
84Field goal attempts77
41Three-point attempts28
19Free throw attempts27
108Actual points121
−1.4Finishing (points − xPTS)+17.7

Every field goal attempt priced by the 2025–26 league bin table; every free throw at the league rate of 0.78. Play-by-play context approximated from public data.

A full series through the same lens
2026 Western Conference Finals · Thunder vs Spurs · priced with the 2025–26 tables
Oklahoma City Thunder Expected pointsxPTS San Antonio Spurs

San Antonio analytically won six out of seven games in the 2025–2026 playoff series against the Oklahoma City Thunder. In the games that Oklahoma City won, they analytically lost via xPTS but won via sheer conversion rate.

How Well Do xPTS Predict Wins?

One of the cool things xG in soccer allows is to see, over a period of time, most often a season, who the best teams are based on the quality of chances they create. Go back through a season and assign each game to the team that created more xG, and that expected table explains roughly 75–80% of the eventual final league table.

In the NBA, expected wins derived from expected points explain only about 50% of final wins (R² ≈ 0.49 across the full 2025–26 season). I was very curious as to why, and as I dug through it, I found three main reasons for the divergence.

  • The value of chances in football is much wider than basketball. A soccer xG valuation on a given shot can range from 0.03, half a chance, to 0.79, a penalty, a nearly 26x spread. The chances one can get in soccer vary widely, most of them are low and not expected to convert. Soccer is a 90-minute jousting match between two teams to see who can create the most clear-cut chances.
  • Football conversion is extremely unstable year over year. Only a handful of players on the planet consistently outperform their xG. For the majority of players and teams, their xG is destiny.
  • Conversion is basketball's skill. Shots range from 0.53 expected, a smothered late-clock pull-up, to 1.77 expected, an open alley-oop at the rim in transition. A spread of a measly 3x. This is wildly different from soccer: even in differing shot contexts, basketball shot opportunities are close together in their eventual expected value.

Chance creation is still a strong barometer of eventual team performance. Across all 1,230 games of the 2025–26 season, the team with the higher Total xPTS won 62.1% of the time. When the xPTS differential is 5 or more, it predicts the winner at 67.9%, and at 20 or more, it reaches 80.2%, soccer territory.

This holds across every season the full bin engine covers. Pooled over the five seasons of play-by-play rich enough to power it, 2021–22 through 2025–26, 6,150 games, the higher-xPTS team won 57.2% of all games, 61.0% at a differential of 5+, and 73.2% at 20+. The chart below pools all five seasons.

Margin < 2 xPTS
50.7%974 games
2 – 5
51.0%1,343
5 – 10
57.9%1,844
10 – 15
60.2%1,117
15 – 20
66.2%559
20 +
73.2%313

In 14.5% of games this season, the xPTS margin was inside two points. Chance creation, or xPTS, was essentially worthless and less accurate than a coin flip in those games.

NBA 2025-26 · Expected Wins
#
Team
Exp Wins
Actual Wins
Exp Pts
Actual Pts
Exp Allowed
Actual Allowed
Net x
Net
Correlation between the expected table and the actual table
SeasonPremier League R²NBA R²
2021–220.890.14
2022–230.820.09
2023–240.820.26
2024–250.880.37
2025–260.780.49

R² is the percentage of the variance in the actual table that the expected table explains. An R² of 1.00 means a one-to-one match.

  • NBA over/under-performance repeats year after year: r = 0.52 (120 team-season pairs). Teams that beat their expected wins keep beating them.
  • EPL finishing over expected points repeats at r = 0.06, literally zero. In football, conversion is lossy, with creation being law.

Expected wins award each game to the team with the higher net xPTS that night. Over/Under is actual wins minus expected, the conversion signal. Across 2025–26, expected wins track actual wins at R² ≈ 0.49.

As I was working on this section, I shared an excerpt of the unfinished version on Twitter, and a question from @Yim0e made me go back and be more thorough. This paper took much longer than anticipated to get out. It was initially supposed to be a casual blog sharing a weekend experiment, but I hate putting out unfinished stuff, and each time I got a nudge like this I leaned in: run the test, really understand the thing you built.

They asked whether xPTS is a better predictor of future results than actual efficiency, whether that be eFG% or true shooting. So I built the test,  took all 30 teams for every season I have full, proper data for, 2021 through 2025, and created 120 this-season-versus-next-season pairs. For each pair, I asked which number best predicts a team’s actual net rating the following season: the team’s xPTS net, which is two way chance creation/supression; the team’s actual net, creation and conversion together; or both melded into one model.

Predictor of next season’s actual netrR²
This season’s actual net0.550.30
This season’s xPTS net0.380.14
Both together0.550.31

120 team-season transitions, 2021–2025. Adding xPTS to actual net moved R² from 0.30 to 0.31: essentially nothing.

For added detail, I measured how each component repeats from year to year. Chance creation repeated at 0.52. Conversion repeated at 0.54. This was the interesting finding. 

In football, xG is a better tool for prediction than actual goals, because conversion in football is lossy and does not repeat. In basketball, conversely, conversion is one of the defining skills, and it does repeat. It is the critical context that separates an average team from an elite team, not the creation of chances.

The difference between two chances in basketball, especially without proper defender-distance data, is far more compressed than the difference between chances in football. A penalty is enormously more likely to convert than a 40-yard shot, but in basketball a layup is relatively as easy to convert as a three-pointer is, and the harder shot is rewarded with 1.5 times the value. And the nature of the sport is that both teams get a similar number of chances per game. Teams see roughly the same possessions and shots; unlike soccer, you cannot hold an opponent to zero chances while creating eight. The differences that remain are minute, a team’s pace or its turnover economy.

So the creation of xPTS, or any form of expected points, cannot really be used to predict a team’s future performance. It is added context for how a team gets to its end result, and it is, more than anything, a confirmation of how critical shot conversion is. Tough shot-makers, shot-makers in general, the players who consistently help their team convert chances into buckets and into value, carry an incredible amount of it.

Back to the Individual Level

xPTS is an extremely versatile statistic that, when done properly, can be used to quantify the process of an NBA offense and defense, both on a granular player and team level. It also gives insight into the atomic root of value creation in the sport, that being conversion.

You can see who the best shot converters are by using xPTS over any given time period. For the 2025-26 season, you can see who has made the most of their chances, converting far above the league-average expected points.

2025-26 · Points above expected · 500+ shots
1
Durant
2026 pts · 1711 xPTS
+315
2
Gilgeous-Alexander
2117 pts · 1837 xPTS
+280
3
Jokić
1799 pts · 1552 xPTS
+247
4
Murray
1905 pts · 1668 xPTS
+237
5
Dončić
2143 pts · 1926 xPTS
+217
6
Leonard
1813 pts · 1598 xPTS
+215
7
Knueppel
1498 pts · 1336 xPTS
+162
8
Mitchell
1952 pts · 1800 xPTS
+152
9
Edwards
1757 pts · 1606 xPTS
+151
10
Curry
1142 pts · 993 xPTS
+149

Even more excitingly, you can examine over- and underperformance on a single-game level. You can see the performances that are extremely load-bearing and may not be sustainable, and the poor form that lands far, far away from what we would expect.

Best single-game shot overperformance
Player
xPTS
Actual
Diff
Murrayszn avg +3.2/gDEN vs IND · Dec 4, 202519-25 FG · 10-11 3PT · 4-5 FT
28.2
52
+23.8
Gordonszn avg +0.1/gDEN vs GSW · Oct 24, 202517-21 FG · 10-11 3PT · 6-6 FT
27.0
50
+23.0
Curryszn avg +3.5/gGSW vs POR · Dec 15, 202516-26 FG · 12-19 3PT · 4-4 FT
29.2
48
+18.8
McCollumszn avg +0.9/gWAS vs ATL · Nov 26, 202517-25 FG · 10-13 3PT · 2-4 FT
27.5
46
+18.5
Murrayszn avg +3.2/gDEN vs DAL · Mar 26, 202619-28 FG · 9-14 3PT · 6-6 FT
34.5
53
+18.5
Quickleyszn avg +0.7/gTOR vs GSW · Jan 21, 202611-13 FG · 7-8 3PT · 11-11 FT
21.7
40
+18.3
Brownszn avg +1.1/gBOS vs LAC · Jan 4, 202618-26 FG · 6-10 3PT · 8-10 FT
32.5
50
+17.5
Jokićszn avg +3.8/gDEN vs LAC · Nov 13, 202518-23 FG · 5-6 3PT · 14-16 FT
37.6
55
+17.4
Payneszn avg -0.3/gPHI vs MEM · Mar 10, 20269-10 FG · 8-8 3PT · 6-6 FT
14.6
32
+17.4
Merrillszn avg +1.6/gCLE vs WAS · Feb 12, 202611-12 FG · 9-10 3PT · 1-1 FT
14.6
32
+17.4
Murrayszn avg +3.2/gDEN vs IND · Dec 4, 2025 · 2025-2619-25 FG · 10-11 3PT · 4-5 FT
28.2
52
+23.8
DoncicDAL vs ATL · Jan 27, 2024 · 2023-2425-33 FG · 8-13 3PT · 15-16 FT
49.4
73
+23.6
CurryGSW vs ORL · Feb 28, 2025 · 2024-2516-25 FG · 12-19 3PT · 12-12 FT
33.0
56
+23.0
Gordonszn avg +0.1/gDEN vs GSW · Oct 24, 2025 · 2025-2617-21 FG · 10-11 3PT · 6-6 FT
27.0
50
+23.0
LillardPOR vs HOU · Feb 27, 2023 · 2022-2322-38 FG · 13-22 3PT · 14-14 FT
49.2
71
+21.8
LaVineSAC vs CHA · Feb 25, 2025 · 2024-2516-19 FG · 8-9 3PT · 2-3 FT
20.4
42
+21.6
LillardPOR vs UTA · Jan 26, 2023 · 2022-2321-29 FG · 9-15 3PT · 9-10 FT
38.8
60
+21.2
YoungATL vs POR · Jan 4, 2022 · 2021-2217-26 FG · 7-12 3PT · 15-15 FT
35.7
56
+20.3
IngramNOP vs TOR · Feb 6, 2024 · 2023-2416-21 FG · 8-11 3PT · 1-1 FT
21.1
41
+19.9
IrvingBKN vs CHA · Mar 9, 2022 · 2021-2215-19 FG · 9-12 3PT · 11-13 FT
30.2
50
+19.8
Murphy IIIszn avg +1.1/gNOP vs OKC · Jan 28, 20263-20 FG · 1-11 3PT · 3-5 FT
24.8
10
−14.8
Cunninghamszn avg +0.2/gDET vs PHX · Jan 16, 20263-16 FG · 0-7 3PT · 4-9 FT
23.6
10
−13.6
Cunninghamszn avg +0.2/gDET vs SAS · Feb 24, 20265-26 FG · 2-9 3PT · 4-5 FT
29.6
16
−13.6
Harperszn avg -0.4/gSAS vs CLE · Dec 6, 20251-11 FG · 0-5 3PT · 1-4 FT
16.4
3
−13.4
Ballszn avg +0.7/gCHA vs CLE · Jan 22, 20261-15 FG · 0-10 3PT · 0-0 FT
15.3
2
−13.3
Greenszn avg -1.4/gPHX vs ORL · Feb 21, 20266-26 FG · 2-11 3PT · 2-6 FT
29.3
16
−13.3
Brownszn avg +1.1/gBOS vs ATL · Mar 30, 20269-29 FG · 3-9 3PT · 8-14 FT
42.1
29
−13.1
Nesmithszn avg -0.2/gIND vs DAL · Oct 30, 20252-16 FG · 1-9 3PT · 0-2 FT
18.0
5
−13.0
Carterszn avg -1.2/gSAC vs POR · Apr 13, 20263-14 FG · 0-3 3PT · 2-5 FT
20.8
8
−12.8
Cunninghamszn avg +0.2/gDET vs WAS · Nov 11, 202514-45 FG · 2-11 3PT · 16-18 FT
58.7
46
−12.7
MarkkanenUTA vs CHA · Mar 12, 2023 · 2022-233-22 FG · 1-9 3PT · 6-6 FT
31.7
13
−18.7
GordonDEN vs MIN · Jan 3, 2023 · 2022-234-18 FG · 0-3 3PT · 4-6 FT
29.7
12
−17.7
BarrettNYK vs BKN · Apr 6, 2022 · 2021-227-27 FG · 2-11 3PT · 7-12 FT
39.5
23
−16.5
EdwardsMIN vs DAL · Dec 15, 2023 · 2023-243-19 FG · 0-3 3PT · 3-6 FT
24.5
9
−15.5
HauserBOS vs SAC · Apr 5, 2024 · 2023-241-18 FG · 1-13 3PT · 0-0 FT
18.5
3
−15.5
HendersonPOR vs OKC · Jan 12, 2024 · 2023-244-21 FG · 1-9 3PT · 4-6 FT
28.5
13
−15.5
WestbrookLAL vs BKN · Dec 26, 2021 · 2021-224-20 FG · 0-3 3PT · 5-6 FT
28.4
13
−15.4
BantonPOR vs SAC · Apr 14, 2024 · 2023-246-26 FG · 0-15 3PT · 5-6 FT
32.3
17
−15.3
McCollumNOP vs DET · Mar 18, 2025 · 2024-251-15 FG · 0-7 3PT · 1-5 FT
18.2
3
−15.2
BarrettNYK vs MEM · Oct 19, 2022 · 2022-233-18 FG · 0-6 3PT · 5-6 FT
26.1
11
−15.1

You can also swap out the league-average baseline in the formula for a player’s own baseline from each bin, so you can see, on a game-by-game or even season-by-season level, whether they are playing above or below their own level, whether they have hit a hot streak or gone unusually cold.

Stephen Curry’s expected points on a deep pull-up three are wildly different from the league’s.

Stephen Curry
Stephen CurryPast five seasons · priced against his own five-year baseline, his average expected value from his own shot bins, 2021–22 through 2025–26
Pull-up three, 26–28 ft, center1.27 vs 1.01
Pull-up three, 26–28 ft, right wing1.23 vs 1.01
Catch-and-shoot three, 26–28 ft, right wing1.27 vs 1.07
Catch-and-shoot three, 24–26 ft, right wing1.28 vs 1.09
Free throws.923 vs .781
Curryleague average · expected points per attempt, five-year sample, 100+ attempts per bin
+18.6 above himself
56 pts on 37.4 self-expected
GSW vs ORL · Feb 28, 2025
−16.9 below himself
14 pts on 30.9 self-expected
GSW vs DAL · Jan 6, 2022
Kevin Durant
Kevin DurantPast five seasons · priced against his own five-year baseline, his average expected value from his own shot bins, 2021–22 through 2025–26
Pull-up, 8–10 ft, center paint1.21 vs 0.94
Pull-up, 10–12 ft, right midrange1.15 vs 0.89
Driving finish at the rim, halfcourt1.60 vs 1.38
Turnaround, 6–8 ft, post1.14 vs 0.94
Pull-up, 12–14 ft, right midrange0.83 vs 0.87
Durantleague average · expected points per attempt, five-year sample, 100+ attempts per bin. The last row is the only shot in his diet below league average.
+13.3 above himself
45 pts on 31.7 self-expected
BKN 109–102 ORL · Nov 29, 2022
−10.1 below himself
26 pts on 36.1 self-expected
BKN vs MEM · Jan 4, 2022

xPTS-RAPM

Finally, the piece I have been most excited about, and the one in the title of this paper: xPTS-RAPM. Instead of seeing how a player's on-court presence adds to or subtracts from a team's net rating over a huge sample of possessions, you see how a player's on-court presence influences a team's expected point value. Are they creating numerically optimal shots? Are they suppressing numerically optimal shots? How are they warping the geometry of the court?

ARC Impact (RAPM)
xPTS-RAPM
Measures
Points
Expected points
The question
How much does a player change his team’s net rating?
How much does a player change the expected value of each shot?
Shot value
0, 2, or 3
707 bins per season; free throws at the league rate
Sides
One net value
Offense and defense, solved separately
Sample
One season
198,480 stint-sides, three seasons, weighted 100 / 70 / 49%
Priors
Team quality
None
Ridge α
5,000
10,000
North star
Reconstruct team net rating
Predict the next season’s expected net points (r = 0.47)
Output
Net impact per 100
Offense, defense, and net, in expected points per 100
⚲
#PlayerOffDefNet xPTS-RAPMPoss
1Giannis Antetokounmpo+2.36+0.52+2.8810,117
2Brandin Podziemski+1.33+1.21+2.546,054
3Nikola Jokić+1.31+1.08+2.3911,228
4Jimmy Butler III+0.78+1.50+2.298,206
5Jonathan Isaac+1.29+0.90+2.193,410
6Franz Wagner+0.57+1.51+2.079,674
7Amen Thompson+1.52+0.55+2.076,296
8Fred VanVleet+0.99+1.02+2.0210,260
9Tari Eason+1.77+0.16+1.945,183
10Steven Adams+1.57+0.33+1.902,643
11Andre Drummond+1.61+0.18+1.794,049
12Ausar Thompson+0.81+0.90+1.724,860
13Alex Caruso+0.60+1.11+1.716,413
14Luke Kornet+0.88+0.78+1.664,632
15Chris Boucher+1.57-0.00+1.574,085
16OG Anunoby+0.80+0.76+1.569,851
17Alperen Sengun+0.87+0.55+1.429,639
18Clint Capela+1.38+0.04+1.426,850
19Donovan Mitchell+0.81+0.61+1.429,542
20Anthony Davis+0.38+1.04+1.429,049
21Dyson Daniels+0.24+1.17+1.408,204
22Pascal Siakam+0.29+1.10+1.3911,402
23Scottie Barnes+1.33+0.06+1.399,773
24Rudy Gobert+0.11+1.25+1.3610,198
25Toumani Camara+0.56+0.79+1.357,402
26Payton Pritchard+0.75+0.58+1.337,353
27Dillon Brooks+0.60+0.70+1.299,953
28Kevon Looney+0.81+0.47+1.285,803
29Goga Bitadze+0.50+0.77+1.274,454
30Josh Hart+1.45-0.18+1.2711,603
31Day'Ron Sharpe+1.32-0.06+1.263,529
32Moussa Diabaté+1.23+0.00+1.232,617
33Isaiah Hartenstein+0.51+0.72+1.227,389
34Josh Okogie+1.23-0.02+1.223,781
35Deni Avdija+0.62+0.59+1.229,457
36Moses Moody+0.17+1.03+1.205,680
37Donovan Clingan+0.89+0.30+1.192,610
38Mitchell Robinson+1.02+0.14+1.163,043
39Moritz Wagner+0.62+0.53+1.164,115
40Domantas Sabonis-0.54+1.68+1.1411,700
41Aaron Gordon+0.61+0.53+1.148,030
42Draymond Green-0.94+2.05+1.128,472
43Lauri Markkanen+0.93+0.18+1.117,794
44Jalen Suggs-0.28+1.36+1.086,002
45Isaac Okoro+0.82+0.26+1.076,209
46Jakob Poeltl+0.10+0.95+1.057,120
47Jae'Sean Tate+0.57+0.48+1.053,257
48Ja Morant+1.44-0.39+1.055,584
49Trey Lyles+0.57+0.47+1.045,455
50Jalen Brunson+1.48-0.45+1.0310,418
51Bam Adebayo-0.81+1.82+1.0110,896
52Anthony Black+0.21+0.80+1.015,215
53Shai Gilgeous-Alexander+1.17-0.17+1.0011,431
54De'Aaron Fox+0.66+0.33+0.9910,715
55Kenrich Williams+0.20+0.78+0.984,863
56Trayce Jackson-Davis+0.43+0.53+0.963,490
57Gary Harris+0.44+0.52+0.964,284
58Evan Mobley+0.33+0.62+0.959,060
59Miles McBride+0.98-0.04+0.945,531
60Luka Dončić+0.65+0.25+0.909,516
61LaMelo Ball+0.79+0.10+0.905,301
62Dean Wade+0.37+0.51+0.884,857
63Dennis Smith Jr.+0.70+0.16+0.852,781
64Kevin Love+0.36+0.48+0.842,966
65John Konchar+0.58+0.26+0.844,236
66Gary Payton II+0.42+0.42+0.843,138
67Mikal Bridges+0.52+0.32+0.8312,649
68Kentavious Caldwell-Pope-0.28+1.11+0.8210,016
69Jarrett Allen+0.42+0.40+0.8210,090
70Jayson Tatum+0.56+0.25+0.8211,412
71Zion Williamson+1.45-0.66+0.795,759
72Sandro Mamukelashvili+0.73+0.05+0.792,649
73Tre Jones+0.44+0.31+0.756,887
74Kawhi Leonard-0.14+0.88+0.747,199
75Kris Murray+0.56+0.16+0.723,896
76Duop Reath+0.56+0.16+0.722,602
77Derrick White-0.43+1.15+0.7110,591
78Luguentz Dort+0.25+0.46+0.719,725
79James Harden+0.23+0.48+0.7110,906
80Caleb Martin-0.15+0.84+0.696,676
81Dereck Lively II+0.27+0.41+0.683,461
82Oshae Brissett+0.81-0.14+0.682,211
83Lindy Waters III+0.07+0.57+0.652,438
84Dwight Powell+0.32+0.32+0.643,652
85Kelly Oubre Jr.+0.84-0.20+0.648,400
86LeBron James+0.34+0.29+0.6410,270
87Cade Cunningham-0.30+0.93+0.638,261
88RJ Barrett+1.36-0.74+0.628,729
89Jordan Goodwin+0.56+0.05+0.613,505
90Keldon Johnson+1.15-0.55+0.608,673
91Mason Plumlee+0.31+0.27+0.585,479
92Kris Dunn-0.75+1.31+0.565,900
93Dalen Terry+0.61-0.05+0.563,186
94Xavier Tillman+0.11+0.45+0.562,925
95Kyle Lowry-0.23+0.78+0.565,207
96Stephon Castle+0.90-0.35+0.554,311
97Dorian Finney-Smith+0.49+0.05+0.558,049
98Keon Ellis-0.26+0.81+0.555,219
99Harrison Barnes+0.59-0.05+0.5410,438
100Mike Conley-0.19+0.73+0.548,362
101Derrick Jones Jr.-0.13+0.66+0.537,125
102Jeremy Sochan+0.54-0.01+0.527,337
103Paul Reed+0.18+0.34+0.523,748
104Javonte Green+0.54-0.03+0.513,309
105Tobias Harris+0.12+0.39+0.5110,197
106Herbert Jones-0.07+0.57+0.506,385
107Victor Wembanyama-0.16+0.66+0.506,049
108Austin Reaves+0.12+0.39+0.5010,571
109Wendell Carter Jr.-0.55+1.04+0.496,917
110Josh Green+0.11+0.37+0.487,350
111Kevin Huerter-0.28+0.76+0.487,787
112Larry Nance Jr.-0.27+0.74+0.473,948
113Julius Randle+1.02-0.54+0.479,172
114Sam Merrill+0.40+0.06+0.474,276
115Christian Braun+0.80-0.33+0.478,640
116Paolo Banchero+0.14+0.32+0.469,251
117Precious Achiuwa+0.71-0.26+0.455,539
118Torrey Craig+0.54-0.09+0.453,892
119Max Strus+0.31+0.14+0.457,840
120Jevon Carter+0.41+0.03+0.433,811

Three-season window anchored on the season shown, weighted 100 / 70 / 49%. Expected points per 100 possessions. Minimum 2,000 weighted possessions.

Like a normal RAPM, you can then decompose this further into offensive xPTS-RAPM (oxRAPM) and defensive xPTS-RAPM (dxRAPM): how a player changes the geometry of the court to bend his team toward more favorable shot conditions, and how his presence helps suppress favorable shot conditions on the other side. I show the best offenders and defenders below.

As you may notice, Donovan Clingan and the Thompson twins are amongst the most surprising and notable leaders, especially since they are not good three-point shooters, nor are they playmakers. I will have to do more decomposition to see, numerically, why they rank so well.

⚲
#PlayerDefensePoss
1Bam Adebayo+2.0710,758
2Draymond Green+1.727,999
3Domantas Sabonis+1.617,448
4Kris Dunn+1.608,064
5Rudy Gobert+1.5210,395
6Franz Wagner+1.517,064
7Derrick White+1.4410,867
8Jalen Suggs+1.426,599
9Brandin Podziemski+1.418,832
10Isaiah Hartenstein+1.396,355
11Kawhi Leonard+1.377,942
12Ivica Zubac+1.368,195
13Cade Cunningham+1.259,844
14Ausar Thompson+1.217,140
15Wendell Carter Jr.+1.188,298
16Alex Caruso+1.145,469
17Dyson Daniels+1.1410,172
18Donovan Clingan+1.106,024
19Jimmy Butler III+1.086,617
20Nikola Jokić+1.0210,851
21Marcus Smart+1.005,065
22Deandre Ayton+0.987,199
23Kentavious Caldwell-Pope+0.957,559
24Jusuf Nurkić+0.945,704
25Dillon Brooks+0.938,836
26Jalen Duren+0.938,537
27Victor Wembanyama+0.937,985
28Austin Reaves+0.939,596
29Derrick Jones Jr.+0.927,060
30Paul George+0.926,494
31Jonathan Kuminga+0.925,167
32Keegan Murray+0.917,742
33Ajay Mitchell+0.913,821
34Moses Moody+0.866,469
35Cason Wallace+0.868,426
36Jrue Holiday+0.837,942
37Toumani Camara+0.8210,702
38Stephen Curry+0.828,328
39Mike Conley+0.786,437
40Collin Gillespie+0.785,301
41Jonathan Isaac+0.773,314
42Anthony Black+0.777,448
43Keon Ellis+0.766,518
44Gary Payton II+0.754,195
45Tyrese Martin+0.753,252
46Pelle Larsson+0.744,917
47Jalen Williams+0.747,341
48Javonte Green+0.724,876
49Andrew Wiggins+0.718,738
50Jakob Poeltl+0.715,944
51Chet Holmgren+0.707,689
52Fred VanVleet+0.675,475
53Luke Kornet+0.675,565
54Zach Edey+0.672,622
55Nique Clifford+0.663,718
56Neemias Queta+0.645,106
57De'Anthony Melton+0.633,354
58Matisse Thybulle+0.632,835
59Anthony Davis+0.626,245
60Brook Lopez+0.629,124
61Caleb Martin+0.594,990
62Herbert Jones+0.576,327
63Haywood Highsmith+0.573,919
64Amen Thompson+0.5610,091
65Luka Dončić+0.559,610
66OG Anunoby+0.549,671
67Sion James+0.533,554
68Paul Reed+0.533,878
69Trayce Jackson-Davis+0.533,387
70Gary Harris+0.513,458
71Al Horford+0.515,812
72Norman Powell+0.518,305
73Larry Nance Jr.+0.512,728
74Goga Bitadze+0.504,744
75Karl-Anthony Towns+0.4810,011
76Kenrich Williams+0.474,255
77Mouhamed Gueye+0.473,181
78Daniss Jenkins+0.472,907
79Trey Lyles+0.472,956
80Pat Spencer+0.472,776
81Dereck Lively II+0.462,670
82Jarrett Allen+0.468,666
83Lauri Markkanen+0.466,875
84Rui Hachimura+0.468,190
85John Konchar+0.454,221
86Gui Santos+0.443,978
87Jaylen Wells+0.446,679
88Precious Achiuwa+0.426,556
89Mark Williams+0.414,978
90Tristan da Silva+0.415,977
91Sidy Cissoko+0.413,137
92Jonas Valančiūnas+0.415,668
93Kevin Huerter+0.417,087
94Onyeka Okongwu+0.419,146
95Luguentz Dort+0.408,900
96Duncan Robinson+0.408,459
97LeBron James+0.409,697
98Jaylin Williams+0.404,560
99Steven Adams+0.392,471
100Kevin Love+0.392,510
101Kyle Lowry+0.392,728
102LaMelo Ball+0.386,805
103Aaron Gordon+0.376,188
104Dwight Powell+0.373,432
105Kevon Looney+0.373,321
106Kon Knueppel+0.365,060
107Jayson Tatum+0.367,129
108Svi Mykhailiuk+0.363,828
109Andrew Nembhard+0.367,955
110Jarred Vanderbilt+0.363,554
111Ronald Holland II+0.354,822
112Myles Turner+0.358,937
113Ryan Kalkbrenner+0.352,957
114Payton Pritchard+0.349,594
115Donovan Mitchell+0.349,808
116Brandon Miller+0.347,395
117Dean Wade+0.345,431
118AJ Green+0.347,368
119Pascal Siakam+0.3310,357
120Terry Rozier+0.314,212

Same solve, decomposed. Offense is the effect on his own team’s expected points; defense is how much he suppresses his opponent’s. Positive is better on both ends. Minimum 2,000 weighted possessions.

These leaders are actually a great case study of what this RAPM measures. Clingan is a chance-quality machine in three distinct ways. His rebounding: 22.2 offensive rebounds per 100 shots is a good 30% more than league average. Many of those rebounds convert a dead possession into a putback or a kick-out, which sit amongst the most highly priced bins, around 1.3 to 1.5 expected points. And his rebounding lets Portland manufacture its diet: with him on the court, Portland takes 39% of its shots from three and 26% at the rim, while opponents get only 22% of their shots at the rim. Portland’s offense with Clingan on is extremely Morey-pilled: rim attempt or three-point attempt.

For the Thompson twins, Amen is actually the best offensive geometry-bender in the league. He is the offensive xPTS engine: extreme rim pressure and second chances. Remember, with expected points there is no tax, no punishment for his lack of conversion, or his team’s, while he is on the court.

Ausar, meanwhile, is elite defensively. His presence lets his team take 28% of its shots at the rim while dropping opponents’ rim share to about 19%, and he forces about 19 turnovers per 100, zeroing out those possessions entirely.

On the inverse, you have the players who perform extremely poorly in net xPTS-RAPM. The worst is Bub Carrington, and the interesting point about him is that there is no single horrific channel. He is simply poor among so many. Washington’s offense becomes extremely midrange-heavy when he is on the court: his personal game is heavily pull-up-weighted with no rim pressure, which drags Washington into the cheapest quantified shot values. He provides no transition boost, below-average offensive rebounding, and above-average turnovers, essentially never generating or forcing his team toward more optimal chances while leaking possessions along the way. 26% of opponents’ shots come at the rim with him on, against a league average of about 21%, while the opponents take only 20% from midrange, the exact inverse of what a good defense produces. He does not create turnovers. He gives up straight drives to the rim, and opponents’ free-throw share runs above average. Some honest context, which I will return to in the caveats: he plays for a 17-win team that has been bad as an entire unit, he is a young guard given developmental freedom and reps, and the collinearity weakness of any ridge regression does exist.Kevin Durant and net xPTS-RAPM is a very interesting story, especially when you pair it with his conversion. His shot-quality impact is among the single worst in the entire league. He provides no rim pressure, there is no transition game, the offense becomes a half-court jousting match every possession. His influence turns his team into a midrange engine, the quantified worst shot in basketball, at roughly 7% more than league average.

He still rates well in all RAPMs, because he is, even at his age, among the most elite converters in the sport. As you saw from the earlier tables: 315 points made above expected this season, 280 the season before. He makes the poorly graded 8-to-10-foot pull-ups at about 1.21 expected points versus a league average of 0.94, functionally making what is graded as the worst shot in basketball worth more than a three from a league-average shooter. He ranks in the 1st percentile of the league in chance creation and the 100th percentile in conversion. Extreme dimorphism.

And that, as I will keep touching on, is the beauty of xPTS and xPTS-RAPM. You can now decompose what RAPM even stands for in a new way: how many chances a player creates or suppresses through the geometry of the floor, versus how much he converts himself, or erases.

The beauty of xPTS-RAPM is that it is subtly a decomposition channel of RAPM itself: one half of a shot-quality decomposition. xPTS-RAPM is the half that measures how many chances a player creates or suppresses through the geometry of the floor. Its sister, Conversion RAPM, measures how much his presence helps convert, or deny, shots above expected. The summation of the two gets you net RAPM, the standard RAPM we all know and love, the one that measures how team net rating moves with a player on or off the court.

Kevin Durant, decomposed2025-26 anchor · every branch sums to the number above it
⚲
+1.35Net RAPM82nd percentile
−1.73xPTS-RAPM2nd percentile
+3.08Conversion RAPM99th percentile
−1.47offense1st percentile
−0.26defense31st percentile
+3.08offense99th percentile
+0.01defense41st percentile

His geometry costs his team about a point and a half of chance quality per 100; his shot-making pays it back twice over. Positive is better on both ends.

Conversion RAPM

xPTS-RAPM: a quantification of how a player influences his team’s shot diet. Conversion RAPM: a quantification of how a player’s on-court influence alters the points created above expected.

⚲
#PlayerOffDefNet Conversion RAPMPoss
1Shai Gilgeous-Alexander+2.50+1.91+4.4110,859
2Kevin Durant+3.08+0.01+3.0811,329
3Kawhi Leonard+2.67+0.40+3.077,942
4Nikola Jokić+3.07-0.20+2.8710,851
5Derrick White+1.80+0.95+2.7510,867
6Chet Holmgren+1.06+1.62+2.687,689
7Jamal Murray+3.03-0.40+2.6410,422
8Victor Wembanyama+0.27+2.02+2.297,985
9Devin Booker+1.70+0.54+2.2410,511
10Luka Dončić+2.36-0.15+2.219,610
11Jarrett Allen+1.59+0.48+2.078,666
12Tyrese Haliburton+1.81+0.12+1.935,732
13Peyton Watson+0.83+1.08+1.906,808
14Nickeil Alexander-Walker+0.88+1.00+1.8810,044
15Sam Hauser+1.64+0.24+1.887,422
16Joel Embiid+0.84+1.01+1.854,472
17OG Anunoby+0.89+0.96+1.859,671
18Jaylin Williams+0.78+1.06+1.844,560
19Kyrie Irving+1.15+0.69+1.844,532
20Isaiah Joe+0.89+0.92+1.816,752
21Neemias Queta+0.80+0.95+1.755,106
22Kon Knueppel+1.55+0.16+1.715,060
23Stephen Curry+2.84-1.14+1.708,328
24Rui Hachimura+1.49+0.20+1.708,190
25Giannis Antetokounmpo+0.99+0.71+1.707,723
26Donovan Mitchell+1.15+0.50+1.659,808
27Anthony Edwards+1.55+0.09+1.6410,861
28CJ McCollum+0.80+0.84+1.649,283
29Luke Kennard+1.86-0.23+1.646,443
30Brook Lopez+1.10+0.54+1.649,124
31Nicolas Batum+0.58+0.95+1.535,848
32Ryan Rollins+0.96+0.56+1.525,884
33Devin Vassell+0.76+0.74+1.509,176
34Donte DiVincenzo+0.23+1.26+1.509,462
35Aaron Nesmith+1.19+0.27+1.466,312
36Naz Reid+0.34+1.09+1.438,948
37Jaylen Brown+1.71-0.29+1.4210,016
38Karl-Anthony Towns+1.46-0.05+1.4110,011
39Coby White+0.87+0.54+1.418,802
40Darius Garland+1.29+0.12+1.417,825
41Julius Randle+1.20+0.21+1.419,829
42Dorian Finney-Smith+0.49+0.90+1.395,508
43Jayson Tatum+0.86+0.52+1.387,129
44Ty Jerome+1.41-0.06+1.352,651
45Oso Ighodaro+0.44+0.88+1.324,922
46Aaron Gordon+0.48+0.80+1.286,188
47Duncan Robinson+0.87+0.41+1.288,459
48Malik Beasley+0.93+0.35+1.285,559
49Damian Lillard+0.43+0.85+1.285,478
50Zach Edey+0.66+0.62+1.282,622
51Ivica Zubac+1.14+0.13+1.278,195
52Bobby Portis+1.24+0.02+1.266,803
53Dean Wade-0.01+1.25+1.245,431
54Hugo González+0.75+0.48+1.232,069
55Marcus Smart+0.45+0.78+1.225,065
56Ryan Nembhard+0.73+0.49+1.222,308
57Christian Braun+0.45+0.76+1.218,091
58Cedric Coward+0.91+0.28+1.203,272
59AJ Green+1.09+0.09+1.187,368
60Rudy Gobert-0.64+1.81+1.1710,395
61Norman Powell+0.57+0.60+1.178,305
62Davion Mitchell+0.25+0.90+1.158,003
63D'Angelo Russell+0.26+0.88+1.145,497
64Zach LaVine+1.12+0.01+1.136,981
65Kevin Huerter+0.68+0.44+1.127,087
66Tobias Harris-0.07+1.18+1.118,984
67Myles Turner+0.78+0.32+1.108,937
68Sam Merrill+0.27+0.82+1.095,718
69Payton Pritchard+1.46-0.37+1.099,594
70Jrue Holiday+0.29+0.80+1.097,942
71Eric Gordon+0.59+0.49+1.083,020
72Paul George+0.76+0.32+1.086,494
73Al Horford+1.08-0.01+1.085,812
74Daniel Gafford+0.04+1.01+1.055,949
75Jimmy Butler III+1.07-0.04+1.036,617
76Pascal Siakam+0.77+0.25+1.0210,357
77Julian Champagnie+0.46+0.56+1.018,798
78Nikola Vučević+0.70+0.31+1.019,485
79Reed Sheppard+0.54+0.45+0.995,142
80Jaren Jackson Jr.-0.47+1.46+0.998,259
81Aaron Holiday-0.08+1.05+0.973,838
82Brandon Ingram+0.74+0.22+0.967,989
83Brandon Miller+0.64+0.32+0.967,395
84Isaiah Hartenstein+0.31+0.65+0.966,355
85Austin Reaves+1.39-0.43+0.969,596
86Aaron Wiggins+0.18+0.78+0.956,518
87Tyrese Maxey+0.09+0.86+0.9510,520
88Moussa Diabaté+0.39+0.55+0.945,350
89Alex Caruso-0.27+1.21+0.945,469
90Jay Huff-0.16+1.10+0.944,642
91Dyson Daniels+0.59+0.34+0.9410,172
92Dereck Lively II+0.49+0.44+0.932,670
93Luguentz Dort+0.66+0.26+0.928,900
94Robert Williams III-0.23+1.15+0.922,615
95Tyler Herro+1.25-0.35+0.907,200
96Naji Marshall+0.29+0.60+0.898,281
97Evan Mobley+0.04+0.85+0.898,702
98Jalen Pickett-0.08+0.96+0.892,568
99Jalen Williams+0.53+0.35+0.887,341
100De'Aaron Fox+0.85+0.03+0.8810,310
101Grant Williams+0.52+0.35+0.874,107
102Herbert Jones+0.22+0.63+0.856,327
103Maxi Kleber+0.67+0.17+0.842,631
104Kristaps Porziņģis+0.22+0.60+0.824,908
105Jose Alvarado-0.39+1.21+0.825,518
106Josh Giddey+0.25+0.57+0.828,680
107Jalen Smith+0.26+0.55+0.814,676
108James Harden+1.31-0.51+0.8011,017
109Desmond Bane+0.76+0.04+0.8010,191
110Jaden McDaniels+0.25+0.55+0.8010,215
111Baylor Scheierman+0.37+0.42+0.793,235
112Ajay Mitchell+0.13+0.67+0.793,821
113Klay Thompson+0.23+0.50+0.728,069
114Jalen Brunson+0.94-0.24+0.7010,778
115Derrick Jones Jr.+0.71-0.04+0.687,060
116Tre Johnson+0.51+0.14+0.662,997
117Karlo Matković-0.37+1.01+0.642,928
118Kenrich Williams+0.55+0.09+0.644,255
119Julian Phillips-0.11+0.75+0.642,800
120Royce O'Neale+0.71-0.09+0.628,805

Points above expected per 100 possessions, on versus off. Same three-season window, same solve, different target. Minimum 2,000 weighted possessions.

Rim lg 1.344Midrange lg 0.873Three lg 1.081
Wembanyama1.209 (−0.135)0.749 (−0.124)1.060 (−0.021)
Gobert1.289 (−0.055)0.799 (−0.074)1.036 (−0.045)
Caruso1.217 (−0.127)0.735 (−0.138)1.050 (−0.031)

Opponent points per attempt with each player on the floor, 2025–26 league baselines in the header. Parentheses show the suppression versus baseline.

Net RAPM

 After running numeric validation, I found that I had somehow built, from first principles, a full reconstruction of pure RAPM. Using my own expected-points measure for shot values, and the conversion above or below those shot values, adding the two regularized adjusted plus-minuses together gives you a number that is 99.99999% equivalent to a pure, no-prior RAPM.

This is the part I am extremely excited for: to my knowledge, this is the first public and open exact decomposition of pure RAPM.

Standard pure RAPM asks what happens to the score: how does net rating change with this player on and off the court?

I take that question and rip it into two further questions. How much does this player change his team’s quantified shot diet? And how much does his presence swing his team’s conversion above or below that shot diet? Essentially, separating regularized adjusted plus-minus into shot-quality impact and conversion impact.

Any RAPM can be split as:
Pure RAPM = expected-points RAPM + (actual − expected) RAPM

The identity requires the same RAPM specification in all three solves: the same stint rows, lineup matrix, stint weights, centering, and ridge penalty. Another researcher can use different stints or a different xPTS model and still recover the same identity inside that specification, as long as conversion is defined as actual points minus expected points and all three solves use the same settings.

The SumxPTS-RAPM + Conversion RAPM = RAPM, exact to the decimal, every player
Jokić+2.65 + +2.87 = +5.52elite at both
Gilgeous-Alexander+0.84 + +4.41 = +5.25conversion carries
Durant−1.73 + +3.08 = +1.35beats his own geometry
shot quality + conversion = net rating impact (RAPM)

And boom: this is the table of both aforementioned RAPMs added together to get the net per-100 RAPM that we all know and love, the one reconstructing net rating. Essentially, what I have done over the past couple of sections is backwards-decompose it.

⚲
#PlayerNet RAPMxPTS-RAPMConversionPure RAPMPoss
1Nikola Jokić+5.52+2.65+2.87+5.5210,851
2Shai Gilgeous-Alexander+5.25+0.84+4.41+5.2510,859
3Kawhi Leonard+4.02+0.94+3.07+4.017,942
4Victor Wembanyama+3.96+1.67+2.29+3.967,985
5Giannis Antetokounmpo+3.86+2.17+1.70+3.867,723
6Derrick White+3.77+1.02+2.75+3.7710,867
7Chet Holmgren+3.40+0.73+2.68+3.407,689
8Luka Dončić+3.17+0.96+2.21+3.179,610
9Rudy Gobert+3.03+1.85+1.17+3.0310,395
10Donovan Mitchell+2.94+1.29+1.65+2.949,808
11Alex Caruso+2.87+1.92+0.94+2.875,469
12OG Anunoby+2.86+1.01+1.85+2.869,671
13Isaiah Hartenstein+2.79+1.82+0.96+2.786,355
14Jimmy Butler III+2.69+1.66+1.03+2.696,617
15Moussa Diabaté+2.67+1.72+0.94+2.675,350
16Amen Thompson+2.59+2.37+0.21+2.5910,091
17Jarrett Allen+2.56+0.50+2.07+2.568,666
18Dyson Daniels+2.52+1.59+0.94+2.5210,172
19Franz Wagner+2.50+2.32+0.17+2.507,064
20Dean Wade+2.49+1.25+1.24+2.495,431
21Neemias Queta+2.47+0.72+1.75+2.475,106
22Aaron Gordon+2.33+1.05+1.28+2.336,188
23Tobias Harris+2.32+1.21+1.11+2.328,984
24Ausar Thompson+2.30+2.27+0.04+2.307,140
25De'Aaron Fox+2.21+1.33+0.88+2.2110,310
26Jayson Tatum+2.14+0.76+1.38+2.147,129
27Marcus Smart+2.13+0.91+1.22+2.135,065
28Bam Adebayo+2.12+1.97+0.15+2.1210,758
29Nickeil Alexander-Walker+2.07+0.19+1.88+2.0710,044
30Kon Knueppel+2.05+0.35+1.71+2.055,060
31Christian Braun+2.05+0.84+1.21+2.058,091
32Jrue Holiday+2.04+0.96+1.09+2.047,942
33Jamal Murray+2.03-0.61+2.64+2.0210,422
34Sam Hauser+1.99+0.11+1.88+1.997,422
35Tari Eason+1.98+1.48+0.50+1.985,423
36Tyrese Haliburton+1.97+0.03+1.93+1.975,732
37Evan Mobley+1.96+1.07+0.89+1.968,702
38Luke Kornet+1.93+1.97-0.03+1.945,565
39Zach Edey+1.85+0.57+1.28+1.852,622
40Duncan Robinson+1.81+0.53+1.28+1.818,459
41Payton Pritchard+1.81+0.72+1.09+1.819,594
42Stephen Curry+1.80+0.10+1.70+1.808,328
43Karl-Anthony Towns+1.80+0.39+1.41+1.8010,011
44Steven Adams+1.79+1.40+0.39+1.792,471
45Donte DiVincenzo+1.77+0.27+1.50+1.779,462
46Brandin Podziemski+1.76+1.79-0.04+1.768,832
47Norman Powell+1.73+0.56+1.17+1.738,305
48Dylan Harper+1.73+1.28+0.45+1.733,099
49Isaiah Joe+1.73-0.09+1.81+1.736,752
50Jonathan Kuminga+1.72+1.16+0.55+1.725,167
51Jaylin Williams+1.71-0.13+1.84+1.714,560
52Julian Champagnie+1.69+0.68+1.01+1.698,798
53Ajay Mitchell+1.67+0.88+0.79+1.673,821
54Austin Reaves+1.65+0.69+0.96+1.659,596
55Anthony Edwards+1.60-0.04+1.64+1.6010,861
56Miles McBride+1.59+1.26+0.34+1.595,470
57Herbert Jones+1.58+0.73+0.85+1.586,327
58Cade Cunningham+1.57+1.71-0.14+1.579,844
59Dereck Lively II+1.56+0.63+0.93+1.562,670
60Fred VanVleet+1.56+1.15+0.41+1.565,475
61Dorian Finney-Smith+1.56+0.17+1.39+1.565,508
62Joel Embiid+1.55-0.30+1.85+1.554,472
63Devin Booker+1.54-0.70+2.24+1.5410,511
64Stephon Castle+1.54+1.15+0.39+1.547,157
65Pascal Siakam+1.53+0.51+1.02+1.5310,357
66LaMelo Ball+1.50+1.18+0.32+1.506,805
67Paul George+1.50+0.42+1.08+1.506,494
68Hugo González+1.49+0.26+1.23+1.492,069
69Jalen Brunson+1.48+0.78+0.70+1.4810,778
70Cason Wallace+1.47+1.07+0.40+1.478,426
71Rui Hachimura+1.42-0.27+1.70+1.428,190
72Paul Reed+1.42+0.86+0.56+1.423,878
73Jalen Smith+1.40+0.59+0.81+1.404,676
74Lauri Markkanen+1.38+0.99+0.39+1.386,875
75Kevin Durant+1.35-1.73+3.08+1.3511,329
76Kevin Huerter+1.35+0.23+1.12+1.347,087
77Sandro Mamukelashvili+1.33+1.34-0.01+1.334,877
78Damian Lillard+1.32+0.05+1.28+1.325,478
79Aaron Holiday+1.30+0.33+0.97+1.303,838
80Jalen Suggs+1.28+1.06+0.22+1.286,599
81Kyrie Irving+1.28-0.56+1.84+1.284,532
82Julius Randle+1.28-0.13+1.41+1.289,829
83Mikal Bridges+1.25+0.77+0.48+1.2512,119
84Sam Merrill+1.25+0.16+1.09+1.255,718
85Ivica Zubac+1.24-0.03+1.27+1.248,195
86Sion James+1.24+0.68+0.56+1.243,554
87Naz Reid+1.20-0.23+1.43+1.208,948
88Mitchell Robinson+1.18+1.39-0.21+1.183,329
89Donovan Clingan+1.18+2.67-1.49+1.186,024
90Wendell Carter Jr.+1.14+0.94+0.21+1.148,298
91Oso Ighodaro+1.14-0.19+1.32+1.144,922
92Davion Mitchell+1.14-0.01+1.15+1.148,003
93Derrick Jones Jr.+1.13+0.46+0.68+1.137,060
94Jalen Duren+1.13+1.48-0.35+1.138,537
95Luguentz Dort+1.12+0.20+0.92+1.128,900
96Collin Gillespie+1.12+0.58+0.53+1.125,301
97Cameron Johnson+1.11+0.70+0.41+1.117,279
98Jalen Williams+1.11+0.22+0.88+1.117,341
99Kenrich Williams+1.10+0.46+0.64+1.104,255
100Josh Okogie+1.10+1.12-0.03+1.104,294
101D'Angelo Russell+1.08-0.05+1.14+1.085,497
102Aaron Nesmith+1.06-0.40+1.46+1.066,312
103Clint Capela+1.05+1.16-0.10+1.055,368
104Desmond Bane+1.02+0.22+0.80+1.0210,191
105Toumani Camara+1.02+1.70-0.68+1.0210,702
106Kris Dunn+1.01+0.74+0.27+1.018,064
107Al Horford+1.00-0.08+1.08+1.005,812
108Malik Beasley+0.99-0.29+1.28+0.995,559
109De'Anthony Melton+0.98+0.65+0.34+0.983,354
110Ja Morant+0.98+0.47+0.50+0.983,737
111Jaylen Brown+0.96-0.46+1.42+0.9610,016
112Brook Lopez+0.96-0.67+1.64+0.969,124
113Ty Jerome+0.96-0.39+1.35+0.962,651
114Kristaps Porziņģis+0.96+0.13+0.82+0.964,908
115RJ Barrett+0.95+0.89+0.06+0.957,883
116Josh Hart+0.94+1.02-0.07+0.9410,369
117Alperen Sengun+0.94+1.23-0.29+0.949,900
118CJ McCollum+0.92-0.72+1.64+0.929,283
119Pelle Larsson+0.91+1.22-0.30+0.914,917
120Jabari Smith Jr.+0.91+0.52+0.39+0.919,932

Pure RAPM is a separate ridge solve on actual points: same stint rows, lineup matrix, weights, centering, and α = 10,000; no priors. Before display rounding, the largest net difference is under 0.000000000024 points per 100 in both windows. Minimum 2,000 weighted possessions.

Three trees2025-26 anchor · every branch sums to the number above it
ClinganClingan
+1.18 (79th)Net RAPM
+2.67 (99th)xPTS-RAPM
−1.49 (3rd)Conversion
+1.57 (99th)off
+1.10 (96th)def
−1.26 (4th)off
−0.23 (27th)def
JokićJokić
+5.52 (99th)Net RAPM
+2.65 (99th)xPTS-RAPM
+2.87 (99th)Conversion
+1.63 (99th)off
+1.02 (95th)def
+3.07 (99th)off
−0.20 (30th)def
DurantDurant
+1.35 (82nd)Net RAPM
−1.73 (2nd)xPTS-RAPM
+3.08 (100th)Conversion
−1.47 (1st)off
−0.26 (31st)def
+3.08 (99th)off
+0.01 (41st)def

Clingan, Jokić, Durant. Elite creation with no conversion; elite at both; elite conversion with no creation. Positive is better on both ends.

It is repeatable with any approach to expected-points shot quality and the conversion above or below it. Price the shots however you like; if you keep the same stints and the same regression, the two halves will reassemble into a healthy RAPM every time.

ValidationAgreementPlayers
xPTS-RAPM + Conversion RAPM vs pure RAPMr = 0.9999999802
Net RAPM vs xrapm.com’s pure three-year RAPM, independent, no priorsr = 0.90251
Net RAPM vs ARC Impact, 3yr, light box priorr = 0.95364
Net RAPM vs a single-season RAPM, separate pipeliner = 0.85262

Pure RAPM: same stints, same weights, same α, actual points as the target, no priors. The external rows are separately built metrics from different pipelines.

Net RAPM percentilexrapm.com percentile
Jokić99th99th
Wembanyama99th99th
Dončić98th96th
Gobert98th94th
Brunson84th85th
Durant82nd90th
Şengün72nd89th
Portis29th38th
LaVine19th35th
Kuzma1st4th
Carrington1st0th

League percentile in each system’s own qualified pool: this paper’s Net RAPM against xrapm.com’s pure, no-prior, three-year RAPM. Two independent solves, different code, different ridge settings, a mean gap of about five percentile points top to bottom.

Some caveats on xPTS-RAPM specifically: the health of the final number depends on the health of the inputs, the stints, and the math itself. And the match is to pure RAPM under the same specification; this is a three-year, recency-weighted solve, so it will not line up one-for-one with public boards built on other windows or priors. It does, though, match closely in leaderboard and rankings to my own impact metric, ARC Impact, a lightly box-priored RAPM, at 0.95. And against the closest public analogue, xrapm.com’s pure no-prior three-year RAPM, it agrees at a rank correlation of 0.91; they grade Durant at +1.8 to my +1.35, two independent pure solves telling the same story.

Everything Built Here

xPTSExpected point value of each field goal and free throw attempt, priced against league average.
The bin
1.77alley-oop · rim · halfcourt
1.09catch-and-shoot three · left wing
0.69contested pull-up · 20 ft
A game, priced
Cleveland CavaliersCLE
108–121Final · ECF Game 3 · May 23, 2026
NYKNew York Knicks
109.4 Expected pointsxPTS 103.3
43.4…from three-point attempts29.0
39.8…from shots at the rim36.6
11.2…from midrange16.6
14.9…from free throws21.1
84Field goal attempts77
41Three-point attempts28
19Free throw attempts27
108Actual points121
−1.4Finishing (points − xPTS)+17.7

Every field goal attempt priced by the 2025–26 league bin table; every free throw at the league rate of 0.78. Play-by-play context approximated from public data.

Total xPTSThe player currency: xPTS scored plus xPTS created, summed into X Score.
⚲

#
Player
Scored
Created
X Score
Actual
Shots
Personal-baseline xPTSThe same pricing computed from a player’s own history in each bin.
Stephen Curry
Stephen CurryPast five seasons · priced against his own five-year baseline, his average expected value from his own shot bins, 2021–22 through 2025–26
Pull-up three, 26–28 ft, center1.27 vs 1.01
Pull-up three, 26–28 ft, right wing1.23 vs 1.01
Catch-and-shoot three, 26–28 ft, right wing1.27 vs 1.07
Catch-and-shoot three, 24–26 ft, right wing1.28 vs 1.09
Free throws.923 vs .781
Curryleague average · expected points per attempt, five-year sample, 100+ attempts per bin
+18.6 above himself
56 pts on 37.4 self-expected
GSW vs ORL · Feb 28, 2025
−16.9 below himself
14 pts on 30.9 self-expected
GSW vs DAL · Jan 6, 2022
Expected WinsEach game awarded to the team that generated more net xPTS.
NBA 2025-26 · Expected Wins
#
Team
Exp Wins
Actual Wins
Exp Pts
Actual Pts
Exp Allowed
Actual Allowed
Net x
Net
xPTS-RAPMA two-sided ridge regression measuring how a player changes the expected value of each shot.
⚲
#PlayerOffDefNet xPTS-RAPMPoss

Three-season window anchored on the season shown, weighted 100 / 70 / 49%. Expected points per 100 possessions. Minimum 2,000 weighted possessions.

Conversion RAPMThe same regression on points scored above expected.
⚲
#PlayerOffDefNet Conversion RAPMPoss

Points above expected per 100 possessions, on versus off. Same three-season window, same solve, different target. Minimum 2,000 weighted possessions.

Net RAPMxPTS-RAPM plus Conversion RAPM, which reconstructs pure RAPM exactly.
⚲
#PlayerNet RAPMxPTS-RAPMConversionPure RAPMPoss

Pure RAPM is a separate ridge solve on actual points: same stint rows, lineup matrix, weights, centering, and α = 10,000; no priors. Before display rounding, the largest net difference is under 0.000000000024 points per 100 in both windows. Minimum 2,000 weighted possessions.

Two trees2025-26 anchor · every branch sums to the number above it
Donovan ClinganClingan
+1.18 (79th)Net RAPM
+2.67 (99th)xPTS-RAPM
−1.49 (3rd)Conversion
+1.57 (99th)off
+1.10 (96th)def
−1.26 (4th)off
−0.23 (27th)def
Nikola JokićJokić
+5.52 (99th)Net RAPM
+2.65 (99th)xPTS-RAPM
+2.87 (99th)Conversion
+1.63 (99th)off
+1.02 (95th)def
+3.07 (99th)off
−0.20 (30th)def

Clingan and Jokić, decomposed. Same elite chance creation, opposite conversion. Positive is better on both ends.

Caveats

  • The 2015–16 work is unfinished. The leak gave me roughly 25% of that season’s defender-distance data, 295 of 1,230 games. Everything built on it is a projected sample, not a season.
  • The main formulation has no defender distance. The 707-bin engine captures about 77% of the value found in defender distance. I lose roughly 23% of real shot-quality information, at the lowest. My xPTS is unfinished until I get real defender-distance data. Treat this as a working proof of concept.
  • The bins are trained per season. Each season’s 707 bins use that season’s shots only, shrunk toward the parent zone, recomputed every year. Free throws price at the season’s league rate, not the player’s own.
  • This is shots only, not full EPA. There is no passing value in the quantification. xPTS is expected points per shot attempt.
  • The collinearity problem persists, even in xPTS-RAPM. Teammates who always share the floor are hard to separate. Some players carry credit that belongs to their lineups. 2,000 weighted possessions is a floor, not a cure.
  • Descriptive, not predictive. Chance creation does not out-predict actual results in basketball. xPTS and its RAPMs are context for how value is created, not a forecast.

Sources & Data

Plus-minus lineage Dan Rosenbaum / Adjusted Plus-Minus (2004) — 82games.com
Joseph Sill / Regularized Adjusted Plus-Minus — MIT Sloan Sports Analytics Conference (2010)
Shot-quality prior art Cervone, D’Amour, Bornn & Goldsberry / EPV — MIT Sloan (2014)
Second Spectrum / qSQ & qSM — proprietary
Williams, Schliep, Fosdick & Elmore / EPAA — arXiv 2405.10453 (2024)
Soccer xG Understat / xG data and league tables — understat.com
The 75–80% figure is consistent with this paper’s own five-season computation (R² 0.78–0.89, table above)
External validation xrapm.com / pure no-prior three-year RAPM — xrapm.com
Data NBA play-by-play — NBA.com public data feeds
2015–16 defender-distance tracking — the publicly leaked SportVU sample, 295 of 1,230 games
All other computation is original.

Related Work

Other LUMA papers Introducing ARC: The Adjusted Regularized Contribution NBA Impact Model — the impact metric Net RAPM is validated against in this paper
Modeling College Basketball Impact: Introducing C-ARC — the same impact framework, rebuilt for the collegiate game

Is this thing on? #NeverBooz

Related

  • xPTS-RAPM — the expected-points model on the RAPM design
  • Shot quality and shooting channels in the ARC decomposition
  • NBA ARC player impact leaderboard
  • ARC — the impact model xPTS feeds
  • Glossary — xPTS, POE, true shooting, shot quality
  • All LUMA papers