一分鐘看懂
過度最佳化(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) |
|---|---|---|---|
| 1 | 40/60 | 1.11 | 1.12 |
| 2 | 20/60 | 0.97 | 1.19 |
| 3 | 40/90 | 0.95 | 1.26 |
| 4 | 20/40 | 0.94 | 0.97 |
| 5 | 20/90 | 0.86 | 1.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 | 一直抱著不動 |
|---|---|---|---|---|
| 2020 | 40/90 | 2,125 | 3,396 | 2,735 |
| 2021 | 40/60 | 2,964 | 1,810 | 3,486 |
| 2022 | 5/20 | −412 | −1,434 | −4,081 |
| 2023 | 20/40 | 855 | 2,270 | 3,793 |
| 2024 | 40/90 | 2,947 | 3,795 | 5,104 |
| 2025 | 30/120 | 5,748 | 6,666 | 5,928 |
| 2026(到 10/30) | 5/60 | 15,073 | 13,655 | 16,248 |
| 合計 | 29,300 | 30,158 | 33,213 |
每年重新最佳化,合計 29,300 點;固定用一組普通的 20/60,不做任何最佳化,合計 30,158 點,反而稍微多一點。
這段期間台股大多頭,一直抱著不動賺最多。均線策略的價值在 2022 年這種空頭年:抱著不動虧 4,081 點,均線策略只虧幾百到一千多點。
從這次測試看出三件事
| 觀察 | 意思 |
|---|---|
| 樣本內第一名,樣本外排第 23 | 單一最佳參數不可靠 |
| 大部分參數在樣本外的夏普值都在 1 到 1.3 之間 | 這個策略賺錢的原因是「多頭時持有」,跟參數關係不大 |
| 每年重新最佳化沒有比固定參數好 | 頻繁調參數不一定有幫助 |
第二點最重要。如果換了參數,績效就天差地遠,代表策略很脆弱;如果一大片相鄰的參數表現都差不多,代表策略抓到的是比較穩定的東西。挑參數時,挑在「一片都不錯的區域」中間,比挑那個最高點安全。
避免過度最佳化的做法
| 做法 | 說明 |
|---|---|
| 留一段資料完全不碰 | 至少留 20%~30% 的資料,到最後才拿來驗證一次 |
| 參數越少越好 | 每多一個參數,可以「貼合」過去的空間就多一倍 |
| 看參數高原,不看最高點 | 相鄰參數表現都不錯,才是穩的 |
| 交易次數要夠多 | 只有十幾筆交易,任何統計都不可靠 |
| 驗證失敗就換策略 | 不要回頭改參數讓樣本外變好看,那等於把樣本外也用掉了 |
做最佳化之前先做這三件事
- 先切資料:決定哪一段是樣本外,寫下來,在最後驗證之前都不去看它的績效。
- 限制參數數量:一個策略最好不超過兩三個要最佳化的參數。
- 畫出參數地圖:把每組參數的績效列成表,看最好的那組旁邊是不是也不錯。
回測報告的各項指標怎麼解讀,可以看回測報告怎麼看。回測程式怎麼寫,可以看Python 回測怎麼寫。程式交易的整體流程在期貨程式交易怎麼開始。