MetaTrader5のカスタムウォークフォワード最適化

Stanislav Korotky | 28 9月, 2017

アルゴリズムトレードは、トレーディングロボットの計画と開発だけでなく、実装されたアイデアやアルゴリズムの生存性をテストし検証することでもあります。 MetaTrader5は、過去データを用いてEAを最適化する組み込みのテスターがあります。 このツールは日常の研究活動に欠かせません。 しかし、その主たる問題として、最適化した組み合わせがこれから先の未来で利益をもたらしてくれるようにすることです。 解決策の1つは、フォワードテストです。 このテスターは、組み込みモードを備えています。 しかし、一度 EA を最適化すれば、それ以降の期間も正常だと言えるでしょうか。

EA のオペレーションサイクルは、最適化とトレードの繰り返しで、トレーダーは長期間にわたってポジティブな (または少なくとも損失がない) の結果を期待します。 システムの効率を確保するためには、過去から仮想未来への期間で最適化とフォワードテストを起動し、何度も繰り返す必要があります。

これは、ウォークフォワード最適化と呼ばれ、多くのトレーダーによって広く使用されています。 残念ながら、組み込みのメタトレーダーテスターは、ボタンひとつで起動することはできません。 代わりに、外部ツールを使用してテスターの起動を自動化し、一緒にテストレポートを堅持する必要があります。 したがって、シンプルな方法としては、メタトレーダーと MQL のルーチン操作を行うことにより、ウォークフォワード分析を実行する必要があります。

結果として、任意の EA に必要に応じて接続できる MQL ライブラリを開発することができます。 EA のソースコードを適応するつもりですので、プログラミングスキルが必要になります。


プラン

ライブラリの原則を説明する前に、概要を紹介しましょう。

最適化期間は通常、サンプルデータと呼ばれます。 その後のテスト期間は通常、サンプル外のデータと呼ばれます。 より使いやすくするため、用語として "最適化ウィンドウ" (または "ウィンドウ") と "テストステップ" (または "ステップ"、"テスト") を使います。

ウォークフォワードの最適化のアイデアは簡単です。 このテスターで、開始日を過去 (ポイント B) に押して、通常の最適化ウィンドウよりもはるかに大きい全体の最適化期間 D を選択します。 EA のトレードは、所定のサイズの現在のウィンドウ W と後続のテストステップS 内でのみ許可してください。 D > W > > S となります。たとえば、D には W ウィンドウと1ダースのステップが含まれている必要があります。

最初に、ウィンドウは最初の B 点から始まりますが、その後、ウィンドウの右側の境界線が全体の最適化範囲 D の最終日に達するまで、ステップ値を順番に何度も右に移動する必要があります。

最適化パラメータは、W ウィンドウ内のトレードに基づいてのみ計算する必要があります。 Sセグメント内のトレード結果は、後で分析するため保存されます。 特定のウィンドウごとに最適なパラメータを決定することができ、パス番号を知ることで、対応するテスト結果へのリンクを得ることができます。

完全に1つの明白なニュアンスを除いて正のウォークを繰り返す: S のトレードは初期証拠金で始まらないが、W の時間内で管理しました。 この関数は、固定ロットの戦略にのみ使えます。 しかし、おそらく、固定ロットの検証は、後の段階で資金の管理を有効にするものであっても、任意の EA を分析する際に必須の手順であることには同意せざるを得ません。

ステップの数として、D 期間内のウィンドウのシフトを定義するウィンドウ W のサイズを設定する入力を追加することにより、上記の "断片的な" トレードを実行することができます。 たとえば、シフトが0の場合、ウィンドウは B の始点から始まります。 1に等しい場合、ウィンドウは s で始まり、s + W で終わります。 シフトが2の場合、ウィンドウは 2 * s で始まり、2 * s + W などで終了します。 対応するパラメータに応じて最適化を可能にすることで、様々なシフトの探索をテスターに委ねることができます。 そこで、サンプルやサンプルデータを含めた複数のテスターパスを、仮想時間軸に沿って移動することによって配置することができます。

連続したフォワード最適化として稼働させるためにこのメカニズムを適応させる必要があります。 これを実現するには、すべての後のテスト期間を無視しながら、各ウィンドウ W のトレード結果によってのみ最適化が実行されることを確認します。テスターの設定で [カスタム最適化基準] を選択し、トレードに基づいてライブラリで計算します。現在のウィンドウ内では、 OnTesterイベントハンドラを使用してテスターでその後に返します。 その上、ライブラリで計算し、続くテスト期間 S のトレードの結果を扱うべきです。最適化を完了した後、ステップのシフトで、各ウィンドウの W のパラメータの複数のセットがあります。 最適なセットは、その中で定義されます。 パスのインデックス番号は、すぐに次のテストセグメント S でトレードの結果を得ることができます。 組み合わせて、 D 内のサイクルのフォワードテストに関する完全なレポートを取得します。

ウォークフォワードテストの形成

図1. ウォークフォワードテストの形成

W と S のサイズは、トレーダーの裁量で異なる場合があります。 たとえば、3か月の最適化ウィンドウと1か月のフォワードステップを選択できます。 合計検証期間 D が12か月の場合は、テスターの 0 ~ 9 (包括) のシフトでステップ S を通過します。 9は、シンプルな計算を使用して取得されます。

