The Poisson distribution is the foundation of most professional football prediction models. It converts two numbers — each team's expected goals — into a complete probability grid covering every possible scoreline. From that single grid you can calculate 1X2 probabilities, correct score odds, over/under percentages, BTTS likelihood, and Asian handicap lines.
This guide walks through the full process: from calculating attack and defence strength ratings, to building a complete 0–4 × 0–4 matrix, to finding value against bookmaker odds.
Want to skip the maths? Use our free Poisson Match Predictor to generate a full matrix instantly.
How the Poisson Formula Works
The Poisson probability mass function:
P(X = k) = (e^-λ × λ^k) / k!
Where:
- λ (lambda) = the expected number of goals for that team
- k = the exact number of goals you want the probability for
- e = Euler's number (≈ 2.718)
- k! = k factorial (3! = 6, 2! = 2, 1! = 1, 0! = 1)
For a team with λ = 1.5 expected goals:
| Goals (k) | Calculation | Probability |
|---|---|---|
| 0 | e^-1.5 × 1.5^0 / 1 | 22.3% |
| 1 | e^-1.5 × 1.5^1 / 1 | 33.5% |
| 2 | e^-1.5 × 1.5^2 / 2 | 25.1% |
| 3 | e^-1.5 × 1.5^3 / 6 | 12.6% |
| 4 | e^-1.5 × 1.5^4 / 24 | 4.7% |
| 5+ | remainder | 1.8% |
Step 1: Calculate Attack and Defence Strength
Attack and defence strength ratings normalise each team's performance against the league baseline, making the model applicable to any league.
Formula:
- Attack strength = team's average goals scored (home or away) ÷ league average goals (home or away)
- Defence strength = team's average goals conceded (home or away) ÷ league average goals conceded (in that venue)
Premier League 2025/26 league averages: Home goals = 1.45 per match, Away goals = 1.15 per match.
Worked example: Liverpool (home) vs Brighton (away)
Liverpool home stats (19 matches played):
- Scored 42 goals at home = 2.21 per match → Attack strength = 2.21 / 1.45 = 1.524
- Conceded 18 goals at home = 0.95 per match → Defence strength = 0.95 / 1.15 = 0.826
Brighton away stats (19 matches played):
- Scored 17 goals away = 0.89 per match → Attack strength = 0.89 / 1.15 = 0.774
- Conceded 23 goals away = 1.21 per match → Defence strength = 1.21 / 1.45 = 0.834
Expected goals (λ):
- λ_Liverpool = Liverpool Attack × Brighton Defence × League Home Avg = 1.524 × 0.834 × 1.45 = 1.84
- λ_Brighton = Brighton Attack × Liverpool Defence × League Away Avg = 0.774 × 0.826 × 1.15 = 0.74
Step 2: Generate Individual Goal Probabilities
Apply the Poisson formula to each team's expected goals for 0–4 goals:
Liverpool (λ = 1.84):
| Goals | Probability |
|---|---|
| 0 | 15.9% |
| 1 | 29.2% |
| 2 | 26.9% |
| 3 | 16.5% |
| 4 | 7.6% |
| 5+ | 3.9% |
Brighton (λ = 0.74):
| Goals | Probability |
|---|---|
| 0 | 47.7% |
| 1 | 35.3% |
| 2 | 13.0% |
| 3 | 3.2% |
| 4 | 0.6% |
| 5+ | 0.2% |
Step 3: Build the Complete Correct Score Matrix
Multiply Liverpool's probability for each goal count by Brighton's probability for each goal count to fill the full grid. Each cell = P(Liverpool score) × P(Brighton score).
Liverpool vs Brighton — Correct Score Probability Matrix (%)
| Brighton 0 | Brighton 1 | Brighton 2 | Brighton 3 | Brighton 4 | |
|---|---|---|---|---|---|
| Liverpool 0 | 7.6 | 5.6 | 2.1 | 0.5 | 0.1 |
| Liverpool 1 | 13.9 | 10.3 | 3.8 | 0.9 | 0.2 |
| Liverpool 2 | 12.8 | 9.5 | 3.5 | 0.9 | 0.2 |
| Liverpool 3 | 7.9 | 5.8 | 2.1 | 0.5 | 0.1 |
| Liverpool 4 | 3.6 | 2.7 | 1.0 | 0.2 | 0.0 |
The cells shown account for approximately 92% of all outcomes. Scores of 5-0 or above (8% combined) are excluded from the table but included in aggregated market calculations.
The most likely scoreline is 1-0 to Liverpool at 13.9% — a typical result when a strong home side faces a weaker away team.
Step 4: Derive Market Probabilities
Sum the relevant cells from the matrix to calculate any betting market:
Match Result (1X2):
- Home Win (Liverpool): sum all cells where Liverpool score > Brighton score = ~62% → fair odds ≈ 1.61
- Draw: sum diagonal cells (0-0, 1-1, 2-2, 3-3, 4-4) = ~18% → fair odds ≈ 5.56
- Away Win (Brighton): sum all cells where Brighton score > Liverpool score = ~13% → fair odds ≈ 7.69
Note: These probabilities sum to ~93% rather than 100% because they are derived from the full Poisson distribution (including 5+ scorelines), while the displayed matrix is truncated at 4 goals. The remaining ~7% is distributed across very-high-scoring outcomes.
Over/Under 2.5 Goals: Sum all cells where total goals ≥ 3 (e.g., 2-1, 3-0, 1-2, 3-1, 2-2, 4-0, etc.):
- Over 2.5: ~51% → fair odds ≈ 1.96
- Under 2.5: ~49% → fair odds ≈ 2.04
To calculate Over 1.5 instead, sum all cells where total goals ≥ 2 (includes 1-1, 2-0, 0-2, 2-1, etc.):
- Over 1.5: ~75% → fair odds ≈ 1.33
Both Teams to Score (BTTS): Sum all cells where Liverpool score ≥ 1 AND Brighton score ≥ 1 (the interior of the matrix, excluding row 0 and column 0):
- BTTS Yes: 10.3 + 3.8 + 0.9 + 0.2 + 9.5 + 3.5 + 0.9 + 0.2 + 5.8 + 2.1 + 0.5 + 0.1 + 2.7 + 1.0 + 0.2 + 0.0 ≈ 42% → fair odds ≈ 2.38
- BTTS No: ~58% → fair odds ≈ 1.72
Correct Score (individual cells): Each cell in the matrix is directly the correct score probability. For example:
- 2-1 to Liverpool = 9.5% → fair odds ≈ 10.5
- 1-1 = 10.3% → fair odds ≈ 9.7
- 0-0 = 7.6% → fair odds ≈ 13.2
Step 5: Find Value Against Bookmaker Odds
Convert your Poisson probability to fair decimal odds (1 ÷ probability) and compare to the bookmaker's price.
Value exists when bookmaker odds > your fair odds.
Example using the Liverpool vs Brighton matrix:
| Market | Poisson Probability | Fair Odds | Bookmaker Odds | Value? |
|---|---|---|---|---|
| Liverpool Win (1X2) | 62% | 1.61 | 1.55 | No — bookmaker has edge |
| 1-0 Liverpool | 13.9% | 7.19 | 8.00 | Yes — 11% edge |
| 2-1 Liverpool | 9.5% | 10.53 | 11.00 | Yes — 4% edge |
| 1-1 Draw | 10.3% | 9.71 | 9.00 | No — bookmaker has edge |
| Over 2.5 Goals | 51% | 1.96 | 1.90 | No — bookmaker has edge |
| BTTS Yes | 42% | 2.38 | 2.50 | Yes — 5% edge |
A bet shows positive expected value (EV) when:
EV = (Your Probability × Bookmaker Odds) - 1 > 0
For 1-0 Liverpool: EV = (0.139 × 8.00) - 1 = 0.112 - 1 = +0.112 = +11.2% EV
Model Accuracy and Known Limitations
What the numbers say
Backtesting Poisson on Premier League data over multiple seasons consistently shows:
- 1X2 accuracy: 45–52% — significantly better than random (33%) but reflecting football's inherent unpredictability
- Correct score accuracy: ~15–18% on the most likely scoreline — markets are correctly priced most of the time
The draw underestimation problem
Basic Poisson underestimates draws by approximately 20%. In a typical Premier League season, 0-0 draws occur roughly 8–10% of the time, but basic Poisson often predicts only 5–6%. This is because Poisson assumes goals are independent between teams — in practice, a match between two cautious sides creates correlated defensive play that inflates scoreless outcomes.
Other limitations to understand
- Constant scoring rate: Poisson assumes the same scoring rate throughout 90 minutes. In reality, red cards, fatigue, and match state change scoring dynamics dramatically.
- No situational factors: Injuries, suspensions, cup finals, dead rubbers, and head-to-head dynamics are not captured by historical averages alone.
- Sample sensitivity: Short lookback periods (fewer than 8 matches) create noise; long lookbacks (full season) may include stale data from changed form or personnel.
- Low-scoring leagues struggle more: The model works best in high-scoring leagues (Bundesliga, Eredivisie) and is less reliable in defensive leagues (Serie A, Ligue 1) where scoring rates are lower and variance is higher.
The Dixon-Coles Correction
Statisticians Simon Dixon and Stuart Coles (1997) developed a widely adopted improvement to basic Poisson that specifically addresses draw underestimation.
Two key changes:
-
Correlation parameter (ρ): A correction factor applied to 0-0, 0-1, 1-0, and 1-1 scorelines. These low-scoring outcomes are where team goal counts are most correlated. The adjustment increases their probability relative to basic Poisson.
-
Time weighting: Recent matches are weighted more heavily than older ones. A common implementation: weight = e^(-k × days_elapsed), where k is a decay constant. Matches from 3 weeks ago receive roughly 50% weight compared to last week's match.
Practical impact on the Liverpool vs Brighton example:
| Scoreline | Basic Poisson | Dixon-Coles | Difference |
|---|---|---|---|
| 0-0 | 7.6% | 9.2% | +1.6% |
| 1-0 | 13.9% | 15.1% | +1.2% |
| 0-1 | 5.6% | 6.4% | +0.8% |
| 1-1 | 10.3% | 10.9% | +0.6% |
| 2-1 | 9.5% | 9.1% | -0.4% |
| 3-0 | 7.9% | 7.5% | -0.4% |
The overall draw probability rises from ~18% (basic Poisson) to approximately ~21% under Dixon-Coles — closer to historical frequencies.
Poisson vs xG Models
Many bettors ask whether to use actual goals or xG (expected goals from shot quality) as inputs.
Using actual goals (traditional Poisson):
- Simpler to compute — data is publicly available
- Includes finishing luck as signal, which may revert over time
- Better for teams with small sample sizes (cup form, new signings)
Using xG as Poisson inputs:
- Removes finishing variance — more stable and predictive over 10+ matches
- Better reflects underlying chance creation quality
- Requires a data source beyond basic results (Understat, FBref, Opta)
Practical recommendation: Use xG-based inputs where available (Premier League, Bundesliga, La Liga, Serie A, Ligue 1). For lower leagues where xG data is sparse or unreliable, actual goals with a 10–15 match lookback are acceptable.
A hybrid approach — using xG for the current season and supplementing with actual goals from the previous season for newly promoted sides — is common among professionals.
Over/Under and BTTS: Worked Probability Calculations
Over/Under in detail
From the Liverpool vs Brighton matrix, to calculate Over 2.5, you sum all scorelines where Home + Away ≥ 3:
Scorelines contributing to Over 2.5 from the matrix above:
- Liverpool 2, Brighton 1 (total 3): 9.5%
- Liverpool 3, Brighton 0 (total 3): 7.9%
- Liverpool 1, Brighton 2 (total 3): 3.8%
- Liverpool 0, Brighton 3 (total 3): 0.5%
- All scorelines with 4, 5, or more total goals: ~29.3%
Over 2.5 total ≈ 51% for this fixture.
By contrast, a match between two average sides (λ_home = 1.45, λ_away = 1.15) would show approximately 42% Over 2.5 — demonstrating how the model correctly rates Liverpool matches as higher-scoring.
BTTS in detail
BTTS Yes = all scorelines where BOTH Liverpool ≥ 1 AND Brighton ≥ 1. This excludes the entire top row (Liverpool 0 goals) and left column (Brighton 0 goals) from the matrix.
From the interior cells: approximately 42% BTTS Yes for Liverpool vs Brighton with these expected goals.
Compare: in a match between two average sides (λ_home = 1.45, λ_away = 1.15), BTTS Yes ≈ 46%. Counterintuitively, Liverpool vs Brighton shows slightly lower BTTS despite Liverpool's attacking strength — because Brighton's low expected goals (0.74) means Brighton often fail to score, reducing joint scoring probability.
Tools for Poisson Modelling
For a complete automated solution, use our free Poisson Match Predictor. Input each team's recent average goals scored and conceded, plus the league average, and get a full probability matrix across all markets in seconds — no spreadsheet or coding required.
If you prefer to build your own model:
- Excel / Google Sheets: use
=POISSON.DIST(k, lambda, FALSE)to calculate individual cell probabilities - Python:
from scipy.stats import poisson; poisson.pmf(k, lambda)for individual values, or generate a full matrix with nested loops - R:
dpois(k, lambda)for single values;outer(dpois(0:5, lambda_home), dpois(0:5, lambda_away))for a matrix in one line