2018年2月5日 星期一

Runtime Error

在正常情況下,當程式代碼運行的時候,會完全不受影響地運行直至終止執行。但如果電腦程式的運作時期出現問題,此為-Runtime Error。 有時候內存數據損壞/程式間的衝突會導致這樣的錯誤。前文提到賭人在建立賭馬模型並實際使用的初期,發現不少錯誤。就是那種情況。記得賭人第一次接觸賭馬/波時亂買都係輸錢,但正因為這挫敗感令賭人有動力去繼續研究,屢敗屢戰!

如果導致錯誤的原因是軟件問題, 程式員需要一行一行地審視程式代碼,試圖尋找軟件中的runtime error。所以軟件/程式調試對程式設計非常重要,調試時間/資源投放越大,出現問題的機會越底。

本文記錄賭人5 個主要的runtime error以警惕自己,同時希望其他人不要重覆賭人的敗路。


  1. 用作計算機率的數據出錯:誤把馬匹的總獎金當作今季獎金計算
  2. Excel function 錯誤
  3. 程式錯誤量化資料計算
  4. 自動化程式出錯
  5. 未能及時更新計算數據
雖然知道部份問題所在並作出相應的改善,新模型不見得有利潤空間。下圖為賭人以今年新建立的賽馬模型對最近6個賽馬日進行測試的結果。


上述的運行錯誤只令計算每駒機率時出現錯誤,最令賭人憂慮的卻是另一個錯誤-致命錯誤(Fatal Error) 

下回再談。

2018年1月9日 星期二

2018 -退

Gambler's prayer: Dear Lord, please let me break even, because i could really use the money.

但可借的是賭人在過去一年不但沒有做到break even, 並錄得嚴重虧損。最令人痛心的是花了不少時間和精神「揼」出來的賽馬模型實際成效跟預期有很大落差,成為過去一年賭人失利的重要因素。既然過去一年的努力換來如此成果,賭人不得不承認失敗。其實失敗並不可怕,可怕的是人們拒絕承認自己的錯誤,一錯再錯。

因為令賭徒拒絕承認錯誤的理由和藉口太多:賭人大可以站在馬埸,責怪馬會抽水太深,高手/大戶太多,分薄了大家的利潤。或是怪馬經的Tips,利用了我們。責怪馬評人的分析,教唆了我們。怪Adam Smith, 當初發明了資本主義。怪金錢分化了我們。但這都不是真正的原因,事實是,罪魁禍首是賭徒自己,自己是問題所在。這都要怪自己。若投注者忽略這一點,將因為錯誤付出高昂的代價。

又以1月1日第三埸沙田馬為例,賭人的模型計算出3號武術冠軍的勝出機會超過9成,轉換成賠率只值1.09,kelly 建議不惜動用9成資金買武術冠軍獨贏。因為隨機性和不確定的因素影響之下,武術冠軍居然以一個頭位勝出。若然賭人跟足kelly建議投注,此埸的利潤超過900%。


在同日第五埸賽事,雖然首飾大帝以項位之差贏出此埸賽事,但也反映出賭人的模型計算結果不合理的情況。理由非常簡單,Even a Broken Clock is Right Twice a Day. 有時候僥倖也會成功,就算瞎猜也可能會猜中。



可幸的是,賭人重覆檢查數據庫/模型/程式/方法,發現當中有很多問題。用的方法亦相當粗疏,這奠定了賭人過去一年的敗局。知道自己一開始走的路已經是錯,再也沒有必要繼續下去,如果再弄錯的時候,就沒有人可以再幫到你。儘管隨機性和運氣是博彩的關鍵,但其中也包括技巧這項元素。有見及此,賭人在2018年先退下來,改善自己在賽馬中的技巧。

正如Malcolm Gladwell在《Outliers: The Story of Success》一書中提出一萬小時定律。意思是要成為某個領域的專家,需要10000小時。一日工作8小時,一周工作5天來計算,至少需要五年時間。對於賭人這類slow learner 可能還要加倍時間,但時間不是問題,問題是賭人能否以一人之力勝過集體智慧。這也是2018年要研究的問題。

2017年12月7日 星期四

失敗的喜悅

記得在中學時期,有一次中文作文題目是XX的喜悅。賭某作的題目跟“熱門”的題目相若,反而令賭人至今仍印象深刻的題目卻是-失敗的喜悅。很多人都追求自己心中的“成功”,幾乎沒有人會因為失敗而感到喜悅,更沒有人會享受甚至愛上失敗。雖然賭人認為失敗乃成功之母是安撫失敗者的說話,但最近的經歷令賭人開始明白䓢中的樂趣。