N = (D - W) / S = (12 - 3) / 1 = 9 (1)

フォワードステップテストは、最後のものを除くすべての繰り返しウィンドウ W の右側に配置することです。 しかし、シフトが9だと、ウィンドウ W が終了日に近づいてきてフォワードテストができなくなります。 ウォークフォワード最適化が成功した場合、最後のステップの最適なパラメータがオンライントレードの推奨セットとして使用されます。

フォワード最適化の効率は、以下の検討しようとしているさまざまな基準によって評価することができます。 直感的には、フォワードテストの手順は、利益率、シャープレシオ、利益の数学的期待値などのようなおなじみのパラメータによって定義されたバランス曲線を形成できます。

しかし、別の質問にこだわることもできます。つまり、どのような W のウィンドウと S のステップサイズが適しているでしょうか? テスターに最適な値を検索させるのが妥当でしょう。 ライブラリによって提供される特別なエントリーを使用して前のテストステップをパスするのと同様に、最適化したリストにウィンドウとステップサイズを指定するパラメータを含めることができます。

最適なウィンドウとステップサイズの選択と同時に実行されるウォークフォワード最適化は、クラスタウォークフォワード分析と呼ばれます。

ライブラリとすべての3つのパラメータを最適化する結果を使用して、ウィンドウとステップのサイズの様々な組み合わせのフォワードテスト収益性のテーブルを含むレポートを形成するだけでなく、すべてを含む各テーブルのセルのレポートを作成することができます。

このライブラリは、説明されている操作モード (「クラスタ解析」と「連続フォワードテスト」とも呼ばれます) に加えて、アンカーウォークフォワード最適化をします。 ウィンドウ W の開始日が変更されることはありませんが、前の反復テスト期間を含む各ステップでウィンドウサイズが増加するという点で、ローリングウォークフォワードとは異なります。 たとえば、最初のウィンドウサイズが3か月の例を使用して、合計期間 D が1月から開始されるとします。 最初のステップでは、1 ~ 3 月に最適化が行われ、テストは4月に行われます。 2番目のステップは、5月のテストで1月〜4月の最適化を可能にする一方、3番目の1月に最適化をします。

これが、実装しなければならないすべてのアイデアです。 プログラマおよび EA の開発者は非常に広汎であることにもかかわらず、タスクがかなりわかりやすいので、自身でツールを作成できます。 既製のものを入手したい場合は、MetaTrader4と5の両方の WalkForwardOptimizer (WFO) ライブラリがあります。 MetaTrader5がより魅力的に見えます。 特に、5番目のバージョン以降は顕著です。:

  • このライブラリは、最適化データを収集し、レポートを生成する単一のモジュールとして実装されています。 MetaTrader4のバージョンでは、ファイルはテスター/ファイルで生成され、手動で MQL4/ファイルに再配置する必要があります。 次に、別のスクリプトを起動してレポートを生成する必要があります (すべてのリンクは以下のとおりです)。
  • ほとんどのルーチン操作は、新しい最適化を開始する前に、中間ファイルの削除です。
  • 名前と値は EA のタスクパラメータに自動的に割り当てられます (MetaTrader4では、このデータは適切な関数を呼び出すことによって明示的に渡される必要があります)。
  • ネットワークエージェントと MQL 計算クラウドを含むマルチスレッド最適化のサポート。
一般的に、MetaTrader5のバージョンは、より効率的で使いやすいです。 テスターの MQL5 API によって提供される便利なツールの範囲が広いことによります。


実装

したがって、ライブラリプログラムのインターフェイスは、ウォークフォワード最適化を実行するようにテスターを設定できるようにインプットを実装する必要があります。 ヘッダーファイルに記述されています。

input WFO_TIME_PERIOD wfo_windowSize = year;
input int wfo_customWindowSizeDays = 0;
input WFO_TIME_PERIOD wfo_stepSize = quarter;
input int wfo_customStepSizePercent = 0;
input int wfo_stepOffset = 0;
input string wfo_outputFile = "";
input WFO_ESTIMATION_METHOD wfo_estimation = wfo_built_in_loose;
input string wfo_formula = "";

wfo_windowSize および wfo_stepSize パラメータを使用すると、ウィンドウサイズと最適化ステップを設定できます。 WFO_TIME_PERIOD 列挙体は、標準単位で設定するために使用されます。

#defineDAYS_PER_WEEK 7
#defineDAYS_PER_MONTH 30
#defineDAYS_PER_QUARTER (DAYS_PER_MONTH *3)
#defineDAYS_PER_HALF (DAYS_PER_MONTH *6)
#defineDAYS_PER_YEAR (DAYS_PER_MONTH *12)

#defineSEC_PER_DAY (60*60*24)
#defineSEC_PER_WEEK (SEC_PER_DAY * DAYS_PER_WEEK)
#defineSEC_PER_MONTH (SEC_PER_DAY * DAYS_PER_MONTH)
#defineSEC_PER_QUARTER (SEC_PER_MONTH *3)
#defineSEC_PER_HALF (SEC_PER_MONTH *6)
#defineSEC_PER_YEAR (SEC_PER_MONTH *12)

