ELO to Match Probabilities (W/D/L)¶
Overview¶
ELO does not output a win probability in a sport with draws. The logistic formula gives the expected score
$$E_A = \frac{1}{1 + 10^{(R_B - R_A)/400}}$$
and in football the score convention is win=1, draw=½, loss=0, so the identity is
$$E_A = P(\text{win}_A) + \tfrac{1}{2} P(\text{draw})$$
One equation, two unknowns. Any poisson-elo-ensemble needs a third-way split, so a draw model must be bolted on. Three standard options, in increasing order of effort.
Option 1 — Fixed draw rate (baseline)¶
Assume P(draw) is a constant (international football overall: ≈ 0.22–0.28; higher between evenly matched teams). Then
$$P(W_A) = E_A - \tfrac{d}{2}, \qquad P(D) = d, \qquad P(L_A) = 1 - P(W_A) - d$$
Probabilities sum to 1 by construction. Crude but coherent — and strictly better than inventing numbers. Weakness: in reality d depends on the rating gap (mismatches draw less), so this misprices lopsided games — clamp P(W), P(L) to [0,1] for extreme gaps.
Option 2 — Empirical draw-rate regression (recommended for v2)¶
Model the draw rate as a function of rating difference. Procedure:
- Compute ELO difference Δ (including any home-advantage offset) for every historical match
- Bin by Δ (or fit a smooth curve); record observed draw frequency per bin — it peaks at Δ=0 and decays roughly symmetrically
- Fit d(Δ), e.g. a Gaussian-shaped curve d(Δ) = d₀ · exp(−(Δ/s)²) with d₀ ≈ 0.30, s ≈ 600 as starting points (fit to your corpus)
- Apply Option 1's identity with d = d(Δ)
This keeps the ELO machinery untouched and calibrates the draw where the data actually is. Validate with a calibration-plots pass on the draw bucket specifically — it is the hardest outcome to calibrate.
Option 3 — Davidson tie model (principled)¶
Davidson (1970) extends bradley-terry-model with a tie parameter ν. With strengths π_A, π_B (π = 10^(R/400) connects to ELO):
$$P(W_A) = \frac{\pi_A}{\pi_A + \pi_B + \nu\sqrt{\pi_A \pi_B}}, \quad
P(D) = \frac{\nu\sqrt{\pi_A \pi_B}}{\pi_A + \pi_B + \nu\sqrt{\pi_A \pi_B}}, \quad
P(W_B) = \frac{\pi_B}{\pi_A + \pi_B + \nu\sqrt{\pi_A \pi_B}}$$
ν is estimated by maximum likelihood on historical matches (ν=0 recovers tie-free Bradley-Terry). Draw probability automatically peaks for equal strengths and decays with mismatch — Option 2's shape, derived rather than fitted ad hoc.
Option 4 — Map ELO to goal expectancy¶
Skip the direct split: convert the ELO gap into expected goals and reuse the Poisson machinery (which produces the draw natively). FiveThirtyEight's club model worked this way. Fit a regression of observed goal difference (and total) on Δ, derive λ_A, λ_B, then read W/D/L off the poisson-distribution scoreline matrix. Elegant, but it makes the ELO leg of an ensemble partially redundant with the Poisson leg — the ensemble gains less diversity.
Code Snippet¶
import numpy as np
def elo_wdl(r_home, r_away, home_adv=50.0, d0=0.30, s=600.0):
"""W/D/L from ELO via expected score + gap-dependent draw rate (Option 2)."""
diff = r_home + home_adv - r_away # home_adv=0 at neutral venues
e_home = 1.0 / (1.0 + 10 ** (-diff / 400))
d = d0 * np.exp(-(diff / s) ** 2)
p_home = np.clip(e_home - d / 2, 0.0, 1.0 - d)
p_away = 1.0 - p_home - d
return {"home": p_home, "draw": d, "away": p_away}
Pitfalls¶
- Using E_A as P(win) — it isn't; it contains half the draw mass. At E_A = 0.50 between equal sides, true P(win) is ≈ 0.36, not 0.50
- Hardcoding the draw and not rebalancing — outputs that don't sum to 1 poison ensemble weights and EV math downstream
- Calibrating d on club data for international use — draw rates differ by context (and friendlies differ from competitive matches); fit on the corpus you predict
- Neutral venues — drop the home-advantage offset from Δ at the World Cup, same as the Poisson side (international-football-modelling)
See Also¶
- elo-rating-system — the rating machinery upstream
- poisson-elo-ensemble — why a proper three-way split is required
- bradley-terry-model — Davidson's model is its tie-aware extension
- calibration-plots — validate the draw bucket after fitting