在上一個馬季最後一個賽馬日,賭人損失約8成資金。心感氣餒之餘,更甚的是連自已都開始懷疑一直做的事。記得賭人第一次接觸用期望值(Expected value)賭馬是在去年相若的時間,因為連續輸好幾個賽馬日而萌生用其他方法如數學/統計學以達致贏馬。機緣巧合之下,看到池兄的blog,認識到只要長期買正預期回報(positive expected return)的馬就可以笑到最後。當時的感覺真的有如茅塞頓開,深深以為自己已經知道了中大教授-顧鳴高贏錢的先決條件。隨即用了大約兩個多月時間建立自己的賽馬統計模型,並在建模後的第一個賽馬日錄得3成盈利。意想不到的順利不但令賭人對自己信心大增,還令賭人加大賭博的注碼,最後一敗塗地。

尼可洛·馬基維利認為人生至少有50%是靠運氣,“黑天鵝效應”作者塔雷伯也曾講過運氣常常被低估。個人運氣好壞無人得知,賭人寧可承認失敗也不把輸錢的事實推作運氣差。

最近看到老賭徙嘅一篇文章,令賭某重新思考期望值賭馬的問題。賭人在前文曾提到因為隨機性(randomness),不確定性以及很多未知的因素所影響。儘管大數據可以減輕randomness嘅影響,對每匹馬要計算出完全客觀/合理的機會率依然是不可能甚或乎不存在的。即使能夠計算出相對於公眾有優勢的機率,賽馬結果也可以是不科學的,但這也是賽馬吸引人的地方。因此如果大家基於相若的數學模型計算出每駒的機率,誰對誰錯很難定斷。

眼見他人春風得意,自己卻一敗塗地,失敗的滋味不好受。在12月6日跑馬地9埸賽事以及最近的賽馬日,賭人又經歷挫敗。可喜的是,賭人知道錯處並立即更改。賭人漸漸明白,失敗的喜悅在於勇敢承認自己的失敗及不足,避免下一次的失敗。屢敗屢戰,找出成功之道。

2017年5月28日 星期日

OUR LIFE HAS BEEN HACKED?

一個NSA 用以監控民眾保障國家安全的0Day(未被公開的軟件漏洞)-MS17-010公開後,以致最近WannCry 勒索軟件在全球爆發,有見及此,賭人當然不會放過這個 抽水 討論的機會。賭人先來班門弄斧一下。 首先,對於勒索軟件信相對有“睇新聞”或從事IT的人而言不是新鮮事,中毒而“被勒索”的情況亦時有發生。以賭人為例,早在幾年之前就聴聞過有關的事。看起來這次事件也是“平常事”,沒有被用作新聞來娛樂大眾的價值。但在賭人認為這次的勒索攻擊事有二個有趣的地方。



第一,這次的攻擊令賭人關想到一套劇集-駭客軍團(MR. Robot) 中對跨國大型公司 E Corp 的資料庫(所有電子文件以及所有hard copy)全部銷毀,達至解放所有人所背負的債務,在電子文件中正是用加密的方式。此劇集令賭人為之著迷的地方是其駭客攻擊的手法及無政府主義的思想。令人思考到人為財死,鳥為食亡的哲理。其範模與是次攻擊極為相似。



賭人自小就對各種駭客攻擊手法極有興趣,在睇未來戰士 2 (Terminator 2) 時就非常羨慕電影中的主角約翰·康納可以令ATM嘔錢的情節。雖然在現實中也有同樣的事情發生,但由於這涉及比較專業的知識,賭人不會在此討論。話雖如此,其中一種的駭客攻擊手法-社交工程(Social Engineering)卻不是這一回事,例如在香港常見的電話騙案正是用了社交工程的手段。

第二,在是次攻擊中,一位22歲的網絡保安專家,在偶然情況下停止了近日影響全球近 100 個國家的網絡勒索程式 WannaCry 的傳播,只透過一個域名登記的作業。雖然賭人認為這並不是“偶然”,而是該名網絡保安專家用Reverse Engineering 的手法以及相關的Toolkit如Wireshark 反覆測試出來。

而賭人在Internship 的時候也曾與同事討論過解決“被勒索”的威脅,但畢竟RSA, AES 等加密算法(algorithm)太精密,難以從算法中反向(reverse)把密文(digest)計算至明文(Plain text)。而事實也証明這是想錯方向,應從勒索軟件中的缺陷(bug)着手。

