世界盃足彩怎麼買划算?機器學習AI告訴你答案(含預測)

本文首發於InfoQ公衆號頭條。html

 

 

四年一度的世界盃又來了,做爲沒什麼時間看球的碼農,跟你們同樣,靠買買足彩給本身點看球動力和樂趣,
然而老是買錯球隊,面對各類賠率也不知道怎麼買才划算,足彩是否是碰大運的?如何提升本身的預測水平,成爲預言帝,升職加薪贏取白富美走上人生巔峯?
本文采用機器學習方法,試圖經過特定指標進行訓練,對世界盃剩下的比賽勝負平作預測,並判斷足彩給出的賠率是否值得買,以贏得博弈遊戲的勝利。選取的數據量較少,僅提供一種思路,如下爲個人程序的預測結果:

 

 引言

本文主要寫給跟我同樣對機器學習的實際應用感興趣的,但沒有入門的小白程序員。初步嘗試,拋磚引玉,若有大牛看出計算方法和數據的問題,歡迎指點討論。
 
機器學習的通常步驟: 定義問題、數據預處理、特徵工程、機器學習建模及訓練、模型應用。爲了定義問題,說清楚爲何要解決這個問題,咱們首先須要先學習些基本機率賠率知識。
 
本文基於如下假設:
一、足彩靠服務費賺錢,選擇的場次不存在假球因素
二、你的資金規模足以支撐長期買足彩
 
做爲簡化,不考慮幾場組合串、讓球勝平負、大小球、比分、進球數之類的場景。只考慮勝平負狀況及賠率因素。本文不討論莊家如何經過調整賠率和雙方下注額獲利,只討論下注用戶如何盈利。
 

機率賠率基本知識

咱們用初中數學知識來學習EV知識,並繞過兩個常見的賭場陷阱
1)賠率陷阱
咱們先來看一個拋硬幣的場景,假設正反面出現機率就是50%,你每次須要投入1元,你贏了給你1.8元( 即賠率1.8 ,你獲得0.8元),輸了就失去你的1元,這個遊戲你應該玩嗎?
 
這就要引入EV(指望值)公式了, EV就是事情出現的機率*盈虧的和
即 EV = 盈利*獲勝率+損失*失敗率   ,EV爲正,長期來看你是盈利的,EV爲負,長期看虧損。
 
具體到這個例子 就是  EV = (1.8-1)*0.5 + (- 1*0.5) = - 0.1  ,平均來講,你每輪會虧損 0.1元,因此你不該該玩這個。
 
賭場會有各類賠率陷阱,套用這個公式大致上都能識別出來,賭場就是靠這些賠率陷阱有了微弱的優點來盈利的,例如百家樂賭場優點是1.2%,21點賭場優點最小(0.58%),長期來看都是負EV。即便真有正EV的遊戲,也會由於賭場龐大的資金量和你不對等的小資金量致使你在某次小几率時間裏破產,因此理性看待,這裏只作數學分析。
2)賭徒謬誤陷阱
賭徒謬誤大意是指將先後相互獨立的隨機事件當成有關聯的事件,例如拋硬幣時,不管拋幾回,任意兩次之間都是相互獨立的,並不相互產生影響。道理雖簡單易懂,但有時仍會糊塗。好比,當你連拋了5次正面時,到了第6次,你可能會認爲此次正面出現的機率會更小了(< 1/2),反面出現的機率會更大(> 1/2)。
 
賭場中著名的輸後加倍下注系統(Martingale)即是利用此心態的實例:賭徒第一次下注1元,如輸了則下注2元,再輸則變成4元,如此類推,直到贏出爲止。賭徒誤覺得在連續輸了屢次以後,
勝出的機率會變大,因此願意加倍又加倍地下注,卻不知其實機率是不變的,賭場的遊戲機沒有記憶,不會由於你輸了就給你更多勝出的機會。
 
這時候就要用到1)的EV公式,某次的成功並不改變後果,你的指望值沒有變,怎麼作這種倍數努力都是沒用的。 並且下注都有上限,若是你的資金無窮大且容許你下注無窮大,那麼加倍下注確實能贏。惋惜現實裏作不到,小几率時間會把你弄的傾家蕩產TT。
 
反等價鞅法則、凱利公式感興趣的能夠研究下,這裏再也不展開。咱們只要知道正EV狀況下咱們才應該買足彩就好。
 

