2020年8月27日 星期四

數字遊戲

化骨龍一邊玩著計數機,一邊分享他的開心大發現:原來0的0次方等於1,而不是等於0。但係……點解呢?

池某嘗試以limit的概念去解釋,當x->0,lim(x^x)=1,見下表:



化骨龍很快又有一個更有趣的發現:既然1^1=1、0^0=1,0至1中間的數字取自己次方都小於1,點解最細的數值唔係0.5^0.5而係0.4^0.4?

“0.4^0.4應該不是最細的,若細分下去,0.37^0.37左右會更細。”池某憑直覺衝口而出,同時腦海裡浮現了1/e這個神奇數字。

口講無憑,好在要證明也不難:

Let f(x)=x^x,d一d就得出,

f’(x)=( x^x)(ln(x)+1)

因為f’(x)=0即ln(x)+1=0時f(x)有optimal,所以可以解出x=1/e=0.36789441…

正是0.37左右。

不過同小學雞講derivative都係嘥氣,還是列個表方便啲:



池某之所以說1/e是個神奇數字,相信有看過趣味數學題之類的都知道,1/e正是選擇困難症的最佳解藥。著名的請秘書問題、揀老婆問題、見好就收問題等等,甚至蘇格拉底與柏拉圖關於愛情、婚姻和幸福的對話,都可以用這個數字來解答。

這個數字應該如何使用呢?假設你安排了與100個人相睇,依次逐一與他(她)們會面,會面後要即時決定是否揀他(她)做老公(婆),一旦作出決定就不能反悔,而在這100次會面中一定要作一次決定也只可以作一次決定,應該點揀?正常人遇到樣的問題都難免會選擇困難症發作:若太早作決定,很難確定那是不是最好的;若太遲作決定,很大機會會錯過了最好的。

在這種兩難關頭,就可以請1/e出場了。具體做法是先將1/e的比例(100人就是前37人了)列作觀察,而不作決定,但記下最好那個有多好,一旦之後遇到一個同樣好的或更好的,就要立即作出決定。這種放棄前面1/e比例的決策方法被稱為最優停止理論(Optimal Stopping Theory),也被稱作1/e法則或37%法則。

從上面例子也可以看到其實1/e法則的使用限制相當多,很難在實際中驗證其效果。現實中有什麼情況是要經常作決定而且一決定之後就不能反悔的?最常見的例子應該是股票交易。那1/e法則是不是一個用以撈底或逃頂的理想方法?

為了滿足1/e法則的使用條件,這裡先假設每個交易日只能交易一次,且以多少個交易日為計算單位。舉個例子,只考慮3個交易日的情況,要撈中3個交易日的最低位,怎樣操作的可能性最大?根據1/e法則,應先放棄第1天,然後再以第2天的價位同第1天比較,若不是比第1天更低,就用第3天的價位同第1天比較再作決定。問題來了,若第3天的價位也比第1天高呢?可見,用所謂“最優”的1/e法則,其實並非100%能選到最優答案的。那麼其成功率有多高呢?

若詳細拆解共有三個選項的情況,假設在A、B、C三個選項中,A最優,B次之,C最差。三個選項的排列方式共有六種:ABC、ACB、BAC、BCA、CAB和CBA,顯然,如果是隨機地選擇一次,選中A的機率就是1/3;使用1/e法則呢?放棄第一個不選之後,BAC、BCA和CAB這三種情況都可以選中A,成功率提升至1/2。

不過,隨著選項數目增加,1/e法則選中最優的成功率也會逐步下降,可幸的是,不管選項總數增加到多少,成功率也只會降到1/e,即接近37%左右就不會再下跌了,見表:



可見,要使用1/e法則來撈底,即使是在使用環境極度簡化、理想化的情況下,成功率也只得37%左右,而且還有一個現實中未能預知的問題無法解決,那就是每次輸贏的幅度。因此,看不到1/e法則用於撈底操作的實際可行性。最多只能領會一下其精神:比少少耐性,讓子彈飛一會兒才出手,會比匆匆作決定較優。

今年1、2月間,恒生指數受疫情影響開始下跌,從29000多點跌到26000多點時,池某身邊的朋友,包括很多師奶大嬸都已磨刀霍霍、蠢蠢欲動,準備重錘出擊撈底,有的問及池某意見,池某又不是財演大師,哪知幾時係底幾時係頂?只能重申一下1/e法則的精神:比少少耐性會係較優的選擇。

後來有一位朋友說,他使用1/e法則在3月19日今年恒指的最低位成功撈底買入了2800,聽得池某一頭霧水。他解釋說,只記得池某說過舉棋不定時可以用1/e法則作決定,但無法套用於股市,於是他自製了個人版本的“1/e新法則",以恒生指數的歷史高位33484點下跌1/e,即33484*(1-1/e)=21165點為撈底界線,結果一擊即中。

