PPG賽馬 — 移動平均(Moving Average)及其運用策略

PPG HorseRacing
4 min readNov 30, 2020

--

繼續講怎樣準備statistic model嘅features。

很多時候,賽馬的數據都是和時間有關的(time dependent)

比如話,

  • Purton 2020–21季初勝率下降了不小
  • Golden Sixty過去六場贏曬

如何可以有系統地以數值表示一隻馬嘅最近的強弱(往績)?

這篇文章我會用馬匹過往五場的勝率為例子,介紹一下python pandas如何處理時間有關(time dependent)的數據處理(feature engineering)。學會了這個,就大約能處理大部分類型的數據了。

注意要點

你不能把未來的資料(開跑前未知的資訊)放在你的賽馬模型內(data leakage)。

比方說,你可以試試把馬匹首400米名次放在你的模型中,你會發現模型準確度大幅提高,但其實只是自欺欺人。有時當你發現你把一些features加入模型後,很多時候也是你不小心把未來的資料洩露了(data leakage)

你不能用結果推測結果。

流程

Step 1 : 讀取資料。這篇文章會用之前的數據sample。

Step 2 : 把數據重新以時間排序,以準備做rolling。

左圖:數據未排序時;右圖:排序後

Step 3 : 活用pandas現成的functions

  1. Database[[‘date’,’raceid’,’HorseNameCHI’,’first’]] <- 只選取有關的columns (分別為日期、賽事編號、馬匹名稱、勝出與否)
  2. .groupby([‘HorseNameCHI’]) <- groupby操作用以根據”HorseNameCHI”分割數據
  3. [‘first’].apply(lambda x:x.rolling(center=False,window=5,min_periods=1).mean()) <- 將最近5行(包括本行)的”first” column計算平均值
  4. Database[[‘date’,’raceid’,’HorseNameCHI’,’prev5_winpct’]]<- 只選取有關的columns (分別為日期、賽事編號、馬匹名稱、剛剛創造的column)
  5. .groupby([‘HorseNameCHI’])<- groupby操作用以根據”HorseNameCHI”分割數據
  6. [‘prev5_winpct’].shift(1)<- 將”prev5_winpct”向上移一格,以防止data leakage

用馬匹美麗傳承說明一下這兩行的結果為何。

  • 這裏假設1/28/2018為美麗傳承香港生涯第一場比賽。
  • 因為沒有往積,所以1/28/2018的”prev5_winpct”為NAN
  • 4/29/2018的”prev5_winpct”為0.33333,因為之前三場比賽中勝出了一場。

Step 4 : 學會了以上簡單幾句,已經可以舉一反三,計算最近500匹馬(大約四五十場比賽)的同檔勝率了。

最後,用matplotlib把1200米在2018年的檔位勝率圖表化。

2018年一月的內檔勝率有16%,到了年底只有12%。

下次再講。

--

--

No responses yet