分類
績效
難度
高階
適用情境
回測策略設計MT5 操作

前推分析

前推分析是一種驗證方法:先在一段歷史視窗上重新最佳化策略,再把那組設定原封不動地拿到緊接其後的視窗上交易,然後把兩段視窗一起往前滑動並重複——最後只引用那些未被動過的區段。

亦稱:WFA, 前推最佳化, WFO, 滾動樣本外測試

更新於 · 審閱於 · 由 mt5depot research desk 審核

一句話講清

在一段歷史上把規則調好,再原封不動地拿到緊接其後的那一段上交易,然後把這兩段一起往前滑,再做一次。只有那些未被動過的區段,才算進你最後引用的那個數字裡。

為什麼重要

單獨一次樣本外測試,只把一個問題問過一次。前推分析在每一步都重新問一次,而這是唯一能看出一份優勢究竟是持續熬過每一輪重新配適、還是只僥倖熬過了一次的方法。它同時也在排練部署者真正會做的事:從最近的過去挑出參數,然後把它們送進沒有人見過的未來。

  • 它評分的是流程,不是一組設定。「照這個方式重新配適,然後交易」才是你實際會做的事,所以那才是值得驗證的東西。
  • 它交出的是一連串樣本外結果,而不是單獨一個數字,因此一個好看的季度沒辦法自己扛起整個主張。
  • 它會讓那些坐不住的參數現形。當每一次重新配適都落在新的地方,規則追的就是樣本,而不是市場。
  • 單一預留視窗會把市場狀態的問題藏起來。本站有紀錄的八次搜尋裡,有兩次通過了搜尋之後的那段視窗,卻在搜尋之前的那段視窗上失敗。

用它驗證策略

用在哪裡

  • 驗證一套你確實打算按排程重新配適其參數的策略。
  • 決定重新最佳化的間隔——一組參數在需要更新之前,還能繼續用多久。
  • 把一份熬過數種市場狀態的優勢,和一份只存在於它被調校的那段視窗裡的優勢分開。
  • 當歷史短到無法割出一大塊預留區塊時,仍然建立起一份站得住腳的樣本外紀錄。

可靠的結果長什麼樣

  • 對外公布的數字只由樣本外區段首尾相接組成,樣本內數字擺在旁邊,而不是混進去。
  • 訓練長度、測試長度與步長都在第一次執行之前就定死,而且三者都跟著結果一起公布。
  • 文字說明引用的是樣本外效率——樣本外表現占樣本內表現的比例——而不只是獲利。
  • 每一步都列出它所選中的參數,讓讀者能自己判斷這些參數漂移得有多遠。
  • 試過幾種前推設定的次數會出現在某個地方,因為試很多次本身也是一種配適。

警訊

  • 只有一個合併後的數字,樣本內與樣本外兩半之間沒有任何切分。
  • 看起來被調過的視窗長度:一個沒有人解釋的、奇怪的訓練對測試比例。
  • 每一次重新配適都會跳動的參數,這意味著每一次配適追的都是上一段視窗的雜訊。
  • 效率接近或高於 100 %,這指向視窗之間有滲漏的機會,遠高於指向一套異常穩健的策略。
  • 定錨式與滾動式兩種變體被混著引用,因為一個會長大的視窗和一個固定長度的視窗回答的是不同的問題。

回測與實盤的差異

  • 前推分析縮小了一部分與實盤結果之間的落差,因為被測試的流程就是被部署的流程。
  • 它完全沒有碰到執行風險。滑價、點差擴大與延遲全都落在這項演練之外。
  • 它無法憑空造出歷史不曾裝著的市場狀態,所以一套在單獨一個平靜十年裡熬過二十輪重新配適的策略,面對承壓的十年仍然是未受檢驗的。
  • 應當預期實盤結果貼近樣本外那一串,而不是樣本內那一個。樣本內數字診斷的是這次搜尋;它們預測不了任何東西。