足彩賠率推導及返還率推導

 

 
買足彩如何獲利的呢?
根據以前的賠率知識, 當計算出咱們獲勝的勝率,再結合足彩給出的賠率,咱們認爲獲勝時候EV爲正,那麼就能夠下注。而不是說看賠率高就無腦以小博大,那樣仍是在賭博。
 
足彩的賠率又是怎麼計算出來的呢?實際上是根據勝率和返還率倒推的。
 
首先須要瞭解返還率這個指標 。一場比賽 假設  W、D、L各表明主勝、平賠、客勝的賠率,P爲主勝的機率, 假設咱們投入1元,在0EV情況下有:
(W-1) * 1 * P - 1* (1-P) = 0 
W-1 爲盈利, 1爲輸的時候的虧損。那麼 求解方程 P = 1/W  , 同理 平的機率是  1/D , 客勝的機率是  1/L   ,加起來是100%
在沒有干預的狀況下: 返還金額/投注金額 = 1  /(1/W + 1/D + 1/L ) = 100%
 
但是足彩或者博彩公司是要盈利的,那麼他們就會從總投注資金裏抽取一部分, 因而返還金額就<投注金額。  因而就有 1/W*返還率 + 1/D*返還率 + 1/L*返還率  = 1 ,
例如勝場,賭場估計的機率就是   1/W*返還率 。  返還率 也能夠用  1  /(1/W + 1/D + 1/L ) =  1/ ( (W*D+W*L+D*L) /  (W*D*L)) =   (W*D*L) / (W*D+W*L+D*L) 計算,更方便。
 
因而你看到 開出的 勝平負賠率 ,就能夠算出 勝平負的機率和足彩的返還率了 。
例如勝 2.34 平 3.05 負 2.80   ,返還率爲 (W*D*L) / (W*D+W*L+D*L)  = 90%
 
博彩公司對該項比賽的機率估計爲 主隊勝 0.9/2.34 =0.384=38.4%  。  實際預算的時候是先有勝負機率再出賠率的,博彩公司根據各類因素指標,計算出了主隊勝率, 而後主隊的賠率就有了: W = 返還率/勝率 。 平和負的計算方法也是相似。
 
咱們如何獲勝呢?只能假設博彩公司機率估低,給出的賠率高了,這樣套用EV公式  EV = (2.34-1) *P - (1-P) >0 ,  即 P >1/W= 42.735% ,
即 足彩告訴咱們他們計算主場勝率是38.4%,而咱們認爲主隊勝率大於42.735%時候 就能夠下注了 ,這時咱們有微弱的優點,並且自行分析機率後就不容易被誤導 ^^  你們能夠自行推倒二串一 三串一這種是否划算,不過早期好比提早幾天的時候由於局勢不明,是有可能有比較高的賠率。
 

定義問題,特徵選取,數據抓取

 繞了一大圈,其實簡單來講,咱們要作的就是自行計算勝平負的機率,而後套用EV公式看根據賠率投注是否划算。
這個問題抽象下,是一個預測類的問題。 若是想要預測目標變量的值,能夠選擇監督學習算法,不然能夠選擇無監督算法。因此這個問題能夠歸類認爲是機器學習的監督學習,能夠用線性迴歸去解決這類問題。
簡單地講,瀏覽一些數據網站,咱們能夠選定一些特徵和歷史比賽結果樣本,做爲多元一次方程組去求解, 即  aX+bY+cZ = R 。 咱們要作的就是求解參數a、b、c。這種方法在機器學習裏就叫作多變量線性迴歸,有通用的解法。(ps 若是當年早知道,就能夠順利解決appstore排名預測問題了。。。)
 
特徵選取:
根據某數據網站數據,這裏選擇主隊獲勝賠率、主隊平局賠率、主隊負賠率、主隊世界排名、客隊世界排名、主隊近期勝率、客隊近期勝率、主隊信心指數、讓球指數、讓球后主勝賠率、讓球后主平賠率、讓球后主負賠率做爲特徵,結果集爲最終勝平負賽果 ,簡單起見,定爲主勝 值爲1(含平局)、主負值爲0處理。 
 
