MT5 策略驗證:訓練、樣本外、鎖定三段,把優化冠軍拿去考沒看過的年份

策略測試器的優化,會依你選的標準(例如最後餘額)從一堆參數裡排出第一名。問題是它排名時已經看過答案:同一段資料拿來挑參數又拿來打分數,成績容易偏好看。這篇把歷史切成三段,用一段挑參數,另外兩段考試,看冠軍在沒看過的年份還站不站得住。

範例沿用均線交叉下單的 MaCrossTrade.mq5(快慢 EMA 交叉進場、ATR 倍數停損停利、固定 0.10 手),程式一行沒改。商品 EURUSD、H1,報價模式「1分鐘OHLC」。先講結論:訓練段的冠軍,在樣本外和鎖定段兩段都賠錢。

1. 為什麼要切三段

  • 訓練段:拿來優化、挑參數。
  • 樣本外:冠軍參數凍結後第一次考試。
  • 鎖定段:最後一關,只考一次。樣本外考完,人總會想回頭調參數;鎖定段完全不碰,留到最後才用,調過的版本也只能在這裡考一次。

MT5 測試器設置頁的前向測試只切一刀(一段優化、一段前向),前向結果就列在優化結果旁邊,看完很容易回頭改參數。三段切法多留一段完全不碰的資料,這是兩者最大的差別。

測試器也沒有自動「滾動」的功能(每隔一段重新優化、往前推)。這篇只做一次切分,嚴格說是單次前推,不是滾動式的 Walk-Forward。

2. 開跑前先把規則寫死

挑參數的方法如果是看完結果才決定的,三段切得再漂亮也沒用。所以開跑前先寫一份登記,存進版本控制,之後不改:

  • 網格:快線 5~20、慢線 20~60、停損 1~3 倍 ATR、停利 2~4 倍 ATR,共 180 組,完整算法、優化標準「最大本日餘額」。
  • 選冠軍:交易筆數至少 100、獲利因子大於 1 的組合裡,淨利最高的那組。
  • 通過條件:樣本外和鎖定段的獲利因子都要大於 1.2、各至少 30 筆,而且樣本外的獲利因子不能低於訓練段的 6 成。

三段的日期這樣切:

段期間用途
訓練2019-01~2021-12挑參數
樣本外2022-01~2023-12第一次考試
跳過2024-01~2025-06已經看過
鎖定2025-07~2026-09只考一次
時間軸:訓練 2019.01~2021.12、樣本外 2022.01~2023.12、跳過 2024.01~2025.06、鎖定 2025.07~2026.09,冠軍獲利因子依序 1.12、0.90、不測、0.83
色塊長度按月數;下方是冠軍在各段的獲利因子

訓練段從 2019 年開始,是因為我這家券商 2018 年的歷史資料不夠細。同一隻 EA 拿 2018 年整年來跑,報告只有 258 根 H1 K 線、1032 個報價(每根 4 個),「質量歷史」0%;樣本外兩年則有 12431 根。一年的 H1 只剩兩百多根,幾乎是一天一根,H1 策略用這種資料回測沒有參考價值。

跳過的那一年半,是之前用同一隻 EA、同一組網格優化過的期間。看過的資料不能再當作沒看過,所以鎖定段改用之後的 15 個月。另外,測試器的結束日期是當天 0 點,不含那一天:樣本外實際測到 2023-12-30,鎖定段測到 2026-09-29。

3. 訓練段:180 組選出冠軍

訓練段 180 組裡,快線等於慢線的 9 組一筆都不會交易;賺錢的有 41 組。照登記的規則,冠軍是快線 20、慢線 40、停損 3 倍 ATR、停利 4 倍 ATR:三年 353 筆、淨利 +723.33、獲利因子 1.12。這組剛好也是 180 組裡淨利最高的,合格條件沒有排掉更好的組合。

執行時出了一個小差錯:登記要求冠軍先存進版本控制再考樣本外,結果那次存檔的指令失敗了,樣本外先跑了。冠軍是程式照規則從訓練結果選出來的,選出的時間早於樣本外開跑,參數沒有因此改動;補存之後,後面每一步都先確認存檔成功才往下做。

4. 考試:樣本外與鎖定段

冠軍參數凍結後,各段都從入金 10,000、空倉重新開始,各跑一趟:

段筆數淨利/獲利因子
訓練353+723.33/1.12
樣本外296−667.43/0.90
鎖定155−468.63/0.83

兩段考試都賠錢,獲利因子 0.90 和 0.83 都在 1 以下,離 1.2 的門檻很遠:判定不通過。筆數(296、155 筆)和「質量歷史」(99%、100%)都達到登記的門檻。

淨利已經扣掉點差、手續費和隔夜利息。把樣本外的成交表逐筆加起來:手續費 −177.60、隔夜利息 −39.23,扣這兩項之前的成交損益是 −450.60;鎖定段是 −93.00、−10.93、−364.70。點差已經算在成交價裡,拆不出來;但不計手續費和隔夜利息,兩段也一樣賠錢。

樣本外已經不過,照理可以停在這裡;鎖定段還是照登記跑了,判定用的單趟只跑這一次,結果一樣是賠錢。

5. 換個角度看:冠軍其實排在哪

判定寫下之後,才拿其他資料做對照,這些都不影響結論:

  • 樣本外整個網格:同樣 180 組在 2022~2023 年只有 8 組賺錢(另有 9 組沒交易),訓練冠軍排第 78 名。訓練段賺錢的 41 組裡,到樣本外還賺錢的剩 6 組;樣本外至少 30 筆的組合,獲利因子最高 1.13,沒有一組過 1.2。
  • 樣本外最賺的那組(快線 20、慢線 50、停損 3、停利 3)在訓練段排第 23 名,照登記的規則事前挑不到它。
  • 全段一起優化:把 2019 到 2026 年 9 月全部丟進去優化,180 組只有 3 組賺錢,第一名獲利因子也只有 1.02(898 筆、+323.35),就是上面樣本外最賺的那組。訓練冠軍放在全段是 −597.30。
  • 換報價模式:冠軍改用「每次報價」重跑兩段,筆數相同,獲利因子 0.90、0.83,跟「1分鐘OHLC」幾乎一樣。這兩種模式都是從 1 分鐘資料模擬報價,真實報價模式沒有測。

全段第一名就是樣本外最賺的那組。全段本來就包含樣本外那兩年,在其中一段特別好的組合,加總起來也容易排在前面。拿全段優化的第一名當成「這個策略最好的設定」,等於用考試答案回頭挑參數。

6. 這個結果能說明什麼

照登記選出的冠軍沒有通過。整個網格看,訓練段賺錢的 41 組到樣本外只剩 6 組還賺錢,也沒有一組達到 1.2 的門檻:這個均線交叉策略在 EURUSD H1 上,這組網格裡沒有參數達到事先定的通過門檻。

結論的範圍只到這裡:只測了一個商品、一個週期、一種切法。不代表均線交叉在其他商品或週期上一定沒用;反過來,就算某組通過了三段,也還要檢查是不是靠一兩筆大單撐起來、換個商品還成不成立,這些檢查本文沒做。

三段驗證最有用的地方,是把「挑參數」和「打分數」分開。只要在動手前把規則寫死、鎖定段只碰一次,不通過的結果至少是可信的,不會被事後的調整蓋過去。

本篇檔案:MaCrossTrade.mq5 放 MQL5\Experts\,在 MetaEditor 打開按 F7。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料。