回測與驗證 beginner 13 分鐘閱讀

MT5 回測怎麼做(以及報告上那兩個回撤數字該相信哪一個)

MT5 回測從打開策略測試器開始:挑好會左右答案的資料與設定,按下 Start,然後把報告讀懂,而不是讀成自己想要的樣子。這裡把一次完整執行的輸入與輸出並排引出來,也把幾乎沒有人核對的那個數字講清楚——在本站已公開的 23 次執行裡,權益回撤每一次都比餘額回撤更深。

發佈於 · 審閱於

你在 MT5 裡跑一次回測的方式是:用 View > Strategy Tester(或 Ctrl+R)打開策略測試器,選好 EA、商品、時間週期、日期區間與建模模式,然後按下 Start。五分鐘後你手上就有一份報告。真正棘手的問題不是怎麼走到那一步——而是報告上那些數字,哪一個真的是你以為的那個意思。

這份指南把兩半都做完:操作流程,以及讀法。這一頁的證據來自讀法那一半,因為我們手上有 23 次跑完的執行,而它們的報告會用一種幾乎沒有人去核對的方式自相矛盾。

一次執行跑完之後你手上有什麼

產物是一份分成兩半的報告:結果區塊(交易筆數、獲利因子、回撤、淨利)以及它背後的交易清單。兩半都重要,而被引用的永遠只有第一半。

你在結束時應該能說出口的,不是「它賺了 $3,023」。而是:*這一組規則,在這個商品與這個時間週期上,在這段區間裡,用這個 tick 模型,在一個 $10,000 的帳戶上,做出了這麼多筆交易,獲利因子是這個數字,而在最糟的時候曾經被埋在水面下這麼深。*這句話裡的每一個子句都是你選的一項設定,改掉其中任何一項都會改變答案。這也是為什麼設定在這裡排在流程前面。

設定:決定答案的資料與參數

以下是我們自己跑過並且公開過的一次真實執行,把輸入與輸出並排引出來,讓你可以同時握住兩邊。它就是 Stillwater 背後的那份紀錄——一支只做多的美元/日圓策略,跑在 5 分鐘圖上。

設定這次執行為什麼這樣設
Expert(EA)Stillwater(19 個輸入參數)報告被驗證過帶著的每一個輸入——也就是你要重現它就得重新輸入一次的那整片表面
Symbol(商品)USDJPY_DUKA一個專用的 tick 歷史商品,和實時報價的那個分開放,好讓這次執行可以重跑
Period(時間週期)M5規則評估所在的那張圖;趨勢濾網是在 EA 內部讀 M30 的
日期區間2019-01-01 → 2026-07-017.5 年,長到足以裝下不只一種市場狀態
Modelling(建模模式)Every tick based on real ticks (Model 4)任何在日內完成交易的東西,都需要 K 棒內的路徑被量測,而不是被插值
Deposit(初始資金)10,000 USD這裡每一次執行都固定,好讓回撤百分比彼此可比
Leverage(槓桿)請求 1:500 — 實際跑在 1:100見下文。這一項並不是它表面看起來的樣子
Optimisation(最佳化)停用單獨一輪。搜尋參數是另一件工作,有另一組陷阱

上面有兩列,值得比一個表格欄位更多的篇幅。

資料品質是整份結果所依靠的那一項設定。報告裡其他每一個數字,都是在測試器所用的價格序列之上算出來的,所以建模品質這個數字,界定了報告的其餘部分到底有多少是在講你的策略。上面那次執行公開的紀錄寫著:在 2.29 億筆真實 tick 上達到 100% 歷史品質,直接讀自測試器的報告。一次跑在插值 K 棒資料上的執行,產生的會是一組不同的交易,而不只是不同的成交價——測試器假定它已知的價格之間是一條平滑路徑,而一支停損很緊的策略,交易的正是這個假設。如果你還沒讀過你的終端機對這個商品實際持有多少 tick 資料,那是策略之前第一件要檢查的事。

