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

策略檢驗清單:信任回測前的 7 項檢查

依固定順序執行七項檢查,由成本低的開始:資料品質、成本、前視偏誤、依時間排序的樣本內/樣本外切分、推進效率、蒙地卡羅與參數壓力測試,以及最低交易筆數。每個通過/未通過的數字都在第一次執行前寫下,策略在第一個未通過的檢查就停止。

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

目錄
  1. 期貨策略的策略檢驗清單有哪些項目?
  2. 檢查 1 至 3:在讀任何結果之前,資料、成本與成交順序正確嗎?
  3. 檢查 4:樣本內與樣本外資料該怎麼切分?
  4. 檢查 5:推進效率多少才算通過?
  5. 檢查 6:蒙地卡羅與參數壓力測試,比單一條權益曲線多提供什麼?
  6. 檢查 7:回測需要多少交易筆數?要事先設定哪些門檻?
  7. 為什麼搜尋中最好的回測,仍然要通過七項檢查?
  8. 常見問題
  9. 參考文獻

期貨策略的策略檢驗清單有哪些項目?

期貨策略的策略檢驗清單,是依固定順序執行的七項檢查:資料品質、成本、前視偏誤、樣本內/樣本外切分、推進分析、蒙地卡羅與參數壓力測試,以及最低交易筆數,其通過/未通過門檻在第一次執行前就已寫下。策略只要有一項未通過,就在那裡停止。

策略檢驗清單是一份固定的檢驗列表,對每個候選策略都依同樣的順序執行,且每項檢驗的通過門檻,在讀到第一個結果之前就已寫下。可以想成機場的七道關卡:護照查驗沒通過的旅客,不會再被送到行李掃描機,指望那一關會順利些。順序之所以重要,是因為前三項檢查決定輸入,之後每一項檢查讀到的,都是建立在這些輸入上的結果。本文的主張是:順序與事先寫好的數字,比任何單一檢驗更有用,包括那些耗時又令人印象深刻的檢驗。

檢查能抓出什麼所需時間
1 資料品質未調整的轉倉、跳空、異常報價、錯誤時區數分鐘
2 計入成本小於一買一賣成本的優勢數分鐘
3 前視檢查以規則當時不可能取得的價格成交數分鐘
4 樣本內/樣本外只描述某一段歷史的規則多跑一次
5 推進分析在新資料上重新選定後就失效的設定多次執行
6 蒙地卡羅與參數壓力測試碰巧有利的交易順序;鄰近設定都不好的單一設定多次執行
7 交易筆數與門檻建立在過少交易上的結果;事後移動的合格標準查看一次

AlphaPrime(Valynox)在策略檢驗中就是這樣運作:門檻由你在搜尋前設定,未通過前面檢查的候選策略,不會繼續進入較慢的檢查。

七道檢驗關卡,順序固定:通過關卡的策略進入下一關,任何一關未通過的策略就此停止,成本低、速度快的第 1 至 3 關排在耗時的第 4 至 7 關之前 過不了一關,就此停止 七項檢查,順序固定 1 2 3 4 5 6 7 成本低、快 耗時 通過:繼續 未通過:停止 慢的檢驗只看乾淨的輸入。 所以:先跑成本低的關卡。
七道關卡,順序固定。未通過一道關卡的策略就此停止;成本低的關卡排在前面,讓耗時的關卡只對輸入正確的候選策略執行。

檢查 1 至 3:在讀任何結果之前,資料、成本與成交順序正確嗎?