#defineCUSTOM_DAYS-1

enum WFO_TIME_PERIOD
{
  none = 0,
  year = DAYS_PER_YEAR,
  halfyear = DAYS_PER_HALF,
  quarter = DAYS_PER_QUARTER,
  month = DAYS_PER_MONTH,
  week = DAYS_PER_WEEK,
  day = 1,
  custom = CUSTOM_DAYS
};

1日は基本測定単位です。 小さい手順はサポートされていません。 テスター自体は1日の正確さの中でのみ日付を設定することができます。 足内でのタスクの切り替えは、日中のフォワード最適化を練習する人向けに以下に提供されています。

1週間、1か月、4半期、および年が定数 (固定日数) として定義されていることに注意してください。 期間のカレンダー境界による整列は発生しません。 計算の効率が向上し、週または月の境界に固執せずに任意のサイズのウィンドウを移動することで統一されます。 月の期間が選択されている場合 (30 日)、カウントが任意の月の最初から開始された場合、その後の各月の変更は、"月" のステップの前または後に明らかに発生する可能性があります (月が日数によって異なるため)。 カウントが月の途中から開始された場合、ステップは月の序数にシフトして後続の月の中間になります。

wfo_windowSize または wfo_stepSize の ' custom ' 値は、後続のパラメータで任意のウィンドウとステップサイズを設定することができます。 パラメータ名からわかるように、ウィンドウは日で定義され、ステップはウィンドウの% で表示されます。

このパラメータを使用すると、クラスタの最適化中にサイズの検索を行うことができます。 最小 (初期) のパーセンテージと、指定したインクリメントによる変更が、最小ウィンドウに適用されてから整数の日数を指定できるように、サイズを選択する必要があります。 たとえば、ウィンドウが10のステップで10から50に変更された場合、最小ウィンドウから1日であるため、10% 以下のステップを減らすことには意味がありません。 さらに、フォワードステップの増分は 10% 未満である必要があります。 例えば、5%で30のウィンドウのサイズで、2番目は、15%(初期の 10% プラス 5% の1つのステップ) の間隔でのテストになるでしょう。 このような構成は、もちろん、致命的なエラーにつながることはありません。しかし、フォワードテストの手順は、計算の精度に影響を与えることがあります。

残念ながら、このライブラリは、構成を簡素化し、正確性を確認するための便利なツールを提供することはできません。 ユーザーは、パラメータ自体をチェックする必要があります (つまり、プログラミングの基本的な知識は少なくとも必要です)。 1つの可能な解決策は、ライブラリの配置に別のアプローチを実装することです。 ここにこだわりましょう。

wfo_windowSize と wfo_stepSize が ' none ' に等しい場合、ライブラリは無効になります。

wfo_stepOffset パラメータは (最適化されたものに含まれている)、順方向のテストステップでソートすることができます。 そのインクリメントは常に1である必要があります。 最大値は、最大ウィンドウサイズ W と最小ステップサイズ S を含む式 (1) を使用して計算されます。

wfo_outputFile パラメータは、最適化実行が保存される csv ファイルの名前を設定します。 このファイルは、MQL5/Files (МТ5) か tester/Files (MetaTrader4)で生成されます。

wfo_estimation パラメータは、最適化テスターに渡す結果を定義します。 この値は、WFO_ESTIMATION_METHOD 列挙値の1つです。

enum WFO_ESTIMATION_METHOD
{
  wfo_built_in_loose,
  wfo_built_in_strict,
  wfo_profit,
  wfo_sharpe,
  wfo_pf,
  wfo_drawdown,
  wfo_profit_by_drawdown,
  wfo_profit_trades_by_drawdown,
  wfo_average,
  wfo_expression
};
  • wfo_built_in_loose (デフォルト) と wfo_built_in_strict-シャープレシオ、利益率、利益のサイズとトレードの数で構成される複雑なインジケーター;
  • wfo_profit — 利益;
  • wfo_sharpe — シャープレシオ;
  • wfo_pf — プロフィットファクター;
  • wfo_drawdown-反転相対ドローダウン (100-DD) は、バランス曲線上で計算されます。
  • wfo_profit_by_drawdown-相対ドローダウンによって分けられた利益;
  • wfo_profit_trades_by_drawdown-トレードの数を乗算し、相対的なドローダウンで割った利益;
  • wfo_average — トレード平均利益;
  • wfo_expression-カスタム結果方程式。

最後に、wfo_formula パラメータは、wfo_estimation が wfo_expression と等しい場合に結果を計算するための同じカスタム式です。 ライブラリユーザーガイド(ロシア語) では、有効な数式やその他の設定について詳しく知ることができます。

すべてのパラメータには wfo_ プレフィックスが付いているため、EA のタスクパラメータと容易に区別することができます。

EA にヘッダファイルをインクルードした後で、記述されているエントリーパラメータがその中に書かれていることに注意してください。 最適化プロセスを管理するので、メタパラメータと呼ぶことがあります。

