SPORTS BETTING MATH APPLIED PROBABILITY INSTITUTE
ARTIGO DE PESQUISA

Modelo Dixon-Coles Explicado: Correção de Baixos Placares e Decaimento Temporal no Futebol

Guia matemático completo sobre a correção bivariada de Dixon-Coles, matriz de ajuste tau para baixos placares, estimação de parâmetros com decaimento temporal e ineficiências em apostas de futebol.

22 min de leitura Avançado Última atualização 2026-09-20

Lab de Modelagem Estocástica SBM

Equipe de Modelos de Poisson e Otimização de Banca

Laboratório de pesquisa focado em modelagem de distribuição de Poisson para gols, otimização de apostas pelo Critério de Kelly e simulações de Monte Carlo para risco de ruína.

Modelagem Bivariada de Partidas pela Distribuição de Poisson Otimização de Crescimento Geométrico pelo Critério de Kelly Simulações de Monte Carlo para Risco de Ruína (10M+ execuções)

1. Introdução: A Falha Estrutural do Modelo Poisson Independente

Na modelagem quantitativa de futebol de associação, o modelo de Poisson independente — introduzido pioneiramente na análise esportiva por M. J. Maher em 1982 — representa a referência clássica para estimar a expectativa de gols e as distribuições de placares exatos. A premissa central de Maher afirma que os gols marcados pela equipe mandante ($X$) e pela equipe visitante ($Y$) ao longo dos 90 minutos de tempo regulamentar seguem processos estocásticos pontuais de Poisson mutuamente independentes, parametrizados pelas expectativas marginais de gols $lambda$ e $mu$:

$$P(X = x, Y = y) = P(X = x) cdot P(Y = y) = rac{lambda^x e^{-lambda}}{x!} cdot rac{mu^y e^{-mu}}{y!}$$

Embora matematicamente simples, computacionalmente rápido e amplamente utilizado por apostadores amadores, essa hipótese de independência estocástica apresenta uma grave deficiência empírica: os gols no futebol profissional não são condicionalmente independentes. Em dados reais de ligas competitivas, a dinâmica tática, a conservação de energia após abrir vantagem, a pressão psicológica e as decisões de arbitragem introduzem uma correlação não nula entre os placares de mandantes e visitantes.

A Anomalia da Correlação de Baixos Placares no Futebol Empírico: Ao analisar mais de 40.000 partidas nas principais ligas europeias (Premier League inglesa, La Liga espanhola, Serie A italiana e Bundesliga alemã), os resultados revelam um agrupamento estatístico evidente em placares baixos:
  • Empates em 0 a 0: Ocorrem em aproximadamente 8,2% a 9,5% das partidas do futebol moderno, enquanto um modelo de Poisson independente padrão com médias típicas ($lambda = 1,45, mu = 1,10$) prevê apenas 5,9% — uma subestimação sistemática de quase 35%.
  • Empates em 1 a 1: Ocorrem em cerca de 11,5% a 13,2% dos jogos, ao passo que a independência ingênua projeta aproximadamente 9,4%.
  • Vitórias por 1 a 0 e 0 a 1: São, inversamente, superestimadas pelo modelo independente em cerca de 8% a 15%.

Essa distorção estrutural cria uma vulnerabilidade evidente nos mercados de apostas esportivas. Qualquer consórcio quantitativo que dependa de modelos de Poisson sem correção subestimará gravemente a probabilidade real de empates com poucos gols, calculará linhas de Handicap Asiático distorcidas e precificará mercados de Menos de 2,5 Gols (Under 2.5) com valor esperado negativo ($ ext{EV} < 0$).

Em seu célebre artigo de 1997 publicado no Journal of the Royal Statistical Society, os estatísticos britânicos Mark J. Dixon e Stuart G. Coles apresentaram a solução canônica para este problema: "Modelling Association Football Scores and Inefficiencies in the Football Betting Market". O modelo Dixon-Coles introduziu um fator de ajuste de correlação bivariada $ au_{x,y}(lambda, mu, ho)$ que pondera explicitamente os estados de baixa pontuação, preservando integralmente a distribuição marginal de Poisson, associado a um mecanismo de decaimento temporal exponencial para refletir a evolução das forças relativas das equipes ao longo do tempo.