PS. 在幾個月前寫完"MLR 賭馬 Part 1"後,由於該文章太過虛無,賭人一直希望在其model定下來後寫一篇完整的包括教學的文章,可惜時間所限令model 的變數至今仍未定下來,另外在相關的program 方面還有待完善。

2017年4月27日 星期四

差之毫釐 謬之千里

與其說統計模型(statistical model)是馬圈中一大兵器,那麼「蝴蝶效應」就是統計模型的致命傷。據維基百科的解說,蝴蝶效應是指事物發展的結果,對初始條件具有極為敏感的依賴性,初始條件的極小偏差,都將可能會引起結果的極大差異。記得幾年前理工大學曾做過預測輪盤的物理模型,其教授說過因蝴蝶效應而無法作出有效預測。在賽馬上,時常聽到有人說只有準確地計算出每匹馬勝出的機會率,不然一切都是徒勞無功。賭人認為此說法是荒謬的, 先講數個例子後再加以說明。



1996年6月4日,亞利安5號運載火箭首次測試發射。在風和日麗的法屬圭亞那太空發射場,計劃運送4顆人造衛星到預定軌道。但火箭發射後37秒,在4000米的高空被迫自行引爆。其自行引爆的原因在於64位元(bit)的運算錯誤地變為16位元的運算,造成程式崩潰後處理器發生數字溢流,將感測角度的垂直讀值錯誤的代入到水平值做運算,導致火箭在高速下進行90度水平滾轉而崩解,觸發自毀裝置的啟動。

事實證明一個亳不起眼的operand error令整個價值起過5億的火箭連衛星化成灰燼。事件冇做成人命傷亡算是不幸中的大幸。言而一個亳不起眼錯誤不但有機會賠上金錢,更帶來生命的隱憂。



1991年2月25日,由於愛國者飛彈失效,令一枚伊拉克飛毛腿飛彈擊中了沙烏地阿拉伯宰赫蘭的一個軍營,殺死了美國陸軍第十四軍需分隊的28名士兵。經調查後指出該次失敗歸咎於飛彈系統時鐘內的一個軟體錯誤。在此之前,愛國者飛彈連在載赫藍已經連續工作了100小時。每一個小時,系統時鐘會有一個毫秒級延遲。飛彈系統時鐘暫存器設計為24 位,精度也只限於24位的精度。這個精度誤差漸漸放大,100小時後,飛彈的時鐘已經偏差了三分之一秒,相等於600公尺距離誤差。

雖然在在飛毛腿飛彈擊中軍營後一天雷神公司提供了更新軟體,但已做成28名士兵死亡。證明了蝴蝶效應實在無法避免。

在4月23日的沙田賽馬日,賭人初以「真飛」試驗,結果出帥不利,大敗而回。也証實positive expected return 必須經歷長時間才有預期回報。

第一埸,重新裝上左前蹄的蹄鐵的「明多多」於起步後不久失去左前蹄的蹄鐵,只得第五名。

第五埸重注的西方快車,小注的彩福,人民武士和永旺年年。出閘後「西方快車」被「加州議長」碰撞後失去平衡,賽後該駒練馬師蔡約翰亦言「西方快車」今仗走勢令人失望。最後由下注時24倍但派彩時只有10倍的彩福跑出,令原本平手離埸變成虧蝕。而連續數埸的虧蝕令賭人失去超過一半資金,奠定敗局。

由上可見,在賽馬上準確無比的機會率很難計算,也許是不可能的任務,一個簡單的因素足以支配全盤結果。正如在華爾街之狼(The Wolf of Wall Street) 中 Matthew David 曾說過 "Number one rule of Wall Street. I don't care if you're Warren Buffett or if you're Jimmy Buffett. Nobody knows if a stock is gonna go up, down, sideways, or in fucking circles." 

最後賭人以一歐洲中世紀的寓言詩作為總結。






2017年3月26日 星期日

理性 Vs 非理性

經過近三個多月來的努力,初歩用於賽馬研究的 logit model總算是完成了。由最初零知識到今日也只是“識少少”,當中的過程十分艱苦,充滿挑戰。猶如在砌一幅無限大的"puzzle" ,是無了期的。

在講model 之前,賭人想先講一埸「非理性」的戰爭-秦滅燕之戰。