また、ヘッダは必要なタイプとメタパラメータのみを宣言することに注意してください。 ライブラリにデータを取得させるためには、ライブラリのプログラミングインターフェイスである一連のオープン関数が必要です。 また、ヘッダーファイルに import ディレクティブとして記述されています (MetaTrader5のバージョンから検討されます)。

#import"WalkForwardOptimizer ex5"
void wfo_setEstimationMethod(WFO_ESTIMATION_METHOD estimation, string formula);
void wfo_setPFmax(double max);
void wfo_setCloseTradesOnSeparationLine(bool b);
void wfo_OnTesterPass();
int wfo_OnInit(WFO_TIME_PERIOD optimizeWindow, WFO_TIME_PERIOD optimizeStep, int optimizeStepOffset, int optimizeCustomW, int optimizeCustomS);
int wfo_OnTick();
double wfo_OnTester();
void wfo_OnTesterInit(string optimizeLog);
void wfo_OnTesterDeinit();
#import

wfo_set プレフィックスを持つ関数は省略可能です。 操作モードを設定することができますが、呼び出さない場合は、デフォルト値が使用されます。 wfo_On プレフィックスを持つ関数は、適切なイベントを処理します。 EA のソースコードに追加する必要があります。

以下に、EA のソースコードの例を組み込みライブラリで示します。 すべての関数パラメータは、インプットメタパラメータから直接取得されます。

#include<WalkForwardOptimizer.mqh>

...

int OnInit(void)
{
  //ここにタスクコード
  ...

  //省略可能、デフォルトは wfo_built_in_loose
  wfo_setEstimationMethod(wfo_estimation, wfo_formula);

  //省略可能、デフォルトは DBL_MAX
  wfo_setPFmax(100);

  //省略可能、デフォルト値は false です。
  //wfo_setCloseTradesOnSeparationLine (真);
  
  //必須、ヘッダファイルからのすべてのパラメータ
  int r = wfo_OnInit(wfo_windowSize, wfo_stepSize, wfo_stepOffset, wfo_customWindowSizeDays, wfo_customStepSizePercent);
  
  return(r);
}

void OnTesterInit()
{
  wfo_OnTesterInit(wfo_outputFile); // obligatory
}

void OnTesterDeinit()
{
  wfo_OnTesterDeinit(); // obligatory
}

void OnTesterPass()
{
  wfo_OnTesterPass(); // obligatory
}

double OnTester()
{
  return wfo_OnTester(); // obligatory
}

void OnTick(void)
{
  int wfo = wfo_OnTick();
  if(wfo == -1)
  {
    //ウィンドウが起動するまで待つ
    //トレードしない
    return;
  }
  else if(wfo == +1)
  {
    //ウィンドウの後にテストの終了を待つ
    //トレードしない
    return;
  }

  //ここにタスクコード
  ...
}

wfo_OnInitは、必要なすべてのデータをライブラリに渡します。ウィンドウサイズ、ステップ、ステップ番号、カスタムウィンドウサイズ (日数)、カスタムのステップサイズを% で表示します。 正しくないパラメータが設定されている場合、エラーコードが返り、 (たとえば、INIT_PARAMETERS_INCORRECT) 正しい場合は0を返します。

wfo_OnTickは、最適化ウィンドウ内で EA の最適化を管理し、テストを進めます。 現在のティック (bar) が、EA がトレードを許可されている移動フレーム内に収まった場合、0を返します。また-1/+ 1 ティックは、ウィンドウの外にある場合、トレードは一時的に無効にする必要があります (-1 は、ウィンドウがまだ到着していないことを意味し、+ 1 は、ウィンドウがすでに通過していることを意味します).

wfo_OnTesterは、指定された効率パラメータをテスタに計算して返します。

wfo_setCloseTradesOnSeparationLineは、すべての相場オーダーを決済し、最適化ウィンドウとフォワードテストの間の境界を越えるときに保留中のすべてを削除するモードを設定します。


プラクティス

組み込みライブラリを持つ EA がコンパイルされると、テスターを設定する時間になります。

間隔フィールドグループで、特定の日付範囲を選択してみましょう。 上記と同じ一般期間 D です。 通常、終了日は現在の日から近くします。

フォワードフィールドで [いいえ] を選択します (組み込みのフォワードテストは、適していません)。

コントロールポイントを使用して、[実行モード] を [標準] に設定します。 最適化 (EA の動作パラメータに加えて) に含まれるメタパラメータを入れると、計算負荷を増大させることに留意してください。

最適化モードでは、低速 (完全な並べ替え) または高速モード (遺伝学を使用) を選択できますが、最適化基準は常にcustomである必要があります。

遺伝的最適化アルゴリズムの使用は許可されていますが、その意図を念頭に置いておく必要があります。 遺伝的アルゴリズムは、ウィンドウのサイズ、フォワードステップのサイズ、ステップ番号を指定するメタパラメータの組み合わせなど、エントリーパラメータの多くの組み合わせをスキップします。 これはフォワードテストが欠如するかもしれない理由です。 この問題は、検索スペースが非常に大きい場合に顕著です (多くの EA のタスクパラメータまたはその増分がある場合) が、それ以外の場合は無視することができます。 生成されたレポートにマークされている最適化のスペースを削減しようとするかどうかを決定することができます。

