NBA Model Health

Phase 3 validation — prediction accuracy, HCA/B2B calibration, FFI weight regression.2025-26 · last run 4/2/2026, 2:28:51 AM

Phase 3 — in-season evaluation only. Season-end ratings are used retroactively for prediction accuracy, so the accuracy figure is optimistically biased. True hold-out validation requires multi-season backfill (Phase 3B).

1. Prediction Accuracy

Straight-up picks using season-end adj_net ± configured HCA. Retroactive — not held-out.

Games evaluated

1,132

completed regular-season games

Straight-up accuracy

69.4%

correct picks

Brier score

0.201

lower = better (random = 0.25)

Log-loss

0.589

lower = better (random = 0.693)

2 & 3. Empirical HCA + B2B Calibration

OLS fit: home_margin ~ β₀ + β₁·adj_net_diff + β₂·home_b2b + β₃·away_b2b. 1132 games.

OLS R²

0.261

explanatory power of the model

Empirical HCA

+1.88 pts

configured: +2.50 pts/100

Model scale (β₁)

1.095

goal ≈ 1.0 (pts ≈ pts/100 poss)

Home B2B penalty

-2.69 pts

configured: −1.8

Away B2B (home benefit)

+1.28 pts

configured: +1.8 to home

4. FFI Weight Derivation

OLS: adj_net ~ w₀ + w₁·eFG_margin + w₂·TOV_edge + w₃·OREB_edge + w₄·FTA_margin across all 30 teams. R² = 0.987.

High R² — four factors explain adj_net well this season. Proposed weights below can be considered for NBA_FFI_WEIGHTS in nba/ratings_config.py after the season concludes.
Four FactorProposed (data-driven)Current (configured)Status
EFG margin41.2%40.0%
TOV edge40.4%25.0%◄ notable
OREB edge12.2%20.0%
FTA margin6.2%15.0%◄ notable

Proposed weights are derived by running OLS on the current season's 30 teams and normalising positive coefficients to sum to 1. They reflect within-season patterns only and should not be adopted until multi-season validation is complete (Phase 3B).

Methodology Notes

Prediction accuracySeason-end adj_net ratings are used retroactively. Because these ratings already incorporate the outcomes being evaluated, accuracy is optimistically biased. All-else-equal, 69–72% is typical for mature rating systems.
OLS model scaleβ₁ converts adj_net advantage (pts/100 poss) to expected raw-point margin. An NBA game averages ~100 poss/team, so β₁ should approach 1.0 at season end.
Empirical HCADerived as the OLS intercept (β₀). Compared to home_court_adj in ratings_config.py, which is in pts/100 poss. At ~100 poss/game these are roughly the same scale.
FFI R²The four factors are mathematically related to scoring margin, so high R² is expected (≥0.95 at season end). R² here measures how well the specific four factor edges predict adj_net — not whether adj_net predicts outcomes.