SPORTS BETTING MATH
RESEARCH ARTICLE

Correct Score Matrix: Building the Full Probability Grid from Poisson Parameters

A mathematical guide to constructing 7x7 correct score probability surfaces, Dixon-Coles correlation adjustments, and deriving 1X2, Over/Under, and BTTS fair odds.

18 min read Intermediate Last updated 2026-09-20
Topic illustration: Correct Score Matrix: Building the Full Probability Grid from Poisson Parameters
Conceptual illustration. Numerical assumptions and worked examples are explained in the text.

SBM Stochastic Modeling Lab

Editorial byline: match and bankroll models

This topic byline groups articles about Poisson models, Kelly sizing and simulation. It is an editorial label, not evidence of a staffed laboratory or independently verified qualifications.

Bivariate Poisson Match Outcome Modeling Kelly Criterion Geometric Growth Optimization Monte Carlo Risk-of-Ruin Simulation

1. Introduction: The Foundational Probability Surface of Football

In quantitative association football trading, all major betting propositions—including the 1X2 moneyline, Over/Under total goals lines, Asian Handicaps, Both Teams To Score (BTTS), and exact winning margins—are not independent statistical phenomena. Rather, they are ancillary derivatives of a single underlying stochastic distribution: the joint probability surface of exact match scorelines.

Recreational sports bettors frequently treat different markets as disconnected events, betting on "Over 2.5 Goals" with one sportsbook, "Arsenal to Win" with another, and a "Both Teams To Score" prop elsewhere. In doing so, they expose themselves to synthetic bookmaker margins stacked across multiple derivative lines. Professional quantitative syndicates operate from the opposite paradigm: they construct a unified, bivariate probability grid—the Correct Score Matrix—and derive fair odds for all related proposition markets by integrating over subsets of matrix cells.

The Master Matrix Principle: Once a quantitative model constructs a calibrated 7×7 scoreline probability matrix P(i,j), every standard football market is unlocked with mathematical exactness:
  • Home Win (1): ∑i>jP(i,j)
  • Draw (X): ∑i=jP(i,j)
  • Away Win (2): ∑i<jP(i,j)
  • Over 2.5 Goals: 1−∑i+j≤2P(i,j)
  • BTTS (Yes): ∑i≥1,j≥1P(i,j)=(1−P(0,⋅))(1−P(⋅,0))

This technical guide provides a rigorous blueprint for constructing the Correct Score Matrix from Poisson goal expectancies (λ and μ). We analyze probability mass truncation thresholds, detail the exact cell summation partitions for ancillary markets, integrate the Dixon-Coles low-score correction, work through a matrix example, and provide Python code.

2. Bivariate Grid Construction: The 7×7 Probability Matrix

Let an econometric model establish the expected goal intensities for Home Team H (λ>0) and Away Team A (μ>0). Under the classical independent Poisson hypothesis, the probability of the home team scoring exactly i goals and the visiting team scoring exactly j goals is given by the product of their marginal probability mass functions:

P(X=i,Y=j)=λie−λi!×μje−μj!

Matrix Dimensionality and Truncation Thresholds

While the discrete Poisson distribution has an infinite support (i,j∈{0,1,2,…,∞}), practical computing requires truncating the grid at an upper bound K. What is the optimal dimension for an institutional grid?

How much a 7×7 grid (scores from 0−0 up to 6−6, 49 cells) captures depends on the expectancies: 99.9% of the probability mass for λ=1.5,μ=1.2, 99.1% for λ=μ=2.0, but only 95.2% for λ=μ=2.8. Choose the grid using an explicit omitted-tail tolerance for the stated parameters. Normalizing a truncated grid conditions on that grid; it does not recover the omitted scorelines. Extend the grid and report the remaining tail.

Pnormalized(i,j)=P(i,j)∑u=06∑v=06P(u,v)

3. Deriving Ancillary Betting Markets via Matrix Partitions

The supreme operational power of the Correct Score Matrix is that any market proposition corresponds to a geometric partition of the grid:

1. The 1X2 Match Outcome Market

The 49 scoreline cells are cleanly partitioned into three mutually exclusive regions relative to the main diagonal:

P(Home Win)=∑i=16∑j=0i−1P(i,j),P(Draw)=∑k=06P(k,k),P(Away Win)=∑j=16∑i=0j−1P(i,j)

2. Over/Under Total Goals Lines

Total goal propositions evaluate whether the aggregate match score S=i+j exceeds a specific half-goal threshold T∈{0.5,1.5,2.5,3.5,4.5}. The probability of the Under is the sum of cells along the anti-diagonals where i+j≤⌊T⌋:

P(Under 2.5)=P(0,0)+P(1,0)+P(0,1)+P(2,0)+P(1,1)+P(0,2)
P(Over 2.5)=1.0−P(Under 2.5)

3. Both Teams To Score (BTTS)

The "BTTS: No" proposition represents the event that at least one team fails to score (i=0 or j=0). This corresponds to the union of the first row and the first column of the matrix:

P(BTTS: No)=∑j=06P(0,j)+∑i=06P(i,0)−P(0,0)
P(BTTS: Yes)=1.0−P(BTTS: No)=∑i=16∑j=16P(i,j)

4. Asian Handicaps

For any Asian Handicap spread H∈{±0.5,±1.0,±1.5,…}, the probability of the home team covering is the sum of cells satisfying i+H>j:

P(Home −1.5)=∑i−j≥2P(i,j)

4. Incorporating the Dixon-Coles Low-Score Correction

Dixon and Coles (1997) found that independent Poisson models underestimate 0−0 and 1−1 draws and overestimate 1−0 and 0−1 scores. To correct this bias, the four low-scoring cells {0,1}×{0,1} are multiplied by Dixon and Coles' (1997) adjustment factor τi,j(λ,μ,ρ):

PDC(i,j)=τi,j(λ,μ,ρ)⋅Pindep(i,j)

Where ρ is fitted on historical matches and is usually small and negative (the code below uses ρ=−0.11 as an example). Applying the τ correction shifts probability mass from 1−0 and 0−1 scorelines into 0−0 and 1−1 draws, which raises the draw probability slightly.

5. Worked Step-by-Step Example: Manchester City vs. Newcastle

Consider a hypothetical Premier League fixture with expected goal intensities of λ=2.15 (Manchester City at home) and μ=0.85 (Newcastle away).

The 4×4 Core Probability Grid (Subset)

Man City \ Newcastle 0 Goals (42.74%) 1 Goal (36.33%) 2 Goals (15.44%) 3 Goals (4.37%)
0 Goals (11.65%) 0-0: 4.98% 0-1: 4.23% 0-2: 1.80% 0-3: 0.51%
1 Goal (25.04%) 1-0: 10.70% 1-1: 9.10% 1-2: 3.87% 1-3: 1.10%
2 Goals (26.92%) 2-0: 11.51% 2-1: 9.78% 2-2: 4.16% 2-3: 1.18%
3 Goals (19.29%) 3-0: 8.25% 3-1: 7.01% 3-2: 2.98% 3-3: 0.84%

Derived Market Probabilities and Fair Odds

The 1X2 figures sum over all scorelines; in this match the 7×7 grid holds 99.3% of the probability mass.

  • Home Win (PHome): ∑i>jP(i,j)=10.70%+11.51%+9.78%+8.25%+⋯=𝟔𝟕.𝟐%⟹Ofair=𝟏.𝟒𝟗
  • Draw (PDraw): ∑kP(k,k)=4.98%+9.10%+4.16%+0.84%+⋯=𝟏𝟗.𝟐%⟹Ofair=𝟓.𝟐𝟏
  • Away Win (PAway): ∑i<jP(i,j)=4.23%+1.80%+3.87%+⋯=𝟏𝟑.𝟔%⟹Ofair=𝟕.𝟑𝟒
  • Over 2.5 Goals: 1−(4.98%+4.23%+10.70%+1.80%+9.10%+11.51%)=1−42.32%=𝟓𝟕.𝟔𝟖%⟹Ofair=𝟏.𝟕𝟑
  • BTTS (Yes): (1−e−2.15)(1−e−0.85)=(0.8835)(0.5726)=𝟓𝟎.𝟓𝟗%⟹Ofair=𝟏.𝟗𝟖

