VALYNOXSTRATEGY RESEARCH TECHNOLOGY
AlphaPrimeAlphaPrime
策略學院 / 回測與檢驗

回測中的前視偏誤:常見洩漏來源與一根 K 棒檢查法

前視偏誤是指回測用到了下單決策當下還不存在的資訊。把每筆委託延後一根 K 棒再比較:真正的優勢只會小幅減弱,洩漏造成的優勢通常會崩潰。

作者 · 發佈 · 更新於 · 編輯原則

目錄
  1. 什麼是前視偏誤?
  2. 未來資訊是如何洩漏進回測的?
  3. 在訊號 K 棒的收盤價進場
  4. 被修正與調整過的資料
  5. 在日內使用日線數值
  6. 交易時段與時間對齊錯誤
  7. 如何用延後一根 K 棒檢查前視偏誤?
  8. 如果位移測試的結果不明確怎麼辦?
  9. 前視偏誤與過度最佳化、存活者偏誤有何不同?
  10. 常見問題
  11. 參考資料

什麼是前視偏誤?

前視偏誤是指讓回測使用了下單決策當下尚未取得的資訊。它通常從同一根 K 棒成交、被修正過的資料、在日內使用日線數值,或交易時段對不齊等途徑混入。檢查方法是把每個訊號延後一根 K 棒。如果結果崩潰,就要找找哪裡有洩漏。

想像你拿著今天的報紙,去押注昨天的足球賽。每一注你都會贏,但這些勝利對你學習押注毫無幫助。有洩漏的回測也是同樣的道理。它顯示的是規則能多有效地利用答案,而不是預測得多準。華語圈的交易人把這種錯誤稱為前視偏誤。讀取未來數值的程式碼,常被稱為未來函數,英文就是 "future function"。

洩漏幾乎都會讓結果變好,所以常見的症狀就是測試結果好得不像話。可以留意以下跡象:

  • 權益曲線接近一條直線,回撤非常小。
  • 勝率遠高於同一市場上同類型的其他策略。
  • 許多進場都發生在該根 K 棒的最佳價位或非常接近的位置。
  • 策略在實單交易或模擬交易的第一天就失效,而不是在數月間慢慢失效。

未來資訊是如何洩漏進回測的?

大多數洩漏來自四個地方,每一個都有簡單的解法。

洩漏發生什麼事解法
用同一根 K 棒的收盤價進場規則在該 K 棒收盤時做出決定,同時也以該收盤價成交。在下一根 K 棒成交。
被修正或調整過的資料測試看到的是後來才公布的更正數值或結算價。使用當時最初得知的數值。
日內使用日終數值日內規則在一天結束前就讀取當天的最高價、最低價或收盤價。只使用最後一根已完成的日 K 棒。
交易時段對齊錯誤兩組資料,或一組資料與其交易時段,使用不同的時鐘或 K 棒標記。所有資料採用同一個時區與同一種時間戳記慣例。

在訊號 K 棒的收盤價進場

以某根 K 棒收盤價計算的規則,不能同時在該收盤價成交。你要等 K 棒結束才知道收盤價,而到那時市場早已繼續走了。下一根 K 棒成交的規則是:由某根 K 棒收盤觸發的委託,在下一根 K 棒成交,通常是以其開盤價成交。AlphaPrime(Valynox)在回測中以下一根 K 棒成交、手續費與滑價評估每個候選策略,所以這種洩漏由設定本身就堵住了。

這種洩漏還有一個較隱微的版本,發生在 K 棒內部。像「若 K 棒最高價突破某個價位,就以該 K 棒最低價買進」這樣的規則,假設最低價出現在最高價之前。K 棒只呈現四個價格,並不呈現它們的先後順序。當停損與停利都落在同一根 K 棒內,而測試假設停利先被觸及時,也會出現同樣的問題。

時間軸上的三根 K 棒:訊號要到第 1 根 K 棒收盤才確定,因此無法以該收盤價成交;較貼近實際的成交是第 2 根 K 棒的開盤價,也就是下一根 K 棒成交 在下一根 K 棒成交 訊號要到收盤才確定 K 棒 1 K 棒 2 K 棒 3 收盤成交:否 下一開盤成交 收盤價不能同時是成交價。 所以:下一根 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 棒並排在一起。第一個序列現在就看到了未來五分鐘。