先做成本低的檢查,因為轉倉處理錯誤、漏掉一買一賣成本,或規則讀取自己所交易那根 K 棒的收盤價,都可能讓虧損的規則變成獲利的回測,之後任何檢查都無法補救。這三項檢查只需數分鐘,就能在動用任何統計之前,剔除大部分看似獲利的假贏家。

  1. 檢查 1,資料品質。連續月期貨序列是由多個合約月份接成的,每次轉倉的價差跳動必須調整,否則趨勢規則會去交易一個沒人交易得到的跳空。檢查轉倉日期、隔夜跳空、K 棒的時區與休市日曆。通過標準:每次轉倉都用同一種方式調整,沒有任何 K 棒遠離相鄰的 K 棒,且交易時段與你實際交易的時段一致。
  2. 檢查 2,成本。從一開始,就在每次執行中放入手續費、交易所費用與滑價,以一買一賣(進場加出場)計算。然後拿成本後的平均每筆損益,與一買一賣的成本比較。毛平均每筆損益與交易成本相近的規則,沒有優勢,而且通常正是交易筆數最多的規則。
  3. 檢查 3,前視偏誤。前視偏誤是回測使用了規則下決定的那一刻還拿不到的資訊。最常見的漏洞,是規則依某根 K 棒的收盤價下決定,又以同一個收盤價成交。解法是下一根 K 棒成交:收盤時下決定,下一根開盤時成交。單根 K 棒檢查:讓策略比訊號晚一根 K 棒成交再跑一次;若結果崩潰,代表規則讀到了未來。

你的軟體是否顯示轉倉調整、是否支援每邊滑價、能否強制下一根 K 棒成交,最好在看任何結果之前就弄清楚;回測軟體比較中的六項檢查,說明了該看什麼。

兩列各五根日 K 棒,訊號出現在第 3 根的收盤:錯誤的一列在同一個收盤價成交,正確的一列在第 4 根的開盤價成交,兩個價格的差距,就是同一根 K 棒回測憑空產生的獲利 在下一根成交 收盤決定,下根開盤成交 訊號 成交 同一根 下一根 差距 差距是沒人拿得到的獲利。 所以:一律在下一根成交。
在某根 K 棒收盤下決定的規則,在下一根 K 棒成交。兩個價格的差距,就是同一根 K 棒回測憑空產生的獲利。

檢查 4:樣本內與樣本外資料該怎麼切分?

依時間切分,只在較早的部分調整,在較晚的部分原封不動執行規則,並保留最後一段近期 K 棒,在最後一次檢驗前誰都不去碰。樣本內(IS)資料是用來選規則與設定的那部分歷史。樣本外(OOS)資料是留在一旁,只用來執行完成的規則並讀取結果的那部分。讀書用的教材,和考試的試卷必須是不同的頁面。

  1. 在第一次執行之前就決定切分日期並寫下來。常見的比例,是約 70% 樣本內、約 20% 樣本外,最近的 10% 保留給最後一次檢驗。
  2. 確認兩邊都含有趨勢、盤整與波動大的區段。若樣本外的幾年是一路上漲,單純做多的規則就會因錯誤的原因通過。
  3. 計算樣本外的交易筆數,而不是年數;檢查 7 會說明原因。
  4. 讀過樣本外結果後,所有設定都要固定下來。只要改了設定,那段資料就成了調整的一部分,這次檢驗就用掉了。

樣本內結果應保留多少、結果較弱但沒壞時該怎麼辦,請見樣本內 vs 樣本外的切分方式。

2019 至 2025 年依時間排序的一段歷史,切成三個區塊:樣本內約 70%,可看任意多次;樣本外約 20%,只看幾次;保留的最後一塊約 10%,只檢驗一次 三個區塊,三種用途 一段歷史,依時間切分 2019 2025 樣本內:可多次檢視 樣本外:少次檢視 保留:只看一次 每看一次新資料就用掉一次。 所以:先固定設定,再檢驗。
同一段依時間排序的歷史分成三個區塊、三種用途、三種檢視額度:多次、少次、一次。

檢查 5:推進效率多少才算通過?

推進效率,是樣本外每單位時間的獲利,除以樣本內每單位時間的獲利;約一半或更高的數字,是常見的通過門檻,要在執行前寫下,並以所有視窗合計判讀,而不是只看最好的那一個。推進分析是一種檢驗:在一個歷史視窗調整設定,原封不動套用到緊接的下一個視窗,兩個視窗一起往前移動並重複,直到接起來的樣本外片段形成一份完整結果。它把一次切分變成多次切分,並從同一份資料產生更多樣本外交易。

