機器學習在程式交易的應用、過度最佳化與策略檢驗
交易中的機器學習可用來預測漲跌、分類行情狀態或找出規則,但行情資料雜訊多,模型很容易過度最佳化。要排除資料洩漏、在模型沒看過的資料上依時間順序向前測試、計入每一個試過的模型,並以扣除成本後的結果來判斷。
作者 Soren Huang · 發佈 · 更新於 · 編輯原則
程式交易中的機器學習,用途是根據特徵預測報酬、對行情狀態或交易形態做分類,以及找出交易規則。行情資料訊號少、雜訊多,模型很容易過度最佳化。交易人要讓模型保持誠實,做法是排除資料洩漏、用推進切分在較晚的資料上測試、計入每一個試過的模型,並以扣除成本後的結果來判斷。
機器學習在程式交易中怎麼用?
程式交易中的機器學習大多做三件事之一:預測一個數值、把情境分成幾類,或搜尋人看得懂的規則。機器學習是一組方法,從範例中學出規則,而不是由人手寫規則。
每個專案都會碰到另外兩個名詞。特徵是由行情資料算出的輸入值,例如 14 根 K 棒的 RSI,或價格與移動平均線的距離。標籤是模型被訓練要預測的答案,例如「接下來 10 根 K 棒的收盤是否走高?」
| 用途 | 模型學什麼 | 常見標籤 | 常見輸出 |
|---|---|---|---|
| 以特徵做預測(迴歸) | 特徵與未來數值之間的關係 | 未來 N 根 K 棒的報酬 | 預期漲跌幅,例如 5 根 K 棒內 +0.1% |
| 分類 | 某個情境屬於哪一類 | 上漲或下跌、做或不做、趨勢或盤整 | 機率,例如接下來 10 根 K 棒收盤走高的機率為 0.56 |
| 規則探索 | 區分好壞交易的 if-then 條件 | 每條規則的交易結果 | 人看得懂的規則,例如「RSI 低於 30 且價格在 200 根 K 棒均線之上時買進」 |
常見的實務用法是過濾器。既有的規則型策略產生訊號,再由分類器決定要做哪些訊號,或部位大小該多大。模型只需回答一個較窄的問題,雜訊能發揮的空間也就比較小。
為什麼機器學習這麼容易對行情資料過度最佳化?
機器學習容易對行情資料過度最佳化,是因為價格波動中可重複的部分相對於隨機部分極小,而彈性大的模型連隨機部分也會學進去。想像要在擁擠的火車站裡錄下一句耳語:靈敏的麥克風錄得到耳語,也錄到每一則廣播和每一個腳步聲。用這段錄音訓練出來的模型,學到的是整個車站,而不是那句耳語。
訊噪比是可重複的規律,相對於周圍隨機波動的大小。在照片辨識中,貓每次都是貓。在市場裡,同樣的特徵組合之後,上漲與下跌出現的頻率幾乎一樣。過度最佳化,就是模型把訓練資料中的隨機細節擬合得太緊,以致在新資料上失效。
交易中有三件事會讓情況更糟:
- 市場會變。市場是非定態的,也就是行為會隨時間漂移。在某個波動環境中學到的規律,到了下一個環境可能就不存在。
- 獨立的樣本比 K 棒數少。如果每個標籤涵蓋接下來 10 根 K 棒,相鄰兩筆資料就共用其中 9 根。一萬筆資料能包含的獨立答案,可能少得多。
- 試驗次數多。你試過的每一種模型、特徵組合與設定都算一次試驗。在許多組中挑出最好的,它的表現有一部分是運氣。White(2000)為這個資料窺探問題設計了檢定。Bailey 等人(2014)則顯示,只要試的變化夠多,光靠雜訊就能輕易生出看起來很強的回測。我們的文章為什麼最好的回測通常被高估更詳細介紹了這方面的研究。
假設範例
某交易人用 200 個特徵,在 5,000 根日 K 棒上訓練樹狀分類器。樣本內準確率為 71%。在接下來模型沒看過的兩年,準確率是 50.4%。交易人接著試了 300 種不同設定,留下在這兩年準確率達 54% 的那一組。這個 54% 現在有一部分是搜尋本身造成的,因為測試期間被拿來挑選勝出者。
資料洩漏與偷看未來是怎麼混進特徵與標籤的?
資料洩漏是機器學習回測看起來太好的最常見原因:模型讀到了未來的資訊。資料洩漏指的是訓練或測試資料中,在做出交易決定的當下還不可能知道的任何資訊。偷看未來偏誤(look-ahead bias)則是資料洩漏在回測中的結果:交易使用了決定之後的價格或數值。
| 來源 | 洩漏方式 | 解法 |
|---|---|---|
| 特徵用到該 K 棒的收盤價,而交易又在同一個收盤價成交 | 決策用了你實際上無法成交的價格 | 在第 t 根 K 棒收盤時計算特徵,在第 t+1 根 K 棒開盤成交 |
| 用全部歷史的平均與離散程度來縮放特徵 | 測試期間的統計量進入訓練資料 | 任何縮放都只用訓練窗口來擬合 |
| 標籤跨越切分點 | 訓練標籤的未來 K 棒落在測試期間內 | 移除這些資料列(purging)並留出間隔 |
| 隨機打亂後分成各個摺(fold) | 幾乎相同的相鄰 K 棒同時出現在訓練集與測試集 | 依時間切分,絕不隨機切 |
| 看過所有資料後才挑選特徵 | 測試期間參與了輸入的挑選 | 在每個訓練窗口內部挑選特徵 |
| 使用回溯調整的連續月合約價格水準 | 過去價格被後來才發生的轉倉價差所位移 | 改用報酬或比率,或在未調整的資料上處理轉倉 |
Purging 是移除標籤期間與測試期間重疊的訓練資料列。Embargo 是訓練期間與測試期間之間、雙方都不使用的一段 K 棒間隔,讓一個期間的尾端不會為另一個期間的開頭提供資訊。
有個快速的洩漏測試很好用:把每個特徵再多延遲一根 K 棒,重跑測試。真正的優勢通常只會縮水一點,洩漏則往往會完全崩潰。
如何檢驗機器學習交易模型?
檢驗模型的方式要跟你實際交易的方式一致:用過去訓練,在隨後的期間測試,再向前推進,最後以扣除成本後的合併結果來判斷。推進分析是一種測試,在整段歷史上重複「訓練再測試」的循環,只把各個測試期間接成一個結果。我們的指南推進分析與窗口長度說明了如何設定窗口。
- 鎖住最後的保留資料。最近的一段歷史保持不動,只在最後用一次。
- 其餘資料依時間切分。在一個窗口訓練,在下一個窗口測試,然後向前推進。重新訓練的節奏要與實單交易時相同。
- 每次切分都做 purging 與 embargo。在每個窗口都套用上表的洩漏解法,而不是只做一次。
- 把預測轉成交易。準確率不等於獲利。要用手續費、滑價與下一根 K 棒成交來模擬交易。我們的文章回測中的交易成本說明了怎麼設定。
- 計入試驗次數。把你試過的每個模型、特徵組合與設定都記下來。Harvey 與 Liu(2015)主張,結果應依所做的檢定次數打折。去膨脹夏普比率是套用這類修正的一種方式。
- 改變設定。用不同的窗口長度與重新訓練節奏重跑。只在某一種組合下有效的模型很脆弱。Bailey 等人(2017)描述了一種方法,可估計所選的那一組有多大機率是過度最佳化。
假設範例
某分類器在推進測試中有 55% 的時間判斷正確。賺錢的單平均 8 個跳動點,賠錢的單平均 10 個跳動點。扣除成本前,平均每筆損益是 0.55 × 8 − 0.45 × 10 = −0.1 個跳動點。加上一買一賣(來回)2 個跳動點的成本後,是 −2.1 個跳動點。一個「對」的次數多於錯的模型,仍然會虧錢。
機器學習比規則型策略搜尋更好嗎?
兩種做法都不能免於過度最佳化;差別主要在於搜尋的對象,以及檢視結果的難易。規則型策略搜尋是一種方法,在設定好的參數範圍內,產生並回測大量人看得懂的進場與出場規則組合。兩種方法都是把候選策略擬合到同一段歷史,所以都需要同樣的檢驗紀律。
| 機器學習模型 | 規則型策略搜尋 | |
|---|---|---|
| 搜尋什麼 | 從特徵學出的模型權重或樹的分裂點 | 規則、指標與參數值的組合 |
| 結果的形式 | 訓練好的模型,通常有許多內部數值 | 人看得懂的進場與出場規則 |
| 如何檢視 | 間接,透過特徵重要性或測試結果 | 直接,閱讀規則與其交易 |
| 過度最佳化藏在哪 | 模型彈性、有洩漏的特徵、試過許多設定 | 試過許多規則組合、參數選擇範圍狹窄 |
| 實單交易時怎麼跑 | 通常需要另一支程式來計算預測 | 可以用交易平台的腳本語言撰寫 |
| 主要優點 | 能找出多個輸入之間的交互作用 | 容易檢查、說明與監控 |
兩者的限制是共通的。沒有任何一種方法能把回測變成預測。試驗次數增加而沒有修正時,兩者都會變差。成本或執行被鬆散建模時,兩者都會失敗。機器學習還多了上述的洩漏風險;規則搜尋則多了一種風險:一長串條件,每一個都只是剔除了過去的幾筆壞交易。
AlphaPrime(Valynox)走的是規則型路線。它的策略生成把研究想法轉成可測試的交易規則,指標、參數範圍、進場與出場條件和搜尋限制都由你選擇。它的策略檢驗包含推進分析,因此每個候選策略都會在它沒被擬合過的期間上測試。
如果你使用 AlphaPrime,這代表:把每組生成的規則當成機器學習的候選策略來對待,也就是搜尋時就納入成本、在沒看過的期間做推進檢查,並誠實計算你在挑選之前看過多少種變化。
常見問題
機器學習能預測期貨價格嗎?
機器學習能在過去資料中找到微弱的規律,但行情資料雜訊多、市場又會變,所以任何優勢都很小,而且可能消退。模型的回測描述的是過去,不是未來。有用的問題是:這個優勢在扣除成本後,能否通過推進測試。
哪種機器學習演算法最適合交易?
沒有哪一種演算法是最好的。邏輯斯迴歸或淺層決策樹這類較簡單的模型,記住雜訊的方式比較少,這在訊噪比低的資料上很重要。要在檢驗架構固定之後再選模型,並把你試過的每個模型都算作一次試驗。
交易機器學習中的資料洩漏是什麼?
資料洩漏是訓練或測試資料中,在做出交易決定時還拿不到的資訊。常見原因有:特徵用同一根 K 棒的收盤價計算、卻又以該收盤價成交,用全部歷史的統計量做縮放,標籤跨越訓練與測試的切分點,以及隨機打亂時間序列。資料洩漏會讓回測看起來遠比實單交易好。
為什麼隨機摺的交叉驗證不適用於行情資料?
相鄰的 K 棒幾乎一模一樣,所以隨機摺會把同一個情境的近似複本同時放進訓練集與測試集。模型看起來很有本事,是因為它實際上已經看過測試資料。請改為依時間切分,並在訓練與測試期間之間留出間隔。
參考文獻
- White, H. (2000). A Reality Check for Data Snooping. Econometrica, 68(5), 1097–1126.
- Bailey, D. H., Borwein, J., López de Prado, M., & Zhu, Q. J. (2014). Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance. Notices of the American Mathematical Society, 61(5), 458–471.
- Harvey, C. R., & Liu, Y. (2015). Backtesting. The Journal of Portfolio Management, 42(1), 13–28.
- Bailey, D. H., Borwein, J., López de Prado, M., & Zhu, Q. J. (2017). The Probability of Backtest Overfitting. Journal of Computational Finance, 20(4), 39–69.
AlphaPrime 在這裡能幫上什麼
AlphaPrime 的策略生成會在你設定的限制內搜尋人看得懂的規則型策略,而它的策略檢驗在你保留候選策略之前,加入推進分析與基本、標準或完整檢驗。

