All leagues β€” Validation

Every played match: our pre-match forecast vs. what actually happened. The receipts. 🧾

67 graded matches

By league

The same forecasts, split by competition. Sample sizes differ a lot early in a season, so a league with few graded matches will look noisier than it is.

LeagueGraded Outcome accuracyAvg. RPS
Premier League 40 42.5% 0.2
Bundesliga 27 51.9% 0.214
46.3%
Outcome accuracy
31 / 67 results called
46.3% vs Market 49.3%
9.0%
Exact scoreline
6 / 67 spot‑on
0.205
Avg. RPS (lower better)
coin‑flip baseline 0.231
0.205 vs Market 0.199
11.0%
Skill vs. coin‑flip
RPS improvement over uniform

Market = de-vigged bookmaker consensus over 67 of 67 graded matches. Both figures above are scored on that same subset. SFMMO trails the closing market by 3.1% on RPS.

Wait β€” how can 46.3% accuracy still beat a coin-flip on RPS?

Because accuracy and RPS measure different things, on different scales β€” they're not in competition.

  • Accuracy only asks: was our single top pick right? It's blind to the probabilities, and a model almost never makes draw its top pick β€” so a draw-heavy round drags it down even when the forecast was good.
  • RPS grades the whole probability spread (e.g. 55 / 25 / 20) against a uniform β€œcoin-flip” (33 / 33 / 33). The coin-flip never commits, so it's never punished hard β€” which makes it a surprisingly tough baseline, and means a few % of skill is a genuine edge.

Our committed forecast cuts both ways (lower RPS = better):

MatchOur forecastResultOur RPSCoin-flip RPS
Favourite delivers55 / 25 / 20home win0.12 βœ“0.28
We back home, it's a draw55 / 25 / 20draw0.170.11 βœ“

When a favourite wins we crush the baseline; on a draw, the hedging coin-flip actually beats us. Matchday 1 had 9 draws in 24 games, so the wins and losses partly cancel β€” the net edge is the β€œskill” figure above. A few % over uniform is roughly what bookmakers manage, so it's a real, healthy edge.

