Methodology
How the model works
Two statistical models, blended evenly, fitted on every completed match in a competition's season. No tipsters, no scraping, no hand-editing. Here is exactly what runs.
Layer one: Dixon-Coles Poisson
Goals in football are close to Poisson-distributed, so the first layer predicts a scoreline distribution and reads the 1X2 probabilities off it. The expected goals for each side come from league-normalised attack and defence strengths:
lambda_home = attack[home] × defence[away] × league_home_average
Attack and defence are ratios to the league mean, so an average team sits at roughly 1.0. That matters more than it sounds. An earlier version of this engine multiplied two raw goal averages together and scaled the result, which is dimensionally meaningless and produced badly calibrated rates. It measured 50.3% accuracy against a 47.1% always-pick-home baseline — barely a signal at all.
Three corrections sit on top:
- Dixon-Coles low-score adjustment (
rho = -0.13). Plain Poisson under-predicts 0-0 and 1-1 and over-predicts 1-0 and 0-1. This corrects the four lowest scorelines, which is where draws live. - Bayesian shrinkage toward the league mean, worth five pseudo-games. In August a team has played twice; without shrinkage the model would treat a 4-0 opening win as proof of a title challenge.
- Score-matrix truncation at 8 goals per side. Beyond that the probabilities are noise and the sum is unchanged to four decimals.
Layer two: Pi-ratings
The second layer is a Pi-rating table in the Constantinou & Fenton (2013) form: a league-wide rating per team, updated game by game against the actual opponent's rating, in goal-difference space.
Learning rate is 0.15, home advantage is 0.30 goals
in rating space, and the rating gap converts to a win probability through a
logistic with divisor 1.6.
The draw parameter took two attempts. The peak draw
probability was originally 0.30, and the layer emitted an average
P(D) of 19.5% against an actual draw rate of 25.3%. It was the
source of the whole blend's draw deficit. Sweeping 0.30–0.50 found 0.34
minimised Brier score on both the training seasons and the held-out one
without costing accuracy. Higher values start tipping draws outright, which
loses more than it gains.
The blend
The two layers are averaged 50/50. An earlier design carried a third "form" layer at 20%; measured on its own it scored below the always-home baseline, so it was removed rather than down-weighted.
How it was validated
Parameters were selected by sweeping the 2022-23 and 2023-24 seasons, then tested once on a held-out 2021-22 season the sweep never saw. It generalised at +7.1 percentage points over the always-home baseline.
That is the number to hold onto, and it is smaller than it looks. Roughly 51% is the honest ceiling for picking 1X2 outcomes by argmax probability. Anyone advertising 80-90% is not measuring the same thing — the arithmetic is here.
What the model does not do
- No injury, lineup or weather data. Goals and results only.
- No competition without history. Of 43 competitions on the board, only those with a results feed get a fitted model. The rest show bookmaker consensus or, failing that, a flat league-average baseline that is labelled as such.
- No editing after kick-off. Every prediction is written to an append-only log before the match starts and graded against the real result afterwards. That log is what the record page reports.
Parameters current as of 27 August 2026. Any change to them is a change to the numbers on the board, and shows up in the record from that day forward.