回測中的前視偏誤:常見洩漏來源與一根 K 棒檢查法
前視偏誤是指回測用到了下單決策當下還不存在的資訊。把每筆委託延後一根 K 棒再比較:真正的優勢只會小幅減弱,洩漏造成的優勢通常會崩潰。
作者 Soren Huang · 發佈 · 更新於 · 編輯原則
目錄
什麼是前視偏誤?
前視偏誤是指讓回測使用了下單決策當下尚未取得的資訊。它通常從同一根 K 棒成交、被修正過的資料、在日內使用日線數值,或交易時段對不齊等途徑混入。檢查方法是把每個訊號延後一根 K 棒。如果結果崩潰,就要找找哪裡有洩漏。
想像你拿著今天的報紙,去押注昨天的足球賽。每一注你都會贏,但這些勝利對你學習押注毫無幫助。有洩漏的回測也是同樣的道理。它顯示的是規則能多有效地利用答案,而不是預測得多準。華語圈的交易人把這種錯誤稱為前視偏誤。讀取未來數值的程式碼,常被稱為未來函數,英文就是 "future function"。
洩漏幾乎都會讓結果變好,所以常見的症狀就是測試結果好得不像話。可以留意以下跡象:
- 權益曲線接近一條直線,回撤非常小。
- 勝率遠高於同一市場上同類型的其他策略。
- 許多進場都發生在該根 K 棒的最佳價位或非常接近的位置。
- 策略在實單交易或模擬交易的第一天就失效,而不是在數月間慢慢失效。
未來資訊是如何洩漏進回測的?
大多數洩漏來自四個地方,每一個都有簡單的解法。
| 洩漏 | 發生什麼事 | 解法 |
|---|---|---|
| 用同一根 K 棒的收盤價進場 | 規則在該 K 棒收盤時做出決定,同時也以該收盤價成交。 | 在下一根 K 棒成交。 |
| 被修正或調整過的資料 | 測試看到的是後來才公布的更正數值或結算價。 | 使用當時最初得知的數值。 |
| 日內使用日終數值 | 日內規則在一天結束前就讀取當天的最高價、最低價或收盤價。 | 只使用最後一根已完成的日 K 棒。 |
| 交易時段對齊錯誤 | 兩組資料,或一組資料與其交易時段,使用不同的時鐘或 K 棒標記。 | 所有資料採用同一個時區與同一種時間戳記慣例。 |
在訊號 K 棒的收盤價進場
以某根 K 棒收盤價計算的規則,不能同時在該收盤價成交。你要等 K 棒結束才知道收盤價,而到那時市場早已繼續走了。下一根 K 棒成交的規則是:由某根 K 棒收盤觸發的委託,在下一根 K 棒成交,通常是以其開盤價成交。AlphaPrime(Valynox)在回測中以下一根 K 棒成交、手續費與滑價評估每個候選策略,所以這種洩漏由設定本身就堵住了。
這種洩漏還有一個較隱微的版本,發生在 K 棒內部。像「若 K 棒最高價突破某個價位,就以該 K 棒最低價買進」這樣的規則,假設最低價出現在最高價之前。K 棒只呈現四個價格,並不呈現它們的先後順序。當停損與停利都落在同一根 K 棒內,而測試假設停利先被觸及時,也會出現同樣的問題。
被修正與調整過的資料
事後被更正或重新計算的資料,可能把未來的知識帶進過去。時點資料(point-in-time data)是指完全依各個日期當時所知的樣子保存、未經任何後續修正的資料。常見的三種情況:
- 經濟數據公布。許多報告在首次公布後會被修正。依修正後數值交易的規則,是在用一個公布當天沒有人拿得到的數字交易。
- 結算價。交易所在交易結束後才訂出每日結算價。規則若在同一天內把它當成進場價格,就是用了較晚才出現的數字。
- 反向調整的連續月。反向調整的連續月,是把多個期貨合約接在一起的序列,每次轉倉時會平移較舊的價格以消除價差。每一次新的轉倉都可能改變之前所有的價格。拿價格和固定價位比較、或使用百分比變動的規則,就可能在與當年實際行情時不同的 K 棒上觸發。
《回測資料品質:缺漏、異常跳動點、時區與轉倉》這篇指南說明,在拿資料檔做任何測試之前,如何檢查它是否有這些問題。
在日內使用日線數值
日內規則只能使用已經結束的日子的日線數值。在歷史圖表上,當天的 K 棒常常會帶著最終的最高價、最低價與收盤價出現,程式碼從當天的第一分鐘起就能讀到這些數值。典型的洩漏有:
- 像「只在波動範圍大的日子交易」這類濾網,而所用的範圍是當天的範圍。
- 包含當天 K 棒的日波動率數值。
- 用當天的最高價、最低價與收盤價計算,而不是用前一天的樞紐價位。
- 更高 K 棒週期的趨勢濾網,在週線或日線 K 棒尚未收盤前就讀取了它。
每一種情況的解法都相同:引用較高 K 棒週期上最後一根已完成的 K 棒。白話來說,就是在今天的圖表上使用昨天的數值。
交易時段與時間對齊錯誤
當兩筆資料以錯誤的時鐘配對時,其中一筆可能看到未來幾分鐘或幾小時。有些資料來源用開始時間標記 K 棒,有些則用結束時間標記。如果各取一種合併,標記為 09:00 的那一列,就會讓 09:00 到 09:05 的 K 棒和 08:55 到 09:00 的 K 棒並排在一起。第一個序列現在就看到了未來五分鐘。
時區會在更大的尺度上造成同樣的問題。美國指數期貨和台灣市場的序列若以不同的時鐘比較,可能把不同的時段對在一起。當美國夏令時間開始或結束時,兩地的時差還會移動一小時,因為台灣不調整時鐘。日線 K 棒是另一個陷阱。從前一天晚上開始的期貨「一天」,與從午夜開始的日曆日,是不同的 K 棒。交易時段的時間來自交易所的合約頁面,而交易所可能更改,所以請到那裡確認目前的數值。期貨交易時間工具會以你自己的時區,依交易所與交易時段顯示交易時間。
如何用延後一根 K 棒檢查前視偏誤?
把每筆委託再多延後一根 K 棒,然後比較結果。大幅下降是訊號依賴了它看不到的資料最明確的跡象。這個測試之所以有效,是因為真正的優勢很少取決於確切的那一根 K 棒,而洩漏造成的優勢則會,因為洩漏提供的正是關於那一根 K 棒的資訊。
- 用正常設定並計入成本來執行策略。記下淨平均每筆損益、交易筆數、勝率與最大回撤。
- 只改變執行方式:每一次進場與出場都比之前晚一根 K 棒發生。如果測試原本是在訊號 K 棒的收盤價成交,第一步修正是改成下一根 K 棒的開盤價,然後再多移一次。
- 用同樣的資料與同樣的成本再執行一次測試。
- 把兩組數字並排比較。
- 對照下表解讀變化。
假設範例
策略 A 交易 5 分鐘 K 棒的指數期貨,共進行 400 筆交易。以下一根 K 棒成交時,它扣除成本後的平均每筆損益是 $120。再延後一根 K 棒,就降到 $15。策略 B 使用同樣的資料,平均每筆損益為 $60,延後之後降為 $48。五分鐘的延遲拿走了策略 A 八分之七的優勢。策略 B 則保住了五分之四的優勢。需要檢查的是策略 A。
| 位移後的結果 | 暗示什麼 | 下一步 |
|---|---|---|
| 平均每筆損益小幅下降,交易筆數相近 | 優勢不取決於確切的那一根 K 棒。 | 繼續做其他檢驗。 |
| 平均每筆損益下降了大部分 | 優勢取決於某一根 K 棒的資訊。這可能是洩漏,也可能是非常短線的優勢。 | 執行下方的截斷測試。 |
| 平均每筆損益轉為負值 | 很可能有洩漏,尤其是策略會持倉許多根 K 棒時。 | 稽核每一項輸入。 |
| 平均每筆損益上升 | 通常是成交價不同造成的隨機變動。 | 不需處理。 |
如果位移測試的結果不明確怎麼辦?
使用截斷測試,它能抓到位移測試可能漏掉的洩漏。持倉只有一兩根 K 棒的策略,即使沒有洩漏,也可能因延遲而失去大部分優勢。這種情況下,要檢查舊訊號是否會在新資料進來時改變:
- 在選定的日期把資料截斷,然後執行策略。保存交易明細。
- 用完整資料再執行一次。
- 比較截斷日期之前的每一筆交易。每一筆在兩次執行中的 K 棒、方向與價格都應該相同。
- 任何有變動的交易,都用到了自己那根 K 棒之後的資料。要等後續 K 棒才確認的波段高點指標,以及在之後的轉倉中被重新調整的序列,都會在這裡現形。
最後做一次簡短的輸入稽核。在一欄中寫下策略的每一項輸入。在旁邊寫下該數值確切成為已知的時間點,並與委託送出的時間點比較。這只需要幾分鐘,就能直接找出日線數值與時區的洩漏。
前視偏誤與過度最佳化、存活者偏誤有何不同?
這三者都會讓回測看起來比實單交易好,但各自來自不同的地方,需要不同的檢查。過度最佳化是指挑選出的規則或參數,貼合的是過去資料中的隨機型態,而不是可重複的效應。存活者偏誤是指只在存活到今天的商品上做測試。
| 前視偏誤 | 過度最佳化 | 存活者偏誤 | |
|---|---|---|---|
| 哪裡出錯 | 規則讀取了決策時間之後的資料。 | 規則是因為貼合歷史中的雜訊而被選中。 | 只測試現在仍然存在的市場或商品。 |
| 從哪裡來 | 資料時間點與程式碼 | 測試許多變體後只留下最好的 | 商品清單是如何挑選的 |
| 典型跡象 | 延後一根 K 棒後結果崩潰。 | 在沒有用於挑選的資料上,結果大幅下降。 | 加入已下市或已到期的商品後,結果下降。 |
| 如何檢查 | 位移測試、截斷測試、輸入稽核 | 樣本外(OOS)測試、推進分析 | 依每個過去日期當時的樣子重建商品清單。 |
在過度最佳化的情況下,每一根 K 棒可能都是乾淨的,但挑選過程仍然用了整段歷史。Bailey 等人(2014)指出,當測試許多變體時,最好的回測在樣本外很可能表現差得多。《策略生成中的過度最佳化》這篇指南說明如何讓大規模搜尋保持誠實。
這兩種錯誤會在一個地方交會:參數選擇。如果你用完整歷史來選參數,然後又在同一段歷史上報告結果,這些參數就把未來的資訊帶進過去的每一筆交易。推進分析能消除這個問題,因為每個樣本外期間都是用在它之前選出的參數來交易。
用今天的指數成分股建立的股票池,會漏掉已經失敗的公司。在期貨方面,同樣的存活者偏誤出現在只測試目前熱門的市場,或只測試標的股票仍在上市的股票期貨。
如果你使用 AlphaPrime,這代表:下一根 K 棒成交與交易時段設定是每次評估的一部分,所以同一根 K 棒成交的洩漏已經處理好了。你要負責的是資料與策略的輸入。使用同一個時區與同一種時間戳記慣例,並排除策略當時不可能看到的修正值或重新調整過的數值。然後對你打算保留的策略執行位移測試與推進分析。
常見問題
用簡單的話說,什麼是前視偏誤?
前視偏誤是指回測用到了下單決策當下還不存在的資訊。常見的例子是,依據在同一個收盤價上算出的訊號,以該 K 棒的收盤價買進。這樣得到的結果,比任何實際交易的人能做到的都要好看。
回測中的「未來函數」是什麼意思?
未來函數("future function")是華語交易圈用來稱呼讀取之後 K 棒數值的程式碼或指標的用語。使用它的策略會出現前視偏誤,也常被稱為前視偏誤。位移一根 K 棒測試與截斷測試都能發現它。
下一根 K 棒成交能完全消除前視偏誤嗎?
不能。下一根 K 棒成交只消除同一根 K 棒成交的洩漏。被修正的資料、在日內讀取的日線數值,以及不一致的時間戳記,仍然可能洩漏未來資訊。請用截斷測試與輸入稽核來檢查這些。
策略在位移一根 K 棒後失去大部分優勢,還可能是有效的嗎?
可以,如果它是持倉只有一兩根 K 棒的非常短線策略。它的優勢可能在沒有任何洩漏的情況下很快消退。用截斷測試來判斷:如果加入新資料時沒有任何過去的交易改變,那麼下降來自時間點,而不是未來資料。
指標重繪和前視偏誤是同一件事嗎?
重繪是前視偏誤的一種成因。重繪的指標在後續 K 棒出現後會改變它過去的數值,所以歷史上顯示的訊號,在即時情況下並不存在。依據這些訊號交易的回測,用到的就是未來資料。
參考資料
- 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.
AlphaPrime 在這裡能幫上什麼
AlphaPrime 的回測以下一根 K 棒成交、手續費、滑價與交易時段來評估每個候選策略。它的策略檢驗提供基本、標準與完整三種檢驗,並含推進分析,讓參數選擇與樣本外(OOS)結果保持分離。

