World Cup 2026 β Validation
Every played match: our pre-match forecast vs. what actually happened. The receipts. π§Ύ
Market = de-vigged bookmaker consensus over 96 matches with odds. SFMMO trails the closing market by 25.7% on RPS.
Wait β how can 58.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.
Knockout rounds can't end level β scores include extra time and penalty shootouts (a 3β4 may be a shootout result), and each match is graded on that final outcome.
Matchday 1
| Match | Forecast (1 / X / 2) | Our call | Predicted | Actual | |
|---|---|---|---|---|---|
| 52.0 / 27.0 / 21.0 | Mexico | 1β0 | 2β0 | ✓ | |
| 35.7 / 27.9 / 36.4 | Czechia | 1β1 | 2β1 | ✗ | |
| 35.2 / 24.5 / 40.3 | Bosnia & Herzegovina | 1β1 | 1β1 | ✗ | |
| 31.7 / 29.2 / 39.0 | Paraguay | 0β1 | 4β1 | ✗ | |
| 12.9 / 18.6 / 68.5 | Switzerland | 0β2 | 1β1 | ✗ | |
| 38.6 / 24.7 / 36.6 | Netherlands | 1β1 | 2β2 | ✗ | |
| 45.1 / 28.7 / 26.2 | Brazil | 1β0 | 1β1 | ✗ | |
| 25.1 / 25.5 / 49.4 | Scotland | 0β1 | 0β1 | ✓ ⚛ | |
| 37.8 / 23.2 / 38.9 | TΓΌrkiye | 1β1 | 2β0 | ✗ | |
| 65.0 / 19.7 / 15.3 | Germany | 2β0 | 7β1 | ✓ | |
| 18.6 / 25.4 / 56.1 | Ecuador | 0β1 | 1β0 | ✗ | |
| 48.2 / 26.2 / 25.7 | Sweden | 1β0 | 5β1 | ✓ | |
| 79.9 / 12.4 / 7.2 | Spain | 2β0 | 0β0 | ✗ | |
| 88.2 / 6.9 / 2.9 | Belgium | 3β0 | 1β1 | ✗ | |
| 22.8 / 27.0 / 50.2 | Uruguay | 0β1 | 1β1 | ✗ | |
| 53.9 / 27.7 / 18.4 | Iran | 1β0 | 2β2 | ✗ | |
| 70.1 / 19.0 / 10.9 | France | 2β0 | 3β1 | ✓ | |
| 26.2 / 26.8 / 46.9 | Norway | 0β1 | 1β4 | ✓ | |
| 74.4 / 15.0 / 10.3 | Argentina | 2β0 | 3β0 | ✓ | |
| 48.3 / 22.5 / 29.2 | Austria | 1β1 | 3β1 | ✓ | |
| 72.2 / 15.8 / 11.7 | Portugal | 2β0 | 1β1 | ✗ | |
| 35.2 / 27.5 / 37.3 | Croatia | 1β1 | 4β2 | ✗ | |
| 39.0 / 27.8 / 33.2 | Ghana | 1β1 | 1β0 | ✓ | |
| 28.1 / 26.1 / 45.7 | Colombia | 1β1 | 1β3 | ✓ |
Matchday 2
| Match | Forecast (1 / X / 2) | Our call | Predicted | Actual | |
|---|---|---|---|---|---|
| 59.3 / 21.1 / 19.6 | Czechia | 1β0 | 1β1 | ✗ | |
| 57.6 / 20.3 / 22.0 | Switzerland | 2β1 | 4β1 | ✓ | |
| 48.0 / 24.0 / 28.0 | Canada | 1β1 | 6β0 | ✓ | |
| 36.4 / 31.0 / 32.5 | Mexico | 0β0 | 1β0 | ✓ | |
| 29.3 / 26.4 / 44.2 | Australia | 1β1 | 2β0 | ✗ | |
| 85.3 / 9.5 / 4.1 | Germany | 3β0 | 2β1 | ✓ | |
| 19.6 / 23.8 / 56.6 | Morocco | 0β1 | 0β1 | ✓ ⚛ | |
| 72.1 / 17.2 / 10.5 | Brazil | 2β0 | 3β0 | ✓ | |
| 49.6 / 23.0 / 27.4 | TΓΌrkiye | 1β1 | 0β1 | ✗ | |
| 48.5 / 22.4 / 29.0 | Netherlands | 1β1 | 5β1 | ✓ | |
| 52.4 / 25.1 / 22.4 | Ecuador | 1β0 | 0β0 | ✗ | |
| 15.4 / 23.3 / 61.3 | Japan | 0β1 | 0β4 | ✓ | |
| 64.1 / 19.9 / 15.9 | Spain | 2β0 | 4β0 | ✓ | |
| 64.7 / 22.0 / 13.3 | Belgium | 1β0 | 0β0 | ✗ | |
| 69.6 / 17.5 / 12.8 | Uruguay | 2β0 | 2β2 | ✗ | |
| 42.6 / 24.1 / 33.2 | New Zealand | 1β1 | 1β3 | ✗ | |
| 64.3 / 20.1 / 15.6 | Argentina | 2β0 | 2β0 | ✓ ⚛ | |
| 69.3 / 20.4 / 10.2 | France | 1β0 | 3β0 | ✓ | |
| 43.8 / 24.6 / 31.5 | Norway | 1β1 | 3β2 | ✓ | |
| 42.4 / 20.4 / 37.1 | Jordan | 1β1 | 1β2 | ✗ | |
| 68.6 / 17.4 / 13.9 | Portugal | 2β0 | 5β0 | ✓ | |
| 73.0 / 16.8 / 10.0 | England | 2β0 | 0β0 | ✗ | |
| 10.8 / 18.3 / 70.9 | Croatia | 0β2 | 0β1 | ✓ | |
| 45.8 / 24.3 / 29.9 | Colombia | 1β1 | 1β0 | ✓ |
Matchday 3
| Match | Forecast (1 / X / 2) | Our call | Predicted | Actual | |
|---|---|---|---|---|---|
| 48.7 / 26.3 / 24.9 | Switzerland | 1β0 | 2β1 | ✓ | |
| 58.7 / 19.8 / 21.5 | Bosnia & Herzegovina | 2β1 | 3β1 | ✓ | |
| 16.5 / 21.8 / 61.7 | Brazil | 0β1 | 0β3 | ✓ | |
| 57.8 / 23.7 / 18.5 | Morocco | 1β0 | 4β2 | ✓ | |
| 44.8 / 28.4 / 26.8 | Czechia | 1β0 | 0β3 | ✗ | |
| 24.1 / 24.4 / 51.5 | South Korea | 0β1 | 1β0 | ✗ | |
| 21.8 / 24.1 / 54.1 | Germany | 0β1 | 2β1 | ✗ | |
| 51.6 / 24.2 / 24.2 | CuraΓ§ao | 1β0 | 0β2 | ✗ | |
| 47.8 / 26.8 / 25.4 | Japan | 1β0 | 1β1 | ✗ | |
| 56.2 / 21.0 / 22.7 | TΓΌrkiye | 1β1 | 3β2 | ✓ | |
| 27.6 / 27.1 / 45.4 | Australia | 0β1 | 0β0 | ✗ | |
| 14.5 / 20.7 / 64.8 | France | 0β1 | 1β4 | ✓ | |
| 42.0 / 29.1 / 28.8 | Senegal | 1β0 | 5β0 | ✓ | |
| 13.5 / 18.4 / 68.0 | Netherlands | 0β2 | 1β3 | ✓ | |
| 26.9 / 23.5 / 49.6 | Spain | 1β1 | 0β1 | ✓ | |
| 25.9 / 25.8 / 48.3 | Saudi Arabia | 0β1 | 0β0 | ✗ | |
| 4.8 / 11.0 / 83.5 | Belgium | 0β2 | 1β5 | ✓ | |
| 13.2 / 20.0 / 66.8 | Iran | 0β1 | 1β1 | ✗ | |
| 13.4 / 21.2 / 65.5 | England | 0β1 | 0β2 | ✓ | |
| 71.7 / 16.8 / 11.3 | Croatia | 2β0 | 2β1 | ✓ | |
| 15.2 / 18.7 / 66.0 | Portugal | 0β2 | 0β0 | ✗ | |
| 42.0 / 25.0 / 33.1 | DR Congo | 1β1 | 3β1 | ✓ | |
| 15.9 / 20.3 / 63.7 | Argentina | 0β1 | 1β3 | ✓ | |
| 25.9 / 19.4 / 54.5 | Austria | 1β2 | 3β3 | ✗ |
Round of 32
| Match | Forecast (1 / X / 2) | Our call | Predicted | Actual | |
|---|---|---|---|---|---|
| 21.1 / 23.4 / 55.5 | Canada | 0β1 | 0β1 | ✓ ⚛ | |
| 46.7 / 27.5 / 25.9 | Brazil | 1β0 | 2β1 | ✓ | |
| 70.6 / 18.4 / 11.0 | Germany | 2β0 | 3β4 | ✗ | |
| 37.4 / 25.7 / 36.9 | Netherlands | 1β1 | 2β3 | ✗ | |
| 23.9 / 23.9 / 52.3 | Norway | 1β1 | 1β2 | ✓ | |
| 58.7 / 23.8 / 17.5 | France | 1β0 | 3β0 | ✓ | |
| 25.3 / 30.6 / 44.1 | Ecuador | 0β1 | 2β0 | ✗ | |
| 68.2 / 18.8 / 12.9 | England | 2β0 | 2β1 | ✓ | |
| 71.7 / 17.8 / 10.4 | Belgium | 2β0 | 3β2 | ✓ | |
| 31.6 / 24.5 / 44.0 | Bosnia & Herzegovina | 1β1 | 2β0 | ✗ | |
| 64.5 / 18.4 / 17.0 | Spain | 2β1 | 3β0 | ✓ | |
| 43.2 / 23.9 / 32.9 | Portugal | 1β1 | 2β1 | ✓ | |
| 65.7 / 18.1 / 16.1 | Switzerland | 2β1 | 2β0 | ✓ | |
| 64.3 / 19.0 / 16.6 | Australia | 2β1 | 2β4 | ✗ | |
| 67.7 / 19.2 / 13.0 | Argentina | 2β0 | 3β2 | ✓ | |
| 46.7 / 24.3 / 29.0 | Colombia | 1β1 | 1β0 | ✓ |
Round of 16
| Match | Forecast (1 / X / 2) | Our call | Predicted | Actual | |
|---|---|---|---|---|---|
| 29.6 / 29.2 / 41.2 | Morocco | 0β1 | 0β3 | ✓ | |
| 11.5 / 21.9 / 66.6 | France | 0β1 | 0β1 | ✓ ⚛ | |
| 64.0 / 20.8 / 15.1 | Brazil | 1β0 | 1β2 | ✗ | |
| 16.7 / 26.7 / 56.6 | England | 0β1 | 2β3 | ✓ | |
| 40.5 / 22.5 / 37.0 | Portugal | 1β1 | 0β1 | ✗ | |
| 7.9 / 16.0 / 76.0 | Belgium | 0β2 | 1β4 | ✓ | |
| 73.4 / 16.7 / 9.8 | Argentina | 2β0 | 3β2 | ✓ | |
| 45.0 / 25.9 / 29.2 | Switzerland | 1β1 | 4β3 | ✓ |
✓ = our most-likely result was correct Β· ⚛ = exact scoreline nailed Β· multiclass Brier score 0.553. Click any match for its full forecast breakdown.