Machine Learning

Who Will Win the 2026 FIFA World Cup?

it came out on June 11 with 48 teams, 104 games, and a normal snowstorm. I wanted a prediction that I could really defend. Not just a cool machine learning model with great results, but a model where every number follows back to obvious reasoning that I can argue with.

This article builds on that prediction from scratch. It's deliberately simple: measure each team, convert each match into a goal distribution, and simulate the entire tournament tens of thousands of times.

This may sound very football-specific, but almost everything in this topic, from the methodology to the way we interpret the results, is universal to data science. Change the “groups” for sales reps, delivery dates, server load, or churn cohorts and the same three steps give you a defensible forecast instead of a point average.

The real transferable skill here is building a pipeline where all the numbers trace back to a hypothesis you can argue against, rather than a black box machine learning model hiding it from you.

In our soccer context, this means: No tracking data, no deep learning, nothing you can't reconstruct in an afternoon. But don't stop reading here! The point is not complexity. It's about having a transparent pipeline that forces you to deal with modeling choices that are hidden by black boxes. We will build our model in three steps and question each assumption.

Step 1: Rate each team with Elo

You can't predict a game without a number on how good each side is. A neat off-the-shelf option for national teams is this World Football Elo ratinga modification of Arpad Elo's chess system.

Elo is one self-correcting statistic. Each group holds an average R. Before the game, the expected score of team A against team B (on a scale of 0–1, where 1 is a win) is a linear function of the rating difference:

E_A = 1 / (1 + 10^(-(R_A - R_B) / 400))

After the game, he shifts the scale to what actually happened:

R_A' = R_A + K * (S_A - E_A),

there S_A visible result (1 win, 0.5 draw, 0 loss) and K controls how fast the measurements move. The football variant adds two important wrinkles: K scales with margin of victory (a 4–0 shakes the odds more than a 1–0), and rates a competitive match over a friendly one. The constant 400 scale selection – that's what makes a 400 point gap correspond to an almost 10:1 favorite (E ≈ 0.91).

In the model, we only need the current measurements, which are stored as a dictionary. I'm using a pre-tournament snapshot from early June 2026, taken from a freely reusable Kaggle dataset that includes these measurements:

# World Football Elo Ratings, pre-tournament snapshot (early June 2026).
# Source: "2026 FIFA World Cup — Historical Elo Ratings" (Kaggle, CC BY-SA 4.0),
# compiling data from World Football Elo Ratings (eloratings.net).
ELO = {
    "Spain": 2155, "Argentina": 2113, "France": 2062,
    "England": 2020, "Brazil": 1988, "Portugal": 1984,
    "Colombia": 1977, "Netherlands": 1944, "Germany": 1925,
    # ... all 48 qualified teams
}

Reasoning test: Elo compresses everything – form, team quality, fatigue – into one number and takes the team's strength almost to a standstill in a short period of time. That's a strong simplification, but it's reliable, readable, and Elo is hard to beat as a single feature.

Step 2: Convert the mean gap to the goal distribution

The average difference gives us the win opportunitiesbut simulating the competition we want points – they drive goal difference, team cuts, and texture. A common move in soccer analysis is to model each team's goals as Poisson process.
The Poisson distribution provides an opportunity to observe k events in which events occur independently with a constant average rate λ:

P(k goals) = λ^k * e^(-λ) / k!

The goals fit this well in terms of strength: they are not the same, they are not easy to find, and they have no memory during the game. If we consider the goals of both teams as independent Poisson variables with means λ_home again λ_awaythe full score line distribution is the outer product of their two pmfs, and we can learn the win/draw/loss probabilities by summing the relevant cells:

from scipy.stats import poisson
import numpy as np

def match_probs(lam_home, lam_away, max_goals=10):
    h = poisson.pmf(np.arange(max_goals + 1), lam_home)
    a = poisson.pmf(np.arange(max_goals + 1), lam_away)
    grid = np.outer(h, a)             # grid[i, j] = P(home i, away j)
    p_home = np.tril(grid, -1).sum()  # home goals > away goals
    p_draw = np.trace(grid)
    p_away = np.triu(grid, 1).sum()
    return p_home, p_draw, p_away

Reasoning test: considering independence is simple but not perfect – actual scores show correlation and subtraction of low scores is extreme (0–0, 1–1). A typical fix is Dixon-Coles correction, which adds a low-score correction term and time decay weight to historical matches. We skip it here for clarity; it's a natural progression and exactly the kind of refinement the chapter in my upcoming Poisson book goes through.

Step 3: Connect measurements to goals

