← Model Journal/
Model Update

374 features. Real contract data. 80.0% overall. Here's what changed.

4 June 2026v27.1
v27.1 · 374 features · 14 layers

27 new features. Three miss clusters addressed.

v27.1 adds 27 new features across two new passes of Layer 14 — directly addressing the three miss clusters identified in our multi-season post-mortem. The improvement is modest but consistent: 6 of 9 categories improved, no significant regressions, and 80.0% overall for the first time.

374
Total features
14 layers
27
New Layer 14 features
v27.1 additions
459
Players with contract data
2026 season
Accuracy comparison · v27.0 vs v27.1

6 of 9 categories improved. No significant regressions.

Categoryv27.0v27.1Change
PTS79.3%79.7%+0.4pp
REB80.3%80.9%+0.6pp
AST76%75.8%-0.2pp
STL75.9%76.4%+0.5pp
BLK68.2%68.5%+0.3pp
3PM73.8%73.8%flat
FG%93.9%93.9%flat
FT%95.1%95%-0.1pp
TO76.3%76.4%+0.1pp
OVERALL79.9%80%+0.1pp

The best gain is REB at +0.6pp — the teammate zero-sum features directly address the rebound competition signal the model was missing. STL +0.5pp reflects the team context features (tanking teams see higher individual defensive opportunities). AST −0.2pp is a minor regression likely caused by multicollinearity with the new team context features.

New Layer 14 features · 4 groups

What we added and why.

Injury / availability
prior_season_gp_pctLast season availability (0–1.0)
two_yr_avg_gp2-year average games played
injury_return_flagPrior gp<55 but year-before gp≥65
career_gp_pctLifetime availability rate
age_x_injury_flagage≥30 AND prior_gp<55 — appears in 11 of 15 worst misses
Team context
team_changed_flagSwitched teams from prior year
new_coach_flagDifferent head coach than prior season
team_win_pct_priorPrior season win percentage
tanking_flagTeam won <30% of games prior season
new_star_arrivalTop-50 player joined this team
Teammate zero-sum
player_team_usage_rankUsage rank on own team
team_usage_concentrationHow dominant is the #1 option
usage_deltaUsage rate change year-over-year
Contract data (new)
contract_year_flagFinal year of guaranteed deal
salary_percentileRank vs all players
player_option_nextPlayer can opt out next season
contract_years_remainingSeasons left on deal
The honest gap

Injury-return MAE: 23.8%. Target was 9.5%.

⚠️ Known gap — documented

The Layer 14 features are in the model but with only ~200 injury-return training examples across 24 seasons, the model hasn't learned the signal strongly enough yet. The features are there. The data volume isn't.

This gap narrows each year as more injury-return cases accumulate in training data. v27.2 target: <15%.

Historical contract data gap: Basketball Reference does not publish machine-readable historical salary pages. Contract features for 2016–2025 default to 0. Spotrac API ($TBD/quarter) would close this gap.
Training configuration
Player-seasons
7,863
Training window
2001–2026
Recency weight
0.95^(2026−year)
Sanity check
Wembanyama #1 · Jokić #2 ✓
← Back to Model Journal