除以時間,兩邊才能比較:三年的樣本內視窗與一年的樣本外視窗,無法用總獲利比較。Pardo(2008)描述了這個比率;許多系統化交易人以約 50% 作為下限。要讀的是所有視窗合計的數字。單一視窗表現弱屬正常,因為市場在視窗之間會變。合計數字遠低於門檻、正負號在視窗之間來回翻轉,或結果只存在於一個視窗,都算未通過。

假設性範例

五個滾動視窗。每個樣本內視窗每年賺約 100 單位。樣本外視窗每年賺 60、45、70、20 與 55 單位,因此效率分別為 60%、45%、70%、20% 與 55%。合計起來,500 單位中有 250 單位保留,即 50%,符合執行前寫下的 50% 通過門檻。第四個視窗單獨看會未通過;合計數字則通過。

五個視窗的假設性推進分析:每個樣本內視窗每年賺約 100 單位,樣本外視窗每年賺 60、45、70、20 與 55,效率分別為 60%、45%、70%、20% 與 55%;合計後 50% 保留,符合執行前寫下的通過門檻 要看合計數字 假設性,五個滾動視窗 樣本內 樣本外 60% 45% 70% 20% 55% 50%門檻 合計 50%:單一弱窗無妨。 所以:看全部視窗,不看最好的。
各視窗的推進效率,與執行前設定的通過門檻。要看合計數字,而不是最好的視窗。

視窗長度、需要多少個視窗,以及如何解讀接起來的曲線,請見推進分析。

檢查 6:蒙地卡羅與參數壓力測試,比單一條權益曲線多提供什麼?

一條權益曲線只是交易的一種排列,也只是參數網格上的一個點;打亂交易順序,能看出回撤原本可能多深,把每個設定上下移動,能看出結果落在高原還是尖峰上。你看到的曲線只是一次發牌。同樣的 200 筆交易換一種順序發牌,淨損益相同,最糟的回撤卻不同。

蒙地卡羅檢驗,是把交易明細重新排序或重新抽樣許多次,記錄每個新序列的最大回撤,得到的是一個範圍而不是單一數字。任何一份交易明細,都可以用免費的交易用蒙地卡羅模擬器跑一次;歷史回撤通常落在這個範圍中較樂觀的一側,原因見蒙地卡羅回測。可行的通過規則要事先寫下:95% 的洗牌結果都不會超過的回撤,必須是你要交易的帳戶承受得起的。

檢查 7 所述 ES 回測的蒙地卡羅報告。請看回撤分布的右尾,比單一歷史交易順序產生的回撤延伸了多遠。
檢查 7 所述 ES 回測的蒙地卡羅報告。請看回撤分布的右尾,比單一歷史交易順序產生的回撤延伸了多遠。ES · 日 K 棒 · 2019-01-02 至 2025-06-30 · CPU 引擎回測

參數壓力測試,是把每個設定從選定值向上與向下移動幾步,再重跑策略。回看期 20 有效、而 18 與 22 接近零,就是尖峰:這個設定描述的是那段歷史裡的雜訊。回看期 20 的鄰近值從 16 到 26 表現都相近,就位於高原,高原才值得保留。滑價加倍、起始日期位移幾個月,也屬於同一項檢查。

回看期設定從 10 到 30 的假設性淨損益,選定 20:左側是高原,20 的鄰近值賺得差不多,可以保留;右側是尖峰,只有 20 有效、18 與 22 接近零,應予剔除 保留高原 回看期的假設性淨損益 高原 保留 尖峰 剔除 10 20 30 10 20 30 鄰近值也好,設定才可靠。 所以:把每個設定上下移動。
高原與尖峰的比較。穩健的設定,鄰近值與它一致;只在單一數值有效的設定,描述的只是過去。

檢查 7:回測需要多少交易筆數?要事先設定哪些門檻?

平均每筆損益的不確定性,隨交易筆數的平方根縮小,因此只有幾十筆交易的執行只是線索,不是結果;每一個通過/未通過的數字(交易筆數、效率、回撤、成本後獲利因子)都必須在搜尋前寫下,結果才無法移動合格標準。由十幾筆交易算出的平均值,換掉三筆交易就會大幅移動;由數百筆算出的平均值,幾乎不動。

