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

如何回測交易策略:步驟、免費工具與常見錯誤

把規則寫得精確、使用乾淨的資料、計入貼近現實的交易成本、只在你實際可能成交的價格成交,然後用建構策略時從未用過的資料檢查結果。免費工具處理單次測試沒有問題,真正困難的是誠實地測試大量變體。

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

目錄
  1. 如何正確回測一個交易策略?
  2. 第一次執行前應該決定什麼?
  3. 規則需要精確到什麼程度?
  4. 需要多少資料、什麼樣的資料?
  5. 回測應該計入哪些成本?
  6. 委託單應該在何時、以什麼價格成交?
  7. 免費回測軟體能做什麼?
  8. 哪些錯誤會讓回測看起來比實際更好?
  9. 如何解讀最初的結果?
  10. 如何用策略從未見過的資料來測試?
  11. 回測無法告訴你未來的哪些事?
  12. 常見問題
  13. 參考資料

如何正確回測一個交易策略?

把規則寫到電腦能照著執行的程度。用乾淨的歷史資料測試。計入貼近現實的手續費與滑價。只在你實際可能成交的價格成交。然後用建構策略時從未用過的資料檢查結果。免費工具處理單次測試沒有問題,真正困難的是誠實地測試大量變體。

回測是一種模擬:把固定的交易規則套用在歷史價格上,記錄這些規則會產生的交易。飛行模擬器是個不錯的比喻。重播過去天氣的模擬器,能顯示飛機如何應付已經發生過的風暴,卻無法顯示明天的風暴。回測的運作方式相同。它有用,是因為規則面對的是真實的過去行情;它有限制,也是同樣的原因。

正確的回測依下列六個步驟、按此順序進行:

  1. 規則:定義進場、出場、停損與部位大小,不留任何主觀判斷的空間。
  2. 資料:選定市場、K 棒週期、交易時段與日期範圍,並檢查資料是否有錯誤。
  3. 成本:設定每口或每股的手續費、交易所費用與滑價。
  4. 執行假設:決定每張委託單在何時、以什麼價格成交。
  5. 執行:以這些固定的設定跑一次測試。
  6. 檢視:閱讀交易明細、回撤與逐年結果,然後用未見過的資料測試。
依序進行的回測:首次執行前先設定規則、資料、成本與成交規則,接著執行一次測試、檢視結果,再以未見過的資料測試一次 全部設定好,再執行 六個步驟,再做未見資料測試 首次執行前設定 規則 資料 成本 成交 執行 檢視 未見資料測試 先定好所有設定。 所以:最後用未見資料測試。
規則、資料、成本與執行假設在第一次執行前就固定下來。檢視之後,接著是用策略未見過的資料進行測試。

第一次執行前應該決定什麼?

在執行測試之前,先決定所有會改變結果的設定。看到結果之後才調整的設定,會變成擬合的一部分。

規則需要精確到什麼程度?

規則要寫到兩個人照著做會下出相同的交易。「趨勢看起來很強時買進」不是規則。「當 20 根 K 棒均線收在 50 根 K 棒均線之上時,於下一根 K 棒開盤買進」才是規則。要包含出場與停損。許多策略之間的差異,在出場方式上比進場方式更大。

需要多少資料、什麼樣的資料?

使用足夠長的歷史,涵蓋上漲、下跌與盤整的時期,並且至少包含一次劇烈的殺盤。對期貨而言,要決定各個合約月份如何接合。連續月是把相繼的合約月份接成一條走勢的價格序列,而接合時的調整方式會改變過去的價格。做股票回測時,要使用已針對股票分割與股息調整的價格,並納入後來下市的公司。把它們排除在外稱為倖存者偏差,會讓過去的結果看起來比實際更好。回測資料品質:缺漏、壞跳動點、時區與轉倉這篇指南詳細說明各項檢查。另外也要決定你的 K 棒只涵蓋日盤,還是涵蓋全時段。用日盤 K 棒測試、卻在隔夜持倉的策略,是另一個不同的策略。

回測應該計入哪些成本?

滑價是回測所假設的價格與你實際成交價格之間的差距。市價單與停損單通常成交得比觸發價更差。進場與出場都要計入成本。然後把成本與平均每筆損益比較,詳見回測中的交易成本:手續費、滑價與平均每筆損益。

假設性範例

