泊松分布预测足球进球是否有效?
结论先说
主流结论:泊松分布对足球进球预测是"有效但粗糙"的基线模型。

- ✅ 能抓住"进球是稀有独立事件"的核心特征
- ✅ 简单、可解释、可扩展到双变量/动态模型
- ❌ 忽略球队实力、状态、伤病、主场、战术等
- ❌ 低估平局、高估大比分、对弱队/强队尾部拟合差
实际博彩与研究里,纯泊松是起点,不是终点,常见改进:Dixon-Coles、双变量泊松、贝叶斯层级泊松、负二项、ElO+泊松混合。
Python 最小可运行案例
用 scipy 做一次"曼联 vs 利物浦"的进球预测。
import numpy as np
import pandas as pd
from scipy.stats import poisson
# 假设用历史数据估计出的场均预期进球
lam_home = 1.6 # 主队曼联
lam_away = 1.2 # 客队利物浦
max_goals = 6
home_probs = [poisson.pmf(i, lam_home) for i in range(max_goals+1)]
away_probs = [poisson.pmf(i, lam_away) for i in range(max_goals+1)]
# 比分矩阵
score_matrix = np.outer(home_probs, away_probs)
df = pd.DataFrame(score_matrix,
index=[f"H{i}" for i in range(max_goals+1)],
columns=[f"A{i}" for i in range(max_goals+1)])
print(df.round(4))
# 各类结果概率
home_win = np.tril(score_matrix, -1).sum()
draw = np.trace(score_matrix)
away_win = np.triu(score_matrix, 1).sum()
print(f"\n主胜={home_win:.3f} 平={draw:.3f} 客胜={away_win:.3f}")
print(f"总进球>2.5的概率={sum(poisson.pmf(i, lam_home+lam_away) for i in range(3,15)):.3f}")
输出大致:
主胜≈0.49 平≈0.24 客胜≈0.27
大2.5球≈0.48
如何验证"是否有效"——回测框架
光算概率不算数,要用历史数据回测对比:
| 指标 | 含义 | 好的泊松模型应满足 |
|---|---|---|
| Log-Loss | 概率预测损失 | 越小越好 |
| Brier Score | 预测概率误差 | < 0.20 左右算可用 |
| 校准曲线 | 预测概率 vs 实际频率 | 接近对角线 |
| ROI | 对博彩赔率的收益 | > 0 才叫"真有效" |
| KS/χ² 拟合检验 | 进球分布拟合 | p > 0.05 不拒绝 |
from sklearn.metrics import log_loss, brier_score_loss
# y_true: 实际结果 (0=主,1=平,2=客), y_prob: 模型概率矩阵 Nx3
ll = log_loss(y_true, y_prob)
print("Log-Loss =", ll)
单变量泊松的常见失效点
- 进球不独立:一场大胜后对手更保守,实际有轻微负相关 → 用 Dixon-Coles 修正:
def tau(x, y, lam, mu, rho): if x==0 and y==0: return 1 - lam*mu*rho if x==0 and y==1: return 1 + lam*rho if x==1 and y==0: return 1 + mu*rho if x==1 and y==1: return 1 - rho return 1.0 - 方差 ≈ 均值假设太强:实际进球常"过度离散" → 用 负二项回归
- 时间静态:球队状态变化 → 动态泊松 / 指数加权
- 忽略协变量:用
statsmodels或pymc做 Poisson GLM:import statsmodels.api as sm model = sm.GLM(y, X, family=sm.families.Poisson()).fit()
经验结论(业界实证)
- 纯泊松对 1X2 三分类 Log-Loss 约 1.00–1.05,Dixon-Coles 可降到 96–0.99
- 对 大小球 2.5 校准良好(AUC ~0.62–0.66)
- 对 正确比分 命中率约 12–15%(看似低,但已是随机基线数倍)
- 结合 Elo 或 xG 数据可显著提升
一句话:泊松是有效的起点模型,但读博彩市场利润,需要 Dixon-Coles + 贝叶斯/机器学习混合。
推荐下一步
pip install statsmodels pymc arviz scikit-learn
- 想看 完整回测:用 football-data.co.uk 免费英超CSV
- 想看 贝叶斯版:
pymc里写 hierarchy:goals ~ Poisson(exp(attack_i - defense_j + home)) - 想看 Dixon-Coles:GitHub 搜
dixon-coles python,有现成实现
需要我直接给一份用真实英超数据端到端回测的完整代码吗?