平均損益的不確定度 = 各筆交易的離散程度 ÷ √N

其中單筆交易的離散程度是一般交易偏離平均的程度(標準差),N 是交易筆數,√N 是它的平方根。交易筆數變為四倍,不確定性減半。

假設性範例

平均每筆損益為 1,000 單位,單筆交易通常偏離該平均 4,000 單位。41 筆交易時,不確定性約為 4,000 ÷ 6.4 ≈ 625 單位,因此真實的平均值可能遠低於 1,000。160 筆時約為 316 單位;640 筆時約為 158 單位。只有較大的兩個樣本,才讓平均值明顯遠離零。

假設性的平均每筆損益,單筆交易的離散程度是平均值的四倍:不確定性在 41 筆交易時約為正負 625 單位,160 筆時為 316,640 筆時為 158,因此交易筆數變為四倍,不確定性減半 交易越多,疑慮越少 假設:平均每筆相同 41 筆 160 筆 640 筆 ±625 ±316 ±158 0 平均 筆數 4 倍,範圍減半。 所以:目標是數百筆交易。
同一個平均每筆損益搭配三種交易筆數。誤差線隨筆數的平方根縮小,因此 41 筆說明的遠少於 640 筆。

通過門檻要在搜尋前寫下。許多系統化交易人使用的範例值如下:

門檻範例通過門檻原因
已完成交易合計數百筆;樣本外少於 30 筆只算線索低於此數,平均每筆損益不穩定
推進效率,合計50% 或更高重新選定設定後,樣本內優勢仍保留一半
成本後獲利因子1.3 或更高獲利因子是總獲利除以總虧損;接近 1 的數值只是成本與雜訊
蒙地卡羅回撤第 95 百分位數落在帳戶可承受範圍內歷史回撤只是一次發牌
參數鄰近值兩側各兩步,正負號相同高原,而不是尖峰

下面這次執行說明了,為什麼交易筆數的影響這麼大。AlphaPrime 對 ES 日 K 棒執行了一次搜尋,期間 2019-01-02 至 2025-06-30,多空皆做,一口,每筆交易收取 $20 手續費與 $25 滑價。規則是替代用的,並非本文主題:以效率比率(Efficiency Ratio)規則作為唯一的進場與出場,沒有停損、停利與濾網。所示的候選策略,是搜尋嘗試的 1,024 個中留下的那一個,因報酬相對回撤而被選中;事後挑出留下的那一個會美化它,這些數字描述的是一條過去的路徑,不代表這個規則能賺多少,也不是讀者可以預期的結果。

來源:AlphaPrime 產品引擎(CPU),2026-10-31 執行。ES 日線,2019-01-02 至 2025-06-30,多空都做,1 口,每筆手續費 $20、滑價 $25。

數字結果
淨損益(已平倉交易)$50,967.5
最大回撤$19,100
交易筆數41
勝率56.1%
獲利因子2.107
平均每筆損益$1,243.11
持倉時間占比15.84%
同一次執行的權益曲線,並標出樣本外區段。請搭配上方方框中的交易筆數一起讀,不要只看形狀。
同一次執行的權益曲線,並標出樣本外區段。請搭配上方方框中的交易筆數一起讀,不要只看形狀。ES · 日 K 棒 · 2019-01-02 至 2025-06-30 · CPU 引擎回測

先看交易筆數:約六年半只有 41 筆交易。依上面的公式,41 筆讓 $1,243.11 的平均每筆損益帶有相當大的誤差範圍,而 $50,967.5 的淨損益與 $19,100 的最大回撤,只是這 41 筆交易的一種序列。對照事先寫下的數百筆通過門檻,這個候選策略是一條線索,值得帶進視窗更多或 K 棒週期更短的推進分析,而不是可以拿來交易的結果。

為什麼搜尋中最好的回測,仍然要通過七項檢查?

