How the matchup predictor works
Every number on the Matchup Predictor comes from a walk-forward backtest of 15,969 games across 2022-23, 2023-24 and 2024-25. Ratings were fitted only on games that had already been played when each game tipped off — never on the season as a whole, which is the mistake that makes a model look brilliant and perform badly. The constants were chosen on 2022-24, checked once on 2024-25, and checked once more on 2025-26 after they were frozen.
The short version
Opponent-adjusted efficiency, home court and pace do about 94% of the achievable work. Every matchup nuance anyone argues about — style clashes, rebounding collisions, three-point volume, travel, rest, who is hurt — is the other 6%.
| 2024-25 | 2025-26 | |
|---|---|---|
| Mean absolute error | 9.14 | 9.25 |
| Straight-up accuracy | 72.2% | 71.7% |
| Margin variance explained | 38.2% | 39.9% |
Both seasons scored the same way: ratings refit before every date on the games already played, then every fixture between two teams this page lists — 5,655 games and 5,724 games. Numbers measured a different way, on a different set of games, will differ a little from these; the point of quoting one harness is that everything below can be compared against everything else.
1 · Ratings
Each team gets an offensive and defensive rating in points per 100 possessions, and a tempo, solved as an iterated fixed point so that beating a good defense counts for more than beating a bad one. Last season is carried forward as a prior — unregressed, because carry factors from 0.3 to 1.0 were tested and leaving it alone won. That is the reason the page works in November, when nobody has played anyone yet.
2 · Pace
The two standard formulas are both biased. A simple average of the two tempos runs about 2.6 possessions high when two slow teams meet; the KenPom product runs 1.7 high when two fast ones do. Between them they can differ by nearly seven possessions, which is about fifteen points of combined scoring. The fitted form is flat across every tempo band:
pace = L − 0.75 + 0.83 × (tempo_A + tempo_B − 2L)
3 · Home court
Measured from conference games only — where schedules are balanced home-and-home and the buy-game confound disappears — home advantage is worth under three points, and it has been falling: 3.28 in 2022-23, 2.60 in 2025-26. But it is not one number. The floor is worth about two points more in a non-conference game than a conference one, and another three on top of that when a power-conference team hosts a visitor from outside the six strongest leagues. Neutral-court games show no bias at any predicted margin, which is how we know this is the building and not the ratings.
| Fixture | Home floor |
|---|---|
| Conference game | +0.25 |
| Non-conference | +1.39 |
| Power conference hosting a non-power team | +4.21 |
| Neutral floor | 0 |
Plus a flat 2 per side per 100 possessions inside the base projection.
Per-team home advantage, by contrast, is almost entirely noise: a team’s home edge in one half of a season predicts the other half at r ≈ 0.05. The one real exception is altitude, worth about +0.8 points and concentrated between 4,500 and 6,000 feet.
4 · Style
Four style terms carry weight, and the strongest of them is negative. A team projected to out-shoot its opponent from three tends to fall short of it, because three-point percentage is the least persistent thing a team does and the efficiency rating has already banked the luck. The rebounding collision is real but small: across the full observed range it moves the margin by about 3.6 points, and most matchups sit nowhere near those extremes.
| Term | Points per unit |
|---|---|
| Three-point percentage edge | -0.246 |
| Three-point attempt share edge | +0.069 |
| Turnover edge | -0.064 |
| Offensive rebounding edge | +0.089 |
| Both teams strong (home only) | +0.042 |
Tested and dropped: the fast-versus-slow style clash, combined pace, effective field-goal edge, free-throw rate, rest differential, travel distance, and recency weighting of games. None of them survived out of sample. Shot-zone and shot-clock splits were tested with end-of-season hindsight deliberately left in, and still made the holdout worse.
5 · Who is playing
The largest single addition to the model, and the one thing a team rating is structurally blind to. Losing your best player is worth about 1.9 points beyond what the ratings already know. There is deliberately no minutes editor: a minutes-weighted roster rating was raced against the team model and earned a blend weight of −0.004 — zero, at every stage of a season including a team’s first five games. Absences are the only player-level signal that survived. Roster continuity — the share of last season’s minutes that came back — carries a smaller term worth 2.47 points per unit.
The term is correct, and it is also small, and those are not in tension. Regressing what actually happened on the adjustment the model makes for absences gives a slope of 0.81 ± 0.16 — real, and not distinguishable from a perfect 1.0. But it only moves the line by a full point in 15% of games, because the curve is convex on purpose: one man out of a nine-man rotation is 11% of the minutes, and 0.112.5 is almost nothing. Feeding the model the true absences for all 5,724 games of 2025-26 — which is hindsight, and therefore a ceiling on what any injury report could ever be worth — improved it by 0.02 points. Rule players out when you know something; do not expect the number to lurch.
The cost of absences is steeply convex, and that matters more than it sounds. What a team loses is not the missing player, it is the man who replaces him: lose one and the sixth man covers it, lose five and walk-ons play. Measured across three seasons, per team-side:
| Rotation minutes missing | Mean points below projection |
|---|---|
| none | −0.1 |
| under 20 | −0.5 |
| 60 – 80 | 1.3 |
| 100 – 120 | 2.6 |
| over 120 | 6.3 |
The model raises the missing share of the rotation to the power 2.5 and tilts it by whether the absent players are worth more or less per minute than their teammates. Beyond about two absences it is extrapolating: fewer than 1% of games in the sample were missing that much.
6 · The young-ratings stretch
Ratings are shrunk toward a prior and clamped at ±25, and both of those pull teams toward the middle. So the projections come out too close together: regressing what happened on what was projected gives a slope near 1.1 rather than 1.0, at every stage of a season and 7.7 standard errors from calibrated. Good teams beat the number and bad ones fall short of it. The squeeze is worst when the ratings are youngest, because that is when the prior is doing the most work, so the margin is stretched by a factor that fades as games are played: 1 + 1 / (games played by both teams + 6). Two teams four games in are stretched 11%; two teams thirty games in, 1.5%.
| Fitted on 2024-25, checked on 2025-26 | Mean error | First 14 games | Log loss |
|---|---|---|---|
| No stretch | 9.274 | 10.318 | 0.53219 |
| A flat ×1.055 | 9.269 | 10.257 | 0.53240 |
| This form | 9.254 | 10.220 | 0.53208 |
A flat multiplier fitted the same way is worse on every measure and makes the mature-ratings case worse than doing nothing. The gain here is a tenth of a point, and it lands in November, where the model's error is 10.3 against 8.9 in March. The stretch depends only on the two game counts, so swapping the teams still flips the margin exactly.
7 · Win probability, and what the ranges mean
The margin is normal around its projection with σ = 11 points. Normal, logistic, Student-t and Pythagorean were all tested and land within 0.001 of each other in log loss, so the form does not matter and the scale does. The curve on the page is that distribution drawn to scale: a team’s share of the area is its win probability.
One team’s score is harder to call than the margin, because it carries the total’s error too — σ of 10.43 against the total’s 17.3. The range widens with pace while the win probability does not: a fast game is a wider distribution and a wider projected margin, and the two cancel. Fast games produce more blowouts and no more upsets.
8 · The total, and why it is marked
Efficiency times pace projects regulation scoring between two average-luck teams, and what a reader wants is the points in the game that actually gets played. Backtested against every game of four seasons the uncorrected total came in low every year, so 3.44 points are added to it — and to nothing else.
| Season | Total, before the correction |
|---|---|
| 2022-23 | −3.11 |
| 2023-24 | −3.84 |
| 2024-25 | −2.91 |
| 2025-26 | −3.88 |
About 1.0 point of that is overtime — 5.2% of games go past regulation and average 168 points against the field's 149 — and about 1.7 is the pace form, whose intercept puts projected possessions 0.8 below the league's own mean. The margin is a difference, so a shortfall common to both teams cancels out of it: its measured bias is +0.08. The total is a sum, so the same shortfall accumulates.
What it cannot do
Beat a betting line. The projection was run walk-forward against 5,400 closing spreads and totals from 2025-26 — refitting the ratings before every game so nothing was known that had not happened yet. On margin it was close: 9.25 points of mean error against the closing line’s 8.97. Close is the problem. A line is a price, not a forecast, and being a third of a point worse than it means the games where this model disagrees are mostly the games where it is wrong. Filtering to disagreements of 2.5 points or more went 52.9%, which is half a standard error from breakeven and swung from 53.8% to 50.7% between the halves of the season.
The total is worse than that, and the correction above does not rescue it. Its disagreements with a total line were wrong more often than right, and more wrong the larger they got — 47.2% at a gap of five points, 46.0% at seven and a half, both several standard errors the wrong side of breakeven. That is why the number is printed a step back from the other two. The correction makes it honest. It does not make it sharp.
It also has no idea about anything off the box score: a coaching change mid-season, a player returning from injury at reduced minutes, motivation, or a team that has quit on its season. Rule players out by hand when you know something the archive does not.
Current data: 6,257 games from 2025–26, 365 teams, league average 109.22 points per 100 possessions at 67.85 possessions. Built 2026-09-08. 3 games excluded for impossible possession counts in the source archive.