How Scout. works
What the number means
Scout Value is our estimate of how many points of scoring margin a player adds over a full season, compared with a replacement-level player (the kind of player any team can sign for free). A value of 250 means we estimate his team outscores opponents by about 250 more points across 82 games than it would with a replacement in his minutes.
It's a value for today, based on everything known now. Like a share price, it reflects what's known. Breakouts, slumps and trades are what it can't know yet.
It's measured relative to his teammates, so players on very strong teams can be slightly understated. It isn't yet adjusted for the strength of opponents. Both are on our list to improve.
How it fits together
For every past season, work out what each player was actually worth: points of scoring margin over a replacement player.
These are the answers.
Look at what we knew about those players beforehand, and find the weights that best predict their answers.
Learned from 4,054 player-seasons.
Apply the same rule to every player's numbers now. The result is his Scout Value, updated after every game.
This is the number on the site.
Use the rule to predict seasons it never saw, and compare with Stage 1's answers. It gets about two-thirds of the way to the best accuracy possible.
The rest is luck nobody can predict.
Everything else on this page is detail on one of these stages: what counts as value (stage 1), which factors earn a weight (stage 2), and how today's inputs are built (stage 3).
]What goes into it
| Factor | What it measures |
|---|---|
| Performance | Box score production plus lineup impact, at both ends of the floor. Defence counts. |
| Minutes | How much his coach trusts him. |
| Efficiency | True shooting percentage. |
| Load × efficiency | Carrying a big offensive load efficiently. Volume alone isn't rewarded. |
| Playoff games | A small edge for players who go deep in the playoffs. |
| Availability | The share of games he played in the last year. |
| Age | Younger players hold value better. It's a straight line, with no hand-drawn curve. |
How the weights were chosen
Not by us. Every weight was learned from eleven seasons of NBA data (2015 to 2026), by asking what actually predicts a player's value the following season. The rules were fixed before seeing any results:
- Learn on older seasons, then test on seasons the model has never seen.
- Any factor whose effect can't be told apart from zero gets zero weight.
- Every judgement call is written down and published.
What we tested and threw out
Team win %, championships, clutch stats, usage on its own, special "young players leap" or "old players fall off a cliff" curves, and tracking-based defence stats. None of them held up once a player's own impact was known. Rings are a team achievement, and the index measures what you add. Rebounds and blocks are being re-tested with more seasons and with offensive and defensive rebounds counted separately.
How good is it?
On seasons it never saw, it captures about two-thirds of what's realistically predictable about a player's next season. The rest is injuries, trades, role changes and luck, which nobody can forecast.
The maths, explained simply
Three stages: 1. decide what "value" means, 2. learn from history what predicts it, 3. apply that to today's players.
Stage 1: what "value" means, using one game
The Knicks beat Boston 110–100, so the team margin is +10.
Brunson plays 36 of the 48 minutes. While he's on the court, the Knicks win those minutes by 15.
Compare him with his own team. If he were just an average Knick, he'd collect his share of the +10: 36 of 48 minutes is 75%, so +7.5. He actually got +15, so he was +7.5 better than his team's average.
Compare him with the player who'd replace him. If Brunson didn't play, his minutes would go to someone a team could sign for free. Those players typically come out at about −1.4 over 36 minutes, a little worse than average. So Brunson was worth 7.5 − (−1.4) = +8.9 points more than a replacement in that game.
Add up the season. Do that for every game he plays and add them up. A game he misses counts as 0, which is the same as a replacement filling in, so injuries cost him exactly what they cost his team.
Why compare with a replacement rather than an average player? Otherwise half the league would be worth "less than nothing", and a player who stays healthy all season would count the same as one who's injured all season.
Stage 2: learn from history
We did Stage 1 for 4,054 past player-seasons, so we know what each player was actually worth. Then we asked: looking only at the two seasons before, what predicted that? The answer is a set of weights, one per factor.
The factors are in different units (points, minutes, years), so each one is counted in steps from a typical rotation player. A step is just how far players usually sit from average. For age, it's about 4 years.
A simple example with two factors. History says:
• a typical rotation player is worth about 50 · each step better on performance adds about 26 · each step older takes away about 12
A player 2 steps better than typical, and 1 step younger: 50 + (2 × 26) + (1 × 12) = 114.
It's like valuing a house: learn from past sale prices what size and location are worth, then value any house from its size and location alone.
Stage 3: today's players
The real model is the same, with 8 factors. Here's Shai Gilgeous-Alexander's breakdown as of 3 Nov 2026:
| Factor | Points |
|---|---|
| A typical rotation player (the starting point) | 48.7 |
| Performance (he's nearly 5 steps above typical) | +126.0 |
| Minutes | +38.2 |
| Usage × efficiency | +34.7 |
| Playoff games | +14.4 |
| Usage | +9.0 |
| Shooting efficiency | +7.8 |
| Availability | +2.8 |
| Age (28 is close to typical) | −0.2 |
| Scout Value | 281.4 |
Every player page shows this same breakdown, so you can see exactly why anyone is ranked where they are.
For the analysts: the maths
Notation: player \(i\), game \(g\), season \(t\). All inputs use only data available before the period being predicted.
1. The target: value above replacement
$$r_{ig} = PM_{ig} - \frac{MIN_{ig}}{48}\cdot\frac{1}{5}\sum_{j \in \text{team}} PM_{jg}$$ $$y_{i,t} = \frac{82}{G_t}\sum_{g \in t}\left( r_{ig} - \rho\,\frac{MIN_{ig}}{36} \right)$$\(\rho \approx -1.36\) is the replacement rate (average relative +/- per 36 minutes of players outside the top 360 by minutes), and \(G_t\) is the number of regular-season games in season \(t\). Relative +/- sums to zero within a team, so the target is measured against teammates.
2. Box production
$$P_{ig} = PTS + 0.5\,AST + 2.1\,STL - 1.0\,TOV - 0.8\,FGA - 0.4\,FTA$$ $$\text{box}_i = \frac{36}{\sum MIN_{ig}}\sum_g \left( P_{ig} - \pi\,\frac{MIN_{ig}}{36} \right)$$\(\pi\) is replacement-level production per 36 minutes (≈ 5.0). Because inputs are later standardised, \(\pi\) does not affect the model; it only makes the box number readable on its own.
3. Lineup impact (RAPM)
$$\hat\beta = \arg\min_\beta \sum_\ell w_\ell\,\big(y_\ell - x_\ell^{\top}\beta\big)^2 + \lambda\lVert\beta\rVert^2, \qquad w_\ell = \text{possessions},\ \lambda = 4000$$ $$y^{\text{off}}_\ell = ORtg_\ell - \overline{ORtg}, \qquad y^{\text{def}}_\ell = \overline{DRtg} - DRtg_\ell$$Lineups with 10+ possessions; two completed seasons plus the current season so far, refreshed weekly from date-limited snapshots. RAPM is measured against an average player; the baseline is removed by standardising.
4. Standardising
$$z(x_i) = \frac{x_i - \mu_{\mathcal{P}}(x)}{\sigma_{\mathcal{P}}(x)}$$against the pool \(\mathcal{P}\) of players with 500+ minutes in the window.
5. Performance
$$\text{perf}_i = 0.55\,z(\text{box}_i) + 0.25\,z(\text{ORAPM}_i) + 0.20\,z(\text{DRAPM}_i)$$From full-data estimates of 0.531 / 0.228 / 0.205 per SD, rescaled and rounded to 5%.
6. Shooting and usage
$$TS_i = \frac{PTS}{2\,(FGA + 0.44\,FTA)}, \qquad USG_i = \frac{(FGA + 0.44\,FTA + TOV)\cdot \tfrac{TmMIN}{5}}{MIN\cdot(TmFGA + 0.44\,TmFTA + TmTOV)}$$7. The value
$$V_i = \beta_0 + \sum_k \beta_k\, z_{ik}$$Ridge regression (\(\lambda = 1\)) of next-season value \(y_{i,t+1}\) on standardised inputs: performance, minutes per game, availability, age, playoff games, true shooting, usage, and \(z\big(z(USG_i)\cdot z(TS_i)\big)\). Usage alone fails the zero rule and is kept only as part of its interaction. Current weights (points per SD), loaded from the published model file:
| Loading weights… |
Price = \(V_i\) at $1 per point. Players with \(V_i \le 0\) are not listed.
8. Which factors are kept
$$\text{keep } k \iff 0 \notin \big[\,q_{0.025}(\hat\beta_k^{(b)}),\; q_{0.975}(\hat\beta_k^{(b)})\,\big]$$Player bootstrap, \(B = 200\), seed 0. Cut-offs (e.g. age knots) are tested at neighbouring values; a verdict that flips is not robust.
9. How good it can get
$$\rho_{\text{season}} = \frac{2\,r_{\text{half}}}{1 + r_{\text{half}}}, \qquad \text{ceiling} = \sqrt{\rho_{\text{season}}} \approx 0.77$$Odd/even split-half reliability. The model reaches 0.52 on unseen seasons, about 68% of the ceiling.
10. Daily updates and movers
Day \(d\) uses games in \((d - 730\text{ days},\, d]\), availability over the last 365 days, and fixed weights.
$$\Delta V_i = \sum_k \beta_k\,\big( z_{ik,d} - z_{ik,d-7} \big)$$11. Plays like him
$$w_m = \operatorname{corr}\big(m_{t},\, m_{t+1}\big)^2, \qquad v_i = z_i \odot \sqrt{w}, \qquad \text{sim}(a,b) = 100 \cdot \frac{v_a \cdot v_b}{\lVert v_a\rVert\,\lVert v_b\rVert}$$13 standardised style stats, each weighted by its season-to-season repeatability. Similarity measures style, not quality.
What it doesn't do yet
- Rookies: listed automatically once they pass 500 NBA minutes. A draft-position model is in progress.
- Opponents and teammates: not yet fully adjusted for opponent strength or very strong teammates.
- Long-term upside: it values who a player is today, not who he might be in three years.
Locked and verifiable
The opening 2026-27 values were frozen on 31 Oct 2026. Their fingerprint (SHA-256) is:
cc5b285014539d2fc1bd2963c48e59c42f988f8446c9d365caa1382e8e06e58b
In June we'll publish the file and score it against what actually happened. Anyone can check the fingerprint matches, so the values can't have been changed after the fact.
Think we're wrong?
Good. Open any player and hit Too high or Too low. We read every response.