留下的候選策略是多次嘗試中最好的一個,帶有選擇加成,只有未見過的資料與事先寫下的門檻才能把它扣除;而單獨通過的策略,還必須與你已經在交易的其他策略一起檢驗。選擇加成,是搜尋中最好的回測裡,來自搜尋本身、而不是來自規則的那一部分。

給 1,024 個人各一枚硬幣,請每人擲十次。大約有一個人會擲出十次正面,而這個人並沒有任何技巧。上面 ES 的執行,是 1,024 次嘗試中留下一個候選策略,因此結果有一部分就是這種加成,而樣本內的數字無法說明有多少。Bailey、Borwein、López de Prado 與 Zhu(2014)指出,即使每個規則都是雜訊,搜尋中預期的最佳回測仍會隨嘗試次數上升;Harvey 與 Liu(2015)則提出,依結果背後的檢定次數折減結果。影響有多大、背後有哪些研究,請見回測過度最佳化。

規則全是純雜訊的回測結果,圍繞零排序:約一千次嘗試中最好的一個遠在零的右側,10 次嘗試中最好的一個靠近零,因此嘗試次數決定選擇加成的大小 嘗試越多,最好的越幸運 這裡每個規則都是純雜訊 最佳 最佳 多次嘗試 10 次嘗試 0 多次嘗試中最好的,部分是運氣。 所以:用未見過的資料來判斷。
即使每次嘗試都是雜訊,1,024 次嘗試中最好的一個仍遠在右側;10 次嘗試中最好的一個靠近零許多。嘗試次數決定加成的大小。

這就是檢查 4 至 7 存在、且它們的門檻要先寫下的原因:未見過的資料不帶有這種加成,事先寫下的門檻也無法為了配合結果而移動。七項之後還有一道關卡。單獨通過的策略,只有與你已在交易的策略合併後,才會改變你的帳戶;兩個策略若在同幾週一起虧損,回撤就會相加。如何衡量,請見投資組合回測。

下一步:取一個你正在考慮的策略,把它的七條通過門檻連同今天的日期寫在一頁紙上,在再次查看它的權益曲線之前,先對它的資料執行檢查 1。

常見問題

實單交易前應該檢驗什麼?

先檢查輸入:調整過的轉倉與乾淨的 K 棒、每筆交易都計入的手續費與滑價,以及下一根 K 棒成交。接著在規則從未見過的資料上檢驗:依時間排序的樣本外區段、合計效率約一半或更高的推進分析、蒙地卡羅回撤範圍,以及參數高原。最後確認交易筆數達數百筆,且每一條通過門檻都是在執行前寫下的。

回測需要多少交易筆數才可信?

多到幾筆交易改變時,平均每筆損益也不會大幅移動。平均值的不確定性隨交易筆數的平方根縮小,因此筆數變為四倍,不確定性減半。許多系統化交易人希望合計有數百筆交易,並把樣本外少於約 30 筆視為只是線索。較短的 K 棒週期或推進分析的設計,能從同一段歷史產生更多交易。

推進效率多少才算通過?

推進效率,是樣本外每單位時間的獲利除以樣本內每單位時間的獲利。所有視窗合計約 50% 或更高,是常見的通過門檻。單一視窗表現弱屬正常,因為市場會變;合計數字遠低於門檻,或樣本外獲利只存在於單一視窗,則算未通過。門檻要在執行前寫下。

怎麼避免回測過度最佳化?

相對於交易筆數,要讓調整的設定數量保持少;從第一次執行就計入成本;只用搜尋從未接觸過的資料來判斷。鄰近值表現相近的設定,優於單獨突出的某一個數值。記住,多次嘗試中最好的候選策略帶有選擇加成,所以每條通過門檻都要在搜尋前設定,並套用在樣本外與推進分析的結果,而不是樣本內曲線。

參考文獻

  • Pardo, R. (2008). The Evaluation and Optimization of Trading Strategies (2nd ed.). John Wiley & Sons.
  • 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.
  • Harvey, C. R., & Liu, Y. (2015). Backtesting. The Journal of Portfolio Management, 42(1), 13–28.