The World Cup 2026 record, match by match
We predicted every match of the 2026 World Cup before it was played, published each prediction in a public repository, and graded all 104 of them afterwards. This page is the whole record: the hits, the misses, and the two findings that made the model worse rather than better.
The headline numbers
| Metric | The model | Coin flip | Historical base rates |
|---|---|---|---|
| Outcome accuracy (W/D/L) | 59.6% | 33.3% | — |
| Brier score (lower is better) | 0.5406 | 0.6667 | 0.6513 |
| Exact scorelines | 12 of 104 (11.5%) | — | — |
| Log loss | 0.9102 | 1.0986 | — |
Beating a coin flip is trivial; beating the historical base rates of football results is not. Both comparison columns are computed over the same 104 matches, so they are like-for-like.
By stage
| Stage | Matches | Outcome accuracy | Exact scores | Brier |
|---|---|---|---|---|
| Group stage | 72 | 62.5% | 11.1% | 0.5277 |
| Knockouts (90 minutes) | 32 | 53.1% | 12.5% | 0.5696 |
Finding one: retraining during the tournament made the model worse
We retrained after every matchday, weighting the tournament's own results four times more heavily than historical data. The intuition was obvious — use the newest information. Graded against the record, it was wrong.
| Model | Outcome accuracy | Brier | Exact scores |
|---|---|---|---|
| Frozen before the tournament | 66.3% | 0.5220 | 9.6% |
| Retrained after every matchday | 59.6% | 0.5406 | 11.5% |
The version that never saw a single tournament result was 6.7 percentage points better across all 104 matches, and 15.6 points better in the knockouts — 68.8% against 53.1%. Three to seven matches per team is not enough data to update team strength; we were fitting to noise and calling it form. Walk-forward retraining has been dropped.
Finding two: the model could not imagine a well-organised underdog
Our confident predictions were not as good as their confidence implied. Predictions in the 90–100% band (6 of them) came in at 50.0%. A calibrated model's 90% predictions come in about 90% of the time.
| Predicted probability | Predictions | Actually happened |
|---|---|---|
| 0–10% | 35 | 8.6% |
| 10–20% | 53 | 11.3% |
| 20–30% | 64 | 18.8% |
| 30–40% | 64 | 35.9% |
| 40–50% | 41 | 58.5% |
| 50–60% | 20 | 65.0% |
| 60–70% | 13 | 53.8% |
| 70–80% | 9 | 88.9% |
| 80–90% | 7 | 71.4% |
| 90–100% | 6 | 50.0% |
Nearly all of the damage sat in one place: heavy favourites held to draws by sides that set up to defend. A Poisson goal model with a draw correction still assumes both teams are trying to score at their usual rate. That is the wrong assumption for a tournament with a 48-team field and a lot of underdogs happy to take a point.
The calls we got right when it was hard
- England 1-2 Argentina — called the away win at 34.7%.
- Colombia 0-0 Portugal — called the draw at 35.1%.
- Brazil 1-1 Morocco — called the draw at 37.5%.
- Spain 2-1 Belgium — called the home win at 38.1%.
- USA 4-1 Paraguay — called the home win at 38.5%.
- Cabo Verde 0-0 Saudi Arabia — called the draw at 41.3%.
The calls we got wrong while confident
- Spain 0-0 Cabo Verde — we had home win at 97.5%; it finished a draw.
- Iran 2-2 New Zealand — we had home win at 94.9%; it finished a draw.
- Ecuador 0-0 Curaçao — we had home win at 91.2%; it finished a draw.
- England 0-0 Ghana — we had home win at 81.2%; it finished a draw.
- Uruguay 2-2 Cabo Verde — we had home win at 81.1%; it finished a draw.
- Qatar 1-1 Switzerland — we had away win at 73.0%; it finished a draw.
Verify any of this yourself
Predictions were committed to a public repository before kick-off, so the timestamps are checkable independently of anything we say. The grading script reconstructs each prediction from the model parameters as they existed at least sixteen hours before the match — a walk-forward rebuild from git history, not a retrospective fit:
git clone https://github.com/nabeehshameem/fpl-optimiser
cd fpl-optimiser
python wc/retrospective/grade_retrospective.py
That regenerates per_match.csv and summary.txt,
which are the only inputs to this page. If your numbers differ from the ones
above, the numbers above are wrong.
Every match
Two different predictions are graded here, and they can disagree. Top scoreline is the single most likely score. W/D/L call is the most likely outcome, which is every home-win scoreline added together against every draw and every away win. The most likely single score is often a draw while the most likely outcome is still a home win, because home victories are spread across many different scorelines.
That is why 5 matches below show a correct exact score next to a missed W/D/L call. Canada 1–1 Bosnia & Herzegovina is the clearest case: the top scoreline was 1–1, but the home win held 42% against the draw's 32%, so the outcome call was a home win. Both grades are shown rather than the flattering one.
Probabilities are home/draw/away at 90 minutes. Matches marked * went to extra time and are graded on the 90-minute result. Brier score is per match, lower being better.
| # | Date | Match | Top scoreline | Actual | H/D/A % | W/D/L call | Exact | Brier |
|---|---|---|---|---|---|---|---|---|
| 1 | 2026-06-11 | Mexico v South Africa | 1-0 | 2-0 | 56/28/16 | H ✓ | — | 0.300 |
| 2 | 2026-06-12 | Canada v Bosnia & Herzegovina | 1-1 | 1-1 | 42/32/26 | H ✗ | ✓ | 0.714 |
| 3 | 2026-06-12 | South Korea v Czechia | 1-1 | 2-1 | 43/29/28 | H ✓ | — | 0.492 |
| 4 | 2026-06-13 | USA v Paraguay | 1-1 | 4-1 | 38/32/29 | H ✓ | — | 0.568 |
| 5 | 2026-06-13 | Qatar v Switzerland | 0-2 | 1-1 | 8/19/73 | A ✗ | — | 1.201 |
| 6 | 2026-06-13 | Brazil v Morocco | 0-0 | 1-1 | 27/38/35 | D ✓ | — | 0.589 |
| 7 | 2026-06-14 | Haiti v Scotland | 0-2 | 0-1 | 12/19/69 | A ✓ | — | 0.145 |
| 8 | 2026-06-14 | Australia v Türkiye | 1-1 | 2-0 | 29/30/41 | A ✗ | — | 0.766 |
| 9 | 2026-06-14 | Germany v Curaçao | 4-0 | 7-1 | 96/4/1 | H ✓ | — | 0.003 |
| 10 | 2026-06-14 | Netherlands v Japan | 1-1 | 2-2 | 36/32/32 | H ✗ | — | 0.696 |
| 11 | 2026-06-14 | Côte d'Ivoire v Ecuador | 0-0 | 1-0 | 27/34/39 | A ✗ | — | 0.797 |
| 12 | 2026-06-15 | Sweden v Tunisia | 1-1 | 5-1 | 32/28/40 | A ✗ | — | 0.705 |
| 13 | 2026-06-15 | Spain v Cabo Verde | 5-0 | 0-0 | 98/2/0 | H ✗ | — | 1.909 |
| 14 | 2026-06-15 | Belgium v Egypt | 1-0 | 1-1 | 55/30/16 | H ✗ | — | 0.814 |
| 15 | 2026-06-15 | Saudi Arabia v Uruguay | 0-1 | 1-1 | 13/28/59 | A ✗ | — | 0.888 |
| 16 | 2026-06-16 | Iran v New Zealand | 4-0 | 2-2 | 95/4/1 | H ✗ | — | 1.820 |
| 17 | 2026-06-16 | France v Senegal | 1-1 | 3-1 | 55/24/21 | H ✓ | — | 0.304 |
| 18 | 2026-06-16 | Iraq v Norway | 0-2 | 1-4 | 6/15/80 | A ✓ | — | 0.068 |
| 19 | 2026-06-17 | Argentina v Algeria | 1-0 | 3-0 | 50/32/18 | H ✓ | — | 0.388 |
| 20 | 2026-06-17 | Austria v Jordan | 3-0 | 3-1 | 86/10/4 | H ✓ | — | 0.031 |
| 21 | 2026-06-17 | Portugal v DR Congo | 1-0 | 1-1 | 52/31/18 | H ✗ | — | 0.781 |
| 22 | 2026-06-17 | England v Croatia | 2-0 | 4-2 | 67/22/11 | H ✓ | — | 0.165 |
| 23 | 2026-06-17 | Ghana v Panama | 1-1 | 1-0 | 45/28/27 | H ✓ | — | 0.454 |
| 24 | 2026-06-18 | Uzbekistan v Colombia | 0-2 | 1-3 | 8/18/74 | A ✓ | — | 0.103 |
| 25 | 2026-06-18 | Czechia v South Africa | 1-1 | 1-1 | 61/23/16 | H ✗ | ✓ | 0.995 |
| 26 | 2026-06-18 | Switzerland v Bosnia & Herzegovina | 1-0 | 4-1 | 59/26/15 | H ✓ | — | 0.256 |
| 27 | 2026-06-18 | Canada v Qatar | 1-0 | 6-0 | 50/32/18 | H ✓ | — | 0.388 |
| 28 | 2026-06-19 | Mexico v South Korea | 1-0 | 1-0 | 51/32/17 | H ✓ | ✓ | 0.373 |
| 29 | 2026-06-19 | USA v Australia | 1-1 | 2-0 | 35/30/36 | A ✗ | — | 0.644 |
| 30 | 2026-06-19 | Scotland v Morocco | 0-2 | 0-1 | 10/21/70 | A ✓ | — | 0.144 |
| 31 | 2026-06-20 | Brazil v Haiti | 3-0 | 3-0 | 87/9/4 | H ✓ | ✓ | 0.026 |
| 32 | 2026-06-20 | Türkiye v Paraguay | 1-0 | 0-1 | 59/27/14 | H ✗ | — | 1.165 |
| 33 | 2026-06-20 | Netherlands v Sweden | 1-1 | 5-1 | 62/22/16 | H ✓ | — | 0.222 |
| 34 | 2026-06-20 | Germany v Côte d'Ivoire | 3-0 | 2-1 | 79/14/7 | H ✓ | — | 0.068 |
| 35 | 2026-06-21 | Ecuador v Curaçao | 3-0 | 0-0 | 91/7/2 | H ✗ | — | 1.697 |
| 36 | 2026-06-21 | Tunisia v Japan | 0-2 | 0-4 | 5/18/77 | A ✓ | — | 0.091 |
| 37 | 2026-06-21 | Belgium v Iran | 2-1 | 0-0 | 63/20/16 | H ✗ | — | 1.059 |
| 38 | 2026-06-21 | Uruguay v Cabo Verde | 2-0 | 2-2 | 81/15/4 | H ✗ | — | 1.385 |
| 39 | 2026-06-21 | Spain v Saudi Arabia | 3-0 | 4-0 | 90/8/2 | H ✓ | — | 0.017 |
| 40 | 2026-06-22 | New Zealand v Egypt | 0-2 | 1-3 | 6/16/78 | A ✓ | — | 0.080 |
| 41 | 2026-06-22 | Argentina v Austria | 1-0 | 2-0 | 54/30/16 | H ✓ | — | 0.333 |
| 42 | 2026-06-22 | France v Iraq | 2-0 | 3-0 | 76/16/7 | H ✓ | — | 0.088 |
| 43 | 2026-06-23 | Norway v Senegal | 1-1 | 3-2 | 56/26/18 | H ✓ | — | 0.299 |
| 44 | 2026-06-23 | Jordan v Algeria | 0-2 | 1-2 | 15/24/61 | A ✓ | — | 0.233 |
| 45 | 2026-06-23 | Portugal v Uzbekistan | 1-1 | 5-0 | 56/26/18 | H ✓ | — | 0.293 |
| 46 | 2026-06-23 | England v Ghana | 2-0 | 0-0 | 81/15/4 | H ✗ | — | 1.391 |
| 47 | 2026-06-23 | Panama v Croatia | 1-2 | 0-1 | 18/20/62 | A ✓ | — | 0.215 |
| 48 | 2026-06-24 | Colombia v DR Congo | 0-0 | 1-0 | 43/34/24 | H ✓ | — | 0.496 |
| 49 | 2026-06-24 | Bosnia & Herzegovina v Qatar | 1-0 | 3-1 | 55/30/15 | H ✓ | — | 0.321 |
| 50 | 2026-06-24 | Switzerland v Canada | 1-1 | 2-1 | 42/30/29 | H ✓ | — | 0.506 |
| 51 | 2026-06-24 | Morocco v Haiti | 2-0 | 4-2 | 86/12/3 | H ✓ | — | 0.034 |
| 52 | 2026-06-24 | Scotland v Brazil | 1-1 | 0-3 | 18/24/58 | A ✓ | — | 0.262 |
| 53 | 2026-06-25 | South Africa v South Korea | 0-1 | 1-0 | 12/27/61 | A ✗ | — | 1.216 |
| 54 | 2026-06-25 | Czechia v Mexico | 0-1 | 0-3 | 11/24/65 | A ✓ | — | 0.196 |
| 55 | 2026-06-25 | Curaçao v Côte d'Ivoire | 0-3 | 0-2 | 2/6/92 | A ✓ | — | 0.011 |
| 56 | 2026-06-25 | Ecuador v Germany | 0-2 | 2-1 | 14/24/62 | A ✗ | — | 1.179 |
| 57 | 2026-06-25 | Japan v Sweden | 2-0 | 1-1 | 63/24/13 | H ✗ | — | 0.995 |
| 58 | 2026-06-25 | Tunisia v Netherlands | 0-3 | 1-3 | 2/7/91 | A ✓ | — | 0.014 |
| 59 | 2026-06-26 | Paraguay v Australia | 0-0 | 0-0 | 20/39/41 | A ✗ | ✓ | 0.582 |
| 60 | 2026-06-26 | Türkiye v USA | 1-1 | 3-2 | 29/37/34 | D ✗ | — | 0.753 |
| 61 | 2026-06-26 | Senegal v Iraq | 1-0 | 5-0 | 58/30/13 | H ✓ | — | 0.280 |
| 62 | 2026-06-26 | Norway v France | 1-1 | 1-4 | 38/27/35 | H ✗ | — | 0.634 |
| 63 | 2026-06-27 | Cabo Verde v Saudi Arabia | 1-1 | 0-0 | 31/41/28 | D ✓ | — | 0.518 |
| 64 | 2026-06-27 | Uruguay v Spain | 0-1 | 0-1 | 15/43/42 | D ✗ | ✓ | 0.544 |
| 65 | 2026-06-27 | New Zealand v Belgium | 0-2 | 1-5 | 5/24/72 | A ✓ | — | 0.136 |
| 66 | 2026-06-27 | Egypt v Iran | 1-1 | 1-1 | 30/42/28 | D ✓ | ✓ | 0.503 |
| 67 | 2026-06-27 | Croatia v Ghana | 1-1 | 2-1 | 28/44/28 | D ✗ | — | 0.789 |
| 68 | 2026-06-27 | Panama v England | 0-2 | 0-2 | 3/24/72 | A ✓ | ✓ | 0.139 |
| 69 | 2026-06-27 | DR Congo v Uzbekistan | 0-0 | 3-1 | 40/47/13 | D ✗ | — | 0.596 |
| 70 | 2026-06-27 | Colombia v Portugal | 1-1 | 0-0 | 31/35/34 | D ✓ | — | 0.633 |
| 71 | 2026-06-28 | Algeria v Austria | 0-0 | 3-3 | 22/47/31 | D ✓ | — | 0.425 |
| 72 | 2026-06-28 | Jordan v Argentina | 0-3 | 1-3 | 1/18/81 | A ✓ | — | 0.068 |
| 73 | 2026-06-28 | South Africa v Canada | 0-1 | 0-1 | 12/40/48 | A ✓ | ✓ | 0.439 |
| 74 | 2026-06-29 | Brazil v Japan | 0-0 | 2-1 | 27/45/28 | D ✗ | — | 0.809 |
| 75 | 2026-06-29 | Germany v Paraguay | 2-0 | 1-1 * | 56/38/6 | H ✗ | — | 0.696 |
| 76 | 2026-06-30 | Netherlands v Morocco | 1-1 | 1-1 * | 26/42/31 | D ✓ | ✓ | 0.502 |
| 77 | 2026-06-30 | Côte d'Ivoire v Norway | 1-1 | 1-2 | 21/34/45 | A ✓ | — | 0.462 |
| 78 | 2026-06-30 | France v Sweden | 2-1 | 3-0 | 49/38/13 | H ✓ | — | 0.421 |
| 79 | 2026-07-01 | Mexico v Ecuador | 0-0 | 2-0 | 35/51/15 | D ✗ | — | 0.704 |
| 80 | 2026-07-01 | England v DR Congo | 1-0 | 2-1 | 41/52/8 | D ✗ | — | 0.620 |
| 81 | 2026-07-01 | Belgium v Senegal | 1-1 | 2-2 * | 45/38/17 | H ✗ | — | 0.613 |
| 82 | 2026-07-02 | USA v Bosnia & Herzegovina | 2-0 | 2-0 | 49/41/10 | H ✓ | ✓ | 0.444 |
| 83 | 2026-07-02 | Spain v Austria | 1-0 | 3-0 | 45/45/10 | H ✓ | — | 0.516 |
| 84 | 2026-07-02 | Portugal v Croatia | 1-1 | 2-1 | 45/34/21 | H ✓ | — | 0.469 |
| 85 | 2026-07-03 | Switzerland v Algeria | 1-1 | 2-0 | 43/38/19 | H ✓ | — | 0.505 |
| 86 | 2026-07-03 | Australia v Egypt | 0-0 | 1-1 * | 28/48/24 | D ✓ | — | 0.402 |
| 87 | 2026-07-03 | Argentina v Cabo Verde | 2-0 | 1-1 * | 62/35/4 | H ✗ | — | 0.805 |
| 88 | 2026-07-04 | Colombia v Ghana | 0-0 | 1-0 | 38/45/17 | D ✗ | — | 0.612 |
| 89 | 2026-07-04 | Canada v Morocco | 1-1 | 0-3 | 18/42/40 | D ✗ | — | 0.574 |
| 90 | 2026-07-04 | Paraguay v France | 0-2 | 0-1 | 8/40/52 | A ✓ | — | 0.389 |
| 91 | 2026-07-05 | Brazil v Norway | 2-1 | 1-2 | 47/31/22 | H ✗ | — | 0.917 |
| 92 | 2026-07-06 | Mexico v England | 0-0 | 2-3 | 23/40/37 | D ✗ | — | 0.616 |
| 93 | 2026-07-06 | Portugal v Spain | 1-1 | 0-1 | 20/33/47 | A ✓ | — | 0.429 |
| 94 | 2026-07-07 | USA v Belgium | 1-1 | 1-4 | 23/31/46 | A ✓ | — | 0.447 |
| 95 | 2026-07-07 | Argentina v Egypt | 1-0 | 3-2 | 55/31/14 | H ✓ | — | 0.318 |
| 96 | 2026-07-07 | Switzerland v Colombia | 1-1 | 0-0 * | 27/34/39 | A ✗ | — | 0.667 |
| 97 | 2026-07-09 | France v Morocco | 1-1 | 2-0 | 32/37/31 | D ✗ | — | 0.702 |
| 98 | 2026-07-10 | Spain v Belgium | 1-1 | 2-1 | 38/36/25 | H ✓ | — | 0.581 |
| 99 | 2026-07-11 | Norway v England | 1-1 | 1-2 | 22/26/51 | A ✓ | — | 0.358 |
| 100 | 2026-07-12 | Argentina v Switzerland | 1-1 | 3-1 | 49/33/18 | H ✓ | — | 0.399 |
| 101 | 2026-07-14 | France v Spain | 1-1 | 0-2 | 29/38/33 | D ✗ | — | 0.679 |
| 102 | 2026-07-15 | England v Argentina | 1-1 | 1-2 | 31/34/35 | A ✓ | — | 0.640 |
| 103 | 2026-07-18 | France v England | 1-1 | 4-6 | 44/33/23 | H ✗ | — | 0.900 |
| 104 | 2026-07-19 | Spain v Argentina | 0-0 | 0-0 * | 44/39/17 | H ✗ | ✓ | 0.595 |