使用python3+BeautifulSoup 寫爬蟲抓數據示例:
# coding=utf-8
import urllib.parse
import urllib.request import gzip from bs4 import BeautifulSoup class Game: def __str__(self): return '%s,%s,%s,%s,%s,%s,%s,%s,%s' %(self.race,self.turn,self.time,self.host,self.guest,self.rate_w,self.rate_tie,self.rate_lose,self.rate_back) def getHtml(url,values): user_agent='Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36' headers = {'User-Agent':user_agent} data = urllib.parse.urlencode(values) response_result = urllib.request.urlopen(url+'?'+data).read() #壓縮過的數據,通常不須要unzip 視具體網頁決定 html = gzip.decompress(response_result) html = html.decode('gbk') return html #return "" #獲取數據 def requestOdds(index): print('向足彩數據網站請求數據') url = 'http://odds.500.com/#!league=%5B40%2C109%2C352%5D' value= { } result = getHtml(url,value) return result if __name__ == '__main__': print("start parse") text = requestOdds(1) soup = BeautifulSoup(text, 'html.parser') items = soup.find_all('tr', attrs={'': ''}, limit=1000) size = 15 for item in items: #print(item) tds = item.find_all('td') games = [] #只抓世界盃比賽 if len(tds)>=size and tds[1].string=='世界盃': game = Game() game.race = tds[1].string game.turn = tds[2].string game.time = tds[3].string game.host = tds[4].string game.guest = tds[6].string game.rate_w = tds[11].string game.rate_tie = tds[12].string game.rate_lose = tds[13].string game.rate_back= tds[14].string games.append(game)

 

 

模型創建,程序回測,預測勝率

總共44場比賽,咱們使用Logistic迴歸+Sigmoid函數分類方式處理(詳情請閱讀參考文獻《機器學習實戰》),訓練算法爲改進的隨機梯度上升算法:
from numpy import *
def sigmoid(inX):
    return 1.0/(1+exp(-inX))

def stocGradAscent1(dataMatrix, classLabels, numIter=500):
    m,n = shape(dataMatrix)
    weights = ones(n)   #initialize to all ones
    for j in range(numIter):
        dataIndex = list(range(m))
        for i in range(m):
            alpha = 4/(1.0+j+i)+0.0001    #apha decreases with iteration, does not
            randIndex = int(random.uniform(0,len(dataIndex)))#go to 0 because of the constant
            h = sigmoid(sum(dataMatrix[randIndex]*weights))
            error = classLabels[randIndex] - h
            weights = weights + alpha * error * dataMatrix[randIndex]
            del(dataIndex[randIndex])
    return weights

 

選擇訓練集和測試集都爲這44場比賽,這時的錯誤率爲28%,觀察干擾數據:
 

 


足球的迷人地方,包含了韓國對德國這個超大冷門,咱們的程序預測韓國勝率幾乎爲0。。。python

 

用這個模型預測28日及之後的8場比賽, 步長改成更小,到時看看是否能達到72%的勝率:git

時間場次,           主隊勝率 

日 本 VS 波  蘭,0程序員

塞內加 VS 哥倫比,0github

英格蘭 VS 比利時,0.95算法

巴拿馬 VS 突尼斯,0.001app

法 國 VS 阿根廷,0dom

烏拉圭 VS 葡萄牙,0.869032機器學習

俄羅斯 VS 西班牙,0.001函數

克羅地 VS 丹  麥,0.77

   
五、結論及展望
 綜上,咱們看球預測時,須要較精確地估算出一個勝率,而後看足彩給的賠率是否合適,若是 勝率> 1/賠率,則適合下注,是個正EV的遊戲。而不是十分確定地說某某隊會贏,畢竟莊家都不敢這麼預測。如何估算勝率?咱們能夠選擇一些特徵值,進行線性迴歸,肯定特徵值對應的係數,而後預測下場比賽的賽果。
 
另外,必勝策略確定是不存在的,否則莊家也太友好了。。。
本文模型選的特徵值比較少,只依賴數據網站,缺乏不少信息,準確率不高,迴歸係數沒有徹底收斂,也不能評估出勝負外的機率,須要調整參數。本人會繼續改進。 
代碼git地址:https://github.com/sgp2004/world_cup_AI
 
參考文獻
https://zhuanlan.zhihu.com/p/26929562
《機器學習實戰》 
 
課外閱讀:
別賭球了,你只是「莊家必贏公式」的玩偶 https://mp.weixin.qq.com/s/ig06FpzhqE_9dFOtziCxKA

爆冷讓人心慌?如何讓「下注」穩賺不賠?https://mp.weixin.qq.com/s/baftxbdQQKTP-SEutM4uhw

相關文章
相關標籤/搜索