
Building a Poisson Distribution Goal Expectancy Model for Football Betting
Researched and drafted with AI assistance from published sources; published by LokeNessiSport Editorial Team · Last updated: 16 August 2026
18+ | Gambling involves risk. Only bet what you can afford to lose. If gambling is causing you problems, contact BeGambleAware.org or Hjelpelinjen: 800 800 40.
Disclosure: this page contains affiliate links. If you sign up through them we may earn a commission, at no extra cost to you. It does not change what we write.
The Foundations of Poisson Probability in Low-Scoring Sports
In statistical probability theory, the Poisson distribution models the count of independent events occurring within a fixed interval of time or space, assuming these events occur with a known constant mean rate and independently of the time since the last event. Because football (soccer) is a low-scoring sport where goals are discrete, integer-based events occurring across a 90-minute time window, the Poisson distribution serves as the foundational mathematical baseline for modern sports handicapping.
By modeling the expected goals for the Home team (lambda) and the expected goals for the Away team (mu), a quantitative handicapper can calculate the exact mathematical probability of every possible scoreline—from a 0-0 bore draw to a 4-2 goal fest. From this single bivariate probability matrix, you can instantly derive fair, unvigged prices for the entire spectrum of football betting markets: 1X2 Match Winner, Asian Handicaps, Over/Under 2.5 Goals, Both Teams to Score (BTTS), and Correct Score props.
While basic Poisson models make simplifying assumptions (such as independence between home and away goals), implementing proper league averages, attack/defense ratings, and Dixon-Coles low-score adjustments turns a simple distribution into a usable pricing model, as long as you test it against real results and closing prices.
Calculating Attack Strength, Defense Strength, and Lambda/Mu Parameters
To determine the specific expected goal parameters (lambda and mu) for an upcoming match, you must first calculate the baseline league statistics across the current and preceding seasons. Let us walk through the exact mathematical steps.
Step 1: Calculate League Average Goals. Determine the average goals scored by home teams (Avg_Home_Goals) and away teams (Avg_Away_Goals) across the entire league, using the league's own results for the seasons you choose (for example Avg_Home_Goals = 1.50 and Avg_Away_Goals = 1.25; take the real figures from your data).
Step 2: Determine Team Attack Strengths. A team's Home Attack Strength (HAS) is calculated by dividing their average home goals scored by the league average home goals: HAS = Team_Home_Scored / Avg_Home_Goals. A team's Away Attack Strength (AAS) is: AAS = Team_Away_Scored / Avg_Away_Goals.
Step 3: Determine Team Defense Strengths. A team's Home Defense Strength (HDS) is calculated by dividing their average home goals conceded by the league average away goals: HDS = Team_Home_Conceded / Avg_Away_Goals. Their Away Defense Strength (ADS) is: ADS = Team_Away_Conceded / Avg_Home_Goals.

