The Poisson Model for Football Scorelines (Plain English)
Ask a statistician to model a football match and the first tool out of the box is almost always the Poisson distribution. It is nearly a century old, fits on a napkin, and yet it still powers the goals-market models at serious betting operations — including ours. This post explains what a Poisson model actually does, walks through the arithmetic with clean example numbers, and shows how two humble inputs become prices for every scoreline, total and handicap in a match.
What the Poisson distribution is
The Poisson distribution answers one question: if an event happens at some average rate, what is the probability it happens exactly 0, 1, 2, 3… times in a fixed window? Goals in football fit this shape remarkably well. They are rare (a couple per team per match), they can happen at almost any moment, and one team's goal count over 90 minutes behaves — to a first approximation — like a count of independent random events.
Skip the hand-calculation.
Get real value bets flagged for you — 7-day free trialThe only input the distribution needs is the average rate, written as λ (lambda). If a team is expected to score λ = 1.6 goals, Poisson converts that single number into a full probability list over exact goal counts:
- P(0 goals) = 20.2%
- P(1 goal) = 32.3%
- P(2 goals) = 25.8%
- P(3 goals) = 13.8%
- P(4+ goals) = 7.9% (the tail)
That is the whole trick. One expected-goals number in, a complete distribution out. The formula behind it is P(k) = e^(−λ) × λ^k / k!, but you never need to compute it by hand — the shape is what matters: most probability sits at 0–2 goals, and the tail decays fast.
Worked example: from two lambdas to a scoreline grid
A match has two teams, so the basic model uses two independent Poisson distributions. Suppose our model estimates the home side at λ = 1.6 and the away side at λ = 1.1 (all numbers in this post are illustrative). The probability of any exact scoreline is simply the product of the two individual probabilities:
- P(0-0) = P(home 0) × P(away 0) = 20.2% × 33.3% = 6.7%
- P(1-0) = 32.3% × 33.3% = 10.8%
- P(1-1) = 32.3% × 36.6% = 11.8%
- P(2-1) = 25.8% × 36.6% = 9.5%
Do this for every combination from 0-0 up to, say, 8-8 and you have the scoreline grid — a table where every cell is one exact score and the whole grid sums to (almost exactly) 100%. Everything else a goals model produces is just a different way of adding up cells of this grid.
Summing the three regions of the grid gives the 1X2 probabilities for our example match:
- Home win (all cells where home > away): ≈ 48.8%
- Draw (the diagonal: 0-0, 1-1, 2-2…): ≈ 24.9%
- Away win (all cells where away > home): ≈ 26.3%
One grid, every goals market
The elegance of the approach is that the same grid prices every goals-related market at once, and all the prices are automatically consistent with each other:
- Over/Under 2.5: add up all cells with 3+ total goals. With λ_total = 2.7 in our example: Over ≈ 50.6%, Under ≈ 49.4% — a genuine coin flip, which is exactly why bookmakers set the main line there.
- Both teams to score: add all cells where both counts are ≥ 1. Here ≈ 53%.
- Asian handicap: shift the grid by the handicap line and re-add the win/lose/push regions.
- Correct score: read the single cell straight off the grid.
This internal consistency is a real advantage over pricing each market separately. If your over/under probability and your 1X2 probability come from the same grid, they can never contradict each other — something that does occasionally happen between separately-managed markets at soft bookmakers.
Where do the lambdas come from?
Everything above was mechanical. The modelling skill lives in estimating λ, and this is where implementations differ. A classic approach decomposes each team's expected goals into attack strength × opponent defence weakness × league average × home advantage. Modern implementations enrich that with expected goals (xG) instead of raw goal counts — because shot quality is more stable and more predictive than noisy goal tallies — plus Elo-style team ratings, recent form and lineup information.
Our own football goals model is trained on roughly a hundred thousand historical matches and feeds over a hundred inputs into the two lambdas — but the point of this post is that the downstream machinery is unchanged since 1919: two rates in, a scoreline grid out. If you want the broader context of how such models are built and validated, start with how betting models work.
Where the simple model bends: known limitations
The plain two-Poisson model makes one assumption that is measurably false: it treats the two teams' goal counts as fully independent. In reality, low-scoring outcomes are correlated — 0-0 and 1-1 occur slightly more often in real football than independence predicts, at the expense of 1-0 and 0-1. The size of the error is small, one or two percentage points on specific scorelines, but betting margins are smaller. The standard remedy is the Dixon-Coles adjustment, which we cover in detail (with our own fitted numbers) in Dixon-Coles: fixing Poisson's low-score bias.
Two further honest caveats. First, λ is a pre-match estimate — red cards, early goals and tactical shifts change scoring rates mid-game, which is why pre-match grids should not be reused for in-play pricing. Second, a model can be structurally sound and still uncompetitive: the market's own prices already embed a very good implied grid. A Poisson model earns its keep only when its lambda estimates are at least as good as the market's — which must be proven on out-of-sample data, never assumed.
Putting it all together
A Poisson football model is three steps: estimate expected goals for each side, expand each estimate into a probability distribution over goal counts, and multiply the two distributions into a scoreline grid. Every goals market — 1X2, totals, BTTS, handicaps, correct score — is then a sum over regions of that grid, all mutually consistent by construction. The century-old machinery is free; the value is in the lambdas and in the discipline of testing them against reality.