Historical backtest · not live predictions
How accurate is the model?
We replayed every match from 9 Apr 2022 to 1 Jun 2025 in date order. Each match was predicted using only the matches played before it, then scored against the real result. The first year (9 Apr 2022 – 9 Apr 2023) only warms the ratings up and isn't scored.
Backtest run 26 Oct 2026 · results through 1 Jun 2025
Picking the right outcome isn't the real test — a model that says 52% should win about 52% of the time, not 100%. The scores and the calibration chart below measure that.
Scores against simple baselines
Lower is better for all three. "Rolling H/D/A" always predicts the home/draw/away frequencies seen so far; "Uniform" says one-third each.
| Score | Model | Rolling H/D/A | Uniform | What it measures |
|---|---|---|---|---|
| RPS | 0.2066 | 0.2297 | 0.2368 | ranked probability score; rewards being close (a draw is nearer a home win than an away win is) |
| Log-loss | 0.9999 | 1.0664 | 1.0986 | punishes confident wrong calls hardest |
| Brier | 0.5971 | 0.6447 | 0.6667 | squared error of the three probabilities |
Calibration: does 60% mean 60%?
Home-win probabilities grouped into bands. Each dot is a band: how often the model said the home side would win (across) against how often it actually did (up). On the diagonal is perfect.
| Model said | Happened | Matches |
|---|---|---|
| 7.2% | 11.9% | 126 |
| 15.9% | 17.3% | 584 |
| 25.5% | 26.8% | 1,188 |
| 35.5% | 36.4% | 1,826 |
| 45.1% | 45.6% | 2,274 |
| 54.7% | 52.3% | 1,765 |
| 64.5% | 63.4% | 1,001 |
| 74.4% | 74.5% | 533 |
| 84.2% | 84.0% | 212 |
By league
| League | Tier | Matches | Right | "Always home" | RPS model | RPS baseline |
|---|---|---|---|---|---|---|
| La Liga · Spain | tier1 | 861 | 53.5% | 45.8% | 0.1949 | 0.2258 |
| Premier League · England | tier1 | 844 | 53.3% | 44.4% | 0.2074 | 0.2341 |
| Serie A · Italy | tier1 | 851 | 53.2% | 41.2% | 0.1925 | 0.2269 |
| Ligue 1 · France | tier1 | 696 | 51.9% | 43.8% | 0.2119 | 0.2348 |
| Bundesliga · Germany | tier1 | 681 | 50.2% | 41.7% | 0.2036 | 0.2316 |
| Eredivisie · Netherlands | tier2 | 715 | 56.1% | 45.2% | 0.1896 | 0.2307 |
| Primeira Liga · Portugal | tier2 | 682 | 54.5% | 44.7% | 0.1862 | 0.2302 |
| Bundesliga · Austria | tier2 | 441 | 48.1% | 39.0% | 0.2050 | 0.2292 |
| Serie A · Brazil | tier2 | 760 | 47.5% | 47.1% | 0.2161 | 0.2235 |
| Championship · England | tier2 | 1,194 | 45.2% | 44.6% | 0.2229 | 0.2271 |
| UEFA Champions League | tier3 | 506 | 53.6% | 47.8% | 0.2106 | 0.2361 |
| UEFA Europa League | tier3 | 457 | 51.4% | 50.8% | 0.2191 | 0.2282 |
| UEFA Europa Conference League | tier3 | 839 | 51.4% | 49.1% | 0.2204 | 0.2315 |
What this is, and isn't. This backtest scores the rating backbone on its own. Live predictions add a goals model and a calibration layer where a league has enough data, so they can differ. Past accuracy doesn't promise future results, and accuracy alone doesn't make a profitable bet — that's judged on the track record against closing odds.