回測與前向測試
回測顯示一套策略在過去會有怎樣的表現;前向測試則以即時數據加以驗證,而實盤結果幾乎總是比回測所承諾的更差。
過度擬合回測一路飆升,實盤卻停滯並開始下滑。
將上方圖表從 Simple 拖到 Overfit:綠色的回測曲線平滑成一條完美無瑕的線,紅色的實盤曲線卻早早見頂、隨後崩解。這道落差有一個名字,叫過度擬合,而如何守在它安全的一側,正是本單元真正要談的主題。在你為一條規則或一個模型冒上哪怕一美元風險之前,你要先測試它,而誠實的測試方式恰恰只有兩種,另外還有一整份自欺欺人的方法清單。本單元要教你如何分辨兩者。一次好的測試能讓你免於一個壞主意。一次被操弄的測試(通常是無意間操弄的)則恰恰相反:它交給你自信,讓你更快地虧錢。讀完本單元,你會知道如何進行一次值得信賴的回測、如何識破那些讓虧損策略看起來像印鈔機的把戲,以及為什麼你測試印出的那個數字,是一個在現實中永遠達不到的天花板。
回測:在歷史上重播一套策略
回測是指讓一套策略在歷史數據上運行,以估算它過去會有怎樣的表現。你拿起自己的規則,把它們對準幾年的價格歷史,讓它們去「交易」那段歷史,看看資金曲線長什麼樣子。
它是必要的。一套在過去都會虧損的策略,不值得用真金白銀去交易,所以回測是你必須先跨過的下限。但跨過下限,並不等於觸及上限。回測很容易被操弄成呈現該策略在實盤中根本賺不到的結果,而多數時候,沒有人是刻意去操弄它的。錯誤是悄悄潛入的。
所以,把一次好的回測當成繼續深入研究的許可,絕不要當成你會賺錢的證明。本單元其餘部分,就是一份清單,列出外表乾淨的回測會如何欺騙你。
前視偏差:用明天的報紙作弊
前視偏差是指在測試中使用了在模擬決策當下其實還無法取得的資訊。測試「知道」某些真實交易者當時還不可能知道的事情,於是做出一個真實交易者不可能做出的決定。
兩個經典例子:
- 用某一天的收盤價去觸發一筆你假裝在當天早上「開盤時」下的交易。現實中,一天結束之前你並不知道收盤價。
- 使用重編後的基本面數據,而這些數據其實是在你所測試日期的數週之後才公布的。
哪怕只是極少量未來資訊的洩漏,都能把一套平凡的策略,變成一場平滑、輕鬆獲利的幻想。資金曲線之所以看起來華麗,是因為回測正在悄悄地讀著明天的報紙。如果一次回測看起來太乾淨、太輕鬆,前視偏差就是你該首先懷疑的對象。
曲線擬合,以及樣本內/樣本外的解方
第二個巨大的陷阱是曲線擬合。如果你不斷調整一套策略的參數,直到它的歷史曲線看起來完美無瑕,你並沒有找到真正的優勢。你只是把策略捏合成過去那些起伏的確切形狀,連同那些不會重演的隨機雜訊一併納入。曲線之所以漂亮,恰恰是因為你把它塑造成貼合那一段特定歷史的樣子。
標準的防禦手段是樣本內對比樣本外測試,它比聽起來要簡單:
- 把你的歷史數據切成兩段。
- 樣本內: 在第一段上盡情調整策略。
- 凍結規則。不再做任何微調。
- 樣本外: 讓那些凍結的規則在第二段上運行,那是策略從未見過的數據。
如果績效在樣本外依然站得住腳,那個優勢或許是真的。如果它崩潰了,那你當初擬合的就是雜訊,而現在就發現,總好過用真金白銀去發現。一條值得隨身攜帶的經驗法則:一套擁有數十個參數、曲線又平滑得可疑的策略,在被證明清白之前,一律先當它有罪。
前向測試:誠實的彩排
前向測試,也稱為模擬交易,是指讓策略在即時數據上實時運行,而不投入任何真實資金。它是回測誠實的補充,原因只有一個:你無法偷看未來。數據一次一個跳動點地到來,就跟真實交易中一模一樣,於是前視偏差與悄無聲息的數據窺探,再也無處可藏。
前向測試還會檢驗那些回測草草帶過的枯燥細節:你的訂單類型、你的時機掌握,以及當市場正在波動時成交究竟如何運作。許多「完美」的回測,正是在這些執行假設上土崩瓦解。
把它想成投入真金白銀前的最後一道關卡。略過它,正是一次漂亮的回測淪為一個難看的實盤帳戶的原因。
為什麼實盤總是比回測更差
這裡有一個令人不安的規律:回測結果與實盤結果之間的落差是真實存在的、可以預期的,而且幾乎總是朝同一個方向。實盤更差。有三股力量造成這種情況。
| 力量 | 它是什麼 | 為什麼回測會漏掉它 |
|---|---|---|
| 成本 | 手續費、買賣價差、資金費 | 天真的回測往往假設成本為零 |
| 滑價 | 你預期的價格與你實際成交價格之間的差距 | 在回測當成風平浪靜、實則急速或稀薄的市場中,它會擴大 |
| 市場狀態轉變 | 造就你那批數據的市場條件已不復存在 | 歷史無法容納一個尚未發生的市場 |
正因如此,在投入資金之前,前向測試的時間要足夠長,長到能看見大量交易與至少一次市場條件的轉變。要數的是交易筆數與經歷的市場條件範圍,而不是日曆上的天數。一套快節奏的策略也許只需要幾週;一套慢節奏的往往需要數個月。真正的問題從來不是「它已經運行了多久?」,而是「它已經熬過了多少?」
悄悄扼殺一次回測的成本計算
一次回測報告某策略在一個 $10,000 的帳戶上每年賺 +40%,曲線華麗平滑,一年交易 300 次。這次回測假設成本為零。現在,加入現實。
假設每一筆完整往返的交易,在手續費與價差上大約要花掉成交金額的 0.1%。300 筆交易下來,大約就是 300 x 0.1% = 成交額的 30% 被成本吃掉。再加上在急速時刻每筆交易幾個基點的滑價,情況更糟。
把成本算進去重新計算,那個 +40% 的回測,實盤上現實地看也許會落在更接近 +8% 到 +10% 的水準。一套本來看起來只是平庸的策略,一旦誠實計入成本,可能翻轉成淨虧損。邏輯本身毫無改變。唯一的差別,是把回測忽略掉的成本算了進來。這就是為什麼在你興奮起來之前,要先扣除實際成本與滑價,也是為什麼前向測試(成本在此無可迴避)才是真正的試金石。
切分樣本內與樣本外的更乾淨做法
基本的切分(在第一段上調整,凍結後在第二段上測試)足以抓出大多數的曲線擬合。如果你想更嚴格,就讓樣本外那一段真正保持封存:
- 在你查看任何結果之前就決定好切分方式,而不是之後。
- 在樣本外數據上只測試一次。如果你不斷偷看、調整、重測,那段「未曾見過」的數據也會慢慢變成樣本內,整個好處便逐漸流失殆盡。
- 寧可選一套在兩段數據上都只是穩定不錯的策略,也不要一套在其中一段耀眼奪目、在另一段卻搖搖欲墜的策略。在它從未見過的數據上保持一致,才是你真正想要的訊號。
前向測試多久才算「夠長」?
沒有固定的天數,因為兩套策略的交易速度可能天差地別。誠實的衡量標準是對多樣情境的暴露程度:
- 足夠多的交易筆數,讓一段好運連勝無法美化整體紀錄。十幾筆交易幾乎說明不了什麼;幾百筆才開始有意義。
- 至少一次市場條件的轉變,好讓你看過這套策略在盤整與趨勢中、在平靜與恐慌中的表現,而不只是在它恰巧啟動時的那一種市場情緒裡。
一套高頻策略也許幾週內就能同時滿足這兩點。一套慢節奏的波段策略則可能需要許多個月。如果你的前向測試自始至終只見過一種市場,那你其實還沒有真正測試過它。
快速知識測驗
為什麼回測是必要的,卻不足以單獨成事? 一套策略至少要能在過去存活下來,才值得拿去交易,所以回測是下限。但回測很容易被前視偏差、曲線擬合,以及被忽略的成本所扭曲,因此通過一次回測,並不能證明你在實盤上會賺錢。
用一個例子說明,什麼是前視偏差? 在測試中使用了決策當下無法取得的資訊,例如用當天的收盤價去觸發一筆「開盤時」的交易,而那個收盤價是任何真實交易者當時都還無法得知的。
為什麼實盤結果幾乎總是不如回測? 有三股力量是回測通常會低估的:成本(手續費、價差、資金費)、滑價(成交比預期更差),以及市場狀態轉變(造就你那批歷史數據的市場條件已經改變)。
資料來源
- CFA Institute, "Backtesting and Simulation",在歷史數據上測試一套策略以估算其績效的定義。
- arXiv (academic), "Look-Ahead-Freedom as Temporal Non-Interference",使用在模擬決策時點無法取得的資訊。
- Notices of the AMS (academic), "Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance",曲線擬合描述的是雜訊而非底層的關聯,因而無法推廣到新數據。
- CME Group, "About the Trading Simulator",在正式上線之前,於即時數據上進行不投入真實資金的前向測試。