咁都得?!池某自愧不如也。

2020年7月14日 星期二

找死

延續上文的討論,若用現在手上的model賭馬不能贏錢,是否做一個更強的、統計指標更漂亮的model就能扭轉乾坤?個人觀點是,不宜過度關注及追求model的統計指標,而應該好好了解一下自認為有效model的“效果”從何而來。

如果用來砌model的那堆data叫D1,未開跑那堆data叫D2,池某所接觸過的model使用者,不論是用logit model的還是用AI的,無一例外,都總會全副心思放在D1,費盡精力尋找有效factors,絞盡腦汁令model的統計指標看起來更“靚”,認為只要將model做到越強越有效就行,而從不理會D2的分佈會有怎樣的可能。

然而,實際上贏錢與否無關model的強弱,反而與D1、D2的分佈是否一致的關係更大。若D2的分佈遠遠偏離D1,用D1的regression結果去“預測"D2顯然是找死,而且model越強越有效就死得越慘烈。

又由於D2相對於D1是小樣本,即使是random的因素,也會令其分佈偏離於D1成為大概率事件。最常見的就是兩、三個月不贏馬的騎師、練馬師突然一日贏兩、三場;或者一條一向利放頭的跑道突然轉向大利後上等等,涉及方方面面各個factor的例子不勝枚舉。

我們做過regression都知道,如果data的分佈是random的,factors就會無效,做出來的model也會沒什麼效果;data分佈極端且趨向明顯,做出來的model效果才好,統計指標才“靚”。因此,一個model看起來統計效果好、factors看起來有效,多數是因為data分佈極端偏離所致。用這樣一個本來就分佈偏離的D1的regression結果,去“預測"一個分佈偏離幅度更大且無定向的D2,不輸錢才怪。

但人們一旦輸了錢,首先想到的就係個model唔夠勁、factors唔夠有效,於是搜索枯腸,將同一堆data左配右搭,搓圓撳扁,生搬硬砌,以期砌出一個統計指標更好的、看起來更有效的model,結果是統計指標越“靚",偏離就越大,輸得越慘,然後,重來,砌一個更“勁"的model……,陷入死完再找死的循環之中。



Overfitting的問題,不是不懂,但人們總是會自然而然地踏上這條死路而不自知。找出不為人知的有效factors,固然是令model取得或保持優勢的最好方法。問題是,一旦聽聞或心裡覺得某個factor會有效,或有了factor A定會比factor B更有效之類的執念,經過一輪死砌爛砌之後,這些主觀想法是一定能自我實現的,於是就不經不覺地自掘墳墓,墮入自找的overfitting陷阱。

2020年6月1日 星期一

砌模型

個Blog久未更新,上篇文章的留言不斷累積,以致每次覆留言時都要瘋按頁面下方的“載入更多…”,甚是不便。同樣不斷累積的還有email郵箱裡的讀者來信,早前雖曾勉力回覆一小部份,但讀者們總是很快就“舉一反三”地拋來更多與之前差不多的問題,令池某覺得難以溝通。歸根究底,有效的溝通需要建立在共同的認知基礎之上,不然你來我往也只是雞同鴨講,牛頭唔搭馬嘴。



讀者來信中談得最多的,是砌賭馬模型的相關問題,諸如個別factor、某類data如何處理,怎樣有效解決factors的相關性、以及missing data等等。的確,這些也是池某日常在處理的問題。但池某認為,如果大家砌模型的用途與目的不一樣,這些處理方法未必一體適用。

廢話!辛辛苦苦砌模型的目的當然是要中馬贏錢了,怎會不一樣?有讀者(包括手動砌model的和以AI train data的)認為,只要個model夠勁、對頭馬估算的命中率夠高,每場下注model計出來機會率最高的兩匹或三匹馬就能長線贏錢了。

池某不敢說這種想法不對,也不敢說這種做法不可行,只會說池某沒有這樣的功力。換言之,池某的model不是這樣用的。簡單地說,池某砌模型不是用來找出頭馬的,而是以過去的數據分佈規律,給未來每一場的每一匹馬一個大致合理的定價,最終哪匹馬勝出都沒所謂,所謂命中率的高低亦不會在乎。可以想像一下賭場的骰寶賭局,莊家並不會在意下一局開出什麼點數,最重要的是要一早給所有可能的點數作好合理的定價,亦即與機率分佈相匹配的賠率。

