What are we trying to do?
Predict tonight's NBA games accurately enough to beat the sportsbook. For each game we produce two numbers — a spread (who's favored, by how many points) and a win probability for the home team — and compare them to what the sportsbooks are offering. When our numbers and the sportsbook's numbers disagree by enough, that disagreement can be a bet.
We're not trying to pick every winner. We're trying to be right about a specific kind of mismatch often enough that the math works out over hundreds of games.
What's a "spread"?
Basketball doesn't just bet on who wins — it bets on by how much. The spread is the margin the sportsbook thinks separates the two teams. If the Lakers are −7 against the Rockets, the sportsbook thinks the Lakers will win by 7 points. You can bet on either side:
- Lakers −7: bet pays only if the Lakers win by more than 7. Lakers win by exactly 7 = "push" (you get your money back).
- Rockets +7: bet pays if the Rockets win outright or lose by fewer than 7.
Half-point spreads (−7.5, +7.5) avoid pushes. Most spreads come in .5 increments for that reason.
On the dashboard, spreads are shown from the home team's point of view. So −7 means the home team is favored by 7. +3 means the home team is a 3-point underdog.
What's "moneyline" (H2H)?
The simpler bet: just pick who wins, ignore the margin. Sportsbooks express this as odds — e.g. Lakers at −250 means you'd risk $250 to win $100 because the Lakers are heavy favorites. +200 means you'd risk $100 to win $200 on an underdog.
The dashboard converts each sportsbook's odds into a probability (e.g. 71.3% for the Lakers). Our model does the same thing independently. When our probability differs from the sportsbook's by more than a few points, that's an edge — and it's the primary signal this system looks for.
Who are Pinnacle, Circa, etc.?
Not all sportsbooks are the same. Some are aimed at casuals (big brands you see in TV ads), others are aimed at serious bettors:
- Pinnacle: a non-US sharp book. Thin margins, accepts big bets, and the market generally agrees that Pinnacle's price is close to the "true" fair price. When Pinnacle moves, other books follow.
- Circa: a Vegas sportsbook that takes larger limits than most. Also considered sharp.
- Polymarket: a crypto-based prediction market. Different liquidity, but similar pricing to sportsbooks once you account for the mechanics.
The dashboard blends Pinnacle and Circa 50/50 to produce a Market row — that's the sharp-market consensus we compare our model to.
What's EPM?
Short for Estimated Plus-Minus — a single number that says how much a player improves their team per 100 possessions. A star like LeBron James might be +4.5 EPM. A below-average bench player might be −2.0. An average starter sits around +1.
EPM is produced by dunksandthrees.com and is regarded as one of the most predictive all-in-one player metrics. The model on this site pays for access to the full EPM database and uses it as the foundation for rating each team.
How does the model rate a team?
This is the important part. A team's rating is not "how good were they across the whole season". That number is stale by the time we care about it. Instead, we rebuild the rating player by player, for tonight's specific lineup:
- Take each player on the team.
- Multiply their EPM by how many minutes they're projected to play tonight.
- Drop anyone the NBA's injury report lists as "Out".
- Add it all up — that's the team rating.
This lets the model react in real time. If a star is ruled out 30 minutes before tipoff, the sportsbook might not move fast enough. Our team rating drops immediately because that player's EPM is no longer counted.
On top of the team rating we add home-court advantage (about +3.5 points), rest difference, and travel fatigue. That produces the expected margin, which we convert to a win probability.
What's the "rotation" panel?
That's the 8 players most likely to see meaningful minutes tonight, sorted by projected minutes, with their EPM shown next to their name. Green EPM = positive contributor. Red = below replacement. This is the raw input to the team rating.
What's "H2H edge"?
The difference, in percentage points, between our probability for the home team and the sportsbook's probability. If the sharp market says the Lakers have a 71% chance and our model says 79%, the H2H edge is +8pp.
The badge turns green at ≥3pp — the production threshold with the best balance of volume and robustness. Pooled across all 11 backtested seasons (n=233, 60.9% hit rate, 95% CI 54.9-67.4): +15.2% ROI. The PDF-injuries era (2019-20+, what live conditions look like): +14.6% ROI on n=147. Yellow at ≥10pp — skip those; a gap that large almost always means the market priced in a rotation change or injury news we don't have yet. Below 3pp the model and market basically agree — no bet.
The spread edge badge turns green when the model's ATS pick and H2H pick agree on the same team — that's the agreement-gated signal. Pooled (n=142): +12.4% ROI, 57% hit rate, with top-5 outliers accounting for only 28% of profit (low outlier dependence — robust). Nested walk-forward post-2019 OOS (no peeking): +19.8% on n=51. When the two signals point at different teams the spread badge shows a dash — skip the ATS bet, the model is internally inconsistent on that game.
Is this financial advice?
No. These are model outputs from a personal research project. Sports betting is variance-heavy — even a +12-15% ROI edge means losing weeks and months, and the edge only exists on a specific subset of games. Anyone wagering money based on this page is doing so at their own risk.
The model was backtested on 897 playoff games with closing lines (11 seasons, 2014-15 → 2024-25), using point-in-time EPM with per-date injury data: official NBA injury PDFs for 2019-20+ and reconstructed inactives from box-score data (BoxScoreSummaryV2 + DNP-injury comments) for 2014-19. Both eras now produce comparable numbers at the production threshold (~+15% H2H ROI at ≥3pp), which is the strongest evidence the edge is real and not a regime artifact.
Disciplined signals (bootstrap-CI hit rate above 50%, top-5 outlier audit, era split, ambiguous-line audit, nested walk-forward threshold selection): H2H ≥3pp +15.2% pooled (n=233, 60.9% hit rate); ATS ≥3pt + H2H agreement +12.4% pooled (n=142, 57.0% hit rate, low outlier dependence). Walk-forward post-2019 out-of-sample: H2H +16.1% (n=90), ATS+agree +19.8% (n=51). The 2020 Orlando bubble was a regime outlier on every signal — disrupted-environment seasons should be treated as a model failure mode. Past results do not guarantee future performance.