Este tratado técnico apresenta a dedução matemática completa do modelo Dixon-Coles, a demonstração da conservação da massa de probabilidade total, a formulação da Estimação de Máxima Verossimilhança (MLE) com decaimento temporal $\xi$, tabelas empíricas de distorção de mercado e um código completo e operacional em Python utilizando scipy.optimize.

2. O Fator de Correção Bivariada de Dixon-Coles

Para corrigir a falha da independência estocástica sem perder a eficiência de cálculo das distribuições de Poisson, Dixon e Coles formularam a seguinte função de probabilidade conjunta ajustada:

$$P(X = x, Y = y mid lambda, mu, ho) = au_{x,y}(lambda, mu, ho) cdot rac{lambda^x e^{-lambda}}{x!} cdot rac{mu^y e^{-mu}}{y!}$$

O fator de ajuste $ au_{x,y}(lambda, mu, ho)$ é uma função escalar discreta definida pontualmente sobre os resultados de baixa pontuação ${0, 1} imes {0, 1}$, parametrizada pelo coeficiente de correlação $ ho$:

$$ au_{x,y}(lambda, mu, ho) = egin{cases} 1 - lambda mu ho & ext{para } x = 0, y = 0 \ 1 + lambda ho & ext{para } x = 0, y = 1 \ 1 + mu ho & ext{para } x = 1, y = 0 \ 1 - ho & ext{para } x = 1, y = 1 \ 1 & ext{para } x ge 2 ext{ ou } y ge 2 end{cases}$$

Demonstração Matemática da Conservação da Probabilidade Total

Para que o modelo seja estatisticamente válido, a introdução de $ au_{x,y}$ deve respeitar dois axiomas fundamentais: não negatividade ($P(X=x, Y=y) ge 0$) e conservação da probabilidade total ($sum_{x=0}^infty sum_{y=0}^infty P(X=x, Y=y) = 1$).

Podemos demonstrar a conservação total decompondo o somatório em relação à base clássica de Poisson mais a perturbação sobre os quatro estados modificados:

$$sum_{x=0}^infty sum_{y=0}^infty P(X=x, Y=y) = sum_{x=0}^infty rac{lambda^x e^{-lambda}}{x!} sum_{y=0}^infty rac{mu^y e^{-mu}}{y!} + Delta = 1 cdot 1 + Delta$$

Onde o termo de perturbação $Delta$ é avaliado diretamente sobre os estados $(0,0), (0,1), (1,0), (1,1)$:

$$egin{aligned} Delta &= ( au_{0,0} - 1) P_0(lambda) P_0(mu) + ( au_{0,1} - 1) P_0(lambda) P_1(mu) \ &quad + ( au_{1,0} - 1) P_1(lambda) P_0(mu) + ( au_{1,1} - 1) P_1(lambda) P_1(mu) end{aligned}$$

Substituindo as probabilidades de Poisson não ajustadas $P_0(lambda) = e^{-lambda}$, $P_1(lambda) = lambda e^{-lambda}$, $P_0(mu) = e^{-mu}$ e $P_1(mu) = mu e^{-mu}$, e evidenciando o termo comum $e^{-lambda-mu}$:

$$egin{aligned} Delta &= e^{-lambda-mu} Big[ (-lambda mu ho) cdot (1) + (lambda ho) cdot (mu) + (mu ho) cdot (lambda) + (- ho) cdot (lambda mu) Big] \ &= e^{-lambda-mu} ho Big[ -lambda mu + lambda mu + lambda mu - lambda mu Big] \ &= e^{-lambda-mu} ho cdot (0) = mathbf{0} end{aligned}$$

