用Python预测足球(一):逻辑斯蒂克模型前篇

admin 体育热点 2024-02-08 155 0

  很久以前(大概是四年前)便计划写这系列文章,无奈人太懒(不过确实已经写了一部分,发表在某足球网站)。写这系列文章的动机来源于四五年前看到的一篇果壳网讲足球博彩的文章,这篇文章亦刊载于《体育画报》。果壳网的文章想要告诉玩家们,博彩公司无往不利。事实上,果壳网的结论在某种程度上来说是正确的,但是其方法和过程是完完全全的错误。其错误在于,果壳网认为博彩公司预测的是投注比例,而不是比赛胜负,这完全是扯谈。

  事实上,博彩市场充斥着两种类型的玩家,一种可以称为技术派玩家,技术派玩家通过分析历史信息预测比赛,一种是凑热闹偶尔买几元的玩家,几乎不依靠历史信息预测比赛,纯靠瞎猜(笔者本是这类人)。这两类玩家搞在一起,无论如何,都会使赔率偏离比赛真实的胜负概率。再者无论如何,预测玩家们的烧钱方向,根本是不靠谱的事情,先不说预测玩家行为的困难程度(这尼玛能预测成功,博彩公司不如转行炒期货),玩家预测比赛的能力真心比不上擅长统计建模的人,擅长统计建模的人可以建模分析几千乃至上万场(例如近十个赛季的英超)比赛用于确定比赛的走向,业余玩家们更多的是靠所谓的经验和直觉,很明显,如果按照果壳网的文章所说,博彩公司不经过精密的模型确定赔率,而只是依据玩家们分析比赛的信息来确定赔率值,毫无疑问是死路一条,只会让充分利用历史信息准确预测比赛的技术派玩家赚个盆满钵满。

  写到这里,我决定举个通俗易懂的例子来更好的解释我上面这段话。假设博彩公司对投掷硬币开盘,之前的几千次投掷硬币表明,硬币正面朝上和反面朝上次数各占50%,好吧,正好有群傻子参与投注,傻子们啥也不懂,就喜欢按个人喜好胡乱压正面反面,博彩公司准确“预测”到傻子们每次的正反面投注比例,60%对40%,假设博彩公司返还率90%,则确保博彩公司“万无一失”的赔率开出来了,正面1赔1.5(90%/60%),反面1赔2.25(90%/40%),傻子们来吧,请君入瓮。这时一个大脑正常且从不买彩票的富二代路过博彩公司,看见这神一样的赔率设置,心想,尼玛我买100次反面,至少50次中奖吧,我靠,每次投注额一样的情况下,25%的净收益率啊,博彩公司哭了。

  呵呵,细心的读者应该发现了,只要博彩公司设置的投掷硬币盘口中,有一方(无论正面反面)的概率低于45%(预示着赔率值大于90%/45%),对于玩家们来说,一本万利毫不困难。所以博彩公司耐以生存的法则,只能是开出包含历史信息的赔率值,例如博彩公司通过分析几千次投掷硬币的结果,开出了50%概率的盘口,当博彩公司的盘口包含了所有的历史信息,我们则认为当前博彩市场是弱势有效的,即此时此刻,任何技术分析都是无效的,你在怎么分析投掷硬币的历史数据,也只能得出正反面出现的概率为50%这个结果,而这个结果已经反应到了博彩公司的赔率值上。当博彩公司开出了不完全包含历史信息的盘口,风险随之而来,玩家们存在盈利的可能性,不过也只是可能性而已(博彩公司不是傻子,他们会抽水的)。

  所以,博彩公司开出的赔率之所以贴合比赛结果(大数定律的角度),盖是因为其有强大的历史数据库和统计模型。

  再所以,你想通过玩足球彩票发家致富,一是你拥有预测足球比赛的统计模型,二是祈祷博彩公司的赔率是弱势无效(即赔率值并不包含所有的历史信息),三是祈祷博彩公司大发善心少抽点水。最重要的其实是第三个条件,根据相关研究,博彩公司的赔率某种程度上还真是弱势无效的!譬如上面投掷硬币的例子,假设博彩公司开出盘口依据的硬币正面显示的概率是47%,毫无疑问,这个盘口并没有反应所有的历史信息,玩家们却依然无利可图,因为90%/47%小于2,90%的赔付率让玩家们无处下手。

  写到这,笔者估计有些人可能会叫嚷,为什么博彩公司的初盘没有终盘的预测准确度高(这个笔者不确定,没有研究过)。我只能说,存在两种情况,一是变盘期间有新的信息产生(例如某位核心球员受伤),博彩公司根据信息调整赔率,二是知情人(既可以是知晓内幕的人,也可以是擅长预测的人)参与投注,博彩公司依据投注比例规避风险调整赔率值,间接纳入了知情人的信息,提高了赔率对比赛的预测精度。

  总之,博彩公司的赔率主要由两部分信息组成,博彩公司自己分析历史数据而得到的信息,以及玩家们提供的信息(这种信息可能是知情人信息,也可能不是)。而博彩公司的初盘几乎就是由历史信息决定的(我琢磨“几乎”两字可以去掉,但不是业内人士,所以……)。

  絮絮叨叨了这么多内容,我只想表明一个观点,足球比赛的预测是很重要且很有用的事情。了解足球比赛预测方法或内容有助于你:

  A. 确定足球博彩市场是弱势有效还是弱势无效(即赔率值是否反应了所有历史信息)

  B. 如果是弱势有效,表明所有技术分析都是扯淡(信专家分析不如随机选择)大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!

  C. 如果是弱势有效,玩中国足彩的玩家们可以只参考外国赔率值的信息了(什么张路足彩推荐、徐阳足彩推荐滚蛋去)

  D. 陶冶情操

  足球预测模型从普通最小二乘(线性回归)到广义线性模型(probit或logistic或poisson回归),到动态模型(广义状态空间模型),再到机器学习算法(支持向量机、神经网络),无论博彩公司再牛逼,运用也就是这些模型,别把博彩公司想的太神秘,也别把预测想的太复杂。

  笔者这个系列的整体架构如下

  第1部分:逻辑斯迪克模型。主要介绍logistic模型和ordered logistic模型,ordered logistic可以用来预测足球的胜负平概率。

  第2部分:泊松模型。主要介绍最基础的poisson模型,poisson模型可以预测足球比赛的进球数的概率,从而依据进球数预测胜负平的概率。

  第3部分:零膨胀泊松模型及联立泊松模型。由于足球比赛中存在大量的某一方0进球比赛(比如英超17-18赛季的水晶宫,截止10月8日一球未进),传统的泊松模型可能误差较大,所以我们需要零膨胀泊松模型。更近一步,我们认为主队进球和客队进球并不是相互独立,这时我们需要联立泊松模型,而EM算法可以很好的估计联立泊松模型。

  第4部分:状态空间模型和时间序列。足球比赛本质上是一个离散时间序列,我们可以在逻辑斯迪克模型或泊松模型上添加马尔科夫过程,通过卡尔曼滤波或mcmc估计进化方差。

  第5部分:岭回归,lasso和弹性网。我们可以为我们的模型添加很多特征变量,例如是否参加欧冠,是否夺冠关键战,当特征变量太多的时候我们会需要进行特征选择,岭回归,lasso和弹性网是我们的好帮手,如何开发快速的坐标下降算法,是个挑战。

  第6部分:支持向量机。终于来到机器学习的世界,支持向量机特别擅长处理小样本高维空间的特征选择,对于足球比赛这种变量狂多样本又较少的预测,效果卓越。

  第7部分:神经网络。笔者不确定神经网络的效果好于glm和svm,反正看着办吧。

  现在我们进入正题。

  logistic模型大概是使用最频繁的二分类模型。对于体育比赛来说,logistic模型又可以称之为TBL(bradley-terry-lucy)模型(某种程度上),该因为BTL的形式为 \frac{1}{1+e^{-(\beta_i - \beta_j)}} ,其中参数 \beta 可以看做为体育比赛对正双方的实力。对于了解在线游戏配对系统的人来说,BTL和elo rating很像,那是因为elo rating用的对数底是10,而BTL是自然对数,BTL更多的是用来进行参数估计。

  既然BTL模型只是特殊的logistic模型,我们可以用普通logistic进行求解,只需要稍微改下输入数据的形式。我们先看看如何求解logistic模型。

  上面的代码是最基础的logistic模型,其中z函数中threshold是阈值,x是数据,b是权重,logistic函数中的z_val是z函数的值。

  逻辑斯迪克模型的参数估计大致有三种,极大似然估计,MCMC估计和迭代加权最小二乘估计。迭代加权最小二乘估计(irls)是目前最稳健也是相对较快,实现起来也很简单的算法。想了解迭代加权最小二乘估计,可以查看维基百科Iteratively reweighted least squares。对于logistic模型来说,irls的误差为 \frac{y - p}{p(1-p)} ,权重为 p(1-p) ,其中 y 是响应变量, p 是logistic函数值。irls的代码如下

  logistic模型的测试代码如下

  BTL模型虽然是使用最广泛的体育比赛统计模型,但其只能处理二分类问题,也即是只有胜负的体育比赛,例如NBA,网球,围棋等,而足球比赛存在平局,所以BTL模型并不适用于足球赛事。有人可能会想到用多分类的logistic模型处理足球赛事,但是足球比赛的胜平负是有顺序关系的,胜的等级明显高于平,而平又高于负,多分类模型不适用这种等级变量。所幸,有专门的logistic模型处理等级变量,那就是ordered logistic模型。大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!

  ordered logistic模型又可以称之为proportional odds模型(统计学很多名词其实表达的意思一样),是专门处理等级数据的logistic模型。其数学形式为 P_k(\theta) = P^{*}_{k-1}(\theta) - P^{*}_k(\theta) ,而 P^{*}_k(\theta) 是logistic模型。想详细了解ordered logistic,请看维基百科Ordered logit

  对于ordered logistic模型,直接用胜负平这种数据是不合适的,我们需要转换数据大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!

  例如

  转换为

  所以本质上,我们还是将等级数据转换成了二分类问题

  由于之前用的是irls算法,我们这次对ordered logistic用拟牛顿(BFGS)和牛顿迭代进行参数估计。基础代码如下

  拟牛顿迭代(BFGS)算法

  相比牛顿迭代,BFGS算法的优势是不用求解复杂的黑塞矩阵,劣势是迭代次数较多,必须要进行步长的一维搜索,如果不用scipy写好的C代码进行步长一维搜索,那速度还真是比牛顿迭代慢不少。想了解BFGS算法,还是请看维基百科Broyden-Fletcher-Goldfarb-Shanno algorithm

  实现BFGS算法,我们首先创建一维搜索所需的对数似然函数(我们的一维搜索采取暴力搜索方法,考虑到python的龟速for循环,用基于numpy广播机制的暴力搜索不一定慢),我们的步长设定是0.001到0.1,每一步递增0.001。所以对数似然函数和暴力搜索函数如下

  BFGS虽然不需要求解二阶导数了,一阶雅克比矩阵还是需要的。雅克比矩阵如下

  接下来便是构造模拟黑塞矩阵,并且求解参数啦

  以上代码中,像y代表响应变量,x代表自变量,b代表权重或斜率,thresholds代表阈值,都是通用表示方法。测试代码如下

  牛顿迭代

  纯python代码的BFGS算法实在太慢,我们再来编写能快速收敛的牛顿迭代算法。牛顿迭代需要求解黑塞矩阵。黑塞矩阵代码如下

  看到这密密麻麻的代码,笔者也是头疼,但是黑塞矩阵就是这么复杂,接下来我们呈现步长横为1的牛顿迭代代码,实际上,根据研究,不计算步长的牛顿迭代不保证100%收敛全局最大值,但是实际应用效果还不错。代码如下

  测试代码方面,只需要把BFGS测试代码的最后一行换成

  我们的快速ordered logistic参数估代码大功告成

  然后我们便能对足球比赛进行最简单的预测,logistic后篇将会实战讲解,数据处理,参数化处理(奇异矩阵问题,把某个参数设定为0或其他参数之和),然后预测单场比赛胜负平概率,和基于蒙特卡洛模拟的赛季夺冠胜负平概率。

用Python预测足球(一):逻辑斯蒂克模型前篇

用Python预测足球(一):逻辑斯蒂克模型前篇

评论