槓桿欄位是一個請求,不是一項設定。在手上全部 23 次執行裡,測試器被要求 1:500,而測試是在 1:100 下跑完的——23 次裡有 0 次讓被請求的數字生效。這不是把欄位讀回來猜出來的:它是靠量測一筆部位在測試裡實際佔用的保證金 126.39 USD 釘死的,而這個數字對得上槓桿 100 的算法,對不上槓桿 500 的。實務上的後果是,一個對保證金敏感的設計——網格、馬丁格爾,任何會疊部位的東西——可能在一個它永遠不會遇到的槓桿下通過回測,或在一個它本來不會使用的槓桿下失敗。請拿報告裡的保證金數字去對你自己的算術,而不是相信你打進那個框裡的值。

逐步操作:在 MT5 裡跑這次測試

  1. View > Strategy TesterCtrl+R)打開策略測試器。面板會停靠在終端機下方,分頁是 SettingsInputsAgentsJournal
  2. Settings 分頁選擇 EA,接著選 SymbolPeriod。挑你真的會拿去交易的那個商品——規格、而不只是價格,是從它來的,而同一組貨幣對在同一家經紀商的不同變體之間,合約規模與保證金規則並不一樣。
  3. 設定日期區間。用一個帶明確 From 與 To 日期的自訂期間,不要用「上個月」,這樣只讀你報告的人也能重現這次執行。
  4. Modelling 模式。任何日內策略都用 Every tick based on real ticks;比較慢的系統可以用從 M1 K 棒產生的 Every tick;更粗的模式是拿來掃參數的,絕對不要用在你要公開的數字上。
  5. 設定 Deposit、幣別與槓桿,第一輪先讓 Optimisation 保持停用。記下你要求的槓桿——你要拿報告裡的保證金數字去驗證它,而不是假設它生效了。
  6. 打開 Inputs 分頁,把每一個值都讀過。這正是那個會默默帶著上一次執行改動的分頁,也正是為什麼我們的紀錄是拿跑完的報告去核對輸入,而不是拿我們以為載入的那個檔案。這一組裡有一次執行帶著 362 個輸入參數。
  7. Start。除非你正在除錯進場邏輯,否則把 Visual mode 關掉——它慢得多,而且會誘惑你去看,而不是去量。
  8. 跑完之後,打開 ResultsGraphBacktest 分頁,然後在報告裡按右鍵把它存下來。之後你會拿去比對的是存下來的報告,不是資金曲線的截圖。
  9. 把終端機的 build 版本連同結果一起記下來。我們這 23 次執行橫跨 build 6090 與 6140;同一支策略在不同 build 下跑的兩次,不會自動算是同一個實驗。
  • 先查這個商品實際持有多少歷史
  • 依照持倉時間長短挑建模模式
  • 設定商品、時間週期與一段明確的日期區間
  • 把 Inputs 分頁上的每一個值都讀過
  • 在停用最佳化的情況下跑一輪
  • 存下報告,不是截圖
  • 先讀兩條回撤,再讀獲利那一行
這些決定必須依照的順序——資料在設定之前,設定在執行之前

讀結果:報告上的數字實際上在說什麼

拿同一次執行的輸出來看。回來的是這些:

結果數值在你繼續之前它得先通過什麼
交易總筆數416多到足以讓平均值描述的是一個樣本,而不是一則軼事
獲利因子1.28高於 1.0,而且高出的幅度撐得過你沒有建模的那些成本
淨利3,023.01 USD建立在 10,000 的初始資金上——這是報酬,不是分數
餘額回撤5.82%(747.57)已平倉交易的最糟一段下跌
權益回撤6.11%(787.60)把未平倉部位算進去的最糟一段下跌——也就是你當時真的會盯著的那一個
勝率60.82%單獨看沒有意義;要對照停損與目標來讀,這裡是 100 與 200 pips
測試條件
實驗編號EXP-BACKTEST-RUNBOOK-001
執行編號stillwater__gate_v2_duka_realticks__2019-01-01_2026-07-01
MT5 build 版本6140
合約規格Exness-MT5Trial5
商品 / 時間週期USDJPY_DUKA M5
期間2019-01-01 – 2026-07-01
模型Every tick based on real ticks (Model 4)
初始資金10,000 USD
請求的槓桿1:500
實際生效的槓桿1:100
測量日2026-08-23
最後驗證2026-08-25