建議的驗證方法

  1. 1MetaTrader 5 並沒有內建滾動式前推。策略測試器(Strategy Tester)「設定」(Settings)分頁上的 Forward 欄位只把區間切開一次——1/2、1/3、1/4 或一個自訂日期——再把存活下來的參數組合放到尾段評分,結果列在獨立的 Forward Results 分頁裡。跑一次只買得到一步。
  2. 2這一串要靠手工建起來:每一步重跑一次最佳化,每次都把日期範圍往後推一個步長,並保留每一次的 forward 那一列。二十個區段要花掉二十次執行,所以在開始之前先把步數定下來。
  3. 3在你看到參數網格之前就先選定最佳化準則,因為它決定了 MT5 在每一步把哪一組叫做贏家。當沒有任何內建準則符合你判斷一次執行的方式時,Custom max 會把這個決定轉交給 OnTester()。
  4. 4MT5 永遠把它的前推切片切在區間的尾端,所以緊接在訓練期之前的那段視窗永遠不會受到檢驗。那一段請自己跑:在本站自己的這組資料上,它抓出了兩個已經被前推檢查放行的設計。
  5. 5把勝出的參數逐步記下來。Forward Results 分頁交給你的是一組通過的參數,從來不是設定在各步之間的軌跡——而那條軌跡才是真正的發現。
  6. 6把整項演練當成一次實驗。換上新的視窗長度反覆重跑直到它通過,只是把過度配適往上搬了一層,而不是把它移除。

範例

取自本站自己紀錄的一步:EXP-PARAM-SEARCH-OUTCOMES-001 裡的八次參數搜尋。其中 ichimoku 樣板在 H1 上搜尋了一個 12 種組合的網格,留下它樣本內最好的那一組,接著迎面撞上兩段搜尋從未碰過的視窗。

搜尋過的網格
12 種組合
SL 30-80 x TP 60-250, H1
樣本內獲利因子
1.37
搜尋之後的視窗
0.89
搜尋之前的視窗
0.80
有紀錄/已採用的搜尋
8 / 0

65 % 落在大多數文字說明會稱之為「強」的區帶裡。同一組設定在兩段未曾見過的視窗上依然虧錢,這正是為什麼一步只能讀成一個資料點,而永遠不是一份判決。

計算 0.89 除以 1.37 = 這一步 65 % 的效率;0.80 除以 1.37 = 較早那段視窗上的 58 %

結果 65 % 的效率——出現在一組我們拒絕出貨的設定上

怎麼讀這個數字

先讀那一串樣本外結果,再讀比值,最後讀參數的穩定度。對外公布的獲利是這三者當中資訊量最低的。

區間 含義
大約低於 40 % 這次搜尋大體上只配適了它自己的視窗。也許還剩一點小小的優勢,但不是被廣告出來的那一份。
大約 40-60 % 在好幾個參數都會動的前提下,屬於一般水準。請照樣本外的數字做規劃,而不是樣本內的。
單獨一步高於 60 % 令人鼓舞,但不是判決。本站那一步 65 % 的設定,在它沒見過的兩段視窗上都虧了錢。
多數步都高於 60 %,且參數穩定 強。這些重新配適持續有效,而且它們對設定的看法一致。
接近或高於 100 % 要懷疑視窗之間有滲漏、有前視偏差,或者區段少到撐不起任何意義。
  • 數一數區段。四段是軼事;二十段才是一個分布。
  • 把各步選中的參數畫成圖。一個到處漂移的最佳點,是在告訴你它是雜訊。
  • 永遠不要把樣本內與樣本外的資金曲線混成一條:那條曲線一半是考卷,一半是答案。
  • 也要測試訓練期之前的那段視窗。本站八次搜尋裡有兩次向前通過、向後失敗。

mt5depot 會公布每一次執行背後的資料視窗、測試器模型與成交筆數,因此這裡的任何一項樣本外主張,都能對照產生它的那份樣本來核查。

常見誤解

把一次 MT5 Forward 執行叫做前推分析

Forward 欄位把區間切開一次並回報尾段。那是一次定錨式的預留檢驗,只是配了一個更整潔的分頁,而且它只把問題問過一次。前推分析需要那道切口會移動,而這在 MT5 裡意味著你得自己驅動這個迴圈:每一步跑一次最佳化,再把各步的 forward 那一列收集成一串。

