Model

Monte Carlo simulation in football: predicting a whole season

Published

Every so often a headline announces that a supercomputer has predicted the final league table. Strip away the framing and what happened is almost always the same, unremarkable thing: a Monte Carlo simulation in football — a match-level probability model, run over every remaining fixture, thousands of times over, with the results tallied. No supercomputer is required; a laptop will do it in seconds. What matters is not the hardware but what the numbers can and cannot honestly claim.

This post walks through how season simulations are built, how much of their apparent precision is real, and why a simulated table is far harder to hold to account than a match prediction.

What a Monte Carlo simulation in football actually does

The method has four steps and no magic in any of them.

  1. Start from the known state. Points already banked, matches already played, goal difference so far. Before a season begins, everything is zero; part-way through, the simulation inherits the table as it stands.
  2. Price every remaining fixture. A goal model — typically Poisson-based, with a low-score correction — turns team ratings into a probability for each possible scoreline in each unplayed match.
  3. Play the season out once, at random. For each fixture, draw a scoreline according to those probabilities. Award the points. Move to the next fixture until the calendar is exhausted, then sort the final table.
  4. Do it again. And again. Ten thousand times, or fifty thousand. Then count: in what fraction of simulated seasons did each club finish first, top four, bottom three?

That fraction is the probability. “18% to win the league” means the club topped 1,800 out of 10,000 simulated tables. Nothing more mystical is going on.

Why simulate instead of calculating

The obvious question is why anyone samples at random rather than working out the answer exactly. The answer is combinatorics.

A twenty-team division plays 380 matches. Even reducing each to a simple home-win/draw-away-win outcome, the number of distinct ways a season can unfold is 3 raised to the power of 380 — a number with about 181 digits. And that simplification is not even sufficient, because promotion and relegation places are separated by goal difference, so a full enumeration would need every plausible scoreline, not just every result.

Exact calculation is therefore off the table, permanently. Sampling is the workaround: visit a large random selection of possible seasons and let the frequencies approximate the probabilities. That is the entire idea behind Monte Carlo methods, and it is why the count of simulations matters.

How many simulations are enough

Because the output is a proportion estimated from a random sample, its precision follows the standard error of a proportion: the square root of p(1 - p) / N, where p is the reported probability and N the number of simulated seasons. The worst case is a probability near 50%.

Simulations Worst-case standard error of a reported probability
1,000 ±1.6 percentage points
10,000 ±0.5 percentage points
100,000 ±0.16 percentage points

Ten thousand runs is the common choice because it holds simulation noise at or below half a percentage point — small enough to be invisible next to every other source of error. Going to a million runs is cheap, and almost entirely pointless.

That last point deserves emphasis, because it is where simulated tables mislead. Adding simulations reduces simulation error only. It does nothing whatsoever about model error — the possibility that the underlying match probabilities are wrong. A model that systematically overrates one club will overrate it identically in ten thousand or ten million runs, and will report the wrong answer to three decimal places. Precision in the output is not evidence of accuracy in the input.

Even a perfect model produces a wide range

Season simulations are useful mainly because they show how much of a league table is luck, and the amount is larger than most readers expect.

Consider a hypothetical club that is genuinely strong: in every one of its 38 matches it has a 50% chance of winning, a 25% chance of drawing and a 25% chance of losing. Its strength never changes, and we know it exactly — there is no model error at all in this thought experiment.

Its expected points total is 66.5. But the variance of points from a single match, under those probabilities, works out to 1.69, so across 38 independent matches the standard deviation of the season total is about 8 points. A 95% range therefore spans roughly 51 to 82 points — a gap of about 31 points, produced entirely by chance, for a team whose strength we stipulated as fixed and known.

That is the honest reason a “predicted final table” should never be read as a forecast of the finishing order. It is the average of a distribution wide enough that several plausible orderings sit inside it, and a simulator that publishes only the mean table discards the most interesting thing it computed.

What the simulation assumes, and where those assumptions break

Season simulation gets one hard thing right almost for free. Because it plays out an entire fixture list, it captures the dependencies across the table: a single result moves several clubs at once, and simulating the whole schedule handles that automatically in a way that per-team estimates cannot.

The assumptions it makes are less comfortable:

  • Team strength is treated as fixed, or as evolving in a way the model specifies. Real squads change through injuries, transfers and managerial turnover, and none of that is in the fixture list.
  • Matches are treated as independent given the ratings. Fatigue, congestion and squad rotation when a cup run competes for attention all violate this.
  • Every match is assumed to be contested identically. Fixtures between clubs with nothing left to play for are a known blind spot; the model prices them as if the season were still live.
  • Errors in the match model compound. A small bias in per-match probabilities, repeated over hundreds of fixtures, becomes a large bias in the tail outcomes — exactly where title and relegation probabilities live.

None of these make simulation useless. They mean the output should be read as a consequence of the model’s assumptions, not as a reading of the future.

Why season forecasts are hard to hold to account

Here is the transparency problem, and it is a serious one.

A match prediction resolves within ninety minutes. Publish thousands of them and you accumulate thousands of resolved outcomes, which is enough to compute a Brier score and check whether stated probabilities match observed frequencies. That is the basis of our public track record: match-level predictions, scored against results, published with the misses included.

A season forecast resolves once. A club given a 3% relegation probability that goes down is not proof the model failed — 3% events happen three times in a hundred. Testing season simulations directly would require dozens of league-seasons before the sample said anything, and by then the model that produced the earliest forecasts is long retired. This is precisely the environment in which unfalsifiable claims flourish, and it is why “our simulation called it” is worth so little as evidence.

The practical response is to validate the layer underneath. Season probabilities are a deterministic consequence of match probabilities plus arithmetic: if the match model is well calibrated, the season numbers inherit that calibration, and if it is not, no number of simulations will rescue them. So when you meet a simulated table, ask about the match model rather than the simulation — is the methodology published, is match-level accuracy measured against a proper scoring rule, and is that record public? Ask, too, how many simulations were run; a publisher who cannot tell you has not thought about the noise in their own headline number.

How to read a simulated table

Three habits make these numbers genuinely useful.

Read the distribution, not the ranking. A club’s range of plausible finishes carries more information than the single position printed next to its name.

Treat small probabilities as approximately small. The difference between 2% and 4% is well inside the combined uncertainty of the model and the sampling. The difference between 5% and 40% is real.

Expect the numbers to swing while fixtures remain. With most of the calendar unplayed, variance dominates and probabilities move sharply on single results. That volatility is the model working correctly, not changing its mind.

Our league pages set out the structural characteristics — scoring rates, home advantage, draw frequency — that any simulation of those divisions inherits from the first fixture onward.