某期貨策略做了 400 筆交易,毛損益為 $14,000,也就是每筆 $35。手續費與規費為每一買一賣(來回)$5。滑價是進場一個跳動點、出場一個跳動點,每個價值 $10。一買一賣(來回)的成本為 $25,因此每筆淨損益為 $10,總計 $4,000。把滑價加倍,一買一賣(來回)的成本就變成 $45,淨損益變成每筆虧損 $10。

委託單應該在何時、以什麼價格成交?

下一根 K 棒成交的意思是:根據某根 K 棒收盤計算出的訊號,在下一根 K 棒成交,因為你得知訊號時,那個收盤已經結束了。也要決定停損單與限價單如何成交。常見的做法是:限價單只有在價格穿越限價時才成交,只是碰到並不算。

免費回測軟體能做什麼?

免費回測軟體適合在圖表上一次測試一個想法。當你想測試大量變體、保留紀錄,並預留資料做誠實的檢驗時,事情就變得比較困難。

免費選項擅長之處需要預先考量
TradingView 策略測試器在圖表的商品與 K 棒週期上執行 Pine Script 策略。會顯示績效摘要與交易明細。手續費與滑價在策略屬性中設定。預設情況下,從某根 K 棒收盤發出的委託單,在下一根 K 棒開盤成交。每份報表只涵蓋目前的輸入值。可用的歷史長度取決於方案與 K 棒週期。
試算表適合簡單的日 K 規則,每一項計算都看得到。盤中資料與 K 棒內的停損需要大量手動作業。
開源 Python 函式庫免費且靈活,能測試任何你寫得出來的規則。成交與成本的邏輯要自己撰寫並檢查。
圖表回放(手動測試)一根一根 K 棒地訓練你的眼力與執行。速度慢,也很難以完全相同的方式重複。

無論使用哪一種免費工具,都要檢查三件事。成本有開啟嗎?訊號是在下一根 K 棒成交嗎?你能否保留一段調整參數時絕不去看的資料?如果你是手動嘗試變體,也要記下你試了多少個。這個數字之後會很重要。

這些工具也能搭配使用。在 AlphaPrime(Valynox)找到的策略,可以匯出為 Pine Script v6 原始碼,在 TradingView 的策略測試器中執行,作為獨立的第二次檢查。AlphaPrime 也能匯出到 MultiCharts、TradeStation 與 NinjaTrader。支援平台匯出頁面列出了這四個平台。不同程式之間的資料來源與成交規則各不相同,因此要比較兩邊的交易明細,而不只是比較總數。

哪些錯誤會讓回測看起來比實際更好?

多數虛高的回測,來自三種錯誤:前視偏差、忽略成本與過度最佳化。這三者都把結果往同一個方向推:向上。

錯誤表現如何避免
前視偏差訊號用的是某根 K 棒的收盤,交易卻在同一個收盤價成交。或是測試在一天結束之前就用了當天的最高價。在下一根 K 棒成交。只使用做決定的那一刻已經確定的數值。
忽略成本許多小額交易,加上平滑的權益曲線。在第一次執行前設定好手續費與滑價。把滑價加倍再跑一次。
過度最佳化參數非常特定,稍微移動一點結果就崩潰。讓規則保持簡單,檢查鄰近的參數值,並用未見過的資料測試。

前視偏差是指在測試中使用了下單當時尚未取得的資訊。過度最佳化是把策略調整得過度貼合過去的資料,以致捕捉到的是隨機雜訊,而不是會重複出現的規律。試的變體越多,過度最佳化就越嚴重。Bailey 等人(2014)指出,當測試的組合夠多時,其中一個一定會在建構它所用的資料(樣本內期間)上看起來很強,即使資料中根本沒有真正的規律。

訊號出現在第 1 根 K 棒收盤價 100.0。前視偏誤的回測以該收盤價成交,但實際成交價是第 2 根 K 棒開盤價 100.5,這 0.5 的差距是你無法成交的價格 收盤價早已過去 第 1 根 K 棒收盤出訊號,示意圖 實際情況 第 2 根開盤 前視偏誤 第 1 根收盤 100.5 差 0.5 100.0 這 0.5 根本無法成交。 所以:下一根 K 棒成交。
只有在收盤時才得知的訊號,無法在該收盤價成交。貼近現實的成交是在下一根 K 棒。

如何解讀最初的結果?