Advertisement · 18+ · Gambling involves risk · BeGambleAware.org
Step 4: Compute Lambda (Home Expected Goals) and Mu (Away Expected Goals). Lambda = Home_Attack_Strength * Away_Defense_Strength * Avg_Home_Goals. Mu = Away_Attack_Strength * Home_Defense_Strength * Avg_Away_Goals. Once you have lambda for the home side and mu for the away side, you are ready to construct your scoreline matrix.
Worked through with illustrative numbers, using the league averages above (1.50 home, 1.25 away): the home side scores 1.9 a game at home, so HAS = 1.9 ÷ 1.50 = 1.27; the visitors concede 1.4 a game away, so ADS = 1.4 ÷ 1.50 = 0.93; Lambda = 1.27 × 0.93 × 1.50 = 1.77. The visitors score 1.1 a game away, so AAS = 1.1 ÷ 1.25 = 0.88; the home side concedes 1.0 at home, so HDS = 1.0 ÷ 1.25 = 0.80; Mu = 0.88 × 0.80 × 1.25 = 0.88. Two sides that look similar on the league table can come out a long way apart once home and away records are separated.
Calculated Scoreline Probabilities, 0 to 4 Goals Each (Lambda = 1.75, Mu = 1.15)
Away side: 0 goals 31.7%, 1 goal 36.4%, 2 goals 20.9%, 3 goals 8.0%, 4 goals 2.3%. Each line below is one home-goal row; each score's probability is the home probability multiplied by the away probability.
- Home 0 goals (17.4%): 0-0 5.51%; 0-1 6.33%; 0-2 3.64%; 0-3 1.39%; 0-4 0.40%
- Home 1 goal (30.4%): 1-0 9.64%; 1-1 11.08%; 1-2 6.37%; 1-3 2.44%; 1-4 0.70%
- Home 2 goals (26.6%): 2-0 8.44%; 2-1 9.70%; 2-2 5.57%; 2-3 2.14%; 2-4 0.61%
- Home 3 goals (15.5%): 3-0 4.92%; 3-1 5.66%; 3-2 3.25%; 3-3 1.25%; 3-4 0.36%
- Home 4 goals (6.8%): 4-0 2.15%; 4-1 2.47%; 4-2 1.42%; 4-3 0.55%; 4-4 0.16%
Deriving Derivative Markets: 1X2, Over/Under 2.5, and BTTS Fair Prices
Once your 6x6 bivariate matrix is populated with individual cell probabilities (by multiplying P(Home = i) * P(Away = j)), deriving fair odds for all derivative betting markets requires simple summation.
Home Win Probability: Sum all cells below the main diagonal where Home Goals > Away Goals (1-0, 2-0, 2-1, 3-0, 3-1, 3-2, etc.). With lambda = 1.75 and mu = 1.15, summing every score (including those above 4 goals, which the list leaves out), Home Win Prob = 51.4%. Fair Home Odds = 1 / 0.514 = 1.95.
Draw Probability: Sum all diagonal cells where Home Goals == Away Goals (0-0, 1-1, 2-2, 3-3, 4-4 and beyond). Draw Prob = 23.6%. Fair Draw Odds = 1 / 0.236 = 4.24.
Away Win Probability: Sum all cells where Away Goals > Home Goals. Away Win Prob = 25.0%. Fair Away Odds = 1 / 0.250 = 4.00.
Over/Under 2.5 Goals: Sum all cells where (Home Goals + Away Goals) <= 2 (0-0, 1-0, 0-1, 2-0, 1-1, 0-2). Under 2.5 Prob = 5.51 + 9.64 + 6.33 + 8.44 + 11.08 + 3.64 = 44.64% (Fair Under Odds = 2.24). Over 2.5 Prob = 100% - 44.64% = 55.36% (Fair Over Odds = 1.806).
- Both Teams to Score (BTTS - Yes): 1.0 - (P(Home = 0) + P(Away = 0) - P(0-0)). Instant fair BTTS pricing.
- Correct Score Value: Compare matrix cell probabilities with bookmaker correct score odds; correct score markets usually carry a wide margin, so differences need to be large to be value.
- xG Enhancement: Replace raw historical goals with non-penalty Expected Goals (npxG) to eliminate shooting variance and sharpen lambda parameters.
Advertisement · 18+ · Gambling involves risk · BeGambleAware.org
The Dixon-Coles Correction: Fixing the Low-Score Independence Defect
A known limitation of the independent Poisson model, addressed by statisticians Mark Dixon and Stuart Coles in a 1997 paper ("Modelling Association Football Scores and Inefficiencies in the Football Betting Market", Journal of the Royal Statistical Society Series C, vol. 46, no. 2, pp. 265–280), is that the scores of the two teams are not fully independent at low scorelines: the simple model tends to misprice 0-0, 1-0, 0-1 and 1-1.
The Dixon-Coles model corrects this with a dependence parameter (rho) that adjusts only those four low-scoring cells. Rho is estimated from your own league data rather than assumed, and the adjustment mainly affects your draw and under prices.
Dixon and Coles also proposed weighting recent matches more heavily than older ones (a time-decay parameter, xi), so that ratings reflect a team's current strength. Whether either refinement improves your model should be measured on your own back-test.
- Low-Score Dependence: The adjustment changes the probabilities of 0-0, 1-0, 0-1 and 1-1 only.
- Dixon-Coles Tau Function: Applies multipliers to score combinations where both goal counts are 0 or 1.
- Time-Decay Parameter (Xi): Weights recent matches more heavily than matches from many months ago.
Worked example of the adjustment. Take the matrix above (Lambda 1.75, Mu 1.15) and an illustrative rho of −0.10 — in practice you estimate rho from your own league data. The four cells move as follows: 0-0 from 5.50% to 6.61%, 0-1 from 6.33% to 5.22%, 1-0 from 9.63% to 8.52%, and 1-1 from 11.07% to 12.18%. The total still adds up to 100%, and the Under 2.5 probability is unchanged at 44.6%, because all four cells sit below the line. What changes is the result market: draw 23.6% → 25.8%, home win 51.4% → 50.3%, away win 25.0% → 23.9%. Fair draw odds shorten from 4.24 to about 3.88 — the adjustment matters most if you bet draws, correct scores or draw no bet.
Step-by-Step Implementation: Building the Model in Excel or Python
- Data Collection: Scrape or download match results containing date, home team, away team, home goals, away goals, and non-penalty xG from trusted data providers.
- Rolling Window Calculation: Use a time-decay weighted rolling window of recent matches to compute dynamic attack and defense ratings. How many matches to include is a modelling choice; test it on your own back-test rather than assuming a fixed number.
- Compute Matrix Grid: In Excel, use =POISSON.DIST(k, lambda, FALSE) for rows (0 to 5) and columns (0 to 5), then multiply to build the 2D grid.
- Edge Comparison: Compare your fair odds with the prices on offer, and only consider bets where (Offered_Odds / Fair_Odds) - 1.0 is comfortably positive, for example above 5%, because your model has its own error. Track every bet against the closing price.

Advertisement · 18+ · Gambling involves risk · BeGambleAware.org
Related reading
Sources
Frequently Asked Questions
How does a Poisson model predict football scores?
It estimates each side's expected goals for the match from attack and defence ratings relative to the league average, then uses the Poisson formula to give the probability of 0, 1, 2 and more goals for each team. Multiplying the two gives a probability for every scoreline, and summing cells gives the 1X2, totals and BTTS prices.
How do I calculate expected goals for a Poisson model?
Home expected goals = home attack strength x away defence strength x league average home goals. With a home attack strength of 1.27, an away defence strength of 0.93 and a league home average of 1.50, the home side's expectation is about 1.77 goals.
What is the Dixon-Coles adjustment?
A correction from a 1997 paper by Mark Dixon and Stuart Coles that adjusts the 0-0, 1-0, 0-1 and 1-1 cells with a dependence parameter rho, because the simple model treats the two teams' goals as independent. With rho at -0.10 in one example, the draw probability rises from 23.6% to 25.8% while the under 2.5 probability is unchanged.
Can I build a Poisson model in Excel?
Yes. Use =POISSON.DIST(k, lambda, FALSE) for each team's goal counts from 0 to 5, multiply the two to build the grid, and sum the cells for each market. Test the model against results and closing prices before staking on it.