A soma das perturbações é identicamente nula. Logo, a probabilidade total de $100%$ permanece perfeitamente conservada em qualquer parametrização válida.

Interpretação Física do Parâmetro de Correlação $ ho$

Em dados empíricos de ligas reais, o método de Máxima Verossimilhança converge consistentemente para um valor negativo de $ ho$, situado rotineiramente no intervalo:

$$ ho in [-0,15, -0,05]$$

A mecânica de um $ ho$ negativo (por exemplo, $ ho = -0,11$) reflete precisamente o comportamento tático de partidas equilibradas:

  • No estado $(0,0)$: $ au_{0,0} = 1 - lambda mu ho$. Como $ ho < 0$, o produto $-lambda mu ho > 0$, fazendo com que $ au_{0,0} > 1$. A probabilidade de um empate sem gols é aumentada em relação ao Poisson ingênuo.
  • No estado $(1,1)$: $ au_{1,1} = 1 - ho$. Como $ ho < 0$, $1 - ho = 1 + | ho| > 1$. A probabilidade do placar 1 a 1 é explicitamente amplificada.
  • Nos estados $(0,1)$ e $(1,0)$: $ au_{0,1} = 1 + lambda ho < 1$ e $ au_{1,0} = 1 + mu ho < 1$. As probabilidades de vitórias magras de 1 a 0 são reduzidas, compensando com exatidão o ganho dos empates.

3. Parametrização das Equipes: Ataque, Defesa e Mando de Campo

No modelo de Dixon e Coles, as expectativas de gols $lambda_{i,j}$ (equipe mandante $i$ contra visitante $j$) e $mu_{i,j}$ (equipe visitante $j$ contra mandante $i$) são estruturadas de forma log-linear através das forças latentes de cada clube:

$$lambda_{i,j} = alpha_i cdot eta_j cdot gamma, qquad mu_{i,j} = alpha_j cdot eta_i$$

Onde:

  • $alpha_i > 0$: O índice ofensivo (força de ataque) da equipe $i$. Um time com $alpha_i = 1,30$ gera 30% mais chances de gol do que a média da competição.
  • $eta_j > 0$: A fragilidade defensiva (vulnerabilidade a sofrer gols) da equipe $j$. Um time com $eta_j = 0,80$ concede 20% menos gols do que a média da liga.
  • $gamma > 0$: O fator global de vantagem do mando de campo da liga. Em ligas europeias consolidadas, $gamma$ varia entre $1,20$ e $1,35$.

A Restrição de Identificabilidade de Parâmetros

Um erro conceitual comum em modelos de classificação esportiva é a indeterminação de escala. Multiplicar todos os parâmetros de ataque $alpha_k$ por uma constante $c > 0$ e dividir todas as defesas $eta_k$ por $c$ gera valores idênticos para $lambda_{i,j} = (c alpha_i)(eta_j / c)gamma = alpha_i eta_j gamma$.

Para eliminar graus de liberdade espúrios e fixar o estimador de Máxima Verossimilhança, Dixon e Coles estabeleceram uma restrição de normalização sobre todos os $N$ clubes do campeonato:

$$ rac{1}{N} sum_{k=1}^N alpha_k = 1,00$$

Isso padroniza a força média de ataque da liga em exatamente 1,00, servindo de âncora matemática para todas as métricas relativas.

4. Decaimento Temporal Exponencial: A Função de Memória $\xi$

Modelos ingênuos tratam partidas disputadas há dois anos com o mesmo peso de partidas realizadas no último domingo. No futebol real, transferências de atletas, trocas de comissão técnica e oscilações físicas alteram substancialmente o rendimento das equipes.

Para incorporar a dinâmica temporal sem perder a robustez amostral, Dixon e Coles introduziram uma função de decaimento temporal exponencial $w_k(\xi)$ para cada partida histórica $k$ realizada na data $t_k$, relativa à data de previsão $t$:

$$w_k(\xi) = expleft( -\xi cdot (t - t_k) ight)$$

Onde $(t - t_k)$ representa o tempo decorrido em dias e $\xi > 0$ é o hiperparâmetro de decaimento contínuo.

A Meia-Vida da Forma Esportiva: A meia-vida temporal $t_{1/2}$, que indica o período necessário para que o peso de uma partida seja reduzido exatamente pela metade ($w_k = 0,50$), é formulada como: $$t_{1/2} = rac{ln(2)}{\xi}$$ Em testes empíricos com linhas de fechamento da Premier League, o parâmetro ideal de máxima verossimilhança fora da amostra situa-se frequentemente em: $$\xi approx 0,0065 ext{ dias}^{-1} implies t_{1/2} approx rac{0,69315}{0,0065} approx 106,6 ext{ dias}$$ Isso demonstra que confrontos ocorridos há 3,5 meses perdem metade de seu peso analítico, enquanto jogos disputados há mais de duas temporadas exercem menos de 1% de influência sobre os parâmetros atuais de ataque e defesa.

5. Formulação de Máxima Verossimilhança (MLE)

Dado um histórico de $M$ jogos disputados, onde cada partida $k$ envolve o mandante $h_k$, visitante $a_k$, placar $(x_k, y_k)$ e data $t_k$, a função de log-verossimilhança ponderada a ser maximizada é:

$$ln L(Theta) = sum_{k=1}^M w_k(\xi) cdot lnleft[ au_{x_k, y_k}(lambda_k, mu_k, ho) cdot rac{lambda_k^{x_k} e^{-lambda_k}}{x_k!} cdot rac{mu_k^{y_k} e^{-mu_k}}{y_k!} ight]$$

Ao expandir o logaritmo em seus termos aditivos, obtemos:

$$ln L(Theta) = sum_{k=1}^M w_k(\xi) left[ ln au_{x_k, y_k}(lambda_k, mu_k, ho) + x_k ln lambda_k - lambda_k + y_k ln mu_k - mu_k - ln(x_k!) - ln(y_k!) ight]$$

Como os termos fatoriais $-ln(x_k!) - ln(y_k!)$ dependem apenas dos dados observados e não dos parâmetros $Theta$, eles são ignorados durante a otimização computacional. Minimizamos, portanto, a log-verossimilhança negativa ponderada:

$$min_{Theta} mathcal{NLL}(Theta) = -sum_{k=1}^M w_k(\xi) left[ ln au_{x_k, y_k}(lambda_k, mu_k, ho) + x_k ln lambda_k - lambda_k + y_k ln mu_k - mu_k ight]$$

Essa rotina é solucionada com extrema estabilidade utilizando o algoritmo quase-Newton L-BFGS-B ou algoritmos de programação quadrática sequencial com limites (SLSQP).

6. Distorção Empírica de Mercado: Poisson Independente vs. Dixon-Coles

Para mensurar a vantagem financeira direta extraída pelo modelo de Dixon-Coles, analisamos um confronto de topo da liga inglesa: Arsenal vs. Chelsea. Com base em parâmetros calibrados, definimos as expectativas em $lambda = 1,65$ (Arsenal em casa) e $mu = 1,15$ (Chelsea fora). Comparamos o Poisson independente com o modelo Dixon-Coles calibrado com correlação $ ho = -0,12$.

Tabela Comparativa: Probabilidades de Placares e Cotações Decimais Justas

