The Fantasy Basketball Encyclopedia

Strategy

Reading projections and disagreement

Almost every apparent disagreement between projection sources is a disagreement about minutes and games, not about basketball ability, and you cannot see that until you normalise the exposure terms away.

Up: 2026-27 Fantasy Basketball Encyclopedia

Related: 2026-27 fantasy basketball projection methodology · 2026-27 fantasy basketball player projections · 2026-27 NBA minutes projections · 2026-27 fantasy basketball rankings · 2026-27 category rankings · 2026-27 points-league rankings · 2026-27 fantasy basketball tiers · 2026-27 fantasy basketball evidence and confidence policy · 2026-27 projection uncertainty ledger · Using projection disagreement in fantasy basketball · 2026-27 fantasy basketball injury and availability ledger · 2026-27 sleepers, breakouts, and fades

1. The anatomy of a projection

Every season-long projection is the same three-factor product. For player \(i\) and counting stat \(s\):

\[ T_{is} \;=\; \underbrace{G_i}_{\text{games}} \times \underbrace{M_i}_{\text{minutes per active game}} \times \underbrace{r_{is}}_{\text{stat per minute}} \]

The published per-game line is \(M_i r_{is}\). The vault uses exactly this decomposition — see 2026-27 fantasy basketball projection methodology, which writes it as \(T_i = G_i \times M_i \times r_i\).

Take logs and the product becomes additive, which is what makes disagreement diagnosable:

\[ \ln T_{is} = \ln G_i + \ln M_i + \ln r_{is} \]

Two sources' ratio on a stat therefore decomposes cleanly into a games gap, a minutes gap, and a rate gap. Any source pair can be audited this way in about ninety seconds, and the answer is nearly always the same: the rate term is tiny.

2. Why the edge lives in minutes

The empirical case is strong and it comes from outside fantasy. Franks, D'Amour, Cervone and Bornn scored 70 NBA metrics on discrimination (fraction of between-player variance within a season that is real rather than chance) and stability (fraction of variance, after removing sampling noise, that is between players rather than within a player across seasons), using all Basketball-Reference player-seasons from 2000 onward (Meta-Analytics, JQAS 12(4):151–165, arXiv:1609.09830).

Their Figure 2 makes the point that matters here. Values below are read off that scatterplot and are approximate to about ±0.03:

Metric Discrimination Stability Reading
FT% ~0.66 ~0.98 Most stable thing on the chart
STL% ~0.72 ~0.95 Stable rate; noisy in short samples
BLK%, TRB%, AST% ~0.88–0.97 ~0.90–0.97 Position-linked, highly reliable
3PAr (3PA share) ~0.93 ~0.85 Shot diet is a skill; shot result isn't
FG%, TOV% ~0.66 ~0.85 Middling both ways
USG%, PTS ~0.88 ~0.78 Role-dependent
MPG ~0.93 ~0.62 Least stable per-game quantity
MP (total minutes) ~0.93 ~0.42 Least stable metric on the chart
3P% ~0.40 ~0.31 Least discriminative and least stable

Total minutes played is the single least stable quantity they measure, and per-game minutes is not much better. The paper states the mechanism directly: metrics based on total minutes are highly discriminative but less stable, whereas per-minute metrics are less discriminative but more stable, because injuries hit totals hard and per-minute rates barely at all.

That asymmetry is the whole thesis. If per-minute rates are ~0.9 stable and minutes are ~0.4–0.6 stable, then in the identity \(T = G \times M \times r\), essentially all of the forecastable variance you can win or lose sits in \(G\) and \(M\). A source that nails Alperen Şengün's per-36 line and misses his minutes by four is far more wrong than one with the reverse error.

Two practical corollaries:

The availability half is not pure chance either. Peer-reviewed work finds minutes per game and later-season games are the primary risk factors for season-ending NBA injuries (Arthroscopy, 2024) — note the loop, since heavy minutes are simultaneously the thing that generates value and the thing that consumes availability. Unverified: summaries of that paper report roughly +2.9% injury odds per 96 minutes played and −16% per day of rest; the abstract 403s on retrieval, so treat those two figures as unconfirmed.

3. Why sources disagree

Axis Typical spread between public sources Effect on the line
Games played 8–15 GP on any injury-flagged star Scales the total line; leaves per-game untouched
Minutes allocation 2–5 MPG on any contested rotation slot Scales everything, per-game and total
Regression strength to career mean Weak vs strong shrinkage on FG%/3P%/STL/BLK Mostly moves ratio categories and defensive counts
Injury risk baked into per-game rates Some sources silently haircut MPG for risk Double-counts risk if you then also discount GP
Population and format 10 vs 12 team, 9-cat vs points, per-game vs totals Changes rank, not the projection

