回測中的前視偏誤與倖存者偏誤|Traseq 部落格研究方法回測中的前視偏誤與倖存者偏誤
那些讓回測看起來比現實更好的隱性偏誤,搭配加密貨幣實例與一份簡短的稽核檢查清單。
一份回測可以展示乾淨的資產曲線、高勝率與漂亮的獲利因子,卻仍然對過去做出了錯誤的判斷。問題很少出在數學本身,而是那些隱性的假設——它們讓模擬使用了當時交易者不可能擁有的資訊,或讓你在一個被暗中剔除失敗者的市場上測試。本文會逐一說明最常扭曲加密貨幣回測的兩種偏誤:前視偏誤與倖存者偏誤,並簡短談及資料探勘偏誤。接著示範明確的執行模型如何防範前者,最後以一份可套用到任何回測的簡短檢查清單作結。
Traseq 是研究工作區,不是實盤交易或交易所執行平台。它不會下單、不會連結交易所帳戶,也不保證績效。這裡的目的不是承諾結果,而是讓您的歷史研究保持誠實。
前視偏誤發生在回測根據決策當下尚未取得的資訊行動時。模擬中的交易者實際上偷看了未來。結果在歷史上看起來很出色,實盤卻崩潰,因為未來在即時當下其實無從得知。
在加密貨幣中,這會以幾種具體形式出現:
把一個構想轉成可測試的版本。
從無程式的加密貨幣現貨策略開始,鎖定版本、執行回測,並讓結果保持可追溯以供比較。
- 同一根 K 棒收盤價成交。 規則是「當
1h K 棒收在 200 棒 SMA(200) 之上就做多」,而回測卻在同一根 K 棒的收盤價成交。但收盤價要等 K 棒走完才知道,而那一刻下一個可成交的價格是下一根 K 棒的開盤價。以觸發訊號的價格成交,等於用一個您實際上無法成交的價格買進。
- 會重繪的指標。 有些指標或訊號在 K 棒確定之後才修正其數值。一個僅因為後來的資料挪動了它、才「出現」在歷史線圖上的訊號,在您原本會交易的時點根本不存在。如果回測讀取的是最終、重繪後的數值,那它讀的就是未來。
- 資料準備階段的前視。 用整個樣本(含測試期)計算出的統計量來正規化或縮放特徵,會把未來資訊滲漏進每一根 K 棒。使用一個必須看完整序列後才得知的「最佳」參數,也是同樣的問題。
共同的脈絡是:回測中的每個決策,都只能使用該決策當下已經存在的資料。防範之道,是一個明確說明某個數值何時已知、成交何時能發生的執行模型。
倖存者偏誤發生在您的測試範圍只包含存活到今天的資產時。加密貨幣是格外嚴重的案例。數以千計的代幣已被下架、崩盤,或成交量趨近於零。如果您用今天的前 50 大幣種來組「測試前 50 大幣」的研究,等於是在拿存活下來的贏家測試——失敗的標的在您開始之前就已被悄悄移出資料。
舉一個具體例子:把「大型山寨幣逢低買進」規則在 2021 到 2024 年間,只用 2024 年時仍屬大型的標的回測,結果會比現實好得多,因為那些下跌後再也沒回來、或被下架的山寨幣根本不在樣本裡。這個策略從來不必去熬過那些死掉的標的。
- 用一個明確定義、固定的標的範圍測試,而不是「現在剛好有流動性的東西」。
- 優先選擇擁有長期、連續歷史的市場,而非近期才出現、或在上架與下架間反覆進出的資產。
- 誠實承認:在存活的大型交易對上得到的結果是有條件的結果。它建立在一個前提上——您只交易了那些持續被交易的資產,從未碰過其他。
Traseq 的主流程刻意聚焦於擁有長期、連續歷史的大型市值、高交易量代幣的主要 USDT 現貨交易對。這讓資料保持乾淨而一致,但這也是一個您該明白說出的範圍:您的結論適用於這些交易對,而非那些不再被交易的長尾代幣全體。
資料探勘偏誤(data snooping,也稱 data-mining 偏誤)是前兩者的近親。如果您在同一段歷史上試夠多的規則、門檻與時間框架,其中總有一些會純靠運氣看起來很棒。那個結果不是發現,而是一場搜尋的倖存者。這與過度擬合密切相關,而標準的防範方式,是把用來調參的資料與用來判斷的資料分開,這正是樣本內與樣本外測試的主題。
對前視偏誤最有效的結構性防範,是對兩個問題給出明確而固定的答案:條件何時被判定,以及隨之而來的成交何時發生。
Traseq 採用一個明確的模型:條件在 K 棒收盤時判定,訊號驅動的進出場以下一根 K 棒開盤價成交。 在產生訊號的那同一根收盤價上,什麼都不會執行。
- 像「收盤價上穿
SMA(200)」這樣的條件,要等 K 棒確定後才能確認。在收盤時判定,正是尊重這一點。
- 在一根已確定的收盤之後,您實際上能成交的最早價格,就是下一根 K 棒的開盤價。在那裡成交,移除了最常見的前視形式——用觸發訊號的那個價格本身來買賣。
- 因為這條規則對每一份回測的每一個訊號都相同,結果是可重現的。相同的定版版本、交易對、時間框架、範圍與執行設定,會產生相同的成交。不存在可能悄悄滲漏未來資訊的、逐筆交易的隱藏裁量。
這是一個研究模型,而非對 tick 級或委託簿層級擬真度的主張。它也不承諾策略「會有效」。它承諾的是:模擬中的歷史決策只使用了決策當下存在的資訊,而可設定的手續費與滑點會疊加在理論成交價之上。這份誠實,正是回測的意義所在。想看看回測在一個真正困難的局面裡如何表現,可以試試互動式示範:它讓三個系統模板在真實的 BTC/USDT 1h K 棒上,跑過一段先橫盤後下跌的震盪行情。結果三個趨勢與突破模板全都淨虧損——這正是一個乾淨的執行模型該浮現出來的誠實結果。
在信任之前,不論是您自己的還是別人的,把以下問題套到每一份回測結果上:
| 檢查項目 | 您要找的是什麼 |
|---|
| 訊號何時被判定? | 條件應在已完成的 K 棒上解析,而非帶著後見之明在 K 棒中途解析。 |
| 成交何時發生? | 訊號驅動的成交應發生在下一個可成交價格(例如下一根 K 棒開盤),而非觸發的收盤價。 |
| 有沒有指標會重繪? | 確認訊號不會在 K 棒確定後改變數值。 |
| 測試範圍是否事先固定? | 避免用「今天有流動性/今天是大型」來定義的範圍。 |
| 是否排除了已下架或消失的資產? | 只含存活資產的結果是有條件的,而非通用的。 |
| 特徵縮放是否只在樣本內計算? | 統計量不可在測試期上計算。 |
| 試了多少個變體? | 您搜尋過的規則越多,最佳那個越可能只是運氣。 |
| 是否有把手續費與滑點建模? | 無成本的成交可能翻轉結論,在短時間框架上尤其明顯。 |
| 結果是否綁定到固定版本? | 可重現性讓您能重新檢視該次執行背後的確切邏輯。 |
如果一份回測答不出這些問題,就把它的數字當成假設,而非證據。
什麼是回測中的前視偏誤?
前視偏誤是指回測使用了在當下時點還無法取得的資訊來做決策,例如用觸發訊號的那同一個收盤價來成交訂單。這會讓歷史結果看起來比交易者實盤可能達到的更好。
倖存者偏誤和前視偏誤有什麼不同?
前視偏誤關乎時間——在過去的某一刻使用了未來的資訊。倖存者偏誤關乎選擇——只用今天仍存在的資產測試,因此那些原本會傷害策略的失敗案例,完全不在資料裡。
Traseq 如何降低前視偏誤?
Traseq 在 K 棒收盤時判定條件,並讓訊號驅動的進出場以下一根 K 棒開盤價成交。產生訊號的那根收盤價上什麼都不會執行,因此回測無法用一個只有事後才知道的價格去交易。手續費與滑點會疊加在理論成交價之上。
倖存者偏誤對加密貨幣的影響是否比其他市場更大?
通常是的。加密貨幣有一段漫長的下架歷史,也有許多代幣成交量崩跌到趨近於零,因此用今天存活的大型交易對所定義的範圍,可能嚴重偏向贏家。請明確說出您測試的範圍,並把結果視為以那些交易對為條件的結論。
一份乾淨的回測還是可能出錯嗎?
無需寫程式的回測:加密貨幣策略完整指南