Desfecho / Placar Prob. Poisson Independente Odd Justa Indep. Prob. Dixon-Coles Odd Justa Dixon-Coles Benchmark de Fechamento Pinnacle Diferença / Vantagem Analítica
0 – 0 (Empate Sem Gols) $6,06%$ $16,50$ $7,44%$ $13,44$ $13,60$ +22,8% de subestimação no modelo ingênuo
1 – 1 (Empate com Gols) $11,51%$ $8,69$ $12,89%$ $7,76$ $7,85$ +12,0% de subestimação no modelo ingênuo
1 – 0 (Vitória Mandante Mínima) $10,00%$ $10,00$ $8,62%$ $11,60$ $11,45$ -13,8% de superestimação no modelo ingênuo
0 – 1 (Vitória Visitante Mínima) $6,97%$ $14,35$ $6,08%$ $16,45$ $16,20$ -12,8% de superestimação no modelo ingênuo
Vitória Mandante (1X2) $50,21%$ $1,99$ $48,63%$ $2,06$ $2,05$ Ajuste de $-3,1%$
Empate (1X2) $24,78%$ $4,04$ $27,56%$ $3,63$ $3,65$ +11,2% de subestimação no Empate
Vitória Visitante (1X2) $25,01%$ $4,00$ $23,81%$ $4,20$ $4,18$ Ajuste de $-4,8%$
Menos de 2,5 Gols (Under 2.5) $48,06%$ $2,08$ $51,52%$ $1,94$ $1,95$ +7,2% de discrepância no mercado de gols

As conclusões práticas deste experimento numérico são incontestáveis:

  1. A Ineficiência do Empate no Mercado 1X2: O modelo ingênuo projeta o empate a uma odd justa de $4,04$. Sob Dixon-Coles, a odd justa cai para $3,63$, correspondendo com exatidão à linha de fechamento da Pinnacle ($3,65$). Se uma casa de apostas recreativa precificar o empate em $4,00$, o apostador quantitativo obtém um valor esperado superior a $+10,2%$ de +EV.
  2. Distorção no Mercado de Totais: O mercado de Menos de 2,5 Gols passa de aposta perdedora ($48,06%$, odd justa $2,08$) para favorita estatística ($51,52%$, odd justa $1,94$). Operar totais de gols sem a correção de Dixon-Coles destrói a rentabilidade a longo prazo.

7. Implementação Completa em Python: Classe DixonColesModel

Abaixo encontra-se o script completo em Python contendo a implementação da classe com otimização numérica via scipy.optimize.minimize:

import numpy as np
from scipy.optimize import minimize
from scipy.stats import poisson

