How It Works
This app uses 40+ years of international football data and proven statistical models to forecast match outcomes with calibrated probabilities.
Elo Rating
Team Strength Ranking
Each team has a dynamic strength rating. After every match, both teams' Elo ratings update based on the expected vs. actual outcome — beating a stronger opponent earns more points.
Expected score: E_A = 1 / (1 + 10^((R_B − R_A) / 400))
R_A, R_B = Elo ratings before the match
S_A = Actual result (1=win, 0.5=draw, 0=loss)
K = Sensitivity factor (40 for international football)
📌 Example: Germany (1950) vs Czechia (1650). Germany's expected score = 0.94 — they win, gaining only ~2 pts. If Czechia wins, they gain +37 pts!
Score Prediction
Dixon-Coles Bivariate Poisson Model
Each team's attack strength (α) and defensive effect on opponents (β) are estimated from historical data. The Poisson distribution then models every possible scoreline.
Home expected goals:
Away expected goals:
Poisson probability of scoring exactly k goals:
μ = League baseline goal rate
α_i = Team i attack parameter
β_j = Team j defensive parameter (opponent goals allowed)
γ = Home advantage factor
Dixon-Coles Correction
Standard Poisson underestimates low-scoring outcomes (0-0, 1-0, 0-1, 1-1). Dixon-Coles applies a correction factor ρ to these four results, improving calibration at low scores.
📌 Example: Brazil (λ=1.8) vs Argentina (λ=1.1) → Model computes 13.2% for 2-1, 10.8% for 1-0, and so on for all scorelines.
Outcome Probabilities
Win / Draw / Loss
After computing probabilities for every scoreline (0-0 through 6-6), they are grouped into the three match outcomes.
📌 Example: Summing all home-win scoreline probabilities gives 58%. All draw scorelines → 22%. Remainder → 20% away win. Bars on the site show these percentages.
Model Quality
Measured by Brier Score
The Brier Score measures both accuracy and calibration of probabilistic forecasts. Lower is better. The model is penalised heavily for being confidently wrong.
pᵢ = Model's predicted probability (0–1)
oᵢ = Actual outcome indicator (1 if occurred, else 0)
n = Number of predictions evaluated
0.00
Perfect
0.10–0.25
Very Good
≈ 0.67
Random
📌 Example: Model gave France 90% but Morocco won → penalty = (0.9−0)² = 0.81. Model gave 55% and was wrong → (0.55−0)² = 0.30. Confidence punished more.
Data Pipeline
Predictions refresh before every match. After each result, Elo ratings are revised and fed into the next prediction cycle, keeping the model current.
Predictions are probabilistic estimates, not guarantees of outcome.