The fourth row is the one that catches people. If a source publishes a "healthy" per-game line and a separate GP estimate, and another source publishes a risk-adjusted MPG and a GP estimate, subtracting one from the other double-charges the risk. The vault avoids this by construction — 2026-27 NBA minutes projections separates Active MPG (workload conditional on occupying the role) from Weight (the availability/rotation factor), and only their product sums to 240.

4. Normalise before you conclude anyone disagrees

Worked example. Two sources on Alperen Şengün (illustrative source lines; the vault's own base is 70 GP / 32 MPG / 20.5–8.6–5.8):

GP MPG PTS REB AST
Source A 76 33.5 21.8 9.2 6.1
Source B 68 30.8 20.0 8.5 5.6

A projects 9% more points per game and 22% more season points. That reads as a real disagreement. Now convert both to per-36:

\[ \text{per-36} = \text{per-game} \times \frac{36}{\text{MPG}} \]

Per 36 min PTS REB AST
Source A (\(\times 36/33.5 = 1.0746\)) 23.43 9.89 6.56
Source B (\(\times 36/30.8 = 1.1688\)) 23.38 9.94 6.55

They agree to within 0.2%. There is no basketball disagreement at all. Decompose the season-points gap in logs:

\[ \ln\!\frac{1656.8}{1360.0} = 0.1974 \quad=\quad \underbrace{\ln\tfrac{76}{68}}_{0.1112} + \underbrace{\ln\tfrac{33.5}{30.8}}_{0.0840} + \underbrace{\text{residual}}_{0.0022} \]

So 56% of the gap is games, 43% is minutes, 1% is rate. The correct response is not to average the two projections. It is to form your own view on Şengün's games and rotation minutes, then apply the (agreed) per-36 line. Averaging would blend two exposure assumptions you are perfectly capable of adjudicating yourself.

Normalisation checklist, in order: same information date → same GP → same MPG → per-36 → same scoring format → same league size → same per-game vs totals convention. Only what survives all seven is real disagreement.

5. Which stats regress, and how hard

Reliability results worth carrying into the draft room:

Stat Stabilises at Source
3P% ~750 3PA for reliability 0.7 (KR-21, seven seasons) Blackport, Nylon Calculus 2014
3P% (padding method) padding constant ≈ 242 3PA Medvedovsky 2020
Plus/minus >1,000 league-average possessions Medvedovsky 2020
Minutes smallest padding constant of anything tested Medvedovsky 2020
FT% highest season-to-season stability of 70 metrics (~0.98) Franks et al. 2016
AST%, TRB%, BLK% stability ~0.90–0.97 Franks et al. 2016

The 3P% numbers deserve care because the two methods answer different questions. Blackport asks when a single season's 3P% is a trustworthy standalone estimate and gets ~750 attempts — a bar essentially nobody clears, since the single-season record was 678 at the time of writing. Medvedovsky asks how much league-average ballast to add to an in-season sample to best predict the rest of the season, and gets 242. Both are correct; the first is a purity standard, the second an operating rule.

Practically: a player with 180 3PA at 41% should be treated as roughly \(\frac{0.41 \times 180 + 0.365 \times 242}{180+242} \approx 38.3\%\), not 41%. Franks et al. found that over 50% of between-player variation in single-season 3P% is chance, and that empirical-Bayes shrunk 3P% ("3P% EB") beats raw 3P% on both stability and discrimination — the shrinkage is not conservatism, it is a strictly better estimator.

The steals/blocks case is subtler than the folklore. Franks et al. put STL% stability at ~0.95 and BLK% higher still — these are stable skills. What is noisy is a small sample of them: a 20-game stretch of 1.8 STL from a career 1.0 defender is noise, but a career 1.8 defender projects 1.8 next year with high confidence. Do not confuse "regress the sample" with "regress the player." The same distinction applies to FG% on low volume, where the sample is thin and the player's true rate is quite knowable from role and shot diet (3PAr is ~0.85 stable — shot selection is a genuine skill).

6. Four different objects that get confused

Object What it is What it is not
Projection An estimate of an outcome: 68 GP, 35.0 MPG, 22.8 PTS Not a claim about draft order
Ranking A projection pushed through a declared format, population and horizon Not a projection; not invertible
ADP A description of acquisition behaviour — what a room will do Not anyone's opinion of value
Take An analyst's judgment, often about a single mechanism Not a board

2026-27 fantasy basketball evidence and confidence policy already codifies this separation. The specific error to avoid is treating a ranking as a projection. A ranking is a lossy, non-linear, non-invertible transform: it destroys the size of gaps, and the size of the gaps is the entire content. When someone says "Source X has him 40th," you have learned almost nothing until you know whether 40th on that board is 0.05 z-units or 1.0 z-units from 30th.

7. Why averaging ranks is worse than averaging values

Rank is the survival function of value across the pool: \(R(v) = N\,[1 - F(v)]\). Because \(F\) is nonlinear, \(\overline{R(v)} \neq R(\bar v)\) except by accident. Averaging ranks implicitly weights each source by the local density of players, which has nothing to do with basketball.

The vault's own board shows how extreme the nonlinearity is. From Data/player-projections-2026-07-18.csv (262 ranked players, 9-cat per-game z):

Rank band z at top z at bottom Δz Δz per rank slot
1–10 14.485 6.422 8.062 0.8958
10–20 6.422 5.520 0.902 0.0902
20–30 5.520 4.343 1.177 0.1177
30–40 4.343 3.299 1.045 0.1045
40–50 3.299 2.812 0.486 0.0486
50–60 2.812 2.612 0.201 0.0201
80–100 1.714 0.654 1.060 0.0530
120–150 0.061 −0.970 1.030 0.0343

One rank slot in the top ten is worth about 45 times one rank slot in the fifties (\(0.8958 / 0.0201 = 44.6\)). A source moving a player from 12th to 22nd is making a large claim; a source moving him from 52nd to 62nd is making almost none. Rank-averaging treats those two moves as identical.

Worked example. Three sources place a player at ranks 72, 22 and 12. Using the vault board's own value at those slots — 2.064 (Şengün's), 5.342 (Jalen Johnson's), 6.210 (Haliburton's):