class DixonColesModel:
    def __init__(self, xi=0.0065):
        # ---
        xi: Decaimento exponencial diário (padrão: 0.0065 -> meia-vida de aprox. 106 dias).
        # ---
        self.xi = xi
        self.teams = []
        self.team_indices = {}
        self.params = None
        self.gamma = 1.25
        self.rho = -0.11

    @staticmethod
    def tau(x, y, lambda_, mu, rho):
        Fator de ajuste discreto tau_{x,y} de Dixon e Coles.
        if x == 0 and y == 0:
            return 1.0 - lambda_ * mu * rho
        elif x == 0 and y == 1:
            return 1.0 + lambda_ * rho
        elif x == 1 and y == 0:
            return 1.0 + mu * rho
        elif x == 1 and y == 1:
            return 1.0 - rho
        else:
            return 1.0

    def bivariate_prob(self, x, y, lambda_, mu, rho):
        Calcula a probabilidade bivariada P(X=x, Y=y) corrigida.
        p_indep = poisson.pmf(x, lambda_) * poisson.pmf(y, mu)
        tau_val = self.tau(x, y, lambda_, mu, rho)
        return max(0.0, tau_val * p_indep)

    def _unpack_params(self, params, n_teams):
        alpha = params[0:n_teams]
        beta = params[n_teams:2*n_teams]
        gamma = params[2*n_teams]
        rho = params[2*n_teams + 1]
        return alpha, beta, gamma, rho

    def fit(self, matches):
        # ---
        matches: lista de dicionários contendo os dados dos jogos:
                 [{'home': 'Arsenal', 'away': 'Chelsea', 'home_goals': 2, 'away_goals': 1, 'days_ago': 14}, ...]
        # ---
        unique_teams = sorted(list(set([m['home'] for m in matches] + [m['away'] for m in matches])))
        self.teams = unique_teams
        self.team_indices = {team: i for i, team in enumerate(self.teams)}
        n_teams = len(self.teams)

        init_alpha = np.ones(n_teams)
        init_beta = np.ones(n_teams)
        init_gamma = 1.25
        init_rho = -0.10
        init_params = np.concatenate([init_alpha, init_beta, [init_gamma, init_rho]])

        def loss_fn(params):
            alpha, beta, gamma, rho = self._unpack_params(params, n_teams)
            nll = 0.0

            for m in matches:
                h_idx = self.team_indices[m['home']]
                a_idx = self.team_indices[m['away']]
                x = m['home_goals']
                y = m['away_goals']
                t_diff = m.get('days_ago', 0.0)

                weight = np.exp(-self.xi * t_diff)

                lambda_ = alpha[h_idx] * beta[a_idx] * gamma
                mu = alpha[a_idx] * beta[h_idx]

                lambda_ = max(lambda_, 1e-4)
                mu = max(mu, 1e-4)

                prob = self.bivariate_prob(x, y, lambda_, mu, rho)
                if prob <= 1e-12:
                    prob = 1e-12

                nll -= weight * np.log(prob)

            # Restrição de identificabilidade: média de alpha = 1.0
            penalty = 1000.0 * (np.mean(alpha) - 1.0) ** 2
            return nll + penalty

        bounds = []
        for _ in range(n_teams): bounds.append((0.05, 3.5))
        for _ in range(n_teams): bounds.append((0.05, 3.5))
        bounds.append((1.0, 1.8))
        bounds.append((-0.35, 0.0))

        res = minimize(loss_fn, init_params, method='L-BFGS-B', bounds=bounds)
        self.params = res.x
        alpha, beta, self.gamma, self.rho = self._unpack_params(self.params, n_teams)
        print(f"Calibração concluída: gamma={self.gamma:.3f}, rho={self.rho:.4f}")
        return res

    def predict_score_matrix(self, home_team, away_team, max_goals=7):
        n_teams = len(self.teams)
        alpha, beta, gamma, rho = self._unpack_params(self.params, n_teams)
        h_idx = self.team_indices[home_team]
        a_idx = self.team_indices[away_team]

        lambda_ = alpha[h_idx] * beta[a_idx] * gamma
        mu = alpha[a_idx] * beta[h_idx]

        matrix = np.zeros((max_goals + 1, max_goals + 1))
        for x in range(max_goals + 1):
            for y in range(max_goals + 1):
                matrix[x, y] = self.bivariate_prob(x, y, lambda_, mu, rho)

        matrix /= np.sum(matrix)
        return matrix, lambda_, mu

    def predict_1x2(self, home_team, away_team):
        matrix, lambda_, mu = self.predict_score_matrix(home_team, away_team)
        p_home = np.sum(np.tril(matrix, -1))
        p_draw = np.sum(np.diag(matrix))
        p_away = np.sum(np.triu(matrix, 1))
        return {
            'home_win': p_home,
            'draw': p_draw,
            'away_win': p_away,
            'fair_odds_home': 1.0 / p_home,
            'fair_odds_draw': 1.0 / p_draw,
            'fair_odds_away': 1.0 / p_away
        }

8. Extensões Contemporâneas e Conclusão

Embora a formulação de Dixon e Coles tenha sido publicada em 1997, ela continua sendo a espinha dorsal de precificação de casas profissionais mundiais. Variações modernas introduzem cópulas contínuas arquimedianas (Frank e Gumbel) ou modelos bivariados de Poisson com choque comum (Karlis e Ntzoufras). Todavia, para precificação pré-jogo de 1X2, Dupla Hipótese, Placar Exato e Linhas de Totais, o ajuste do fator $ au$ permanece incomparável em clareza analítica, precisão empírica e velocidade de execução estocástica.

Perguntas Frequentes

PESQUISA RELACIONADA

Estudos com Referência Cruzada

AVISO 18+ DE RISCO