2016年10月25日 星期二

得寸進尺 從獨贏到連贏

完成計算獨贏機率的model,很自然要面對一個問題:即使計算相對準確、長線有利,但實際操作時只會下注有edge的馬匹,而非必然是機會率最大的馬匹,故勝出率不會很高,更難免會出現一個又一個擦身而過的遺憾。

真係“好o既唔靈醜o既靈”,周日一戰,四隻重注馬,“華美之友”、“嫡愛寶”、“華恩庭”和“東方快車”,三隻跑第二,一隻跑第四,如非中隻“宅大大”,獨贏投注差點就顆粒無收,掃興、冇癮。

意外的是試驗中的連贏投注表現很好,起到了失之東隅、收之桑榆的效果,不但“華美之友”、“華恩庭”、“宅大大”和“東方快車”這幾場都是正回報,(下圖為“期惑”搭“東方快車”)



連頭場獨贏投注沒有edge的“四平八穩”搭“彩球”,居然也是正回報:



構思連贏投注系統的出發點很簡單,如果計算出來的獨贏有edge,包含了獨贏機率的連贏也應該有edge,只需要思考的是,怎樣才能保證由獨贏機率推算連贏機率時不會過度偏差。

在“名次的煩惱”一文,池某曾質疑過由獨贏機會率推算位置機會率的可行性,有的馬陣上表現非贏即大敗,有的馬是place王唔識贏,獨贏與位置雖然有關係,卻非劃一的比例關係,因此池某想過不如另闢蹊徑獨立地計算位置的機會率,不過,一試之下,發覺這種想法很難成功,最大的問題,是無法保證計算結果的row sum等於1,特別是一面倒的大熱門,很容易得出位置機會率大於1的荒謬結果。

此路不通就惟有參考別人的做法了,若以可行為前提,方便為標準,最方便的可行之法還是Harville formula。Harville formula是利用條件機率(conditional probability)的計算方法,把B馬跑第二的機會率,變成當A馬不在時B馬跑第一的機會率,A馬跑第一而同時B馬跑第二的機會率就是:
p(A)*p(B)/(1-p(A))
同理,B馬跑第一而同時A馬跑第二的機會率就是:
p(B)*p(A)/(1-p(B))
於是,A馬和B馬構成的連贏機率就是:
p(A)*p(B)/(1-p(A))+ p(B)*p(A)/(1-p(B))

這裡說的方便,不僅是對了解這條公式的人而言,不了解的,同樣很方便就能使用其計算結果,外國有些網站提供online的odds calculator,只需輸入一場馬獨贏的機會率,立即就能計出每匹跑每個名次的機會率,所使用的就是Harville formula,即使不明白其背後原理,使用起來亦全無難度。

針冇兩頭利,選擇了簡單方便,就要放棄另一個重要選項──準確度。前文已經說過,Harville formula的偏差頗大,特別是在冷熱門賠率懸殊的場合。要消除偏差,又要參考別人的做法了。原來早在上世紀八九十年代,就有人指出了Harville formula的偏差,並提出修正之法。先是有Henery和Stern兩人,指出第二名、第三名的機率與頭馬機率分別存在大約0.8和0.65的比例關係,繼而有Lo和 Bacon-Shone,公開了一條修正公式:p^c/Σp^c

公式裡的c是一個常數,計算第二名的c剛好就是0.8,計算第三名的c是0.65。

舉例,一場馬四匹馬上陣,A、B、C、D四匹馬的取勝機率為0.4、0.3、0.2、0.1,用Harville formula計算A搭B的連贏機率為:
0.4*0.3/(1-0.4)+0.3*0.4/(1-0.3)=0.3714

修正版則要先調整四匹馬的機率,
p(A)=0.4^0.8/(0.4^0.8+0.3^0.8+0.2^0.8+0.1^0.8)=0.3706
p(B)=0.3^0.8/(0.4^0.8+0.3^0.8+0.2^0.8+0.1^0.8)=0.2944

再用新的數字代入Harville formula,A搭B的連贏機率變為:
0.4*0.2944/(1-0.3706)+0.3*0.3706/(1-0.2944)=0.345

這條修正公式和《計得精彩》書裡提到的Benter Correction基本上是一樣的,不同的只是William Benter用來計算第二名的c是0.81而非0.8,計算第三名的c則同樣是0.65。修正公式的最大問題也正是在這裡,c並非一成不變的常數,用不同的data在不同的時段計算出來的c是不一樣的,這會否造成新的偏差、新的偏差有多大,又成了新的問題。

不過,話說回來,不管選用什麼版本,只要是選擇了以獨贏機率推算位置機率的做法,最重要的,還是首先要確保獨贏機率計算的準確,我們不可能幻想錯誤的獨贏機率加一個錯誤的連贏計算方法會有“負負得正”的效果,也不可能幻想一個沒有偏差的連贏計算方法建基於錯誤的獨贏機率而能取得成功。

