靠AI致富?用keras预测NBA比赛赚钱,回报率136%.

作者| Caleb Cheng
译者| Deephub翻译组
来源| DeepHub
赌棍和赌徒没什么共同点。——人可以把他们的关系描述成一场竞争,决斗,战争。但在梦里,他们为同一个幻想而流口水:一个完美的预测模型,可以准确预测未来游戏的结果。通过深入研究,这可能是可能的或者至少比以前的数据科学技术更容易。
基本的假设是,NBA市场是无效率的(价格或投注线不能反映所有可获得的信息),它可能比大多数市场的效率都低,因为死忠球迷倾向于只赌自己喜欢的球队。如果你能赌市场的无效率,你就能赚钱。我们识别低效率的方法之一是通过数据分析。
虽然许多尝试这种挑战的模型是准确的,但大多数模型远没有盈利。原因很简单:庄家也很准。即使你能做到庄家的精准,也会因为5%的投注费而失败。
https://www . football-data . co . uk/blog/NBA _ pinnacle _ efficiency . PHP
图表是365网的预测线和实际胜率。一个成功的模型必须能够通过完美的回归分析预测庄家的小波动。
我的模型是用Python和Tensorflow搭建的,分析了过去的11个NBA赛季,在很多方面和其他深度学习模型相似(经常尝试后者来解决这个问题)。但是在我们的模型中有一个关键的区别:3354。它使用自定义损失函数来消除与博彩公司的相关性。我们选择了博彩公司错误预测胜率的游戏。
去相关损耗公式-很重要!
源代码
模型结构
我用nba_api Python库抢到了比分记录。数据存储在MongoDB集合中。在过去的11个赛季中,每个球员每场比赛总共存储了42项统计数据,从罚球命中率到防守得分再到抢断次数。Bet数据从betexplorer收集。找到高质量的投注线比训练模特要难得多。你可以向斯洛文尼亚Lubjana大学的Trum Bell教授寻求帮助。
对于每场比赛,样本是用每个球员在赛季初最后8场比赛的平均值来计算的。根据平均比赛时间选出前8名选手。
模型
预处理
import OS import numpy as NP from tqdm import tqdm from py mongo import mongo client bookies={ \ ‘ 44 \ ‘ : \ ‘ Betfair \ ‘,\’16\’:\’bet365\ ‘,\’18\ ‘:\’Pinnacle\ ‘,\ ‘ 5 \ ‘ 3: \ ‘ Unibet \ ‘ } client=mongo client db=client . NBA games=db . games seasons=[f \ ‘ 002 { str(I)。zfill(2)}\ ‘ for i in range(8,20)] #将样本加载到内存x,y=,def normalize _ sample(nparr): for feature in range(nparr . shape[-1]): #对features f=NP . nan _ to _ num(nparr[:feature]) nparr[:3360,feature]=(f-f.min)/(f.max-fnpy \ ‘ in filename : GAME=list(games . find({ \ ‘ GAME _ ID \ ‘ : filename . strip(\ ‘。npy\ ‘),\ ‘ bet 365 \ ‘ : { \ ‘ $ exists \ ‘ : \ ‘ True \ ‘ } })如果不是game : continue game=game[0]closing _ odds=1/float(game[\ ‘ bet 365 \ ‘]。拆分[1]。split(\ ‘ v \ ‘)[0])HOME _ win=int(game[\ ‘ HOME \ ‘]==game[\ ‘ WINNER \ ‘])sample=NP . load(f \ ‘ samples/{ season }/{ filename } \ ‘)x . append((normalize _ sample(sample),closing _ odds))y . append(HOME _ win)x=NP . array(x)y=NP . array(y)import random print(x . shape,y . shape)diff=Len(y)//2-NP . count _非零
从keras导入后端作为K从keras.models导入模型从keras.models导入顺序从keras.layers导入输入,Dense,Dropout,Conv2D,Flatten,Activation,concatenate从keras.optimizers导入Adamc=0.6 def de correlation _ loss(neuron): def loss(y _ actual,y _ predicted): return K . mean(K . square(y _ actual-y _ predicted)-c * K . square(y _ predicted-neuron))return loss #拆分两个输入流box_scores_train,shape print(shape)box _ Model . add(Conv2D(filters=32,kernel_size=(1,8),input_shape=shape,data_format=\’channels_first\ ‘,activation=\ ‘ relu \ ‘)box _ Model . add(Flatten)box _ Input=Input(shape=shape)box _ encoded=box _ Model(box _ Input)odds _ Input=Input(shape=(1,),dtype=\’float32\ ‘) #(开盘或收盘权重)merged=concatenate([odds_input,box validation _ data=([box _ scores _ test,odds _ test],y _ test),verbose=1,epochs=20)这个模型是Conv2D和dense层的结合,有大量的脱落。 该模型的独特部分是去相关损失函数,这在我的第一篇论文中提到过。虽然Keras本身并不支持带有神经元值的损失函数,但是将函数包装在函数中是一个很有用的解决方案。我在GTX 1660Ti上训练了20代网络,直到网络收敛。
结果
使用一个非常原始的赌博策略,即10%的余额*模型置信度,只在模型置信度大于0.6的游戏上赌博,我们有一个上升的余额趋势。有趣的是,这种模式只投注了10%左右的游戏。除去整个2017-18赛季的惨败,我们的模式表现非常好,从最初的100美元投资到现在的136美元投资,峰值292美元。
展望和未来
这只是这个模式的开始。有了令人鼓舞的结果,我想制定一个更有活力的投注策略。
唯一有用的可能性是下注码和模型。
利用NoSQL是个错误。我应该坚持使用SQLite,但是学习一项新技术也是很好的。编写自定义损失函数是非常宝贵的经验,在以后的深入学习项目中会派上用场。
代码:3359github.com/calebcheng00/NBA _预测/blob/master/nba.ipynb
没想到Python可以做到50发的特效。
歌词下岗系列:教你用AI做一个歌词写作软件!
AI修复了100年前的晚清图像,这两个算法功不可没。
阿里云自研数据仓库AnalyticDB再夺TPC全球冠军
调查了17000多名程序员,云原生开发现状如何?CSW:惊人的骗局还是比特币“图腾”中本聪?
从0到70%:铬露出来了!

其他教程

《科学》:科学家破解“声音”缓解疼痛的原因

2022-8-28 19:13:10

其他教程

“刚离婚就后悔了。”民政局门口女子失声痛哭,男子撑伞相拥,让人落泪。

2022-8-28 19:15:12

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索