ウォークフォワード最適化をやってみた
スポンサーリンク

バックテスト最適化の最適化

バックテストはオプティマイザを使って最適化しますが、
その最適化したパラメータでフォワードテストをすると、期待値と大きく乖離するケースは多くあり、
それは直近のテストデータに対してのみ過剰に最適化している(カーブフィッティング)状態でになっています。

これを避ける一つの手段としてウォークフォワード最適化があります。

ウォークフォワード分析とは?

予め決めたバックテスト期間とフォワードテスト期間を、一定のステップずつずらしながら繰り返し実行し、
フォワードテスト全期間での成績や、バックテスト期間とフォワードテスト期間の成績の比率からEAの品質を図る手法です。

 

指標

ウォークフォワード効率(Walk-Forward Efficiency)(WFE)

バックテストとフォワードテストを同じ期間(年次)で評価した場合の比率。

バックテストで利益が1,000,000円、 WFEが60%だったとすると、
同一期間フォワードテストした場合の想定利益が600,000円程度、ということ。

数値が高いほどバックテストの結果を信頼して見て良いということだが、
50%以上あればある程度の信頼性があるそうです。

→つまり、バックテストの結果通りの結果がフォワードでも起きる可能性は低い。

 

最適化方法

  • バックテスト期間
  • フォワードテスト期間
  • 最適化手法(最大利益、最大PF,最大ドローダウン、...)

辺りの設定によりパフォーマンスが大きく変わります。

同じEAで上記パラメータの組み合わせを色々変えてみた結果、

-19% ~ 79%まで、かなりのブレっぷりでした。

これはバックテストで定めた期間に生じた特性が、フォワードで定めた期間で再現性が高いかどうか?
という意味かなと思っていますが、同じEAでもテストの仕方とパラメータの定期的な見直し方のルールによって
パフォーマンスが大きく変わる証拠だと思います。

スポンサーリンク

実装方法は?

調べたところ、MQL5.com のマーケット内に、そのものズバリ WalkForwardOptimizer というライブラリがありました。

MT4版MT5版がありましたが、今回はMT5版を購入し、実際に利用してみます。

利用手順

パラメータ設定方法

なかなかクセがあり理解に時間がかかりました、、
以下、User Guide パラメータ設定方法 翻訳結果です。

  • wfo_windowSize
    定義済のウィンドウサイズの一つ。 デフォルト:年
    カスタムを選択した場合は、カスタム日付番号を wfo_customWindowSizeDays に渡す必要があります。
    もし None を選択した場合は、ウィンドウ管理は無効になり、これは EAがウィンドウの終了日後もトレードを続け、フォワードテストも実行されます。
    最適化処理の最終点検として使用して、EAのパフォーマンスが再定義なしで、その先の長い期間においてどの程度劣化するのかを把握します。
  • wfo_customWindowSizeDays
    最適化ウィンドウサイズ(日付)
    クラスタ分析のための、メタパラメータとして最適化に追加することができる。
  • wfo_stepSize
    定義済のフォワードステップサイズの一つ。デフォルト:四半期。
    ウィンドウサイズよりも小さくする必要があります。
  • wfo_customStepSizePercent
    フォワードステップサイズをウィンドウのパーセントで表します。
    クラスタ分析のための、メタパラメータとして最適化に追加することができる。
  • wfo_stepOffset
    ロールフォワードのシリアル番号。
    常に最適化のメタパラメータとして追加しなければならない。(アンカーモードは除外)
    また、つねに増分は1でなければならない。
    ※上記に加え、実行ステップ数を、バックテスト期間、wfo_windowSize、wfo_stepSize の3つから計算して、手動セットする必要がある
  • wfo_outputFile 
    CSVデータの出力ファイル名。 ←デフォルト空欄だが、何かしらセットする
    ファイル名が空欄の場合は、EAは動作し続けるが本ライブラリはジョブを実行しない。
    これはEAの再コンパイルなしにライブラリを無効化する一つの手段として使用できます。
  • wfo_estimation
    最適化中のEAパフォーマンス測定値として使用される推定値のセレクタ。 デフォルトでは - wfo_built_in_loose

 

実行方法

User Guide和訳。

事前定義された期間または任意の期間を使用した単純なロールフォワード最適化

  1. 最適化ウィンドウサイズ である wfo_WindowSize を、事前定義されたリストの中から選択するか、
    カスタム期間を選択し、wfo_customWindowSizeDaysに指定した日数を入力します。
  2. wfo_stepSize に フォワードステップのサイズを指定します。 事前定義されたリストから選択するか、
    カスタム期間を選択肢、 wfo_customStepSizePercent にパーセンテージを指定します。
  3. 最適化を有効にするには、 wfo_stepOffset に、 0から、履歴範囲に収まる数字範囲を設定し、ステップ幅は1とします。
  4. 最適化を実行します。
  5. 実行結果が保存されるcsvファイルを、 MQL/Files にコピーします。(MT4のみ対応必要)
  6. WalkForwardReporter スクリプトを実行する(MT4のみ)
  7. 生成されたHTMLレポートファイルを開きます。

<例>

2010年-2016年までの期間を参考例とします。

  • 最適化ウィンドウは year
  • フォワードステップサイズは 1四半期

とします。

期間としては6年半です。
1年分は、ウィンドウの移動に消費され、残りは前方への連続的なステップとしてカバーされます。
その期間は5年半になり、サンプル外のテスト22四半期分になりますので、
wfo_stepOffset  は 0 → 21 まで進める必要があります。(22回めのステップは2016年第3四半期であり、テストすることができません)

 

レポート

シンプルで分かりやすいです!

期間ごとの集計と、累積利益も照会できます。各種KPIも表示されている。
ただ、パラメータにあるレポートファイル名を都度手動で変えないと、前回実行レポートを上書きしてしまい、、
前回分のウォークフォワード分析レポートは消えて無くなりましたのでご注意を。。

 

以下は、色々試した結果、ウォークフォワード効率が最も良かったもので79.94%でした!
なかなか良い方ですかね。

ちなみに下記は自作EAで USDJPY, H1, バックテスト1年、フォワードテスト1ヶ月 で期間10年で検証したものです。
タイミング的に、円安トレンドが強く出ていた2014年前後で強烈にプラスに伸び、それ以降は僅かにプラスに伸びている程度でしょうか。

強いトレンドで勝ち、それ以外の所では大きく負けないのならばポートフォリオの一つとして採用すれば良い結果が得られそうな感じです。

 

価格は?

有償ライブラリです。 1ヶ月レンタルが$12.5、買切り版が$85。

感想

これはこれで便利ですが、マーケット等から購入したEAや、
自作EAにウォークフォワード分析付きで販売したい場合には利用できないのが課題です。
terminal.exe は MT5でもコマンドライン実行ができるので、自作でも良いかと思いました。

ただバックテストやフォワードテストを実施するよりは
その品質を評価する目安として機能すると思われますので、時間あれば自作版も検討したいですね。

関連記事

スポンサーリンク
おすすめの記事