nba series bot

model · market · edge — logging only, v0
loading…
run
Loading observations from Supabase…
Loading completed series…

Pipeline

The model produces P(favorite wins series) in three steps:

  1. Prior — net-rating differential and homecourt give a per-game probability.
  2. Bayesian update — each completed game's margin updates the posterior.
  3. Series enumeration — sum probability over all paths from current state to 4 wins.

Per-game probability

Given current posterior mean differential δ (favorite NRtg − underdog NRtg) and homecourt advantage h, the probability the favorite wins one game:

where Φ is the standard normal CDF, σ_n is per-game noise, and σ_g reflects posterior uncertainty about the true differential.

Bayesian update on observed margin

After observing margin y in a game with homecourt term μ_0 = δ + h·HCA, the posterior mean and variance update via the standard normal-normal conjugate:

Each game tightens the posterior — variance shrinks toward zero as more evidence accumulates.

Series probability

From current state (W_f, W_u) with fixed game-location schedule, sum probability across all paths to W_f = 4:

Path enumeration is exhaustive — at most 35 paths from any starting state. The favorite home/road probability is recomputed at each game using the current posterior.

Tail correction

Backtesting showed the raw model overconfident at the extremes. We apply a small symmetric adjustment:

Pulls confident predictions slightly toward the center. Calibrated empirically, not a free parameter.

Constants

Symbol Value Meaning
HCA2.5Homecourt advantage in points
σ_n11.5Per-game noise standard deviation
σ_θ2.0Initial posterior std on NRtg differential
c0.6Prior regression toward zero (calibrated)
κ0.0Four Factors weight (currently disabled)

Calibration approach

Constants were derived from a backtest over 2015-2024 NBA playoffs. Prior regression c was selected by sweeping values from 0.3 to 1.0 and choosing the midpoint of best log-loss (0.7) and best ECE (0.5). Single point estimate, no per-round or per-bucket variation.

Known calibration limitation: the model is systematically over-confident in matchups with model-assigned probability between 0.50 and 0.60 (close NRtg matchups). For full details on the calibration analysis and known biases, see the README.

What this model doesn't know

The model uses regular-season net rating only. It does not see:

  • Player injuries, trade-deadline acquisitions, or roster changes
  • In-game live state — model only updates when games complete
  • Coaching adjustments, momentum, or matchup-specific dynamics
  • Schedule density, rest days, or back-to-back effects

These are real signals the Kalshi market does see (via news, lineup announcements, in-game reactions). The model's edge over the market — when it has one — comes from regression-to-mean discipline, not from richer information.