この問題は、クラスタの最適化中に発生することがよくあります。 シーケンシャルまたはアンカーフォワードの最適化は、影響を受けにくくなります。

遺伝的アルゴリズムは、収益性に応じて異なるシフトを持つ最適化ウィンドウ間で不均一に "優先順位を付ける" 可能性があります。 たとえば、トレードの最初の月が2つ目よりも客観的に困難な場合、テスターは、0ではなく1の値を持つ wfo_stepOffset パラメータにより多くの注意を払う可能性があります。 つまり、日付範囲 D 内の複数のウィンドウに基づく遺伝的最適化は、特定のウィンドウ W (ライブラリがオフになっている) に基づいて遺伝的最適化と同じ最適な結果をもたらすことはありません。 唯一の解決策は、すべてのパラメータとメタパラメータのフル検索を使用することです。

一方、ウォークフォワードは、サンプル外のデータに対するアルゴリズムの安定性をチェックし、最適化の履歴と再最適化のステップ (新しい設定を探す頻度) も選択します。 この関数は、通常、最適なパラメータを検索せずに実行されます。

通常のメソッドで最適化を必要とする EA のタスクパラメータを設定します。 メタパラメータの構成は、有効にするウォークフォワード最適化のモードによって異なります。

事前定義された期間のウォークフォワード最適化
  1. wfo_WindowSize を使用して、リストから最適化ウィンドウを選択します。
  2. wfo_stepSize のリストからフォワードステップのサイズを選択します。
  3. 0からの範囲の wfo_stepOffset の最適化を可能にし、ステップ1の使用できるヒストリーに合う任意の数のステップにします。
任意の周期でシークエンシャルウォークフォワード最適化
  1. パラメータの wfo_WindowSize リストから「カスタム」を選択します。
  2. wfo_customWindowSizeDays する日数をインプットします。
  3. wfo_stepSize パラメータの「カスタム」サイズを選択します。
  4. ウィンドウサイズの% として wfo_customStepSizePercent にサイズを入力します。
  5. 0からの範囲の wfo_stepOffset の最適化を可能にし、ステップ1の使用できるヒストリーに合う任意の数のステップにします。
クラスタウォークフォワード最適化
  1. 「カスタム」として wfo_WindowSize の最適化ウィンドウサイズを選択します。
  2. wfo_customWindowSizeDays の最適化を有効にして、適切な範囲と増分を日数で指定します。
  3. 「カスタム」として wfo_stepSize のフォワードステップサイズを選択します。
  4. 適切な範囲の wfo_customStepSizePercent の最適化を可能にします。 (値の推奨範囲は 5-30%、ステップは 5-10% である)。
  5. 0からの範囲の wfo_stepOffset の最適化を可能にし、ステップ1の使用できるヒストリーに合う任意の数のステップにします。
優先最適化ウィンドウサイズがある場合は、さまざまなステップのクラスター分析のみを実行でき、既にステップサイズを選択している場合は、ウィンドウサイズのみを変更できます。

アンカーウォークフォワード最適化
  1. 「カスタム」として wfo_WindowSize の最適化ウィンドウサイズを選択します。
  2. 目的の範囲で wfo_customWindowSizeDays の最適化を有効にします。 インクリメントとして、次のステップで設定する、定義済み期間の長さと等しい日数を選択します (たとえば、"month" ステップを使用する場合は、30日の増分値を入力します)。
  3. 定義済みの定数の wfo_stepSize リストからステップサイズを選択します。 この定数は、上記のウィンドウサイズに指定されたインクリメントと等しくする必要があります。
  4. wfo_stepOffset の最適化を無効にし、値を0に設定します。

すべてが設定されている場合は、最適化を実行し、その完了を待ちます。 標準の最適化とは異なり、一時ストップすることはできません。ライブラリを扱うときに、プロセスを続行します。 これは、テスターの中断と継続が MQL5 API に対応するプログラムイベントを持っていないことによるものです。 したがって、ライブラリデータキャッシュをテスターキャッシュと同期することはできません。 つまり、Start ボタンを押すたびに、テスターの内部状態に関係なくライブラリの完全な初期化が行われ、ライブラリは最初からパス上のデータの収集を開始します。 以前に中断した最適化が再開されると、一時ストップする前にライブラリによって収集されたすべてのデータが失われます。 ウォークフォワード最適化を開始する前に、テスター/キャッシュフォルダをクリアすることをお勧めします。

最適化中に、WFO は特別なグローバル変数 (.gvf 拡張子を持つ "アーカイブ" ファイルに保存されます) と、MQL5/Files フォルダ内のデータを含む CSV ファイルを作成します。 その後、結果をデコードする html ページは、これらに基づいて自動的に形成されます。 gvf および HTML ファイル名は、wfo_outputFile パラメータを使用してライブラリ内の CSV ファイルセットの名前と一致します。

gvf および HTML ファイル名は、wfo_outputFile パラメータを使用してライブラリ内の CSV ファイルセットの名前と一致します。 このEA は、2つのトレーディング戦略 (エンベロープと WPR) に基づいて MQL5 ウィザードによって生成されました。 これは、フリープロダクトとしてマーケットで利用可能です。