去調校前推設定本身

搜尋好幾種訓練與測試長度,然後公布分數最高的那一組配對,只是把過度配適往上搬了一層。視窗長度同樣是參數,所以請先選定它們、寫下來,然後才開始跑。

把樣本外的高數字直接讀成好事

本站的 macd_signal 搜尋在搜尋之後的視窗上達到 1.14-1.15,在搜尋之前的視窗上則是 0.74-0.77。高的樣本外數字可能意味著滲漏、意味著市況剛好有利,也可能意味著區段太少——先去查清楚,再去慶祝。

以為前推分析能證明策略對未見狀況也穩健

它從頭到尾只測試歷史裡曾經包含的狀況。在單一市場狀態內做二十輪重新配適,產出的是同一種狀態下的二十個結果,這對下一種狀態什麼都沒說。

深入說明

常見問題

在 MetaTrader 5 裡要怎麼跑前推分析?
MT5 給你的是零件,不是那個迴圈。把策略測試器「設定」(Settings)分頁上的 Forward 設成 1/2、1/3 或 1/4:測試器會在你日期範圍的前段做最佳化,再把存活下來的參數組合放到尾段評分,並列在它自己的 Forward Results 分頁裡。那是一步。要得到一整串,就把整個日期範圍往後推一個步長,每個區段各跑一次最佳化,每一次都記下 forward 那一列和勝出的參數。二十個區段就是二十次執行。
樣本內與樣本外的視窗長度應該取多少?
長到讓訓練視窗裝得下不只一種市場狀態,也讓測試視窗裝得下足以說明問題的成交筆數。測試器內建的 1/2、1/3 與 1/4 是合理的起點,而當步長很小時,一個自訂的 forward 日期能給出更短的測試切片。規則比數字重要:在第一次執行之前就把比例定下來,因為試好幾種再公布最好的那一種,正是在重複前推分析存在的意義所要抓的那個錯誤。
前推分析能消除過度配適嗎?
不能。它把過度配適挪了位置,並讓它現形。重新配適仍然發生在每一段訓練視窗裡,所以這個方法量的是那份配適在碰上下一段視窗之後還剩下多少,而不是阻止它發生。本站有紀錄的八次搜尋跑了 116 種參數組合,一種都沒有採用:其中兩次通過了搜尋之後的視窗,然後在搜尋之前的視窗上失敗——而這正是單一預留檢驗會藏起來的那種形狀。
樣本外效率要多少才算好?
在好幾個參數都會動的前提下,大約 40-60 % 屬於一般水準;而高於 60 % 且在多數步上都守得住、參數也穩定,才算得上強。對任何單獨一步都要抱著懷疑:本站配適得最好的那次搜尋在某一步讀到 65 %,它選中的設定在它沒見過的兩段視窗上依然虧錢。接近或高於 100 % 的數值,通常代表訓練視窗與測試視窗之間有滲漏,而不是一套異常穩健的策略。
應該用哪一個最佳化準則來替各組排序?
在參數網格出現之前就決定,因為這個準則——在更廣的文獻裡叫做目標函數——會在每一步挑出勝出的那一組。以結餘為基礎的排序會獎勵冒最多風險的那一組,以回撤為基礎的排序會獎勵交易最少的那一組,而當兩者都不合用時,Custom max 會把這個決定交給你自己的 OnTester()。在本站有紀錄的搜尋裡,測試器的排序從來沒有自己定下任何事:每一組存活下來的參數,之後都必須在三段視窗上都守住高於 1.0 的獲利因子,而八次裡沒有一次做到。
前推分析和單獨一次樣本外測試差在哪裡?
單獨一次測試會保留一塊資料,並拿最終的參數對著它檢查一次。前推分析沿著整段歷史反覆做「先調校、再測試」這個循環,因此它交出的是一串樣本外結果,而且它檢驗的是重新配適這個流程本身——那才是部署者一個月又一個月真正在做的事。