池某知道Michael兄和Peter Pan兄平時都是主攻連贏,歡迎分享心得。

2016年10月18日 星期二

小製作 大工程

經過近四個星期日以繼夜的努力,新的賭馬model總算成形。這次更新model有兩大目的:一是希望增加model的穩定性;二是希望理順從資料採集到下注的整個流程,使整體操作更自動化、更省時、方便,且更準確。雖然還未經實戰考驗,初步看來這兩個目標還是可以達到。

所謂增加model的穩定性,就是要防止model因某方面data不足而失算時會出現過大的損失,具體解決之道還是一個“借”字,即“借”外力去彌補incomplete data所造成的偏差,但如何“補”得恰如其分而又不會喧賓奪主,則很考功夫。

前文已經說明,在expected value相若的情況下,最大損失越小的賭局,越能放心以大大注獲利。故能有效排除model出現極端損失的可能性是一個很大的進步。

從資料採集,到把data在各module間搬來搬去,再到最後結合實時賠率計算注碼下注,在操作層面看,人手輸入或手動操作的次數越少,出錯的機會就越少,要做到這一點,就要靠有效的programming來維繫。這方面,新的操作介面亦已大大改善。

其中一個改變,是把即時賠率的擷取,從馬會網頁的HTML版改為XML版。使用XML不僅run得快一些、順一些,更重要的是XML版不僅顯示賠率,還顯示具體的派彩,不像HTML版無論10.00倍還是10.95倍都一律以10倍表示就算。更detail的預計派彩,可以確保注碼分配的計算更精準。而且,使用XML版還有另外一個好處...,賣個關子,下次再說。


回過頭去看,其實這次改動並算不上什麼大製作,如果一路順利沒有阻滯,最多不過四、五天的工作量。這樣的小製作卻搞成了為期近一個月的大工程,實在太不應該。

小題變成大做,主要原因還是自己的知識根底不夠堅實,對不同的distribution認識不充分,對maximum likelihood等概念亦頗為模糊。缺乏清晰的認知,每每走到十字路口就躊躇不定,最後憑直覺、貪方便變成了抉擇的標準。碰巧錯誤的方法撞中一個正確的結果,問題更加嚴重,加深了積非成是的印象,更對正確的方法產生排斥,寧願一直在錯誤中打轉。

另一個原因就是programming技巧的不足。受阻於programming能力而停滯不前時,首先想到的不是攻堅克難,而是左閃右避,迂迴前進,甚至在具體做法上偷工減料,結果是令原本正確的方法扭曲變形,越錯越遠。

總結教訓:當務之急,需認真刨下書,重新掌握返STA101,同時要練習下programming,打返好個底。

2016年10月4日 星期二

懶惰心 辛苦命

十多年前池某在寺廟靜修,看過的佛門故事中,要數這個印象最深刻:

老和尚出外遠行,小和尚幫他拎行李。走了一段路,小和尚說,行李很重,想休息一會兒。老和尚說,我去找個人來幫你一把。接著,老和尚轉向一戶人家,張口就是一輪粗言穢語,然後快閃。那戶人家暴怒,抄起一根棍子追打出來,嚇得小和尚也跟著老和尚快跑,跑了很遠路程才停下來。老和尚問小和尚,行李還重嗎?小和尚說,奇怪,剛才跑的時候一點都不覺得重。



池某是典型的小和尚性格,懶得就懶,責任在身時,總是嫌三嫌四,諸多藉口,故對這個故事特別有感覺,也不時用來提醒自己,該做的事,若懶得動手,就要設法把自己推到一個不能停下來、也不能回頭的位置,這樣就能心無二念,專心一意向前行,再苦、再重的工作,都不以為苦、不以為重了。

搬來blogspot落腳之後,在過去一年多的時間,池某盡可能保持每星期至少更新一篇文章,到上周終於無以為繼,恐怕短期內亦難復舊觀,原因是,為了重整賭馬model,池某最近一直閉關埋頭苦幹,日以繼夜,做完又改,改完重做,加完又刪,刪完再加,像是沒有個了期。

重整model並非舊的不能用,而是有些新的想法,希望驗證一下。但要驗證一念的對錯,工作量是巨大的,牽一髮而動全身,由database一格一格重新執過,到逐個module改program、debug、測試,沒完沒了,而最後結果還可能是無用功,白做收場。

一想到工程艱巨,付出大而收穫沒有保證,馬上又小和尚心態作祟,總希望免得就免,推得就推,拖得就拖,潛意識裡還想偷偷向三種人學習,輕輕鬆鬆過日子:第一種,說了就當做了;第二種,幻想了就當成功了;第三種,盲信了就當無往而不利了。

但想深一層,市場上的輸家,不正是這三種人嗎?不想與這三種人為伍,唯一出路,就是拋棄懶惰心,擁抱辛苦命。把心一橫,將舊model弄死,令自己兩頭唔到岸,恢復舊model和重設新model工作量一樣大,這樣,選擇就只剩下一個,不需要心大心細了。