SPORTS BETTING MATH APPLIED PROBABILITY INSTITUTE
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

SBM Stochastic Modeling Lab

Poisson Models & Bankroll Optimization Team

Research laboratory focused on Poisson goal distribution modeling, Kelly criterion staking optimization, and Monte Carlo risk-of-ruin simulations for sports wagering.

Bivariate Poisson Match Outcome Modeling Kelly Criterion Geometric Growth Optimization Monte Carlo Risk-of-Ruin Simulation (10M+ Runs)

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 imes 7$ scoreline probability matrix $P(i, j)$, every standard football market is unlocked with mathematical exactness:
  • Home Win (1): $sum_{i > j} P(i, j)$
  • Draw (X): $sum_{i = j} P(i, j)$
  • Away Win (2): $sum_{i < j} P(i, j)$
  • Over 2.5 Goals: $1 - sum_{i + j le 2} P(i, j)$
  • BTTS (Yes): $sum_{i ge 1, j ge 1} P(i, j) = (1 - P(0, cdot))(1 - P(cdot, 0))$

This technical guide provides a rigorous blueprint for constructing the Correct Score Matrix from Poisson goal expectancies ($lambda$ and $mu$). We analyze probability mass truncation thresholds, detail the exact cell summation partitions for ancillary markets, integrate the Dixon-Coles low-score correction, present a real-world worked matrix example, and provide production-ready Python code for institutional modeling.

2. Bivariate Grid Construction: The $7 imes 7$ Probability Matrix

Let an econometric model establish the expected goal intensities for Home Team $H$ ($lambda > 0$) and Away Team $A$ ($mu > 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) = rac{lambda^i e^{-lambda}}{i!} imes rac{mu^j e^{-mu}}{j!}$$

Matrix Dimensionality and Truncation Thresholds

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

For typical European football parameters ($lambda, mu in [0.80, 2.80]$), a $7 imes 7$ grid (scores from $0-0$ up to $6-6$, encompassing 49 discrete scoreline cells) captures more than 99.4% to 99.8% of the total theoretical probability mass. Truncating at $K = 6$ introduces a negligible truncation error $epsilon < 0.005$, which is easily normalized across the matrix:

$$P_{ ext{normalized}}(i, j) = rac{P(i, j)}{sum_{u=0}^6 sum_{v=0}^6 P(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( ext{Home Win}) = sum_{i=1}^6 sum_{j=0}^{i-1} P(i, j), qquad P( ext{Draw}) = sum_{k=0}^6 P(k, k), qquad P( ext{Away Win}) = sum_{j=1}^6 sum_{i=0}^{j-1} P(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 in {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 le lfloor T floor$:

$$P( ext{Under } 2.5) = P(0,0) + P(1,0) + P(0,1) + P(2,0) + P(1,1) + P(0,2)$$
$$P( ext{Over } 2.5) = 1.0 - P( ext{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( ext{BTTS: No}) = sum_{j=0}^6 P(0, j) + sum_{i=0}^6 P(i, 0) - P(0, 0)$$
$$P( ext{BTTS: Yes}) = 1.0 - P( ext{BTTS: No}) = sum_{i=1}^6 sum_{j=1}^6 P(i, j)$$

4. Asian Handicaps

For any Asian Handicap spread $H in {pm 0.5, pm 1.0, pm 1.5, dots}$, the probability of the home team covering is the sum of cells satisfying $i + H > j$:

$$P( ext{Home } -1.5) = sum_{i - j ge 2} P(i, j)$$

4. Incorporating the Dixon-Coles Low-Score Correction

As proved in our specialized research monograph on low-scoring anomalies, raw independent Poisson models systematically underestimate $0-0$ draws (by ~35%) and $1-1$ draws (by ~15%), while overestimating $1-0$ and $0-1$ scores. To correct this bias, the four low-scoring cells ${0, 1} imes {0, 1}$ are multiplied by Dixon and Coles' (1997) adjustment factor $ au_{i,j}(lambda, mu, ho)$:

$$P_{ ext{DC}}(i, j) = au_{i,j}(lambda, mu, ho) cdot P_{ ext{indep}}(i, j)$$

Where $ ho approx -0.11$ in top European leagues. Applying the $ au$ correction shifts probability mass from asymmetric $1-0/0-1$ scorelines into $0-0$ and $1-1$ draws, aligning the derived 1X2 and Total Goals lines with empirical market equilibrium.

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

Consider a Premier League fixture where our team ratings establish expected goal intensities of $lambda = 2.15$ (Manchester City at home) and $mu = 0.85$ (Newcastle away).

The $4 imes 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.24% 3-1: 7.01% 3-2: 2.98% 3-3: 0.84%

Derived Market Probabilities and Fair Odds

  • Home Win ($P_{ ext{Home}}$): $sum_{i > j} P(i,j) = 10.70% + 11.51% + 9.78% + 8.24% + dots = mathbf{66.2%} implies O_{ ext{fair}} = mathbf{1.51}$
  • Draw ($P_{ ext{Draw}}$): $sum_{k} P(k,k) = 4.98% + 9.10% + 4.16% + 0.84% + dots = mathbf{19.6%} implies O_{ ext{fair}} = mathbf{5.10}$
  • Away Win ($P_{ ext{Away}}$): $sum_{i < j} P(i,j) = 4.23% + 1.80% + 3.87% + dots = mathbf{14.2%} implies O_{ ext{fair}} = mathbf{7.04}$
  • Over 2.5 Goals: $1 - (4.98% + 4.23% + 10.70% + 1.80% + 9.10% + 11.51%) = 1 - 42.32% = mathbf{57.68%} implies O_{ ext{fair}} = mathbf{1.73}$
  • BTTS (Yes): $(1 - e^{-2.15})(1 - e^{-0.85}) = (0.8835)(0.5726) = mathbf{50.59%} implies O_{ ext{fair}} = mathbf{1.98}$

6. Python Implementation: Full Correct Score Grid Generator

Below is an institutional Python script that generates the complete $7 imes 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. Frequently Asked Questions

Numerical Stability and Normalization of Matrix Boundaries

When calculating joint bivariate Poisson matrices, floating-point precision becomes vital when evaluating extreme longshot scorelines (such as 6-5 or 5-4). In production trading environments, logarithms of the Poisson probability mass functions are accumulated: $ln P(i, j) = i ln lambda - lambda - ln(i!) + j ln mu - mu - ln(j!)$. Exponentiating back into probability space prevents floating-point underflow. Normalizing the entire $7 imes 7$ grid by dividing by the cumulative sum $sum_{i,j} P(i,j)$ guarantees that the total probability mass equals exactly 1.00000, ensuring complete no-arbitrage coherence across all derivative markets.

Numerical Stability and Normalization of Matrix Boundaries

When calculating joint bivariate Poisson matrices, floating-point precision becomes vital when evaluating extreme longshot scorelines (such as 6-5 or 5-4). In production trading environments, logarithms of the Poisson probability mass functions are accumulated: $ln P(i, j) = i ln lambda - lambda - ln(i!) + j ln mu - mu - ln(j!)$. Exponentiating back into probability space prevents floating-point underflow. Normalizing the entire $7 imes 7$ grid by dividing by the cumulative sum $sum_{i,j} P(i,j)$ guarantees that the total probability mass equals exactly 1.00000, ensuring complete no-arbitrage coherence across all derivative markets.

Numerical Stability and Normalization of Matrix Boundaries

When calculating joint bivariate Poisson matrices, floating-point precision becomes vital when evaluating extreme longshot scorelines (such as 6-5 or 5-4). In production trading environments, logarithms of the Poisson probability mass functions are accumulated: $ln P(i, j) = i ln lambda - lambda - ln(i!) + j ln mu - mu - ln(j!)$. Exponentiating back into probability space prevents floating-point underflow. Normalizing the entire $7 imes 7$ grid by dividing by the cumulative sum $sum_{i,j} P(i,j)$ guarantees that the total probability mass equals exactly 1.00000, ensuring complete no-arbitrage coherence across all derivative markets.

Numerical Stability and Normalization of Matrix Boundaries

When calculating joint bivariate Poisson matrices, floating-point precision becomes vital when evaluating extreme longshot scorelines (such as 6-5 or 5-4). In production trading environments, logarithms of the Poisson probability mass functions are accumulated: $ln P(i, j) = i ln lambda - lambda - ln(i!) + j ln mu - mu - ln(j!)$. Exponentiating back into probability space prevents floating-point underflow. Normalizing the entire $7 imes 7$ grid by dividing by the cumulative sum $sum_{i,j} P(i,j)$ guarantees that the total probability mass equals exactly 1.00000, ensuring complete no-arbitrage coherence across all derivative markets.

Frequently Asked Questions

RELATED RESEARCH

Cross-Referenced Studies

18+ RISK NOTICE