注意! このEA は、聖杯ではありません。 ライブラリの実験モルモットとして機能するサンプルです。 

EURUSD D1 チャートで実験を行います。 まずは、簡単なローリングウォークフォワードレポートを取得してみましょう。 2015.01.01-2017.06.01 の合計テスト期間を設定します。

テスターの設定

図2. テスターの設定

EA には EnableWFO パラメータがあり、デフォルトでは ' false ' となります。 この場合、ライブラリは無効になり、EA は正常にトレードされます。 ライブラリを有効にするには、フラグを ' true ' に設定します。

wfo_windowSize (year) と wfo_stepSize (4半期) のデフォルト値をそのままにします。 14半期のシフトで1年の最適化ウィンドウの動きを指定し、4半期は単一のフォワードテストです。 (2.5 年-1 年)/3 ヶ月 = (30-12)/3 = 6 フォワードテストステップにします。

デモの .csv ファイル名を wfo_outputFile に設定します。

EA のタスクパラメータの中には、ストップロスがあり、利益レベル、期間、エンベロープ偏差、および WPR 期間もあります。 一連のパラメータ (wfo-demo-rolling. セット) は、アーティクルのトレーリングストップにアタッチされます。

EA の設定

図3. EA の設定

最適化の後、デモを取得します。 html レポートは次のように表示されます。

ローリングウォークフォワードレポート

図4. ローリングウォークフォワードレポート

ご覧の通り、このEA は非常に悪い結果になります。 しかし、ネガティブな結果も役に立たせることができます。

次に、クラスタレポートを取得し、利益が安定している最適化ウィンドウとステップサイズを選択してみましょう。 これを達成するためには、wfo_windowSize と wfo_stepSize を ' custom ' に設定し、90から180日のステップで30と wfo_customStepSizePercent-10 から30パーセントのステップで最適化の wfo_customWindowSizeDays を構成します。 wfo_stepOffset のステップの最大数は (2.5 年-90 日)/(90 日 * 10%) = 810/9 = 90 からの比率として受け取られる。 一連のパラメータ (wfo-demo-cluster. セット) は、アーティクルのトレーリングストップにアタッチされます。    

以下のサンプルレポートが表示されます (パラメータの詳細については、次の「分析」を参照してください)。

クラスタウォークフォワードレポート

図5. クラスタウォークフォワードレポート

多くの表のセルは、満足のいく結果を示しています。 120日のウィンドウの構成と 30% のステップが意味するものを明確にしてみましょう。 これを行うには、適切なセルをクリックし、フォワードテストの詳細を参照してください。

ローリングウォークフォワードレポートの明確化

図6. ローリングウォークフォワードレポートの明確化

ポジティブな結果にもかかわらず、バランス曲線が印象的ではありません。 他のバージョンを見ると、EA は現在選択されている最適化パラメータでは十分に安定していないと結論付けることができます。 トレード戦略のセットを調整するか、使用していない他のパラメータを最適化する必要があります。

適切な結果を得るには、常に長い時間がかかり、ウォークフォワードソリューションは従来の方法で確認するために多くの努力が必要になります。多数のオプションを整理し、タスクを簡素化します。 EA の特性を改善する検索はほとんど直感的なままです。 ウォークフォワードは、ここでは助けになっていません。 すでに、多かれ少なかれ収益性の高い EA を持っているときに最も適しており、その結果が実際にフィッティングによって達成されているかどうかを調べる必要があります。


分析

生成されたレポートには、選択したライブラリモードに応じてさまざまなデータが含まれます。 クラスタ分析では、一連の連続したウォークフォワードテストの最終パラメータを含む複数のテーブルからレポートが開始されます。 各テーブルでは、列は日のウィンドウ W のサイズに対応し、行は% のステップサイズ S に対応します。 テーブル内の各セルは、連続したウォークフォワードテストの対応するレポートにつながるハイパーリンクです。 したがって、最終的なパラメータの計算メソッドを明確にすることができます。

クラスタ分析テーブルには、次のパラメータが表示されます。

  • 年率換算利益/損失は、最適化とテストの期間に比例した利益の再計算の1年間の架空の利益です。
  • エフィシェンシは、同じ実行内のテストおよび最適化期間における年間利益の比率です。
  • コンシステンシは、複合フォワードのすべてのテストパス間の収益性の高いパスの割合です。
  • コンプリートネスは、ウィンドウサイズとフォワードステップの特定の組み合わせに対して実行される多数の転送ステップです。 パラメータ値が欠落しているため、遺伝的最適化中にリクエストされた数未満になることがあります。 スキップされたステップの数は、括弧内の小さな活字で示されます。
  • ステップの日数は、ステップサイズを% から日に変換するために、ウィンドウサイズとステップの各組み合わせに対するステップの日数です。

年率換算の利益、エフィシェンシとコンシステンシは、フォワードテストの成功を評価するための主要な基準です。 高い方が良いのは明らかです。 50% 以上のコンシステンシをお勧めします。 クラスター分析テーブルでは、最適なオプションが緑色で強調表示されます。

さらに、ドローダウン、数学的な予想と利益の標準偏差に注意を払い、標準レポートで利用できます。