Matchday 1
Match Forecast (1 / X / 2) Our call Predicted Actual
77.3 / 14.8 / 7.9 Arsenal 2–0 3–0
17.2 / 23.7 / 59.0 Manchester United 0–1 2–0
45.7 / 27.8 / 26.5 Everton 1–1 2–0
32.4 / 28.6 / 38.9 Sunderland 1–1 2–1
50.8 / 24.3 / 24.8 Nottingham Forest 1–1 0–1
49.1 / 24.5 / 26.4 Brentford 1–1 3–0
42.8 / 27.4 / 29.9 Brighton & Hove Albion 1–1 4–0
65.0 / 19.9 / 15.1 Manchester City 2–0 2–1
31.3 / 26.4 / 42.3 Liverpool 1–1 2–2
31.1 / 28.0 / 40.9 Chelsea 1–1 2–3
69.1 / 18.3 / 12.6 Bayern Munich 2–0 5–1
20.6 / 22.5 / 56.9 Bayer Leverkusen 1–1 3–2
61.3 / 21.9 / 16.9 RB Leipzig 1–1 3–0
63.6 / 21.8 / 14.6 Mainz 05 2–0 0–0
41.8 / 27.4 / 30.9 Union Berlin 1–1 3–3
32.3 / 25.4 / 42.3 Hoffenheim 1–1 3–2
66.1 / 20.2 / 13.7 Borussia Dortmund 2–0 2–0
44.2 / 24.9 / 30.9 Freiburg 1–1 4–1
49.1 / 27.0 / 24.0 Augsburg 1–1 3–0
Matchday 2
Match Forecast (1 / X / 2) Our call Predicted Actual
22.0 / 25.8 / 52.2 Manchester City 1–1 1–4
60.6 / 22.5 / 16.9 Liverpool 1–1 2–2
42.8 / 27.0 / 30.2 AFC Bournemouth 1–1 1–1
38.5 / 27.6 / 33.9 Coventry City 1–1 0–1
42.9 / 25.6 / 31.5 Tottenham Hotspur 1–1 0–2
50.1 / 25.6 / 24.3 Chelsea 1–1 4–3
32.0 / 25.3 / 42.7 Brentford 1–1 1–1
36.8 / 28.9 / 34.3 Sunderland 1–1 1–0
74.4 / 16.7 / 8.9 Manchester United 2–0 5–2
20.2 / 23.5 / 56.3 Arsenal 1–1 0–1
55.0 / 22.9 / 22.0 VfB Stuttgart 1–1 4–1
32.4 / 23.9 / 43.7 Borussia Dortmund 1–1 2–3
59.1 / 22.1 / 18.8 Bayer Leverkusen 1–1 4–0
55.8 / 23.0 / 21.2 Borussia MΓΆnchengladbach 1–1 3–4
22.8 / 22.4 / 54.8 RB Leipzig 1–1 3–1
25.6 / 26.0 / 48.4 Freiburg 1–1 0–1
9.2 / 16.2 / 74.5 Bayern Munich 0–2 0–0
35.8 / 29.0 / 35.2 Hamburger SV 1–1 0–5
46.7 / 25.3 / 28.0 Eintracht Frankfurt 1–1 1–4
Matchday 3
Match Forecast (1 / X / 2) Our call Predicted Actual
13.3 / 19.1 / 67.6 Liverpool 0–2 0–2
48.0 / 24.6 / 27.5 Newcastle United 1–1 2–2
61.4 / 22.9 / 15.7 Brentford 1–0 1–1
55.2 / 23.3 / 21.5 Brighton & Hove Albion 1–1 1–1
46.7 / 27.0 / 26.4 Fulham 1–1 2–3
83.1 / 11.6 / 5.3 Manchester City 2–0 1–0
48.6 / 25.4 / 26.1 Nottingham Forest 1–1 0–0
32.4 / 28.3 / 39.3 Aston Villa 1–1 0–0
32.1 / 27.6 / 40.3 Manchester United 1–1 2–2
53.2 / 24.2 / 22.6 Arsenal 1–1 2–1
49.2 / 27.1 / 23.8 Union Berlin 1–1 1–3
80.5 / 13.2 / 6.3 Borussia Dortmund 2–0 3–0
43.7 / 23.1 / 33.2 Hoffenheim 1–1 2–1
51.3 / 24.4 / 24.4 Freiburg 1–1 5–0
33.0 / 25.1 / 41.9 Bayer Leverkusen 1–1 2–2
53.6 / 23.9 / 22.5 Mainz 05 1–1 1–3
36.0 / 24.4 / 39.6 Werder Bremen 1–1 1–1
73.0 / 17.1 / 9.9 RB Leipzig 2–0 5–0
11.2 / 16.6 / 72.1 Bayern Munich 0–2 1–2
Round of 32
Match Forecast (1 / X / 2) Our call Predicted Actual
39.2 / 25.4 / 35.4 AFC Bournemouth 1–1 2–2
40.4 / 27.9 / 31.6 Aston Villa 1–1 1–2
71.5 / 18.6 / 10.0 Chelsea 2–0 2–2
62.2 / 21.9 / 15.9 Crystal Palace 2–0 2–3
65.7 / 20.7 / 13.6 Liverpool 2–0 0–0
40.1 / 27.9 / 32.0 Tottenham Hotspur 1–1 0–0
17.7 / 24.7 / 57.6 Arsenal 0–1 0–2
22.7 / 24.8 / 52.4 Brighton & Hove Albion 1–1 0–5
38.9 / 26.3 / 34.8 Manchester United 1–1 0–1
39.6 / 26.0 / 34.4 Leeds United 1–1 4–1

✓ = our most-likely result was correct  Β·  ⚛ = exact scoreline nailed  Β·  multiclass Brier score 0.614. Click any match for its full forecast breakdown.