那份報告裡有三件事經常被讀錯。

兩條回撤是兩個不同的問題。餘額回撤量的是已平倉交易的權益曲線;權益回撤把還開著的部位上的浮動損益也算進去。在我們這 23 次執行裡,權益那一條每一次都比較深,而差距有多大並不能從策略的描述推出來:最窄的一次是 0.04 個百分點(0.67% 對 0.71%),最寬的一次是 11.10 個百分點(14.52% 對 25.62%,比值 1.76)。收得快的策略差距小。抱著逆向走勢一路坐下去的策略差距大——而那正好就是你在投錢之前最需要知道它回撤有多深的那一種策略。

23 次(共 23 次)權益回撤比餘額回撤更深的已公開執行次數
11.10 個百分點單次執行裡兩條回撤之間最大的差距——14.52% 對 25.62%
0 次(共 23 次)測試器被要求的槓桿真的就是測試實際跑在的槓桿的執行次數

MT5 會把每一條回撤印兩次,用的是兩種定義Maximal 回撤量在金額最大的那一刻;Relative 量在百分比最大的那一刻。它們是同一次執行裡的不同時刻,所以這兩個數字並不是同一個事件的兩種看法。我們的執行裡有 16 次記錄在 Maximal 定義下,5 次記錄在 Relative 下——而寫下這些紀錄的流程會拒絕把一個 Maximal 的餘額數字和一個 Relative 的權益數字配成一對,因為同時秀出兩者的頁面,比的是兩個不同的瞬間。你引用一條回撤的時候,請把定義一起講出來。

報告自己的合計值是四捨五入過的,而它的區間也可能不是你想講的那個區間。拿已公開的交易清單重算,同一次執行的獲利因子是 1.2843,而不是報告上的 1.28——在這裡無害,但當你在比較兩個差在小數點後三位的候選時就不無害了。更重要的是,那次 416 筆交易的執行,會拆成 2026-04-01 公開截止日之前的 404 筆與之後的 12 筆。後面那 12 筆跑出來的獲利因子是 2.3317。兩個數字都沒有錯;它們回答的是不同的問題,而那個截止日是一個人挑的日期,不是測試器印出來的東西。如果你打算把一次執行分成「我配適的那一段」和「我沒有配適的那一段」,請在你看第二段之前,先把線畫在哪裡寫下來。讀懂一份 MT5 回測報告把這個切分做在全部 23 次執行上,並且顯示出代表數字會移動多遠。

會悄悄讓一次執行失效的陷阱

改進它:一次只改一件事,重跑,比較

這個循環刻意很無聊。改一個變數,重跑,然後把兩邊的結果都寫下來。一次改兩個,你就沒辦法把差別歸給其中任何一個。

每一次執行能換到最多資訊的順序是:

  1. 先動區間,再動策略。把 2019–2022 與 2022–2026 分開跑。如果兩半互相打架,那組參數描述的就是其中一段時期,再怎麼調都修不好這件事。
  2. 換商品。一條只在一個貨幣對上有效的規則,是關於那個貨幣對的事實。我們這一組刻意在 USD/JPY、EUR/GBP、AUD/CAD、NZD/USD、一個指數與一個加密貨幣對上都放了同樣的幾種大方向做法,原因正是這個。
  3. 換建模模式。把活下來的候選拿到比較粗的模型上重跑。如果結果垮掉,那個優勢就活在 K 棒內部,而 K 棒內的路徑是任何模擬裡最不值得信任的部分。
  4. 最後才動參數——而且要把任何你必須搜尋才找得到的設定,當成一個比你事先就選定的設定更弱的主張。

當一個改動已經不再把結果推出前幾次執行的雜訊範圍之外,或者當你發現自己是因為上一份報告說了什麼才在挑設定時,就停止迭代。第二個才是真正的停止條件,而且它比人們預期的更早到。回測分析工具在這裡很有用,因為它會把一份存下來的報告裡的主要數字讀回來,讓比較兩次執行變成一件算術的事,而不是一件記憶的事。

