Methodology
The exact ratings, uncertainty, win probabilities, and playoff odds — with formulas.
The rating: Glicko-2
Despite the name, nbaelo uses Glicko-2, not Elo. Each team carries a rating $r$ (league average $\approx 1500$), a rating deviation $RD$ (its uncertainty — the $\pm$ you see and the shaded band on charts), and a volatility $\sigma$ (how erratic its results are). The math is done on an internal scale:
$$\mu = \frac{r - 1500}{173.7178}, \qquad \phi = \frac{RD}{173.7178}$$and converted back with $r = 1500 + 173.7178\,\mu$ and $RD = 173.7178\,\phi$.
Win probability
An opponent's uncertainty is folded in through
$$g(\phi) = \frac{1}{\sqrt{1 + 3\phi^2/\pi^2}}$$The home team gets a home-court bonus $h$ added to its rating (dropped for neutral sites). With both teams' uncertainty combined as $\phi_{\text{c}} = \sqrt{\phi_i^2 + \phi_j^2}$, the probability the home team $i$ beats the away team $j$ is
$$P(i \text{ beats } j) = \frac{1}{1 + \exp\!\big(-\,g(\phi_{\text{c}})\,(\mu_i - \mu_j)\big)}$$where $\mu_i$ uses the home rating $r_i + h$. Because $g(\phi_{\text{c}}) \le 1$, more uncertainty pulls the probability toward $50\%$. The credible interval shown next to a prediction comes from sampling each team's rating from $\mathcal{N}(r, RD^2)$ and taking the 2.5th–97.5th percentiles of the resulting probabilities.
Updating after games
Over a rating period (one day), against opponents $j$ with scores $s_j \in \{0, 1\}$ and expected scores $E_j = P(i \text{ beats } j)$, we compute the estimated variance and the rating improvement:
$$v = \left[\sum_j g(\phi_j)^2\,E_j\,(1 - E_j)\right]^{-1}, \qquad \Delta = v \sum_j g(\phi_j)\,(s_j - E_j)$$The volatility $\sigma' $ is updated by solving (via the Illinois algorithm) the Glicko-2 equation whose root balances the observed change against the system constant $\tau$:
$$f(x) = \frac{e^{x}\,(\Delta^2 - \phi^2 - v - e^{x})}{2\,(\phi^2 + v + e^{x})^2} - \frac{x - \ln(\sigma^2)}{\tau^2} = 0, \qquad \sigma' = e^{x/2}$$Then the deviation and rating are updated:
$$\phi' = \frac{1}{\sqrt{\dfrac{1}{\phi^2 + \sigma'^2} + \dfrac{1}{v}}}, \qquad \mu' = \mu + \phi'^2 \sum_j g(\phi_j)\,(s_j - E_j)$$Winning raises $r$ and playing shrinks $RD$ (we're more certain); a bigger surprise moves the rating more.
Inactivity & between seasons
When a team is idle for $t$ rating periods (off days, and especially the summer), its uncertainty grows:
$$\phi^{*} = \sqrt{\phi^2 + \sigma^2\,t}\,, \quad \text{capped at } RD_{\max}.$$At each season boundary the rating also regresses toward the mean and the uncertainty is reset upward for roster turnover:
$$r_{\text{start}} = 1500 + c\,(r_{\text{end}} - 1500), \qquad RD_{\text{start}} = \min\!\big(RD_{\max},\, \max(RD,\, RD_{\text{reset}})\big)$$with carryover $c \approx 0.75$ by default.
Playoff & championship odds
The playoff odds come from a Monte Carlo simulation of the rest of the season. Each of the (thousands of) simulated seasons first samples every team's true strength $\theta \sim \mathcal{N}(r, RD^2)$, then plays out remaining games with $P = \sigma_{\!L}(\theta_i + h - \theta_j)$ and simulates the bracket. Sampling the strength is why the odds carry intervals: teams we're unsure about produce a wider range of outcomes.
How good is it?
Predictions are scored out-of-sample with log loss and the Brier score on the accuracy page. Every parameter above — reactivity $\tau$, home-court $h$, carryover $c$, $RD_{\max}$, $RD_{\text{reset}}$ — is tunable, and each set of ratings is a versioned run you can compare and switch between.
Note: ratings are team-level and result-driven — they don't know about injuries, rest, or trades, so a game where availability differs sharply from the norm will be mispriced.