Skip to main content
Hardwood

Method

How it works

A margin-and-total model over every NBA game since 2004, refit monthly, and scored against the closing line on named games. It is behind the market by a published margin, and that is the result the design predicts rather than a disappointment.

Games scored

14,600

priced, paired against the close

Gap to the close

+0.0071

Brier, lower is better

Calibration error

0.0114

expected vs observed

Walk-forward n

25,749

out-of-sample games

Method

01What it does

Four things, and nothing else. If a proposed feature is none of them, it does not belong here.

  1. A win probability for every game.
  2. A projected season, seeding and playoff picture.
  3. A value surface comparing the model against the no-vig market price.
  4. A playoff-series layer over best-of-seven brackets.

02Margin and total, not two scores

Soccer models two Poisson goal counts. NBA scores are nothing like Poisson, and the quantities that matter are the difference and the sum.

Basketball scores average around 110 with a variance far below their mean. So this model is parameterised on margin and total, which are close to jointly normal, and the two team scores are recovered from them. The win probability is the area under that same fitted normal above zero, and the score grid and every playoff-series price read off it too — one distribution drives every percentage on the site, so a spread that runs narrow makes all of them overconfident at once, which is why interval coverage is measured on the record page.

Over 27,690 regular-season games, margin has mean +2.6 and standard deviation 13.8, with skewness −0.02 and excess kurtosis +0.30. Normal is a genuinely good fit here, not a convenience. The one place it bends is the extreme tails: the margin forecast’s 95% interval catches about 93%, which is what that kurtosis predicts — a documented limit, not a surprise. And there is no draw to allocate: overtime resolves every game, so zero of those 27,690 finished level.

03Home advantage has collapsed

The sport's most under-appreciated recent change. A fixed constant would mis-price the modern game badly.

EraHome win rateMean marginRating points
2004-200960.80%+3.4276
2010-201459.89%+2.9870
2015-201958.62%+2.7461
2020-202355.66%+1.9640
2024-202654.93%+2.0034

The served model refits monthly and picks the current value up through its intercept, so it tracks this drift rather than assuming it away.

04Ratings regress between seasons

Elo carries forward at 60%, with the remaining 40% pulled to the league mean. Carrying ratings forward untouched was the worst of the six levels tested.

This is the opposite of what the sibling soccer project found, where season-boundary regression was tested and rejected at every level. The difference is institutional rather than statistical: the NBA drafts in reverse order of finish and caps payrolls, European football does neither.

Conclusions do not port across sports. Every constant here was re-measured on basketball, and several came back inverted.

05Season simulation

Each simulated season draws one strength offset per team and holds it for all 82 games, rather than re-rolling every game.

Within-season rating drift measured 36.1 points over 689 team-seasons, and that error is correlated across a team's whole schedule — a team that is better than its rating is better in all 82 — so no number of simulations averages it away. Without it, these title odds would be roughly twice as confident as any market price.

The play-in is modelled exactly: 7v8, 9v10, and the 7/8 loser hosting the elimination game. It is the difference between a 45% and a 70% playoff probability for precisely the teams a reader cares most about.

06Playoff series

A best-of-seven is not one game with a bigger sample. Home court alternates, and the format makes the series probability a non-linear function of the game probability.

Every series is computed by enumerating each path rather than simulating one — a best-of-seven has at most 128 of them, so the exact answer is cheaper than an estimate of it and carries no sampling noise. The Finals ran 2-3-2 through 2013 and 2-2-1-1-1 since, and the backtest scores each series under the pattern it actually played.

The projected bracket draws only the first round as matchups. Everything past it is a marginal probability from the simulation, because advancing a modal winner four rounds compounds one seeding assumption into a championship number.

Evidence

07The market is the benchmark

Any accuracy claim is stated as a paired score against the closing line on named games, or it is not stated.

ForecasterBrierGap
Market (closing line)0.2070
This model0.2141+0.0071

The model is behind, and that is the honest and expected result. It carries no market features at all. A model with none that beat the closing line would be announcing a bug in the harness rather than an edge, and this project treats that outcome as a reason to audit rather than to celebrate.

The full record carries the bootstrap interval, the reliability diagram and the per-season breakdown.

08Backtest is never live

Every retrodiction on this site is labelled a backtest, in every place it appears.

The archive reconstructs what the model would have said about each historical game, using a rolling walk-forward refit on games strictly earlier than the one it scores. The model never saw the result — but nobody read those numbers before those tip-offs either, and a reconstruction that blurs into “published in advance” is the exact dishonesty an archive invites.

The historical walk-forward and the live published record are computed separately and never merged. The live record is empty until the season starts; it will grow from zero and be reported at whatever n it reaches.

Limits

09What it will not do

The constraints are as much a part of the product as the forecasts.

No value flag inside its own error
An edge smaller than the measured calibration error is not called value. Below that threshold, “value” is indistinguishable from the model being slightly off.
No imputation
A missing sportsbook line, box score or result stays missing. Sparse coverage is reported as sparse.
No merged records
The historical walk-forward is never combined with the live published record.
No probability computed in the browser
The site renders published JSON. A component that recomputes something is a second model nobody benchmarked.

10What is missing

Recorded rather than papered over.

  • No injury or roster data. The model knows nothing about trades, the draft, or who is playing. This is the largest single gap, and it is why preseason title odds stay more concentrated than a real futures market.
  • Nothing player-level feeds a probability. Box scores are shown on game pages, read from ESPN at request time; the model consumes team-level results only.
  • Odds coverage is uneven by era. 2019 carries no market at all, which is why the paired sample is smaller than the corpus.
  • The playoff-series layer does not beat the seeding. On 300 series it is not significantly better than “the higher seed advances”. The confidence interval straddles zero and the site says so.

Nothing here is betting advice.

model 2026.08.1+943bde8b · every figure on this page is read from a published artifact, not typed in

Forecasts are scored against the closing line. Nothing here is betting advice. How it works