不同的是,一場馬的機率分佈不像一局骰寶的機率分佈般確定且容易計算,需另闢蹊徑。其中一條可行的思路,是利用大量過去的數據分佈規律來預估未來小量數據的可能分佈,用句古語說就是希望“觀往而知來”,這就是使用統計模型作為工具的初衷,也是文章開頭所說的認知基礎。有了這個基礎,就可以討論砌模型過程中的幾個迷思了。

迷思一,建立模型時是不是用越多的data越好?試想一下這個例子:假設只用一個賽日的data,而該賽日田泰安贏了四場頭馬,顯然,用這樣的model去賭之後的賽事將是凶多吉少,而且,在這個例子中,騎師這個factor越是有效,結果將越是慘烈。

要防止個別極端偏差data造成的破壞,有兩方面的工作可以做:一是盡量找出多些有效factors,攤薄每一個factor對model影響的比重,不要被個別factor dominated整個model;二是增加data的量,減少這種小樣本偏差。

那麼是否data越多越好呢?池某曾作過比較,用多些data,model的統計指標確是看起來更漂亮,也能支撐起更多統計有效factor的數量,每次更新data時model也相對更能保持穩定。但從贏錢的成效來看,卻非data越多越好,用兩個賽季的data,明顯比用三個賽季data的成績更好。

為什麼會這樣?也許可以用上述那個“觀往知來”原則來解釋,使用過多的data,會令model“積重難返”,個別factor的數據分佈即使出現較大幅度的變化,比如騎師、練馬師的成績出現大幅的進步或退步,model的反應也會很滯後,造成長時間的高估或低估。

迷思二,model有很多種,哪一種砌法才最適用於賭馬?這方面池某並沒有作過太多的比較,不過,如果仍是從“觀往而知來”的出發點來考慮,factors的選擇似乎比model的選擇更為重要,因為不同類型的model,差別主要在於擬合data的方法,所體現的不同,僅在於對data的擬合程度,亦即“觀往解釋舊data時,或有些微的好壞之分,但贏錢的關鍵更在於“知來,顯然,factors才是貫穿“往與“來的主角。

迷思三,既然factors的選擇這麼重要,各組data或各個factor是不是會有一種最好的處理方式?如何增加某些factor的效果?或者將missing data比例較高的factor也做出效果?

先看看這個例子:如果你在一座山頭先撿了一堆石頭,之後再撿一塊新的,然後,拿新撿的這塊與之前那堆比較,相似程度會有多大呢?應該會有一定程度的機率吧。若換一種做法,你把那堆石頭先按自己的意願作了加工,變成自己心目中理想的石雕,再拿新撿的石塊與這堆石雕比較,難道相似程度會更大?

顯而易見,對data的過度加工和對factors的過份做作,只會影響“觀往的結果,即使可以令結果看起來更好更有效,實際上那只是一廂情願,用於“知來”肯定是有害而無益,因為未來的data分佈一定是粗糙突兀的,絕不可能是你理想中的石雕。

因此,對data、對factor的處理根本不存在那麼多糾纏不清的疑問,最好的處理方法,當然就是簡單直接原始粗暴的方法,有效就是有效,無效就是無效。不存在增加效果的問題,也不存在把無效加工到有效的問題,那些都是畫蛇添足、無中生有。

不去提高factors的效果,這樣的model豈非很“弱雞?這麼弱的工具,如何與別人競爭?回到砌模型的初衷,統計模型確實不是一件主動參與競爭的工具,而只是一件定價工具。如果公眾的定價更準確,就要輸錢;要公眾定價出錯,才能贏錢。贏或輸、贏多少或輸多少,都由公眾決定,自己完全是被動的(所以賭馬收入絕對是名副其實的“被動收入,呵呵)。因此,“model派會比較關注公眾賠率的R-squared value,用之來衡量遊戲的難易程度。

資料顯示,Bill Benter活躍於香港馬場的年代,公眾賠率的R-squared平均為0.13左右,到顧教授叱咤風雲的年代,公眾賠率的R-squared已升至0.17左右。到上個馬季,這個數值更是上升到0.218,進一步推高贏錢的難度。

不過,這個數字也並非只升不降的,今季到目前為止,就稍稍回落至0.213。將今季的數字拆開來看更是有意思,在疫情還未全球蔓延,各地球賽仍照常舉行,即馬會足智彩還接受投注之前,其實香港賽馬公眾賠率的R-squared高達0.221,由3月下旬開始完全冇波可賭,所有賭仔唯一選擇只能賭馬算起,賽馬公眾賠率的R-squared急降至0.191,贏錢的難度一下子降低了很多。借此機會也想與blog友們共勉一下:面對疫境也好、逆境也好,實在不必過度灰心,身邊總是會有新的希望的。

關於model賭馬,池某大致的想法就是這些,這也是對部份blog友來信的答覆。Blog友們的email,池某就不一一回信了,請見諒。