Real player tendencies. Historically trained rotations. One deep, possession-by-possession forecast that lets you see how a game might unfold.
2,000SIMULATED GAMES ONE MATCHUP
THE DAILY MATCHUP
THE GAME IS IN THE DETAILS.
Loading today’s NBA games…
PICK THE MATCHUP
Build your forecast
One detailed run · 2,000 complete simulated games
VS
Select an away and home team. No matchup is preselected.
PLAYER AVAILABILITY
Injuries & projected rotations
Checking today’s injury report. Select both teams to view available players.
Updating injury information…
✚
ESPN-informed availability. Confirmed OUT players are excluded. Other reported statuses appear for reference; projected playing time and starts come from historical rotations, not official confirmed lineups.
0 possessions recordedCLICK A POSSESSION TO INSPECT ↙
↗
Waiting for tip-off
Simulate a possession to generate your first event sequence.
POSSESSION INSPECTOR–
Select a possession
Shot attempts, passes, screens, defensive contests, fouls, and rebounds will appear here.
06 / SHOT EXPLORER
Shot chart
MADE MISSED SELECTED POSSESSION
Loading historical NBA shot-coordinate data…
07 / GAME DATA DESK
Box score & analytics
TRACK THE FORECASTS
THE RECORD.
Every archived prediction is captured before tip-off, then compared with the official final score. One scored forecast per matchup: the latest one saved before the game began.
Checking latest model update…
GAMES FINAL / SCHEDULED0 / 0Awaiting results
SEASON SCORECARD SINCE OCT 270 / 0Awaiting results
AVERAGE POINT ERROR—Per team, final games
AVERAGE MARGIN ERROR—Final games
PREGAME PREDICTIONS · REAL RESULTS
Game-by-game
Waiting for archived predictions…
HOW IT WORKS
UNDER THE HOOD.
A quick, plain-English guide to the forecasts and how they're measured.
01 / FORECAST
2,000 complete games.
Every full matchup forecast runs 2,000 complete game simulations using player shooting tendencies, defensive estimates, rotations and home court. Historical team strength stabilizes win probabilities. It is never just team record or Elo.
02 / UPDATES
Results change the next pick.
Official final scores and player box scores refresh team strength and playing time. Injury reports refresh availability. Saved forecasts stay unchanged so missed predictions can be tracked accurately.
03 / ACCURACY
Show the misses, too.
Forecast History checks predicted winners, final scores and scoring-margin errors against real games. A 0/4 day before tip-off means zero of four games have finished, not four incorrect predictions.
04 / LIMITS
It's still a simulation.
Exact passes, screens and defenders are estimated. Even unusual comebacks can occur. The displayed replay is chosen to follow historically realistic quarter patterns while preserving the original forecast.
OPTIONAL DEEP DIVEThe complete model guide, followed by the historical tests+
Quick definitions: MAE means average absolute scoring error in points. Brier measures probability accuracy, where lower is better. A pre-tip injury report is a team status report available before the game, not an injury added afterward.
Opening-day reporting: Two October 27 catch-up scenarios were simulated after tip-off using a frozen 7:15 PM ET pregame input snapshot. They are evaluated against final scores in the displayed season scorecard, but they are not independently timestamped pre-tip forecasts. The underlying authentic pre-tip archive remains separate and unchanged. Starting October 28, only actual pre-tip captures enter the scorecard.
FROM SOURCE DATA TO THE FINAL NUMBER
THE MODEL, EXPLAINED.
A forecast starts with historical NBA records, updates the players and teams with completed games, then plays the matchup thousands of times. This guide follows that entire process, including the estimates, safeguards and shortcuts. The historical tests appear after the explanation.
The simulation average is the arithmetic mean of each team's points across 2,000 complete games. Player projections are also averages across all those games, including zero-minute appearances. A player's PLAY % separately reports how often that player enters a game.
The large final score and replay come from one actually simulated game near those averages. The selector prefers an outcome won by the probability favorite, when one exists, and plausible quarter-by-quarter scoring. That is a representative scenario, not the average, a guaranteed final, or a claim that this exact score is the most likely score.
The win probability is a blend: 80% historical team-strength probability, adjusted for the current availability scenario, plus 20% probability inferred from the simulation's average margin. It is not simply the percentage of simulated games won. The expandable explanation on each full forecast shows those components alongside the raw simulated win rate.
The 100 basketballs visualize the displayed win probabilities, with one ball representing approximately one percentage point. Counts are rounded to total 100; the printed percentage retains its precision. The upset comparison describes the lower-probability team's chance using an approximate familiar event. Neither display changes the model.
ESPN supplies roster membership, player season statistics, schedules, scores, box scores, play-by-play and the live injury feed. Archived pre-tip injury reports are used in the historical research where coverage exists. Source files are transformed into smaller model datasets; the possession engine does not download a fresh historical training set for every prediction.
Bundled historical training inventory
INPUT
STORED SAMPLE
WHAT IT CONTRIBUTES
Season statistics
2023–24, 2024–25 and 2025–26
Per-minute production and shooting priors. Relative recency weights: 0.08, 0.22 and 1.00, applied to exposure.
Play-by-play
1,100 games in 2025–26; 480 in 2024–25; 282,384 shots combined
Shot zones, assists, lineup and defensive proxies. Earlier individual shooting samples receive 38% weight; team lineup and defensive proxies use 2025–26.
Rotations
900-game baseline; a separate 1,130-game learned sample
DNPs, starts, minutes and usage. The learned sample contains 28,266 player-game examples and 23,384 appearances before April 1, 2026.
On-court defense
1,130 games
Points scored and allowed while a player is on court, using estimated possessions.
Adjusted impact
800 games; 23,856 lineup stints; 571 players
Ridge adjusted plus-minus, fitting all ten players together.
Shot coordinates
800 games; 139,503 valid locations; 567 players
Player and league shot-location distributions. Invalid coordinates are excluded.
Shooting fouls
240 games
Observed shooting-foul frequencies and free-throw trip lengths.
Historical team strength
1,231 completed 2025–26 games
Opponent-adjusted scoring-margin ratings, home court and residual game-to-game variation.
Quarter patterns
1,130 completed games through March 31, 2026
Final-margin, quarter and comeback frequencies used to select the replay.
Limited-history players
53 young NBA players with qualifying minutes and games
Position-based starting estimates when individual NBA season statistics are missing.
These samples overlap. Adding their game counts would double-count games. Counts describe bundled training snapshots, not a continuously expanding count for every model component. The initial recent-game file contains 36 current-season games through October 25; the server's learned state can contain newer completed games.
Historical on-court possessions use FGA + 0.44 × FTA + turnovers − offensive rebounds. This is a box-score estimate. It is distinct from the explicit possessions generated by the simulator. Conventional play-by-play supplies observed shots and substitutions, but does not establish every pass, screen, matchup or contest.
The external scheduler is configured to check hourly at minute 18. A check first ingests completed results, then requests eligible upcoming forecasts. Scheduling and upstream responses can be delayed; an hourly check does not mean every matchup is recalculated every hour.
A scheduled game becomes due when no saved forecast exists, or its previous forecast is at least 170 minutes old. A closer-to-tip pass is allowed during the final 75 minutes if the saved snapshot was more than 25 minutes before tip and is at least 8 minutes old. A job must start with at least two minutes remaining and finish before tip. Otherwise, an older authentic pre-tip forecast remains available.
Roster maintenance refreshes a rotating six-team group and checks both teams before a saved forecast. Matching by player ID preserves historical skill evidence across a move. The importer rejects implausible rosters, including fewer than 10 or more than 25 players, an older season, and suspicious large membership losses. Feed failures retain the last verified roster instead of replacing it with an incomplete response.
Availability is deliberately narrow. Only an ESPN status of OUT excludes a player, and only when the report timestamp is within 30 hours and not implausibly in the future. Questionable and doubtful players remain eligible. A stale or unavailable report does not create an OUT designation. This is not a complete probability model of availability, a verified starting five, or a minutes-restriction feed.
The browser checks the scoreboard roughly every minute, learned model state and injuries roughly every 30 minutes, and saved forecasts on a shorter cache cycle. Manual calculations run in a background worker. Browser previews are cached by matchup, availability and model state; archived pre-tip predictions take priority. Backend failures remain logged. A delayed successful check alone does not display an automatic-update warning in Model Notes.
Historical season averages are converted into per-minute rates for attempts, points, assists, rebounds, steals, blocks and turnovers. The three season weights are relative exposure weights, not percentages that should add to 100. A large recent sample can contribute more than a tiny older sample.
New completed box scores update these rates with a prior-minute model. For a counting statistic, the estimate is (historical rate × prior minutes + new observed count) ÷ (prior minutes + new minutes). Field-goal attempts use 400 prior minutes; points, threes attempted, free throws attempted and assists use 500; rebounds, steals, blocks, turnovers and shooting-percentage priors use 650. Shooting accuracy is smoothed with made and attempted shots rather than averaging percentages directly.
A player without an individual NBA baseline receives a positional prior, with at least 500 prior minutes per field before recent evidence is blended. The underlying comparison sample requires at least 12 games, eight minutes per game and no more than two years of experience. Limited data means uncertain individual estimates; it does not establish how many years someone has played professionally.
All recent-game features use completed appearances before the prediction's data cutoff. Recent role evidence is team-specific, so a traded player's old skill prior follows the player while a new-team role develops from new-team appearances. Daily box-score updates do not refit the historical shot-coordinate library, play-by-play tables, adjusted-impact coefficients or every learned model.
The initial rotation uses historical team minutes and starts. Established players joining a different team retain a discounted prior workload; players without that history begin with a small three-minute role prior. Recent appearances receive a 16-day half-life. Typical roles use two prior pseudo-games and threefold recent-game weight; established starters use a stronger eight-game prior and gentler recent weight to avoid treating one DNP as a permanent demotion.
A learned model separately estimates the chance of playing, the chance of starting and minutes conditional on playing. Inputs include the last eight and three appearances, playing and starting rates, last starter status, days since playing, position and recent trends. Logistic models estimate participation and starting; a regularized minutes model supplies a conditional workload capped at 42. Its blend with the baseline changes with available evidence.
Each simulated game samples participation using reproducible player-level randomness. Competitive rotations usually draw from eight to eleven core players, with occasional fringe cameos. A viable lineup needs five available players; the engine aims for at least eight participants when the roster permits it. DNPs are real simulation outcomes, not automatically assigned token minutes.
Regulation allocates 240 team minutes. Established workloads are protected before remaining minutes are redistributed, and position fit modestly influences replacement minutes. Normal target capacity is 42 minutes per player, rising to 48 if only five are available. An absent player's production is not copied to a replacement. Substitutions consider fatigue, target minutes, positional needs and inferred windows around 3:38, 6:52 and 10:05 elapsed in a quarter.
Late blowouts can bring in up to three fringe players: a 26-point margin with six minutes left in the fourth, or 20 with three minutes left. These are simplified coaching rules. Actual rotations, foul trouble, return-to-play restrictions and coach decisions can differ substantially. Average projected minutes and player scoring ranges include DNPs and are not promises of playing time.
A complete trial plays four 12-minute quarters and five-minute overtimes until the score is untied. A seeded pseudorandom generator makes an identical matchup and input state reproducible. Healthy and injury scenarios reuse matched seeds so the comparison is less affected by unrelated random draws. The main forecast runs 2,000 trials after its calibration pilots.
Possession pace starts from a 100.2-possession reference, shifts 75% of the teams' historical average-pace deviation from the training league mean, and is bounded between 95 and 106. The clock implementation is approximate, so a game's realized possessions can differ from that target. This reference is a stored model constant, not a live league statistic.
Choose the context and lineup. Score, time, fatigue and target minutes influence the five players on each side and late-game behavior.
Choose the actors. A ball handler is weighted toward assists per minute. Shot volume and free-throw tendencies influence the shooter. Position compatibility, steals and blocks influence the assigned defender.
Draw an event. Turnovers, non-shooting fouls, shooting fouls and shot attempts depend on the current players and context. A turnover can become a steal; a foul can lead to free throws.
Resolve the attempt. Select a shot zone and location, calculate the make probability, sample its result, and credit assists or a possible block where applicable.
Resolve the rebound and clock. A defensive rebound ends the possession; an offensive rebound can continue it. Update the score, player box scores, minutes and plus-minus, then advance the game.
Transition is sampled on about 17% of possession starts. Half-court screens, passes and contest labels are synthetic: the engine uses fixed event chances, including 57% for a half-court screen and 80% for its modeled pass branch. These provide a readable estimated sequence, not a reconstruction of tracked player movement.
Attempts are split into rim, midrange and three-point zones using individual history, season tendencies and 65 prior attempts. Prior three-point attempt share is bounded between 5% and 75%; a team trailing late increases its three-point tendency. Within a zone, the initial make rate is (recorded makes + 90 × league make rate) ÷ (recorded attempts + 90). Smaller samples therefore stay closer to league expectations.
Shot locations sample recorded ESPN coordinates, weighted toward the player's own distribution by n ÷ (n + 80), with league locations filling the remaining share. Court coordinates are measured in feet, with a modeled half-court of 50 by 47 and the rim at (25, 0). Historical distance outcomes adjust three-point accuracy. Attempts from 37 feet or farther are limited to the last four seconds of a period and can fall below the ordinary shot-probability floor. These dots are newly simulated shots.
Adjust the make probability
Contest labels apply adjustments of −5.5, −2.5, 0 or +2 percentage points. Pair-lineup shooting effects are centered and shrunk with 350 prior attempts, capped at 3.2 points per side. Historical team offense, opposing defense and home court also contribute. Assisting and transition branches can add 1.5 and 2 points. Context, the healthy-team anchor and any creator-absence correction are added before the ordinary probability is bounded between 10% and 88%, followed by the distance adjustment.
The assigned defender's zone proxy uses opponent makes while that player was on court, shrunk with 230 league-rate attempts. Its contribution is 60% of the observed-minus-league make-rate difference, bounded at ±3.5 percentage points. Lower opponent shooting lowers the attacker's chance. This is an on-court association, not evidence that the named player personally defended every recorded shot.
Steal/block skill and relative on-court defensive rating supply additional small adjustments. OFF/100, DEF/100 and NET/100 remain sensitive to teammates and opponents. The separate adjusted-impact fit includes all ten players in each stint, uses ridge regularization of 1,700, requires at least 150 estimated possessions for an applied player adjustment, and centers current lineups against a historical team baseline. Its contribution to shot probability is capped at ±1.2 percentage points.
Turnover chance uses lineup turnover and attempt tendencies, adjusted for context and bounded between 6% and 21%; about 58% of modeled turnovers become steals. Non-shooting fouls use a separate roughly 4.5%–14% range. The fifth team foul triggers the simplified two-shot bonus. Shooting-foul rates distinguish two-point and three-point attempts; the training sample implies roughly 0.9% of threes lead to a three-shot foul trip.
Free throws use the shooter's estimated accuracy, bounded between 45% and 96%. Made field goals can receive an assist based on individual history with a 70-make league prior. Blocks are assigned conditionally on a miss, rather than subtracting a second independent block probability from an already sampled make.
Offensive-rebound probability starts from the league baseline, adds 18% of the offense's historical offensive-rebound-rate deviation and subtracts 8% of the defense's defensive-rebound-rate deviation, with a 14%–37% bound. Player rebounding tendencies allocate the rebound. An offensive rebound keeps the same possession alive, with up to four rebound loops. Last-shot free-throw rebounds use a simpler branch.
Ordinary possession timing samples 9–20 seconds, faster when trailing late and slower when leading, then scales by 94.1 ÷ target pace and respects event timing. Clutch means the final five minutes of the fourth quarter or overtime with a margin of five or less. Late trailing/leading behavior begins in the final two minutes at a four-point margin. Intentional fouls can occur in the last 70 seconds when the offense leads by three to nine points; late timeouts are heuristic events.
The rules are intentionally incomplete: no full tracking-based shot clock, coach playbook, explicit and-one branch, or automatic six-foul disqualification is modeled. Team-foul and free-throw behavior simplify NBA rules. This affects late-game realism and is a limitation when interpreting close scores and player projections.
The team-strength model fits scoring margins against opponent ratings with ridge regularization. Its bundled 2025–26 prior uses a regularization value of 24, estimates home court at about 1.75 points and leaves residual game-to-game margin variation of about 14.34 points. Current-season updates change team ratings; the historical residual spread is not re-estimated from every new game.
Before the main run, healthy-lineup pilots estimate the simulator's baseline margin. The target is 75% historical team-strength margin plus 25% healthy simulated margin. Up to three matched-seed passes, each with up to 400 games, adjust shot quality toward that target. The adjustment is bounded at ±7.5 percentage points, later steps are limited, and a closer pilot fit is retained. These pilot games are additional work, not part of the displayed 2,000-game average.
Unavailable players are then removed, participation is redrawn and minutes are redistributed. Matched healthy/scenario pilots estimate the availability-driven change in expected margin. Up to 400 paired games supply a bounded ±24-point scenario shift for the historical probability component.
A separate conservative creator-absence safeguard compares up to 300 matched healthy and injury games when estimated lost creation is at least five points. If replacement lineups fail to capture enough loss, a negative shooting adjustment of at most 1.5 percentage points can be applied. Its target loss is capped at 2.6 points. This is a modeling safeguard, not a claim that every injury has a known causal value.
Because both the healthy simulation and final probabilities use historical team strength, the two probability components are correlated. The 80/20 combination is not an average of two independent sources of evidence. No market betting line is used as an input.
The ingestion process checks official FINAL games from just before its last checked day through the current day, with a bounded catch-up window. Final scores can grade saved predictions even when a valid box score is not yet available. Missing box scores enter a retry queue; player learning waits for both teams and at least five valid player rows per team.
Team ratings update from opponent-adjusted scoring margins, with an 18-game-equivalent prior, a 75-day recency half-life and residuals bounded at ±50 points. Each newly ingested game can move either team's rating by at most 0.5 expected margin points. A 20-point win therefore provides different information from a two-point win, but one surprising result cannot move the rating without a limit. There is no separate extra bonus merely for recording a win.
Player production, recent minutes, starts and participation are updated from completed box scores using the smoothing rules above. The system does not retrain every coefficient after a miss, and it does not use a game's eventual box score to generate that game's original pre-tip pick. Feed failures preserve known cached state and are recorded for diagnosis.
Automated saved forecasts use ten persisted batches of 200 complete games, with distinct seed offsets and inputs frozen for the job. Equal-sized batches combine their mean scores and hybrid probabilities. The saved representative score is an actual batch outcome near the combined average with the favorite winning when possible. This batch selector does not apply the manual replay's quarter-pattern ranking. Each batch also fits its calibration pilots, so a batched archive and a fresh single 2,000-game browser run need not be identical.
A saved snapshot records capture time, scheduled tip time, teams, venue, representative scores, mean scores, win probability, simulation count, model-through date, excluded player IDs and injury report time. Only a computation completed before tip is accepted as a genuine pre-tip prediction. A new forecast is another timestamped snapshot; earlier saved predictions are not rewritten after the result.
History chooses the latest eligible pre-tip snapshot for a game and compares it with the official final. Games stay associated with their original Eastern tip date even when they finish after midnight. The homepage's daily slate rolls over at 3 a.m. Eastern. Games without an archived forecast can appear on the schedule without becoming retroactive predictions.
Opening-day exception: the displayed scorecard includes two October 27 research reconstructions made after tip from frozen 7:15 p.m. inputs. They are labeled separately and are not genuine pre-tip captures. Strict archived-forecast accuracy and a scorecard containing those reconstructions are different samples. October 28 onward uses the normal pre-tip capture rule.
Winner accuracy counts correct favorites. Team-score MAE averages absolute point errors for the two teams; margin MAE measures error in the predicted score difference. Brier score averages (predicted probability − result)², with result 1 for a win and 0 for a loss. Log loss penalizes confident incorrect predictions more strongly. Lower Brier, log loss and MAE are better for their respective tasks.
Calibration asks a different practical question: across many games assigned approximately 60%, did those teams win approximately 60% of the time? Reliability bins, adequate sample sizes and uncertainty around each bin are needed. Lower Brier alone does not prove better calibration because it also reflects discrimination and the outcome mix.
The Long Test walks through 310 games from February 15 to March 31, 2026, with 100 simulations per game. It uses earlier-season player and play-by-play profiles, a rotation model fitted before February 15 and only previous Eastern-day results for rolling evidence. Same-day results are withheld because historical final timestamps are unavailable. Pregame rosters are inferred from earlier games; archived injury coverage is incomplete. This historical run differs from the live 2,000-game configuration.
The raw possession test picked 229 of 310 winners (73.9%), with Brier about 0.1815 and team-score MAE about 9.93 points. The separately evaluated fixed 80/20 hybrid had Brier about 0.1829 overall. In the later 110-game segment, team-only Brier was about 0.1673 versus 0.1669 for the hybrid. The blend had slightly lower Brier in that segment. Both segments have been examined during development, so neither now qualifies as an untouched future test.
Opening Week covers 36 games with 250 simulations each, using the October 25 roster snapshot rather than exact historical pregame rosters and an all-healthy availability assumption. It picked 23 winners, with Brier about 0.2135. That sample has been repeatedly inspected and is development evidence only. Historical rotation comparisons and the rating-update cap also have their own tested cohorts; their results are not interchangeable with whole-model accuracy.
Forward evaluation should keep the forecasting method fixed, preserve timestamped predictions and compare it with a fixed baseline on the same upcoming games. Tuning to these already inspected games and reporting them again as independent validation would overstate the evidence.
Important missing inputs include optical tracking, verified primary defensive assignments, complete coach tactics, explicit travel/rest matchup features, confirmed starting lineups, probabilistic questionable-player availability and reliable minutes restrictions. Correlated shooting streaks, injuries during a game and strategic adaptation are not fully modeled. Roster turnover, unusual roles and early-season samples make priors especially influential.
More detailed simulation does not automatically outperform a simpler model. Historical defense and lineup statistics can carry selection bias and confounding; strong shrinkage reduces instability without eliminating it. The adjusted-impact estimate is not a causal measure of individual talent. A plausible-looking replay is not evidence that every event or probability is realistic.
The next meaningful improvements are to evaluate the corrected engine on untouched future snapshots, check probability reliability by confidence range, compare the fixed blend with team-only and simulation-only baselines, and measure whether score ranges achieve their advertised coverage. Candidate changes to the probability map, blend or availability model should be selected on training data and tested on a later reserved period, with game-day clustering where uncertainty is estimated. The current 80/20 blend remains in place until evidence justifies a change.
Raw possession forecasts for 2025–26 games, using only previous Eastern-day results, 2024–25 player/PBP/shot profiles, a pre-February 2026 fitted rotation model, and archived injury reports released before tip-off. The established 80/20 probability blend is evaluated separately with its weight held fixed.
UPDATED
GAMES WALKED FORWARD–
CORRECT WINNERS–
TEAM SCORE MAE–
BRIER · LOWER IS BETTER–
MATCHUP
PROJECTED SCORE
FAVORITE
ACTUAL
PREGAME INJURIES
Loading historical evaluation…
Results are being loaded. Pregame rosters are inferred from previous games; historical injury coverage is tracked separately.
Calibrating the probability combination on dated historical games…
Evaluating learned playing time against the original rotation baseline…
Comparing the updated forecast with the baseline on the same chronological games…
CURRENT-SEASON DEVELOPMENT CHECK
OPENING WEEK
2026–27 opening games in date order. Rotations use only earlier completed games, but the Oct 25 roster snapshot is not an exact historical pregame roster. This small test has been examined repeatedly during development.
REAL NBA RESULTS
GAMES EVALUATED–
WINNER ACCURACY–
AVERAGE TEAM SCORE ERROR–
BRIER SCORE · LOWER IS BETTER–
MATCHUP
MEAN PROJECTED SCORE
FORECAST FAVORITE
ACTUAL
WINNER PICK
Loading evaluation data…
Small-sample results are exploratory and should not be treated as proof of calibrated odds.