The Fantasy Basketball Encyclopedia

Projections

Projection engine defects and corrections

Two defects in the encyclopedia's build script corrupted the ratio categories and the points board; both are diagnosed here with the code, the blast radius, and the repair.

Up: 2026-27 Fantasy Basketball Encyclopedia

Related: 2026-27 volume-corrected nine-category board Β· 2026-27 fantasy basketball projection methodology Β· 2026-27 points-league rankings Β· 2026-27 fantasy basketball rankings Β· Points leagues versus category leagues Β· Category correlations and roster construction Β· 2026-27 fantasy basketball evidence and confidence policy

Defect 1 β€” fabricated shot volume

Data/build_encyclopedia.py computes the two ratio-category impacts like this:

python fga = row.get("fga") or max(1.0, pts / 2.15) fta = row.get("fta") or max(0.5, pts / 4.8) row["fg_impact"] = (float(fg) - 0.472) * float(fga) if fg is not None else 0.0 row["ft_impact"] = (float(ft) - 0.780) * float(fta) if ft is not None else 0.0

The or clause fires whenever a dossier failed to state attempts, which is 429 of 549 players β€” 78 per cent of the encyclopedia, and 160 of the top 200. For those players the FG% and FT% impact terms were computed against a number derived from points scored rather than from any observed shooting.

This is not a rounding problem. In nine-category leagues the percentage categories are ratio categories, and a player's contribution is

\[\text{impact} = \text{attempts} \times (\text{pct} - \text{league pct})\]

so the attempts term carries half the information. Fabricating it corrupts two of the nine categories for four fifths of the player pool.

The failure is also biased rather than noisy. Free-throw volume is a function of how a player draws fouls, not of how many points he scores, so pts / 4.8 systematically understates rim-pressure players and overstates jump shooters:

Player Proxy FTA Real 2025-26 FTA Error
Giannis Antetokounmpo 5.8 11.6 proxy priced his .665 FT% at half its true cost
Trae Young ~4.6 8.1 proxy underpriced his .875 benefit
Payton Pritchard ~6.5 1.6 proxy paid for four times the volume he actually shoots
Dyson Daniels ~4.0 1.5 proxy over-penalised a bad percentage on trivial volume

Repair

Real 2025-26 per-game attempts were recovered for 262 players and projected forward by scaling free-throw rate with minutes, then solving field-goal attempts from the scoring identity so the shot profile reproduces projected points exactly. The method, the validation, and the resulting board are in 2026-27 volume-corrected nine-category board; the script is Data/recompute_corrected.py.

Result: 132 of 262 players move five or more slots, 53 move ten or more, 9 move twenty or more.

Defect 2 β€” the points model does not match its own documented formula

The same script computes:

python row["points_score"] = ( pts + 1.2 * reb + 1.5 * ast + 3.0 * stl + 3.0 * blk + 0.5 * three_pm - tov )

2026-27 points-league rankings documents its formula as

\[\mathrm{FP/G} = \mathrm{PTS} + 1.2\,\mathrm{REB} + 1.5\,\mathrm{AST} + 3\,\mathrm{STL} + 3\,\mathrm{BLK} - \mathrm{TO}\]

and attributes it to Yahoo's default points settings. There is no 3PM term in the documented formula, and Yahoo's own settings documentation confirms that three-pointers are not scored separately in default points leagues β€” they are already inside the points total. The published board therefore ranks players by a formula its own note does not describe.

The + 0.5 * three_pm term double-counts three-point shooting and, like defect 1, biases in a predictable direction:

Effect Players Example moves
Inflated volume three-point shooters Tim Hardaway Jr 188 β†’ 202, Miles McBride 187 β†’ 199, Isaiah Joe 183 β†’ 193
Deflated non-shooting bigs Isaiah Hartenstein 119 β†’ 107, Mark Williams 120 β†’ 108, Ivica Zubac 71 β†’ 63, Rudy Gobert 103 β†’ 95

51 players move five or more slots and 6 move ten or more when the term is removed. Ranks shown are as-built β†’ as-documented.

Repair

Data/recompute_corrected.py drops the term, so corrected_points_rank reflects the documented Yahoo formula. Anyone in an ESPN points league should not use either version without reading Points leagues versus category leagues first β€” ESPN's default scores FGM, FGA, FTM and FTA, which changes player values far more than this correction does.

What is not fixed

Both repairs touch scoring only. Everything upstream is inherited unchanged:

Why this pattern matters beyond these two bugs

Both defects share a shape worth naming, because it will recur in any LLM-built statistical artifact: the code silently substituted a plausible value for a missing one, and the prose downstream described the output as though the value had been observed. The proxy was mentioned in a caveat, but a caveat that says "proxy volume in those cases" reads very differently from "78 per cent of the board's ratio categories are computed from a number we made up."

The lesson for 2026-27 fantasy basketball evidence and confidence policy is that a missing input should propagate as a missing output, not as a default. A player with no recoverable attempts data should be flagged as unrankable in the ratio categories rather than silently assigned a rank.

Open questions