使用赔率数据预测足球比赛结果,进而按预定策略规划投注。
关注彩种为传统足球的胜负彩和任选九。
权威公告可以去 https://www.sporttery.cn/ctzc/ 看在售的是哪期,以及什么时间开奖。
V2EX 上有关于本项目的讨论 https://v2ex.com/t/758563 ,部分评论也比较有价值。
模型使用简单的神经网络,单场预测准确率约 54%,可能是基于赔率进行预测的上限了吧。
使用合适的策略可达到约每三期投一期(不超过 24 元),投十期中一次奖的成绩。
不过结合每期真实的开奖金额来看,从 2017 年起能中的一等奖不超过 500 元,其它奖不超过 300 元,完全无法盈利。
说明类似预测方法早在 2017 年就已经有人在用了,除非有更好的算法能提升单场预测准确率,否则已没有空间。
不过可以改改参数,使得几乎每期都有方案可推荐,然后拿去卖软件/卖服务骗钱。
需要安装 Python 库:
- requests 爬网页
- beautifulsoup4 解析网页
- pandas 做数据处理
- torch 做机器学习
pip3 install -r requirements.txt
另外需要安装 jq 在命令行中处理 JSON,get_award
这个脚本里用到。
此外,项目开始时需要新建如下 3 个文件夹,用来装中间数据:
mkdir html csv pred
之后先 python3 get_html.py
爬网页(手动改下文件里面的 periods,把新的几期也加进来),再 python3 get_csv.py
解析数据,之后就跟下面“日常使用”接轨了。
日常流程如下:
- 爬上一期数据(更新赛果)和这一期数据(获取赔率)
- 预测这一期赛果
- 规划投注并输出
例如在预测第 21021 期时,使用如下命令:
./run 21020 21021
首先从 500.com 上爬取网页。
例如如下命令爬 21017 和 21018 期数据,如果不带参数,就爬所有历史数据(很慢)。
python3 get_html.py 21017 21018
下载的网页在 html/21017-{id}.html
,id 是该期 14 场比赛之一的 id,其中包含该比赛的时间、所属赛事、主客队名字与得分(如果没有开始或者取消了等异常,得分位置是 VS)。
因为这部分形成的 html 文件比较大,不定时期进行压缩归档。以该压缩包中最后一期命名:
tar czvf zip/{period}.tar.gz html/*
解析 21017 期比赛数据到 csv/21017.csv
,赔率数据到 csv/21017-{id}.csv
python3 get_csv.py 21017
如果不带参数,就处理所有 html 文件(很慢)。 csv 文件中异常比分是 -1:-1,赔率包括初赔和终赔。
将主流公司的赔率数据与比赛数据汇总到 csv/total.csv
python3 get_total.py
预测 csv/total.csv
中最后 1001 期赛事的比分,保存到 pred/scores.csv
。并根据预测规划最后一期的投注,保存到 pred/{period}.csv
,同时检查前一期的得奖情况。
python3 main.py
之后的预测思路换成了先预测赛果(三分类)再下注的方式,而非预测比分。
两者各有好处:
- 预测比分。根据预测比分进行赛果的三分类准确率更高(约 0.5%),但难以进行投注的规划
- 预测赛果。三分类的同时也得到各赛果的估计概率,以此指导的投注规划更简单,表现也更好。
预测 csv/total.csv
中最后 1001 期赛事的结果,保存到 pred/results.csv
。
python3 predict_result.py
根据预定义的几个策略进行投注,以测试策略与策略组合的表现以及参数的效果。
目前包含三个策略,按统计效果顺序为:
- 胜负彩复投。不断扩充进概率最高的组合,直到满足概率下限或达到投注上限
- 任选九方案1:计算概率最高的 k 个组合(为了方便投注,k=5)
- 这个方案近似于在最确定(std 最高)的 10 场比赛中,前 5 固定,后 5 轮流不选
- 任选九方案2:将概率按 std 排序,最高的九场比赛按类似 1 的方案复式投注
各策略都可通过调整参数在一定程度上控制收益率与参与度。目前的参数设置为大概每三期去一期的水平。
python3 simulate.py
配置好策略参数后,根据预测的结果规划投注,并按便于投注的格式打印
python3 bet.py
用体彩中心的 API 获取开奖数据。
使用需要编辑该文件改参数。