標準 (連続) テストのレポートは、クラスター分析バージョンの改良としてだけでなく、シンプルなローリングウォークフォワード最適化の結果としても組み込まれています。

標準 (連続) またはアンカーウォークフォワードテストの場合、レポートは、この組み合わせフォワードを生成したテスターのすべてを含むテーブルです。 各行には、トレードパラメータ (利益、利益率、トレードの合計数、収益性の高いトレード、ドローダウン、シャープレシオなど) が含まれ、最適化とテストの期間ごとに個別に表示されます。 最適化パラメータは青色で強調表示されますが、テスト期間は黄色になります。 最後のステップは、"現在の" 時間 (テストの終了日) をキャプチャする場合、最後の既知のパラメータであることを示す緑色で強調表示されます。したがって、 "現在の" トレードに適用されます。 もちろん、"現在の" 時間は、最適化の終了日が今日に設定されている場合、実際には現在の状態です。

フォワードレポートの最初の3つの列には、テスターパスのインデックス番号、最適化ウィンドウの開始日 (サンプル)、およびテスト期間の開始日と終了日 (サンプル外) が表示されます。 レポートの最後の列には、ウィンドウ内の最適化の結果として見つかったパラメータの値が表示されます。 パラメータの名前を持つツールチップは、列ヘッダの上にマウスを置くことによって得ることができます。

遺伝的最適化法の場合、組み込みレポートのパスインデックス番号は数値形式ではなく、「世代番号、インスタンス番号」として表示されます。 つまり、組み込みレポートの行は、パラメータによってのみ WFO ライブラリレポートの行に一致させることができます。 この場合、両方のレポートのパスインデックス番号が同じであるため、低速な最適化を使用する場合は、この問題を回避できます。 これはMetaTrader5プラットフォームではなく、ライブラリの関数です。

組み込みのテスターレポートの対応する行をダブルクリックすることで、特定のウォークフォワード最適化ウィンドウとその後のウォークフォワードテストステップで EA のトレードを再現することができます。 この範囲外のトレードはありませんのでご注意ください。 ウィンドウ外にこのセットでトレードを確認したい場合は、ライブラリを無効にするか、' none ' に wfo_windowSize を設定する必要があります。

バランス曲線の概略図は、表の後に表示されます。    

中間結果を要約してみましょう。 簡素化されたフォームでメタトレーダーのテスターで直接ウォークフォワード最適化を手配することができました。 これはちゃんと機能し、興味深い結果になります。 しかし、ライブラリのパラメータを設定すると、トリッキーなことが判明しています。 一部のユーザーでは、正しいメタパラメータを選択すると問題が発生します。 この問題は、パフォーマンスに関連しています。 ライブラリの操作は、最適化に参加する追加のメタパラメータに基づいているため、検索スペースは、より多くのコンピューティングリソースを必要とします。 何とか状況を簡素化することは可能でしょうか? もちろん、可能です。 しかし、これを達成するためには、ライブラリの操作の原則を変え、別のライブラリを実装し再構成する必要があります。 


怠け者向けのフォワードウォーク

新しいライブラリは EA にも組み込まれていますが、パラメータは公開されず、構成を意味するものではありません。 このEA は、共通 (増加) 期間 D の最適化に起動されます。ここでの通常の最適化との違いは、通常の最適化が選択されたウィンドウ W のユーザーによって実行されます。D の最適化中に、新しいライブラリは EA によって実行されるすべてのトレードに関する情報を収集します (パラメータのセットによって異なります)。 つまり、テスターの各パスについて、各バーに現在の残高が記録され、浮動利益とオープンポジションの数がファイルが形成されます。 最適化を完了すると、このデータに基づいてさまざまなウォークフォワードレポートを作成できることが判明しました。 レポートは前述のものと似ています。 MetaTrader4の場合, 別のスクリプトによって行うことができます。MetaTrader5の場合にはライブラリ自体によって可能です。

このライブラリにもバージョンがあります。MetaTrader4とMetaTrader5. ここで、MetaTrader4の実装を変更してみましょう。 バージョンの違いのフルドキュメント(ロシア語)は、 ブログに掲載されています。

簡略化されたライブラリの動作原理について説明しましょう。

これを使用する場合、テスタは実際には最適化を実行しませんが、インプットパラメータのさまざまな組み合わせによってソートされます。 各ウィンドウの最適なセットは、レポート生成時に選択されます。 このスクリプトは、合計 D 期間から必要なサンプル W ウィンドウを割り当て、すべてのテスターパスのパフォーマンスパラメータを計算します (各パスは個別のパラメータセットです)、最適なオプションを見つけます。 次に、同じパス上のサンプルのステップ S 以降でトレード効率パラメータを計算します。

このアルゴリズムは、非標準の方法でフォワードウォークを実装します。 使いやすいですが、副作用もあります。 特に, 遺伝的最適化法を用いる場合、テスト対象のパラメータ集合が大域的な意味で最適であるという事実によってバイアスが入ります。 (期間 D 全体に対して, 現在のウィンドウ W に対してではない). これは、将来を垣間見ることになります。 しかし、一方で、最高のグローバルパラメータは、W ウィンドウ上のローカル最適化によって発見される可能性があるパラメータよりも小さい利益を生成する可能性があります。