先看交易明細與回撤,再看淨損益。只靠少數幾筆交易或某一年堆出來的大額總數,說明不了什麼。

  • 交易筆數:幾十筆交易只能給出非常粗略的估計。交易越多,估計越穩定。
  • 扣除成本後的平均每筆損益:它應該是一買一賣(來回)成本的數倍,這樣成交變差時才不會被吃光。
  • 最大回撤:權益從高點跌到之後低點的最大跌幅。問問自己,用真錢的話你撐得過去嗎。
  • 逐年與多空方向的結果:把多單與空單分開來看。如果一個策略的獲利全都來自某一年或某一個方向,它就依賴那段時期。
  • 最大幾筆交易:拿掉最好的兩三筆交易,看看剩下什麼。

期望值是策略平均每筆交易的賺賠金額。計算方式如下:

期望值 =(W × 平均獲利)−(L × 平均虧損)

其中 W 是獲利交易所占的比例,例如 40% 就是 0.40。L 是虧損交易所占的比例,以此例就是 0.60。平均獲利與平均虧損以扣除成本後的金額計算。勝率與期望值計算器可以根據你的交易明細算出這些數字。

如何用策略從未見過的資料來測試?

開始之前,先留出一段歷史。把完成的策略在這段資料上只跑一次,不更動任何東西。樣本外資料是你在設計或調整策略時,策略從未見過的歷史,也是回測最接近全新開始的方式。

假設性範例

某策略以前 8 年的資料建構。在這段期間,它有 320 筆交易,淨損益 $24,000,扣除成本後的平均每筆損益為 $75,最大回撤為 $6,000。在從未使用過的最後 3 年,它有 90 筆交易,淨損益 $1,800,平均每筆損益 $20,最大回撤 $5,500。每筆交易的優勢縮小了約四分之三,回撤卻幾乎不變。這顯示該擬合大多是雜訊,儘管未見資料上的結果仍略為正值。

一條歷史資料列分成 8 年樣本內,用於建立與調整策略,以及 3 年鎖定的樣本外,僅測試一次 把最後幾年鎖起來 11 年歷史資料,假設性 8 年 3 年 樣本內 建立與調整 樣本外 只測一次 未見過的年份只能開啟一次。 所以:看過之後就不要再改。
未見過的期間在策略定案之前都是鎖住的,只開啟一次。

一段未見過的期間只是一次測試。推進分析則會重複這個循環:在一個視窗上調整,在下一個視窗上測試,向前推進,再把未見過的各段接成單一結果。如果你打開了未見過的資料、修改規則後再測一次,它就不再是未見過的了。

研究者把這個問題稱為資料窺探。White(2000)描述了一種檢定:在把搜尋規模納入考量之後,檢驗搜尋中找到的最佳規則是否勝過基準。夏普比率是平均報酬除以報酬的波動幅度,是衡量每單位風險報酬的分數。Harvey 與 Liu(2015)說明了如何依據測試的變體數量下調這個分數。

回測無法告訴你未來的哪些事?

回測告訴你的是,固定的規則在過去價格的某一條路徑上如何表現,並不會告訴你下一條路徑會是什麼樣子。

  • 市場變化:波動、流動性與其他交易人的行為會隨時間改變。交易所規則與交易時間也會改變。
  • 你的實際成交:快市、較大的委託量,以及跨越休市時段的跳空,成交可能比你設定的任何假設都更差。
  • 資料中沒有的事件:歷史中從未出現過的衝擊類型,是沒有被測試到的。
  • 你自己:回測會在每一次回撤中跟隨每一個訊號。真人可能在連續第五次虧損後就停手了。

如果你使用 AlphaPrime,這代表:AlphaPrime 的回測會以你自己的歷史 K 棒資料評估每一個候選策略,並計入手續費、滑價、下一根 K 棒成交,以及你所選的交易時段。上述每個步驟都是只需固定一次的設定,因此在任何候選策略被排名之前,所有候選策略適用的是同一套規則。

常見問題

我可以免費回測交易策略嗎?

可以。TradingView 等圖表平台內建策略測試器,試算表適合簡單的日 K 規則,開源 Python 函式庫則能測試任何你寫得出來的規則。無論用哪一種,都要開啟手續費與滑價、讓訊號在下一根 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.
  • White, H. (2000). A Reality Check for Data Snooping. Econometrica, 68(5), 1097–1126.
  • Harvey, C. R., & Liu, Y. (2015). Backtesting. The Journal of Portfolio Management, 42(1), 13–28.

AlphaPrime 在這裡能幫上什麼

策略檢驗會針對未見過的資料加入推進分析,而績效報表會顯示權益、回撤、交易明細、各期間績效,以及多空分析。

看方案與價格