We need it λ_home again λ_away as a function of the Elo gap. A strong piece of the football model myth is that an Elo edge of 400 points is worth about one goal of elevation. So we divided the basis of 2.7 goals in total (international standard average) between the teams according to their average difference:

GOALS_BASE = 2.7
GOALS_PER_400_ELO = 1.0

def lambdas(elo_a, elo_b):
    diff = (elo_a - elo_b) / 400.0 * GOALS_PER_400_ELO
    la = max(0.15, GOALS_BASE / 2 + diff / 2)
    lb = max(0.15, GOALS_BASE / 2 - diff / 2)
    return la, lb

A floor of 0.15 keeps even the biggest underdog from being given a negative strike rate. A multi-level version is equivalent log(λ) = β₀ + β₁·Δrating as Poisson GLM on real game data; the linear-supremacy heuristic above is a back-of-the-envelope version and stays in the same place of preference.

Step 4: Simulate the tournament 10,000 times

One simulation is not a prediction, it could be just once in 2026. Prediction distribution over thousands of them. So we run through all the brackets and count how many times each team wins.

The format for 2026 is new and must be precisely defined: 48 teams in 12 groups of four, with the top two in each group. and eight third place teams they advanced to the 32-team knockout tournament.

That third place rule is a mixed bag because you can't decide who advances until all the teams are done. Therefore, the simulation tracks the points and goal difference of all four teams in each group, ranks the third-placed teams in the groups, and picks the best eight. In the draw-to-penalty rounds, we model it as a close-coin-flip slightly shifted towards the strong side.

N = 10_000
title = {t: 0 for t in ELO}

for _ in range(N):
    champion = simulate_one_tournament()  # groups -> R32 -> ... -> final
    title[champion] += 1

probs = {t: title[t] / N for t in ELO}

Why 10,000? Because the simulated probability itself is an estimate with sampling error. Topic possibilities p estimated from N Independent competitions have a common error sqrt(p(1-p)/N). With a favorite of 15% on N = 10,000that's about 0.36 percent – strong enough that the rate is stable and the top numbers won't move between runs. Reduce to N = 500 and the quadruple standard error is then ∼1.6 points, which is enough to rescale the midpoint. Vectorizing the simulation (drawing all N competitions as multiple functions instead of Python loop) makes 20,000+ runs for free.

What the model says

The team Win opportunities
Spain 16.0%
In Argentina 11.9%
France 7.9%
In England 7.0%
Brazil 5.4%
In the Netherlands 4.7%
In Portugal 4.3%
In Germany 3.7%

Table 1: Possible World Cup outcomes, according to the model. Source: author.

Two things stand out. First, the favorite is always around 15%, not 50%. Even the best team in the world has too many opportunities not winning the 48-team relegation playoff rather than winning it – a direct result of the Poisson variance in a low-scoring game combined over seven win-or-go-home games.

Second, these numbers come remarkably close to predictions published by more detailed statistical models, the kind built on years of game data and dozens of factors. That's reassuring: the virtual Elo-plus-Poisson pipeline returns much of what the heavy-weight prediction system produces, because they both end up doing the same thing: mapping team strengths against outcome probabilities.

What it gets, and what it leaves out

The model is faithful to simplifications, and each simplification is a labeled dial that you can modify:

  • A neutral place. Every game is considered neutral; hosts (USA, Mexico, Canada) do not receive power. Adding the domestic benefit term (~+50–100 Elo, historically worth a third of the goal) is a one-line change.
  • Tight measurements. Elo is frozen in kicks; the model does not update as the tournament progresses. Rebalancing after each cycle will refine the predictions for the latest cycle.
  • Independent Poisson terms. No adjustment for low Dixon–Coles scores, no inflation is exposed.
  • Parentheses with seeds. I use the seeded knockout rather than the FIFA Round of 32 map. For top team title odds this doesn't move the needle a bit, but it's important in certain ways.
    Each of those is the subject of a chapter of a book I have written, Football Statistics with Machine Learning (O'Reilly, 2026): the Poisson goal model and its extensions in Chapter 6, group estimates in Chapter 8, and turning probabilities into betting decisions in Chapter 9. This article is a toy version of that pipeline — and a toy to play with in an afternoon.

Try it yourself

Many more examples can be found in the book's GitHub repository – put it together, download today's Elo ratings, and you have your World Cup prediction faster than you can tell Claude.

In another article, you will see how I rebuild this structure with eleven different models, plug them into real game data, and watch FIFA crown four different champions.

Currently, my model is Spain. The tournament starts on June 11. We will find out together.

Ari Joury is the author of Football Statistics with Machine Learning (O'Reilly, 2026).

Source link

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button