いずれにせよ、この問題は、パラメータの完全な検索が遅い場合には存在しません。

また、EA は全体の期間 D でトレードされることに注意する必要があり、そこから生じる2つの結果があります。

まず、バランスは、特定のウィンドウの冒頭に可能性があります。 W.Similar の WFO と同様に、新しいライブラリは、固定ロットとストラテジーにのみ適用可能であることを意味します。

第2に、ポジションは最初または最後のウィンドウの境界線を越えることができます。すなわち、ウィンドウの開始時にオープンポジションはすでに存在し、フローティング利益を持っている可能性があります。 この不正確さはプロセスを簡素化するためです。 取引数の増加により、これから負の効果は無視できる値に減少します。 たとえば、ネットアカウントを使用する場合、1つのポジションの最大値は、ウィンドウの開始時に数値を歪めることがあり、1つのポジションの最大値は、その最後に行うことができます。 W ウィンドウで100の2重エントリー/決済トレードがある場合、計算の平均誤差は平均トレードサイズの 2% 以下です。

wfL の mqh ヘッダーファイルのライブラリインターフェイスは非常に簡単です。 

#import"wfL"
  int wfl_OnInit(const int cleanUpTimeout);
  void wfl_OnTick();
#import

EA コードへの埋め込みも大幅に簡略化されています。

#include<wfL.mqh>

int()
{
  //タスクコード
  wfl_OnInit(60);
}

void OnTick()
{
  //タスクコード
  wfl_OnTick();
}

最適化は、WFO ライブラリに対して上記と同じ手順を使用して実行されます。

最適化期間には、少なくとも200のバーがありますが、1000以上が推奨されます。 windows への一般的な期間の分割とフォワードのテストステップがバーで行われ、チェックされたウィンドウのサイズとオフセットのセットがライブラリコードで事前定義済みであることによるものです。ウィンドウのサイズは 10% から 10% 刻みで 50% に変化します (注 that ウィンドウのサイズは、ここでの合計テスト範囲 D のパーセンテージとして設定されます)、およびステップサイズ S は 5% から 30% までの増分でです。

最適化が完了すると、次のフォームのディレクトリが [テスター/ファイル] フォルダに作成されます。

<EA name>-<Symbol>-<Timeframe>-<Date>-<Time>

テスターの各パスの間にライブラリによって収集されたメタデータを持つ csv ファイルがあります。 ファイル内の各エントリには、1つのバーに関する情報が含まれています。( 日付と時刻、残高、フローティング利益とオープントレードの数。) このデータを使用して、期間内の任意のウィンドウの損益を計算することができます。 個々のトレードに関する情報は保存または分析されません。

指定したフォルダをテスタ/ファイルから MQL4/ファイルにすべてのファイルと共に移動することにより、レポート生成スクリプトを実行することができます (エントリーパラメータにフォルダ名を指定します)。 特定のウィンドウ内の最適なパラメータセットを選択するための最適化基準も指定されます。 使用可能な条件は、WFO ライブラリのフルバージョンと同じです。 結果として, 逐次ウォークフォワードテスト (上記例) を用いたクラスタ化レポートを得ました。

上記のすべての欠点は、優れた生産性と使いやすさによって容易にカバーできます。 ここではメタパラメータがないため、ウォークフォワード最適化では、EA の選択されたタスクパラメータに基づいて、通常の最適化と比較してオーバーヘッドコストを導入しません。


結論

組み込みテスターの利用可能な手段の中でウォークフォワード最適化技術を構築し、実装するための考えられるルールを検討しました。 上記で説明した既製のライブラリを使用すると、最小限の労力でテストできます。 ライブラリの簡素化と制限は、従来の1つの使いやすさをもたらし、任意の外部アプリケーションを必要としないため、その結果のウォークフォワードを区別できます。 MetaTraderには、ウォークフォワードの最適化を実行する関数が組み込まれているので、このようなライブラリは効率的な代替手段となりえます。


プロダクト概要表

プロダクト MetaTrader 4 MetaTrader 5

WFO: WalkForwardOptimizer & WalkForwardReporter

WalkForwardOptimizer
ライブラリ
https://www.mql5.com/en/market/product/17683 https://www.mql5.com/en/market/product/23068
WalkForwardReporter
スクリプト
https://www.mql5.com/en/market/product/17750 (必須ではありません
MetaTrader 5 WFO ライブラリは自動的にレポートを生成します)
WalkForwardDemo
EA
(none) https://www.mql5.com/en/market/product/23069

WFL: WalkForwardLight & WalkForwardBuilder

WalkForwardLight
ライブラリ
https://www.mql5.com/en/market/product/23223 https://www.mql5.com/en/market/product/23224
WalkForwardBuilder
スクリプト
https://www.mql5.com/en/market/product/23225 https://www.mql5.com/en/market/product/23226
(option)

アイコンをクリックすると、対応するプロダクトのページにつながります。



デモ EA の連続 (ローリング) WF 分析のパラメータ-wfo-demo-rolling. セット

デモ EA のクラスタ WF 分析のパラメータ-wfo-demo-cluster. セット