1. Introdução: a Superfície de Probabilidade Fundamental do Futebol
No trading quantitativo de futebol, os principais mercados (1X2, Over/Under de gols, Handicap Asiático, Ambas Marcam e margem exata de vitória) não são fenômenos estatísticos independentes. Eles são derivados de uma única distribuição estocástica: a superfície de probabilidade conjunta dos placares exatos.
Apostadores recreativos costumam tratar os mercados como eventos desconectados: apostam "Over 2,5 Gols" em uma casa, "Vitória do Arsenal" em outra e "Ambas Marcam" em uma terceira. Assim, ficam expostos a margens empilhadas em várias linhas derivadas. Analistas quantitativos fazem o contrário: constroem uma grade de probabilidade bivariada única, a Matriz de Placar Exato, e derivam as odds justas de todos os mercados relacionados somando subconjuntos de células.
- Vitória do Mandante (1):
- Empate (X):
- Vitória do Visitante (2):
- Over 2,5 Gols:
- Ambas Marcam (Sim):
Este guia técnico mostra como construir a Matriz de Placar Exato a partir das expectativas de gols de Poisson ( e ). Analisamos os limites de truncamento da massa de probabilidade, detalhamos as somas de células para cada mercado derivado, incorporamos a correção de Dixon-Coles para placares baixos, percorremos um exemplo de matriz e fornecemos código em Python.
2. Construção da Grade Bivariada: a Matriz de Probabilidades
Suponha que o modelo econométrico estabeleça as intensidades de gols esperados para o Mandante () e o Visitante (). Sob a hipótese clássica de Poisson independente, a probabilidade de o mandante marcar exatamente gols e o visitante exatamente gols é o produto das funções de probabilidade marginais:
Dimensão da Matriz e Limites de Truncamento
A distribuição de Poisson tem suporte infinito (), mas na prática a grade é truncada em um limite superior . Qual dimensão usar?
Quanto uma grade (placares de a , 49 células) captura depende das expectativas: 99,9% da massa de probabilidade para , 99,1% para , mas apenas 95,2% para . Escolha a grade por uma tolerância explícita da cauda omitida. Normalizar a grade truncada condiciona à grade, sem recuperar os placares ausentes; amplie-a e informe a massa restante:
3. Mercados Derivados como Partições da Matriz
O grande poder operacional da Matriz de Placar Exato é que qualquer mercado corresponde a uma partição geométrica da grade:
1. O Mercado de Resultado 1X2
As 49 células de placar se dividem em três regiões mutuamente exclusivas em relação à diagonal principal:
2. Linhas de Over/Under de Gols
Os mercados de total de gols avaliam se o placar agregado supera um limite de meio gol . A probabilidade do Under é a soma das células nas antidiagonais em que :
3. Ambas Marcam (BTTS)
O mercado "Ambas Marcam: Não" representa o evento em que pelo menos um time não marca ( ou ). Isso corresponde à união da primeira linha com a primeira coluna da matriz:
4. Handicaps Asiáticos
Para qualquer linha de Handicap Asiático , a probabilidade de o mandante cobrir o handicap é a soma das células que satisfazem :
4. A Correção de Dixon-Coles para Placares Baixos
Dixon e Coles (1997) constataram que modelos de Poisson independentes subestimam os empates e e superestimam os placares e . Para corrigir esse viés, as quatro células de placar baixo são multiplicadas pelo fator de ajuste de Dixon e Coles :
Onde é ajustado com jogos históricos e costuma ser pequeno e negativo (o código abaixo usa como exemplo). A correção transfere massa de probabilidade dos placares e para os empates e , o que aumenta um pouco a probabilidade de empate.
5. Exemplo Passo a Passo: Manchester City x Newcastle
Considere um jogo hipotético da Premier League com intensidades de gols esperados de (Manchester City em casa) e (Newcastle fora).
A Grade Central (Subconjunto)
| Man City \ Newcastle | 0 Gols () | 1 Gol () | 2 Gols () | 3 Gols () |
|---|---|---|---|---|
| 0 Gols () | 0-0: 4.98% | 0-1: 4.23% | 0-2: 1.80% | 0-3: 0.51% |
| 1 Gol () | 1-0: 10.70% | 1-1: 9.10% | 1-2: 3.87% | 1-3: 1.10% |
| 2 Gols () | 2-0: 11.51% | 2-1: 9.78% | 2-2: 4.16% | 2-3: 1.18% |
| 3 Gols () | 3-0: 8.25% | 3-1: 7.01% | 3-2: 2.98% | 3-3: 0.84% |
Probabilidades dos Mercados Derivados e Odds Justas
Os números do 1X2 somam todos os placares; neste jogo, a grade contém 99,3% da massa de probabilidade.
- Vitória do Mandante ():
- Empate ():
- Vitória do Visitante ():
- Over 2,5 Gols:
- Ambas Marcam (Sim):
6. Implementação em Python: Gerador da Grade de Placar Exato
Abaixo está um script em Python que gera a grade completa, aplica o ajuste de Dixon-Coles e extrai os preços justos de todos os mercados derivados.
# 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. Estabilidade Numérica e Normalização
No cálculo de matrizes de Poisson conjuntas, a precisão de ponto flutuante importa para placares extremos como 6-5 ou 5-4. O código de produção acumula os logaritmos das funções de probabilidade, , e volta ao espaço de probabilidades pela exponencial para evitar underflow. Dividir toda a grade pela soma acumulada faz a probabilidade total ser exatamente 1, de modo que os preços de 1X2, totais, Ambas Marcam e handicaps derivados dela permanecem consistentes entre si.