接下來的步驟:在上實盤之前先做前向測試

一次乾淨的回測是四個步驟裡的第一步,不是終點線。

如果這條規則有值得搜尋的參數,就做 Optimisation。把整個搜尋範圍記下來,不是只記贏的那一輪——一個你必須去找才找得到的結果,是關於這場搜尋的證據,而範圍才是告訴讀者你找得多用力的那個東西。MT5 參數最佳化把那一輪從頭走了一遍,也把我們自己記錄下來的八次搜尋讀了一遍:116 種組合,而沒有一組設定是我們願意出貨的。

然後做前推。在一段上配適,在下一段上量測,然後重複。這是四個步驟裡唯一直接對付過度配適的一步,這也是為什麼它比一次更長的回測值錢。

然後在模擬帳戶上做前向測試。延遲、重新報價與真正的點差擴大,是在這裡才終於進入實驗的。跑得夠久,久到能看見這個策略虧損然後恢復,因為你真正需要的數字不是報酬——而是你能不能坐著熬過上面量到的那個回撤。

然後才決定。事先寫下那個會讓你把它關掉的虧損。在投錢之前設好的停損是一個決定;在回撤當中才設的停損是一個反應。

如果你想在跑自己的東西之前先看一份做完的參考,已發布的 EA 目錄裡每一則刊登都附上完整的平倉交易清單、兩條回撤,以及它們背後的執行清單,而我們如何測試說明了這些紀錄必須達到的標準。其餘的回測指南會更深入談這一頁只是指了一下的最佳化與前推步驟。這裡沒有任何內容承諾任何結果:本頁上的每一個數字,描述的都是已經發生過的執行。

常見問題

回測期間應該取多長?
長到足以讓策略走過它將來還會再遇到的市況,而這其實是一個關於交易筆數的問題,不是關於日曆長度的問題。這裡公開的 23 次執行裡,有 22 次從 2019-01-01 開始,區間中位數是 7.5 年——但同樣是這些區間,內部的取樣率從一年 14.2 筆交易到 945.1 筆都有。一個七年的區間放在一支慢速策略上,仍然可能只是一個一百筆交易的樣本,而一百筆交易要拿來下結論是很小的數字。先讀交易筆數,再讀日期範圍。
為什麼我重跑同一個測試,回測結果會不一樣?
幾乎都是因為價格歷史變了,而不是策略變了。測試器會依商品下載並快取歷史,所以第一次跑在一段早期年份還沒被存下來的區間上,用到的 tick 序列就會和缺口補齊之後的第二次不同。建模模式做的是同一件事,只是更明顯:在 Every tick based on real ticks 與從 M1 K 棒產生的 Every tick 之間切換,改變的是哪些交易根本會不會觸發,而不只是它們的成交價。請把模式與終端機的 build 版本連同結果一起記下來,否則你自己的兩次執行就會變成互相無法比較的東西。
策略測試器有沒有把點差、手續費與隔夜利息算進去?
它套用的是價格資料與商品規格所帶著的東西,而這和你自己選定那些成本並不是同一回事。這裡公開的 23 次執行裡,手續費每一次都是零,而只有一次能講出自己的平均點差——19.14 點,而且是因為有一支紀錄型 EA 跟著策略一起在測試裡跑。其餘每一次都只是繼承了歷史資料帶著的點差,並沒有把它記錄下來。如果某一項成本對你的結果重要,請在測試裡把它量出來,不要假設測試器已經替你建好了模。
回測成績好,就足以把 EA 放到真實帳戶上嗎?
不夠。回測界定的是一組規則在已記錄的價格上、在一個模擬的成交模型之下當初可能做到什麼。它裡面沒有延遲、沒有重新報價,也沒有那種正好在訊號觸發時到來的點差擴大。行得通的順序是:先回測;如果規則有值得搜尋的參數就做 Optimisation;接著在搜尋從未看過的資料上做一次前推檢查;然後跑一個夠久的模擬帳戶,久到能看見這個策略虧損然後恢復。過去的結果描述的是過去,而這一頁上沒有任何內容是預測。