A seven-slot gap, more than half a round in a 12-team draft, produced purely by the choice of averaging operator. The rank-average is dragged down because rank 72 sits in the dense middle of the board where ranks are cheap; in value terms the dissenting source is only about 3.3 z below the other two, but in rank terms it is 50 slots away.

Rule: convert every source to a value scale, average there, then re-rank once at the end. If a source publishes only ranks, invert them through your board's value curve before averaging — that at least assumes your gap structure rather than their pool density.

The one honest defence of rank-averaging is calibration: cardinal outputs from different systems are on incompatible scales, and ordinal data can outperform badly-calibrated cardinal data. The answer is to fix the calibration — z-standardise each source over a common population before averaging — not to throw away the gaps.

8. Draft-season protocol

  1. Freeze the vault board as the prior. 2026-27 fantasy basketball rankings plus the underlying 2026-27 fantasy basketball player projections are yours; they carry a stated cutoff and a stated contract. Note the board's own warning: the totals column is a \(\sqrt{GP/82}\) proxy, not a true totals rank, so do not use it as one.
  2. Pull public sources only where they can beat you. They cannot beat you on per-minute rates. They can beat you on fresh camp minutes reports and medical updates. Feed those into \(G\) and \(M\), not into \(r\).
  3. Never aggregate a source whose format you cannot restate. ESPN's early list is points-league; the Rotoworld mock was 10-team 8-cat. Those cannot be averaged into a 12-team 9-cat board without re-deriving from the projections underneath. 2026-27 fantasy basketball rankings already excludes them from numerical aggregation for exactly this reason.
  4. Decide format first. Points leagues reward volume and are nearly indifferent to FG%/FT% shape; 9-cat prices ratios, turnovers and defensive counts heavily. The same projection produces materially different boards — Jalen Johnson is 9-cat #22 but points #8 on the vault's own model, a 14-slot swing driven by 3.3 turnovers. Averaging across formats is not aggregation, it is noise injection.
  5. Compare against ADP last, and never average it in. ADP is a price, not an opinion. Your edge is the difference between your value and the market's price; averaging the two deletes the edge you just built.
  6. Keep a disagreement log, not a consensus number. For every player where you and the field differ by more than ~15 slots, record which of \(G\), \(M\), or \(r\) the disagreement lives in, and what specific observation would flip you. 2026-27 projection uncertainty ledger is the template: decisive recheck, not vibes.

Open questions