Premier League β Validation
Every played match: our pre-match forecast vs. what actually happened. The receipts. π§Ύ
30 graded matches
Market = de-vigged bookmaker consensus over 30 of 30 graded matches. Both figures above are scored on that same subset. SFMMO leads the closing market by 0.6% on RPS.
Wait β how can 46.7% 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 | ✓ |
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 | ✓ |
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 | ✓ |
✓ = our most-likely result was correct Β· ⚛ = exact scoreline nailed Β· multiclass Brier score 0.598. 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