6. Python Implementation: Full Correct Score Grid Generator

Below is a Python script that generates the complete 7×7 grid, applies the Dixon-Coles adjustment, and extracts fair prices for all ancillary derivative markets.

# correct_score_matrix_engine.py
import numpy as np
from scipy.stats import poisson

def generate_correct_score_matrix(lambda_home, mu_away, rho=-0.11, max_goals=6):
    # Generates a calibrated 7x7 correct score probability matrix.
    grid_size = max_goals + 1
    matrix = np.zeros((grid_size, grid_size), dtype=np.float64)
    
    # Compute raw independent Poisson probabilities
    for i in range(grid_size):
        p_home = poisson.pmf(i, lambda_home)
        for j in range(grid_size):
            p_away = poisson.pmf(j, mu_away)
            matrix[i, j] = p_home * p_away
            
    # Apply Dixon-Coles low-score correction tau
    tau_00 = 1.0 - lambda_home * mu_away * rho
    tau_01 = 1.0 + lambda_home * rho
    tau_10 = 1.0 + mu_away * rho
    tau_11 = 1.0 - rho
    
    matrix[0, 0] *= tau_00
    matrix[0, 1] *= tau_01
    matrix[1, 0] *= tau_10
    matrix[1, 1] *= tau_11
    
    # Normalize matrix to 1.0 to absorb truncation error
    matrix /= np.sum(matrix)
    
    # Derive Ancillary Markets
    p_home_win = np.sum(np.tril(matrix, -1))
    p_draw = np.sum(np.diag(matrix))
    p_away_win = np.sum(np.triu(matrix, 1))
    
    # Over / Under 2.5
    under_25_mask = np.array([[i + j <= 2 for j in range(grid_size)] for i in range(grid_size)])
    p_under_25 = np.sum(matrix[under_25_mask])
    p_over_25 = 1.0 - p_under_25
    
    # Both Teams To Score (BTTS)
    p_btts_yes = np.sum(matrix[1:, 1:])
    p_btts_no = 1.0 - p_btts_yes
    
    return {
        'matrix': matrix,
        'home_win_prob': p_home_win,
        'draw_prob': p_draw,
        'away_win_prob': p_away_win,
        'over_25_prob': p_over_25,
        'under_25_prob': p_under_25,
        'btts_yes_prob': p_btts_yes,
        'fair_1x2_odds': (1.0 / p_home_win, 1.0 / p_draw, 1.0 / p_away_win),
        'fair_ou25_odds': (1.0 / p_over_25, 1.0 / p_under_25),
        'fair_btts_odds': (1.0 / p_btts_yes, 1.0 / p_btts_no)
    }

if __name__ == '__main__':
    res = generate_correct_score_matrix(2.15, 0.85)
    print("Fair 1X2 Odds:", np.round(res['fair_1x2_odds'], 2))
    print("Fair Over/Under 2.5:", np.round(res['fair_ou25_odds'], 2))
    print("Fair BTTS Odds:", np.round(res['fair_btts_odds'], 2))

7. Numerical Stability and Normalization

When calculating joint Poisson matrices, floating-point precision matters for extreme scorelines such as 6-5 or 5-4. Production code accumulates logarithms of the probability mass functions, ln⁡P(i,j)=iln⁡λ−λ−ln⁡(i!)+jln⁡μ−μ−ln⁡(j!), and exponentiates back into probability space to avoid underflow. Dividing the whole grid by its cumulative sum ∑i,jP(i,j) makes the total probability exactly 1, so the 1X2, totals, BTTS and handicap prices derived from it stay consistent with each other.

Frequently Asked Questions

RELATED RESEARCH

Cross-Referenced Studies

Compare the same market

Partner links

1win Sports: check the event, quoted odds and settlement rules

What the price includes → Visit 1win Sports 18+ · Terms on site

Stake Sportsbook: compare the same event, market and settlement rules

What the price includes → Visit Stake 18+ · Terms on site

Check the current price, exact market, settlement rules and availability in your country. A calculator result depends on its assumptions and does not verify a live betting opportunity.