How DunkSim reaches 69% NBA prediction accuracy — and what we got wrong
DunkSim shows an accuracy badge: 69.3% for the regular season and 63.5% for the playoffs. This page explains where those numbers come from, what they cover, and how much weight they can bear.
The short version
We replayed every game of the 2025-26 NBA season through the simulation engine and compared its prediction with the real result.
| Regular season | Playoffs | |
|---|---|---|
| Games tested | 1,230 | 85 |
| Winners predicted correctly | 852 | 54 |
| Winner accuracy | 69.3% | 63.5% |
| Average margin error | 15.3 points | 15.4 points |
| Calibration error (lower is better) | 0.062 | 0.132 |
| Measured on | May 6, 2026 | June 16, 2026 |
Why we publish it
A simulation is only useful if you know how far to trust it. We would rather show you a measured number, with its weak spots, than ask you to take the engine on faith. The badge is a track record of the engine. It is not a promise about any future game.
What was tested
Regular season: all 1,230 games, from October 21, 2025 to April 12, 2026.
Playoffs: all 85 games of the 2025-26 playoffs. Playoff basketball is different enough (shorter rotations, slower pace, the same opponent night after night) that the engine uses separate playoff settings, so we score it separately.
The badge measures the engine's own default prediction for each game. It does not measure:
- simulations where you changed the inputs
- predictions made by users or creators
- player stat projections
How the engine works
The engine plays each game possession by possession. Every player carries a set of ratings — scoring, rebounding, passing, defense, pace, and so on — estimated from several seasons of box-score data with more weight on recent games, so a player's form reflects who they are now rather than a career average. Those ratings drive each possession's outcome probabilities; play the game out thousands of times and the distribution of results is the forecast. For a longer, plain-language walk through the method, read NBA Monte Carlo simulation: what it is and how it predicts games.
How the test works
1. We tested on a season the engine was not tuned on. The engine's settings were set using earlier seasons. The 2025-26 season was kept aside for testing. Grading a model on the same games it learned from gives a flattering number, so we didn't.
2. Each game was simulated 10,000 times. The share of those runs a team wins is its win probability. That is the test setting. In the app, a simulation runs 1,000 or 10,000 times depending on plan.
3. Player ratings used only earlier games. For a game on a given date, each player's form is built from games played before that date.
4. The prediction is the team with the higher win probability. If that team won the real game, the prediction counts as correct. Winner accuracy is correct predictions divided by games tested.
5. The test is repeatable. Each game uses a fixed random seed, so running the test again gives the same predictions.
The three numbers
Winner accuracy is how often the engine predicted the right team.
Two comparisons put 69.3% in context. Choosing the home team every time would have scored 55.4% on the same games. Choosing the team with the better win-loss record on game day (home team when tied) would have scored 67.0%. The engine beat that second, fairer baseline by 2.3 points — 28 games out of 1,230. That is a real but modest gain, and it tells you most of the engine's accuracy comes from knowing which team is better, with a smaller part coming from what it knows about lineups and matchups.
Average margin error is the mean absolute error of the predicted margin. In the test, the predicted margin is the home team's average margin across the 10,000 runs (the score shown in the app is built from the median instead); the error for one game is the absolute difference between that and the real margin. If the engine projects a team to win by 6 and they win by 16, that game's error is 10 points.
15.3 points is a lot, and it needs an honest comparison. The average real margin of victory that season was 13.3 points — so predicting a tie in every game would have scored better on this measure than the engine did. Read the "Margins are exaggerated" item below for why. Read any projected score as the middle of a wide range, not as a forecast of the final score.
Calibration error checks whether the engine's confidence matches reality. If it gives teams a 65% chance, those teams should win about 65% of the time. We group games by the engine's confidence in its prediction and compare its average stated confidence in each band with the real win rate:
| Engine's confidence in its prediction | Games | Average stated confidence | Prediction correct |
|---|---|---|---|
| 50–60% | 275 | 54.9% | 58.2% |
| 60–70% | 248 | 64.8% | 62.5% |
| 70–80% | 254 | 74.9% | 70.5% |
| 80% and above | 453 | 90.2% | 79.0% |
Regular season, 2025-26.
The score is the average gap between the engine's mean stated confidence in each band and the real win rate, weighted by the number of games in the band. Zero would be perfect. The regular-season figure of 0.062 means the engine's confidence was off by about 6 percentage points on a typical game — almost all of it in the top band.
What we got wrong
The engine is overconfident when it is most sure. In games where it was 80% sure or more, its average stated confidence was 90%, but it was right 79% of the time. Treat very high win probabilities with some caution.
Margins are exaggerated. The engine's projected margins point the right way — bigger projected margins do go with bigger real ones — but they are too large. Across the season, projected margins varied about 18% more from game to game than real margins did. Lopsided matchups were projected more lopsided than they turned out. This is why the average margin error is worse than the tie-every-game baseline above. Shrinking every projected margin toward zero would have cut the error to about 11.7 points, so the raw margin is not the best estimate the engine's own data supports. We have not yet found the cause.
Combined scores ran low. Across the regular season the engine's projected combined score was 6.2 points below the real total on average (5.0 points in the playoffs). Our best explanation is that 2025-26 was a higher-scoring season than the seasons the engine learned from; we have not confirmed that. If you use Analyze to check a combined-score threshold, be aware of this.
In the playoffs, the engine favored the home team too much. On the 85 playoff games, projected margins leaned about 5 points toward the home team relative to what happened. With that few games this may be partly chance, but the direction is worth knowing.
What the numbers don't tell you
The badge does not track the current season. It is a fixed measurement from the replay described above. It changes only when we re-measure — after recalibrating the engine and re-running the test, or after correcting how a figure is computed, as we did for calibration in September 2026 — never game by game.
It was a replay, not a live forecast. A replay knows which players took the floor; a forecast made before tip-off does not. For that reason we expect the engine's real-time accuracy to be lower than the replay figure — the badge is a ceiling on what to expect from a live prediction, not an estimate of it.
The playoff number rests on 85 games. With a sample that small, luck moves the result a lot. A fair reading is "somewhere between about 53% and 73%". The regular-season number is much steadier, at roughly 67% to 72%.
The test season was measured more than once. When we fixed errors in the engine, we re-ran the test on the same season and updated the badge. That makes the season a slightly less strict test than one the engine had never been scored on.
About 3 in 10 games still go the other way. Upsets are part of basketball. No model removes them.
A reminder
DunkSim simulations are probabilistic models built from historical data. Real games are unpredictable and can differ a great deal from any simulation. Past accuracy does not guarantee future results.