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.

Model the draw rate as a function of rating difference. Procedure:

  1. Compute ELO difference Δ (including any home-advantage offset) for every historical match
  2. Bin by Δ (or fit a smooth curve); record observed draw frequency per bin — it peaks at Δ=0 and decays roughly symmetrically
  3. 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)
  4. 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