All leagues β Validation
Every played match: our pre-match forecast vs. what actually happened. The receipts. π§Ύ
67 graded matches
Sign in to include Serie A, La Liga and Ligue 1.
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.
| League | Graded | Outcome accuracy | Avg. RPS |
|---|---|---|---|
| Premier League | 40 | 42.5% | 0.2 |
| Bundesliga | 27 | 51.9% | 0.214 |
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):
| Match | Our forecast | Result | Our RPS | Coin-flip RPS |
|---|---|---|---|---|
| Favourite delivers | 55 / 25 / 20 | home win | 0.12 β | 0.28 |
| We back home, it's a draw | 55 / 25 / 20 | draw | 0.17 | 0.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.
Arsenal
Coventry City
Hull City
Manchester United
Everton
Crystal Palace
Ipswich Town
Sunderland
Nottingham Forest
Leeds United
Brentford
Tottenham Hotspur
Brighton & Hove Albion
Aston Villa
Manchester City
AFC Bournemouth
Newcastle United
Liverpool
Fulham
Chelsea
Bayern Munich
VfB Stuttgart
Elversberg
Bayer Leverkusen
RB Leipzig
Borussia MΓΆnchengladbach
Mainz 05
Paderborn
Union Berlin
Eintracht Frankfurt
1. FC KΓΆln
Hoffenheim
Borussia Dortmund
Hamburger SV
Freiburg
Werder Bremen
Augsburg
Schalke 04