兩個資料序列都標示為 09:00:序列 X 涵蓋 09:00 至 09:05,序列 Y 涵蓋 08:55 至 09:00,因此合併後,序列 X 比序列 Y 提前看到五分鐘 標籤相同,分鐘不同 兩列都標示 09:00 提前 5 分鐘 序列 X 序列 Y 08:55 09:00 09:05 其中一列提前看到 5 分鐘。 所以:全部採用同一種時間戳規則。
兩組資料都寫著 09:00,卻涵蓋不同的分鐘。合併之後,其中一組看起來領先了五分鐘。

時區會在更大的尺度上造成同樣的問題。美國指數期貨和台灣市場的序列若以不同的時鐘比較,可能把不同的時段對在一起。當美國夏令時間開始或結束時,兩地的時差還會移動一小時,因為台灣不調整時鐘。日線 K 棒是另一個陷阱。從前一天晚上開始的期貨「一天」,與從午夜開始的日曆日,是不同的 K 棒。交易時段的時間來自交易所的合約頁面,而交易所可能更改,所以請到那裡確認目前的數值。期貨交易時間工具會以你自己的時區,依交易所與交易時段顯示交易時間。

如何用延後一根 K 棒檢查前視偏誤?

把每筆委託再多延後一根 K 棒,然後比較結果。大幅下降是訊號依賴了它看不到的資料最明確的跡象。這個測試之所以有效,是因為真正的優勢很少取決於確切的那一根 K 棒,而洩漏造成的優勢則會,因為洩漏提供的正是關於那一根 K 棒的資訊。

  1. 用正常設定並計入成本來執行策略。記下淨平均每筆損益、交易筆數、勝率與最大回撤。
  2. 只改變執行方式:每一次進場與出場都比之前晚一根 K 棒發生。如果測試原本是在訊號 K 棒的收盤價成交,第一步修正是改成下一根 K 棒的開盤價,然後再多移一次。
  3. 用同樣的資料與同樣的成本再執行一次測試。
  4. 把兩組數字並排比較。
  5. 對照下表解讀變化。

假設範例

策略 A 交易 5 分鐘 K 棒的指數期貨,共進行 400 筆交易。以下一根 K 棒成交時,它扣除成本後的平均每筆損益是 $120。再延後一根 K 棒,就降到 $15。策略 B 使用同樣的資料,平均每筆損益為 $60,延後之後降為 $48。五分鐘的延遲拿走了策略 A 八分之七的優勢。策略 B 則保住了五分之四的優勢。需要檢查的是策略 A。

假設範例:延遲一根 K 棒後,策略 A 的平均每筆損益從 120 元降到 15 元,策略 B 則只從 60 元降到 48 元 哪個優勢能存活? 平均每筆損益,假設 策略 A 策略 B $120 $15 $60 $48 之前 之後 之前 之後 A 失去 7/8 優勢;B 保留 4/5。 因此:檢查策略 A 的輸入。
假設範例:延後一根 K 棒後,策略 A 的平均每筆損益崩潰,策略 B 幾乎沒變。
位移後的結果暗示什麼下一步
平均每筆損益小幅下降,交易筆數相近優勢不取決於確切的那一根 K 棒。繼續做其他檢驗。
平均每筆損益下降了大部分優勢取決於某一根 K 棒的資訊。這可能是洩漏,也可能是非常短線的優勢。執行下方的截斷測試。
平均每筆損益轉為負值很可能有洩漏,尤其是策略會持倉許多根 K 棒時。稽核每一項輸入。
平均每筆損益上升通常是成交價不同造成的隨機變動。不需處理。

如果位移測試的結果不明確怎麼辦?

使用截斷測試,它能抓到位移測試可能漏掉的洩漏。持倉只有一兩根 K 棒的策略,即使沒有洩漏,也可能因延遲而失去大部分優勢。這種情況下,要檢查舊訊號是否會在新資料進來時改變:

  1. 在選定的日期把資料截斷,然後執行策略。保存交易明細。
  2. 用完整資料再執行一次。
  3. 比較截斷日期之前的每一筆交易。每一筆在兩次執行中的 K 棒、方向與價格都應該相同。
  4. 任何有變動的交易,都用到了自己那根 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)結果保持分離。

看方案與價格