點選右邊主選單查看更多資訊

樣本外測試與滾動前進分析:怎麼知道回測是真的,還是過度最佳化

一分鐘看懂

過度最佳化(Curve Fitting)是把參數調到最符合過去的走勢,結果只是貼合了過去的雜訊,到了未來就失靈。避免的方法是把資料切開:前段用來找參數(樣本內),後段完全不碰、最後才拿來驗證(樣本外)。滾動前進分析(Walk-Forward)則是反覆做這件事:用過去幾年找參數、測下一年,再往前滾。用加權指數十年資料實測,2016~2021 年 31 組均線參數裡排第 1 名的組合,到了 2022~2026 年只排第 23 名。

回測軟體幾乎都有「最佳化」功能:把參數從 5 跑到 60、每次加 5,全部組合跑一遍,挑出績效最好的那一組。按一個鍵,報告就變得很漂亮。

問題是,參數越多、試的組合越多,越容易找到一組「剛好」符合過去走勢的參數。它在過去看起來最好,不代表它抓到了什麼規律,可能只是運氣。

用真實資料測一次

策略:加權指數,快線在慢線上方就做多,否則空手,每次進出扣 2 點成本。測試 31 組均線參數(快線 5、10、20、30、40 日,慢線 20 到 240 日)。

第一步:用 2016 年 10 月到 2021 年底找參數(樣本內)

依夏普值排名,前五名:

樣本內排名快線/慢線樣本內夏普值樣本外夏普值(2022~2026)
140/601.111.12
220/600.971.19
340/900.951.26
420/400.940.97
520/900.861.23

第二步:拿同樣的參數,跑 2022 年到 2026 年 10 月(樣本外)

樣本內第 1 名的 40/60,到了樣本外,夏普值 1.12,在 31 組裡排第 23 名,比 31 組的中位數 1.22 還低。樣本外表現最好的反而是 5/20(1.34)和 30/120(1.33),它們在樣本內只排中間。

最佳化找出來的「最好的參數」,在沒看過的資料上只是中下水準。

滾動前進分析:每年重新找參數

更接近實際操作的做法,是每年用過去 3 年的資料重新找最佳參數,再拿來交易下一年:

測試年份用前 3 年選出的參數這一年的損益固定用 20/60一直抱著不動
202040/902,1253,3962,735
202140/602,9641,8103,486
20225/20−412−1,434−4,081
202320/408552,2703,793
202440/902,9473,7955,104
202530/1205,7486,6665,928
2026(到 10/30)5/6015,07313,65516,248
合計29,30030,15833,213

每年重新最佳化,合計 29,300 點;固定用一組普通的 20/60,不做任何最佳化,合計 30,158 點,反而稍微多一點。

這段期間台股大多頭,一直抱著不動賺最多。均線策略的價值在 2022 年這種空頭年:抱著不動虧 4,081 點,均線策略只虧幾百到一千多點。

從這次測試看出三件事

觀察意思
樣本內第一名,樣本外排第 23單一最佳參數不可靠
大部分參數在樣本外的夏普值都在 1 到 1.3 之間這個策略賺錢的原因是「多頭時持有」,跟參數關係不大
每年重新最佳化沒有比固定參數好頻繁調參數不一定有幫助

第二點最重要。如果換了參數,績效就天差地遠,代表策略很脆弱;如果一大片相鄰的參數表現都差不多,代表策略抓到的是比較穩定的東西。挑參數時,挑在「一片都不錯的區域」中間,比挑那個最高點安全。

避免過度最佳化的做法

做法說明
留一段資料完全不碰至少留 20%~30% 的資料,到最後才拿來驗證一次
參數越少越好每多一個參數,可以「貼合」過去的空間就多一倍
看參數高原,不看最高點相鄰參數表現都不錯,才是穩的
交易次數要夠多只有十幾筆交易,任何統計都不可靠
驗證失敗就換策略不要回頭改參數讓樣本外變好看,那等於把樣本外也用掉了

做最佳化之前先做這三件事

  1. 先切資料:決定哪一段是樣本外,寫下來,在最後驗證之前都不去看它的績效。
  2. 限制參數數量:一個策略最好不超過兩三個要最佳化的參數。
  3. 畫出參數地圖:把每組參數的績效列成表,看最好的那組旁邊是不是也不錯。

回測報告的各項指標怎麼解讀,可以看回測報告怎麼看。回測程式怎麼寫,可以看Python 回測怎麼寫。程式交易的整體流程在期貨程式交易怎麼開始。

分享你的喜愛
我愛期貨
我愛期貨
文章: 66