公元前227 年,在紙上談兵的趙括戰敗而斷送40餘萬將士性命的長平之戰和荊軻刺秦王事敗後,秦王派王翦率兵攻打燕國。燕國的易水長城是燕國的一道非常重要的防線。易水長城沿易水河的北岸伸廷,而河岸與城牆之間的是一片爛泥沼澤,主要是用於防胡和秦/趙秦兵要攻城就必先攻下燕國的易水長城。說到這裏,稍有「理性」的人都知道這埸仗燕國該如何對應,就是守城-用䀆所有士兵在城牆上以遠距離武器對抗以雲梯/投石器等兵器以及必須經過爛泥沼澤緩慢前進的秦兵。此時兩軍會是長時間運動戰的拉鋸局面,而且對攻城的一方十分不利。再者,當拉鋸時間越長。時即使秦軍有強大的資源作後盾也未必敵得過易水河河水氾濫的季節。




而人總是有「不理性」的時候,燕國不但沒有用易水長城的防守優勢。而是出兵到易水河西岸與秦軍展開了一埸亳無勝算的戰爭。結果當然是秦軍大敗燕軍和前來支援的代軍,攻陷薊都。最「不理性」的地方是戰敗的燕國處死太子丹,以其首級意圖向秦王求和。結果相信大家也可想而知。

這故事說明了利用別人的不理性可以把敵人擊倒,甚至取勝。我相信不論任何事情上都是如此。
就以今日沙田賽馬日第兩埸賽事為例,以搵銀天皇配合新騎師潘明輝為大熱門(最後賠率為3.2)。與賭人計算出的合理賠率有差異,最後大熱倒灶,也可算是公眾「不理性」的時侯。




PS. 得悉騎師潘明輝墮馬受傷入院,希望早日復!


2017年2月20日 星期一

賭埸老千-工程師化身賭神



相信大家還記得澳門女賭神 贏金沙巴黎人逾億元的傳奇,最近賭人看過一篇同樣是在數日從賭埸贏取過萬的文章,令賭人感興趣的是其手法。

2014年,一名在美國聖路易斯賭埸的會計帥發現賭埸的老虎機在數天內出了問題,由於這些老虎機中安裝的軟件都是經過政府審核和批准的,所以這些機器中的數學計算方法是固定的。這意味著賭場可以精確地知道這些老虎機可以給他們帶來多少利潤,即平均下來玩家每投1美元賭場就可以盈利7.129美分。奇怪的事情發生了,在6月2日和3日這兩天,賭場內有幾台老虎機竟然在沒人中jackpot的情況下吐出了好多錢,技術人員在對程序代碼進行了審查之後也沒有發現任何異常,所以唯一合理的解釋就是:有老千!

賭場保安隨即翻查監控錄像,終於發現了罪魁禍首—男性,三十歲左右,黑色頭髮,身著Polo衫,手拿棕色方形錢包。與大多數作弊者不同的是,這個人並沒有對機器做任何手腳(所有設備均為澳洲Aristocrat Leisure公司所生產的舊款老虎機-Aristocrat Mark六代老虎機)。他與其他玩家一樣,投幣然後按下按鈕,但唯一不同的是他會在遊戲過程中悄悄地拿著他的iPhone手機貼近老虎機的屏幕。

自從2009年開始,俄羅斯就已經成為了老虎機詐騙犯罪滋擾的溫床,當時俄羅斯甚至禁止了國內一切與賭博相關的活動。據報導,當時的俄羅斯總理普京認為此舉可以打壓格魯吉亞犯罪集團,而該項禁令也使得俄境內的數千家賭場不得不以低廉的價格賣掉他們的老虎機。這時,那些老千似乎看到了商機,他們以低價收購老虎機之後,便開始研究如何在這些舊款老虎機的電路板中通過修改遊戲來實現作弊。

pseudorandom number
而令賭人最為着迷的地方也在於老虎機的遊戲結果是由一種叫做偽隨機數生成器(pseudorandom number generators)的程序所控制的(以下統稱為PRNG),要識別出老虎機的運行模式,這非常困難。但由於偽隨機數生成的數字並非真正意義上的隨機。因為偽隨機數生成器是由人類通過編碼指令創造出來的,所以偽隨機數也有其規律可循。例如用時間生成(system clock)的偽隨機數, 令其有機會預測下一個生成的偽隨機數。

例如頂頂大名的TP-Link 路由隨機生成的無線密碼就可以被計算出來,令brute force 的時間由2000年減至數小時。

最後,俄羅斯犯罪集團利用一部Iphone 和Skype 就完成這個浩大的“工程”,其“老千+黑客”也相繼被起訴。有趣的是,老舊的老虎機中的PRNG算法漏洞沒有被修復,仍然為賭埸所用