In one sentence
The bivariate Poisson models home and away goals jointly, adding a shared term so that the two scores are positively correlated instead of independent.
How it works
The basic Poisson approach treats each team's goals as separate dice rolls. But matches have a shared character: a wet pitch, two attacking managers or an open game after an early goal can lift both teams' scoring at once. The bivariate Poisson captures this with three ingredients instead of two.
Think of each team's goals as its own goals plus a "match mood" count that both teams receive. Home goals = home part + shared part; away goals = away part + shared part. Because the shared part appears in both, the scores tend to rise and fall together, and the chance of equal scores (draws) goes up.
The model was popularised for football by Karlis and Ntzoufras in the early 2000s. It is a cleaner statistical fix for correlation than ad hoc adjustments, although in practice the fitted shared term is often small.
The maths
- X and Y are home and away goals.
- λ1 and λ2 are each team's own scoring rates.
- λ3 is the shared rate that feeds both scores; it equals the covariance between them.
- The sum runs over how many of the goals could have come from the shared part.
In words: each team's expected goals is its own rate plus the shared rate, and a bigger shared rate means more draws.
Worked betting example
Match Odds and Correct Score, illustrative rates. Suppose λ1 = 1.4, λ2 = 1.0 and λ3 = 0.2. Each team's average is then 1.6 home and 1.2 away, and the correlation between the scores is about 0.14.
- Compare with an independent Poisson using the same averages (1.6 and 1.2).
- P(0-0): bivariate 7.43% versus independent 6.08%.
- P(1-1): bivariate 11.88% versus independent 11.68%.
- Summing every equal scoreline, P(draw): bivariate 26.97% versus independent 24.71%.
- Fair draw odds: bivariate 3.71, independent 4.05.
- The exchange offers 3.90 on the draw. Backing £10 under the independent model: 0.2471 × £29 − 0.7529 × £10 ≈ −£0.36. Under the bivariate model: 0.2697 × £29 − 0.7303 × £10 ≈ +£0.52, or about +£0.36 after 2% commission.
Same average goals, opposite conclusions. That is why the correlation assumption matters, and why you must check it against real draw rates before acting.
Where it's good
- Pricing the draw and correct scores near the diagonal (0-0, 1-1, 2-2).
- Leagues or fixtures where both teams' scoring clearly moves together.
- Total goals markets where joint variation widens the spread.
- A principled route to correlated scores that fits within a standard likelihood.
Limitations and pitfalls
- It can only model positive correlation. Football scores sometimes show a negative link (one team dominating), which this form cannot represent.
- The fitted shared term is often close to zero on league data, so the gain over plain Poisson can be small.
- Extra parameter, extra estimation noise: with a season or two of data, λ3 is poorly pinned down.
- It inflates all equal scores in a similar way, whereas the real excess is concentrated at 0-0 and 1-1. Dixon-Coles targets that more directly.
- The draw is one of the sharper Betfair markets. A two-point difference in draw probability is large relative to typical edges, so check the model before trusting it.
- Fitting is fiddlier than standard Poisson regression and needs care to converge.
How to build it
- R: the bivpois code from Karlis and Ntzoufras; Python: write the likelihood with scipy.stats.poisson and optimise with scipy.optimize.minimize.
- Data: match results with home and away goals over several seasons; team attack and defence ratings drive λ1 and λ2.
- Tip: start with λ3 as a single league-wide constant before letting it vary by team.
Related methods
- Poisson: the independent version this extends.
- Dixon-Coles: a simpler low-score correction.
- Independence and correlation: the idea behind the shared term.
- Skellam: the goal difference, which the shared term cancels out of.