How good is it,
really?
Every forecast on this site comes from one model, replayed against completed seasons it never saw during fitting. Here is what it gets right, what it gets wrong, and the candidates that were rejected for being worse.
Outcome accuracy
55.1%
628 of 1140 fixtures called correctly
Baseline model
49.6%
+5.4pp for the live model
Brier score
0.625
Lower is better · ~0.667 = guessing
Seasons replayed
3
Full 380-fixture out-of-sample replays
Season by season
Share of fixtures where the model's most likely outcome (home win, draw or away win) matched the result.
| Season | Baseline | Tuned | Classifier | Live model |
|---|---|---|---|---|
| 2023/24380 matches | 53.95% | 56.32% | 58.16% | 57.11% |
| 2024/25380 matches | 48.16% | 54.47% | 54.21% | 55.00% |
| 2025/26380 matches | 46.84% | 49.74% | 52.63% | 53.16% |
The live model is the Hybrid Ensemble (Dixon-Coles goal expectation blended with a gradient-boosted outcome classifier). The classifier is stronger in isolation on one season, the blend is stronger on the other two — which is why the site serves the blend.
Calibration
Multi-class Brier score across the three outcome probabilities. Lower is better; a model that always predicts 33/33/33 scores about 0.667.
2023/24
0.5828
2024/25
0.6088
2025/26
0.6286
Being right often is not the same as being right by the correct amount. A forecast that says 60% should happen about 60% of the time — the Brier score measures that, and it is the metric a model has to improve before it is allowed to ship. Latest full-season log loss: 1.0381; draw calibration gap: 0.0039.
Where it breaks down — 2025/26
Full-season review from Snapshot 5 (2026-05-27), measured on the pre-GBT hybrid. The current hybrid scores 53.2% on the same season; the quarter-by-quarter breakdown has not yet been re-run against it.
Q1 · MD 1–9
53.3%
Q2 · MD 10–19
55.0%
Q3 · MD 20–28
40.0%
Q4 · MD 29–38
42.0%
The model is materially better in the first half of a season than the second. The leading explanation is that mid-season form pivots — a manager change, a January rebuild, a genuine hot streak — move faster than the recency window the ratings use. That gap is an open investigation, not a solved problem.
A candidate we rejected
The weekly optimizer produced a candidate coefficient set fitted on all 380 fixtures of 2025/26. It was worse than the live model on both primary metrics, so it was not shipped.
| Metric | Live model | Candidate | Verdict |
|---|---|---|---|
| Outcome Brier | 0.624765 | 0.626315 | Worse |
| Outcome log loss | 1.038122 | 1.039960 | Worse |
| Draw calibration gap | 0.003867 | 0.016039 | Worse |
Decision on 2026-05-27: not shipped. A newer fit is not automatically a better one, and the gate exists to catch exactly this.
How the model works
1. Ratings, not vibes
Each club carries an Elo rating plus separate attack and defence strengths, rebuilt from every completed fixture and weighted towards recent form. Home advantage is fitted, not assumed.
2. Two models, blended
A Dixon-Coles Poisson model turns those ratings into goal expectations and a full scoreline distribution. A gradient-boosted classifier predicts the outcome directly from the same features. The live forecast is a blend of the two — each covers the other’s weak spots.
3. Context, carefully
Season phase, table pressure, fixture congestion and squad availability adjust the baseline. These features are deliberately weighted low: they help in-season and hurt on seasons they were not calibrated against, so they are never allowed to dominate the ratings.
4. Simulated seasons
Title, top-four and relegation probabilities come from a 10,000-iteration Monte Carlo sweep of every remaining fixture. The sweep runs offline on a schedule; pages only ever read the resulting snapshot.
5. Replayed and gated
Every candidate model is replayed out-of-sample against completed seasons. It ships only if it improves Brier score and log loss without a season quarter regressing. Candidates that fail are documented and discarded.
What we are not claiming
The failure modes we know about, published alongside the numbers rather than after someone finds them.
- These are out-of-sample replay backtests, not a live frozen-prediction log. The World Cup 2026 log is the fully frozen record — every call written to disk before kickoff and never overwritten.
- Brier score has drifted upward season over season (0.583 → 0.609 → 0.629). Premier League results are getting harder to predict, or the model has drifted from the data distribution. This is under investigation at the 2026/27 season start.
- On historical seasons the plain baseline beats the fully-enriched context model. The context layer (pressure, congestion, manager, form weights) adds net noise against seasons it was not calibrated on; the hybrid blend recovers most of that, but the context layer needs regularisation.
- A run-in fatigue feature was tested and rejected — it made the model worse in both 2023/24 and 2024/25. It is not enabled.
- Squad-sentiment weighting cannot be validated before 2026-04-28, when the sentiment archive starts. It runs at deliberately conservative weights pending a full-season ablation.
- Exact scorelines are much harder than outcomes and are evaluated separately — treat any single projected score as the middle of a wide distribution, not a call.
This is a forecasting tool, not a tipping service. Every number here is a model output — a statement about how often something happens in simulation, not advice about what to do with it.
Full working: prediction_accuracy.md in the project repository