MT4・MT5で利用できるEAのバックテストとは、過去の特定の期間における取引データに基づきEAのパフォーマンスを測定し、EAの有効性をテストすることです。
その性格上、過去における有効性はテストできますが、現在の相場に継続して同様のパフォーマンスが出せることを示唆するものではありません。
しかし、現在の相場でテストする後述のフォワード(リアルタイム)テストの「相場のスピードの範囲でしか結果が出せない」という最大の弱点がなく、数年にわたる長期間のテストでも数秒でテストできるという手軽さが利用者の最大のメリットと言えます。
初心者向けのバックテストのやり方
MT4・MT5は素晴らしいソフトですが、初心者の方はまずその豊富な機能に圧倒され挫折してしまう傾向があります。
まずは最短の時間でバックテスト自体を体感しながら理解していただくことが重要だと思いますので、ここでは最低限の重要な機能に絞って説明します。
理解が深まってきたら「バックテストの最適化」にお進みください。
MT4のメニューバーの「表示」→「ストラテジーテスター」の順でテスターの画面を開きます。
セッティング(テスト対象項目の設定)
- エキスパートアドバイザ:テスト対象とするEAを選びます。
- 通貨ペア:テスト対象とする通貨ペアを選びます。
- 期間:表記は「期間」になっていますが、プルダウンメニューを開いてみていただくとお分かりのように、これは時間枠の単位(1分、5分、15分など)のことを意味しています。通常適切な時間枠はEA開発者から指示されていますのでそれに従ってください。わからない場合、スキャル系のEAであれば1分や5分など小さい時間枠で設定してみてください。トレンドフォロー系やチャートパターン系のEAであれば時間枠が大きくなるほどチャートがきれいな形になるのでパフォーマンスが上がる傾向があります。
- モデル:プルダウンメニューで「全ティック」、「コントロールポイント」、「始値のみ」を選ぶ形になっていますが、よくわからないうちは「始値のみ」を選んでください。中級編で詳しく説明します。
- スプレッド:次章で説明しますのでここでは初期設定のままで結構です。
- 期間を指定:【開始日】【終了日】を機械的に設定していくだけですが、初めての方はどのくらいの期間が妥当なのか?いつからいつまでにしたらいいのか?といろいろ悩むポイントです。バックテストの最大のメリットは何年間という単位でも数分、もしくは数秒で済んでしまう点なので、このことで何分も悩むくらいなら、まずはいろいろ試してみることをお勧めします。上級編のところで具体的に期間を変えてテストすることによってフォワードテストに近い結果を出すことができるウォークフォワードテストについても解説します。
- エキスパート設定:EAのパラメータについて詳しい方は好みの設定に変更してください。よくわからない方は初期設定のままで結構です。
- スタート:ここまでのプロセスができたらとにかくスタートボタンを押してバックテストを実行してみてください。
結果
初期設定のままですとハンドポンプ式のエアホーンのような音が出てテストの終了を知らせます。
うまくテストができたら結果欄に取引履歴が列挙されます。
何も表示されていなければ何らかの問題が発生している可能性があるので、一番右にある【操作履歴】と表記されたタブを開いてみてください。
文末に「よく起こるエラーとその対処法」について記載しておきましたので併せてご覧ください。
グラフ
結果欄の「残高」をラインチャートで示したものです。
青く太い線が残高を示し、緑の細い線が含み益や含み損を示します。
マーチンゲール系のEAは、青い実践が直線的に右肩上がりで素晴らしい結果が出るのが特徴ですが、緑の線が所々で下向きになってその後青い線に重なることを繰り返すのが一般的です。
結果として青い線に戻ればいいのですが、お金を引き出したいときに戻っていなければ引き出せません。
残高が減っていないのでドローダウンとしてレポートに表記されないためわかりにくいのですが、一番下のラインは口座破たんを意味し、ブローカによって異なる限度額に達すれば強制決済されます。
そのため「ドローダウン」と同じくらい注意して評価する必要があります。
レポートの見方
レポート項目は全部で28項目あり、どれも重要なものですが、初心者の方が一度にすべて把握しようとするとめまいを起こしてしまいますので、ここでは以下の5項目に絞って説明します。
純益(「総利益」-「総損失」)
売り買いすべての取引の結果である総利益から総損失を引いた値が純益になります。
単純に言えば、儲かったのか損したのかを見るところです。
プロフィットファクター(「総利益」/「総損失」)
先ほどの純益を別の表現で表したものですが、純益よりもはるかに重要な項目です。
例えば純益が同じ50万円であってもプロフィットファクターが2.00のEAの場合、総利益100万円、総損失50万円という組み合わせになりますが、1.20のEAの場合、純利益を50万円確保するために総利益を300万円稼ぐ必要がある一方、総損失が総損失が250万円にも達してしまいます。
普通の方には耐えられないですよね。
プロフィットファクター | 純利益 | 総利益 | 総損失 |
---|---|---|---|
2.00 | 50万円 | 100万円 | 50万円 |
1.20 | 50万円 | 300万円 | 250万円 |
理想的な値は2.0以上と言われることが多いですが、次に説明する総取引数が十分にあることが前提となります。
総取引数
地味な項目ですが意外に重要です。
仮にプロフィットファクターが5.0という非常に効率のいいEAがあったとします。しかし検証期間中数回しか取引していなければその結果を信頼してトレードに資金をかけられるでしょうか?
私は少なくとも統計上意味がある数値を得るには、目安として1戦略ルールについて30回から100回のトレードは必要だと思います。
この数値は多ければ多いほどいいと考えています。
EAの効率を上げるためにはフィルターをかけていくからです。
わかりやすく言うと、移動平均線のゴールデンクロスでエントリーするというルールの場合、レンジ相場では損失を繰り返してしまうので、レンジ相場検知フィルターを入れ、そのEAが不得意とするレンジ相場では稼働させないということを、EA開発者は頻繁に考えます。
つまりフィルターを入れるということは取引数が減ってしまうことになります。
総取引数が十分に多いEAは、パフォーマンスを高めていく余地が多く残されているということなのです。
最大ドローダウン
計算時点より前の期間での最大資産と比較して最も大きなマイナスの幅が最大ドローダウンとなります。
初期資産が100万円で計算時点が70万円の場合、初期資産が最大資産であればマイナス30万円です。
しかし、その間に200万円になったことがあればそこから引かなければならないので、最大ドローダウンはマイナス130万円というのが正解です。
最大ドローダウンの1.5倍から2倍は起こりえる「マイナス」として投入額を見積もると、口座破たんを避けられる可能性が高まります。
出力
レポートの画面でショートカットメニューを表示し、「レポートの保存」を選びます。
適切な場所にHTML形式のファイルを保存して開くと、ブラウザ上に画面で確認できたレポート内容と結果タブで表示されていた取引履歴が一緒に表示されます。
バックテストの最適化
ここではより実践的で詳細な機能について説明します。
ここまでで十分バックテストを体感されたら、いよいよバックテストの醍醐味ともいえる最適化についても習得していきましょう。
テスト対象項目の設定
モデル
モデルは3種類の中から選びます。それぞれバックテストの正確性に関わってきます。
全ティック
利用可能な最小時間枠を使いすべてのティックを生成する、最も正確な方法。
中にはリアルなティックをブローカからダウンロードしてバックテストする強者(つわもの)もいますが、MT4では疑似的にティックを生成してくれる便利な機能があります。
次のような欠点があるため、前の足の終値によってエントリーやエグジットの判断をしているEAには不要なモデルです。
EAが前の足の終値で判断しているのがわかっている場合は、迷わず「始値のみ」を選んでください。
- 時間がかかる
- 大量のティックデータがハードディスクを占領してしまう
1つ目は時間がかかるということです。何年もの長い間をテスト対象として設定してしまうと場合によっては何時間も終わらないなんてこともあります。
もう一つは大量のティックデータがハードディスクを占領してしまうことです。テスターを使う多くの場合、通貨や、時間枠等の条件を変えていろいろな側面からEAのパフォーマンスを確認しますが、その際全ティックで行うと平気で数十GBのスペースが一瞬で占領されてしまいます。
回避策としてはバックテスト終了後には都度【メニューバーの「ファイル」→「データフォルダを開く」→「tester」→「history」】の順でフォルダを開き、表示されているヒストリー(.hst)ファイルを削除することです。
コントロールポイント
「一つ下の時間枠を使ったおおまかな方法。結果はあまり信頼性はない。」
信じられないかもしれませんが、実はこのコメント、そのままMT4に表示されています。
確かに大まかな方法ではありますが、MT4を開発したメタトレーダー社自ら「結果はあまり信頼性はない」と認めているわけではないのではないかと思います。
その理由はこのモード、最適化には意外に効力を発揮します。
前述の通り、一つ前の足の終値で判断するEAは最適化も「始値のみ」で行えばいいのですが、ティックの動きで判断するEAの場合に、最適化でいくつもの条件を組み合わせて「全ティック」モードにしてしまうとそれこそいつ終わるかわからない状態にハマってしまいます。
そんなとき、このコントロールポイントのモードを使うと、一つ下の足を使ってシミュレートするため全ティックに比べて大幅に時間を節約できます。
ただし通常のバックテストでEAを評価する際は、メタトレーダー社が言うように「いい加減」になってしまうので全ティックか始値のみを使いましょう。
そういった意味ではここの翻訳は「結果はあまり信頼性はない。」というよりは「ティックで判断するEAの最適化の際に用いる」とした方がしっくりくるかもしれません。
始値のみ
最も早い方法。バーの始めにしか動かないEA向け。これについては前項で十分説明しましたのでここでは割愛します。
スプレッド
固定のスプレッドを自分で設定する形になります。
リアルのスプレッドがヒストリカルデータと同期してダウンロードされているわけではありません。
またMT4のBuild600以降では、それまでのpips単位からpoint単位に変更されているので、3pipsのスプレッドであれば3ではなく30を設定する必要があります。
最適化のやり方
最適化のパラメータについては実は今まで説明してきたEAの評価のための項目がすべて関連してくるのですが、ここではさらに最適化のためだけに用いられるパラメータについて補足しておきます。
最適化
まず最適化をするためにはここにチェックをしておく必要があります。
よく犯しがちな過ちは、最適化後に示されたパラメータの結果を反映してどのくらい改善したかを確認したい場合に、このチェックを外すのを忘れることです。
そのままスタートボタンを押してしまうとまた延々と最適化処理に入ってしまいますのでご注意ください。
エキスパート設定
「テスト設定」タブ
ここではシミュレーションを行う際の初期値を設定します。
- 初期証拠金:初期証拠金の金額
- 取引する通貨
- ポジション:テストするポジションの方向(EAの仕様にかかわらず買いの時のみをテストしたいのであれば「Long only」を選択すると売りは機能しなくなります)
- 最適化パラメータ:この項目の下に位置する遺伝的アルゴリズムを有効にした場合のみ有効となるパラメータになります。
Balance(残高)
Profit Factor(収益要因)
Expected Payoff(期待ペイオフ)
Maximal Drawdown(最低ドローダウン)
Drawdown Percent(ドローダウン%)
Custom:EAのコードの中でOnTester()関数によって指定できる独自のパラメータになります。 - 遺伝的アルゴリズム:チェックを入れると上記6項目から選んだものをもとに、テスターが自動的に有効な結果が出そうなパラメータのみを選んでテストするので大幅に時間が短縮されるところがメリットになります。一方デメリットは正確性が犠牲にされることです。期間が短く、「始値のみ」でテストできるEAの場合は、パラメータの組み合わせを絞り、このチェックは外してパラメータの総当たり戦にチャレンジされることをお勧めします。
「パラメータの入力」タブ
- 変数:EAが外部変数としてユーザーに変更を認めているパラメータのみが表示されます。チェックされた変数のみ最適化対象となります。
- 値:初期値のこと
- スタート:評価を開始する最初の値
- ステップ:スタート値からの変化量
- ストップ:最終評価値
「最適化」タブ
ここでは表示されている各項目について、右の「値」列のレベルに達した時点でテスト中のパスを放棄する制限値を設定します。
ビジュアルモード
テスターが開始日からテストを開始した際、その進捗を専用のチャート(visual)を開いて動的に表現してくれる優れものです。
スライドバー
1から32までの表示がされるスライドバーと【ストップボタン】によってチャートが動くスピードを調整できます。
初期設定で表示されるプレーンな画面のまま32のスピードを出してしまうと、人間の目では認識できないほどのスピードで進んでしまいます。
しかし、一つ遅い31にすると極端に遅くなるのが厄介なところです。
以前ネットではりゅうきさんという方が「Speed Controller」というインジケータ型のツールを出していただいていたのでご紹介しようと探したのですが、残念ながらみつかりませんでした。
スキップ
バックテストで定めた期間の中で、更に特定の時期の動きを直ちに見たいという場合、その日付を入力しボタンを押すことでジャンプできます。
その他の重要なレポート項目の解説
初級編では触れなかった項目の中で見ただけでは見当がつかないもの、また特に重要なものをいくつかここで説明します。
不整合チャートエラー
これはゼロであることが望ましい項目です。
要はこの数が多ければそれだけ不正確な評価結果であることを意味します。
ヒストリカルデータを正確に準備しておくことでゼロにできる項目なのできちんと準備しておきましょう。
モデリング品質
通常のバックテストで多くの方が行う方法は、各ブローカが提供している1分足データを入手して行うやり方です。
この方法だと、MT4がティックデータを疑似的に生成してバックテストを行うため、モデリング品質の最高値は90%を上回ることはありません。
TickStoryなどのプロバイダーから有料でリアルティックを入手しテストすると99%レベルまで高めることができます。
期待利得
1トレード当たりに期待される純利益のことです。
テストではヒストリカルデータにスリッページ、スプレッド、スワップ等のリアルなコストが入っているわけではなく、テスト前に自分で設定した疑似的データにより計算します。
当然リアルトレードでは変わってきますし、それ以外にブローカーによるストップ狩り等のコストなども付け加えられます。
以前は1トレード当たり5000円くらいの純益があれば十分と言われていましたが、この数値はやはり高いに越したことはありません。
さらに上級者向けのバックテスト
相場に合わせて最適化していきましょう。
相場の環境認識を助ける2つの手法
通貨の強弱
通貨ペアはその名の通りドル円であればドルと円がペアになって表記されています。
モノの値段を表す通貨自体がいくらするのか?を測定しようとすればその基準となる通貨が必要になるので考えてみれば当然のことですね。
私も以前100円から95円にさがったのにどうして「円高になった」と表現されるのか全く理解できませんでしたが、1ドルを買うために100円払わなくてはならなかった状態から95円だけで買えるようになった状態になるということは円の価値がそれだけ上がったことになるので円高と表現するのだと教えられようやく納得できた時にすがすがしい気持ちになったことを覚えています。
さて、余談はさておき、この通貨の強弱は意外に重要で、皆さんがお持ちのEAがトレンドフォロー型のものであれば強弱が激しい組み合わせが望ましく、スキャル型やグリッド型のものであれば、強弱が緩やかな組み合わせが望ましい傾向にあります。
要は激しい強弱の組み合わせはトレンドが発生しやすく、わかりやすく、伸びやすいということです。
ではどのようにしてそれを判断するか。
簡単な方法としては、USD/JPYの通貨ペアでUSDの強弱を見たいときは、チャートが右上がりであれば強く、右下がりであれば弱くなっています。JPYの強弱を見たいときはその逆ですね。
私の場合、メニューバーからファイル→チャートの組表示であらかじめドルストレートやクロス円などの通貨の組み合わせを登録しておき、すべての通貨に対して強い通貨とすべての通貨に対して弱い通貨の組み合わせを見つけて、最も強弱の激しい通貨同士をペアにするようにしています。
レンジ相場とトレンド相場を見分ける
環境認識で最もポピュラーなものはこれだと思います。
多くの書籍ではトレンドが出ていればトレンド相場、出ていなければレンジ相場と簡単に判断できるような印象を持たせます。
しかし、実際にトレンドだと思ってその方向にポジションを保有してもすぐにトレンドが終了してしまったり、ひどく逆行してしまったりということは誰にでも経験があるのではないでしょうか。
当然トレンドフォロー型のEAはトレンド相場で威力を発揮しますし、スキャル型やグリッド型のEAはレンジ相場で威力を発揮するので、それぞれ適した相場だけでEAを稼働させられれば多くの利益が得られるでしょう。
しかしなかなかそれを見分けるのは容易ではありません。
移動平均線から始まり、オシレータ指標を使ったダイバージェンス、ダウ理論、エリオット波動、一目均衡表、など相場の切り替わりを見極めるために勉強しなくてはならないことは山ほどあります。
ただ、インジケータの中にはトレンドがどこから始まっているのかをピンポイントで視覚的にわかるものもあるので、そういったツールを有効に活用すればレンジ相場やトレンド相場の期間を特定でき、テスターでその期間の最適化をすることによって市場検知型の最適化ができるようになります。
過剰最適化(カーブフィッティング)に注意
過剰最適化とは、「過去の特定の期間の相場状況に合わせてコードやパラメータを最適化すること」をいいます。
過去の一部分の相場しか考慮されていないので、別の期間でテストしたり、フォワード(リアルタイム)テストしたりすると通常パフォーマンスが大きく損なわれてしまいます。
最も簡単なカーブフィッティングレポートの作り方
- すべてのパラメータを初期設定のままにする
- テスト期間は数年単位のある程度長い期間を設定
- テスト結果を見て右肩上がりになっている期間を探す
- その期間でテストをし直す
以上のステップでほとんど手間をかけずに実に素晴らしいEAの評価レポートを作ることができます。
市販のパッケージでもテスト期間がマスキングされていたり、読みにくくなっていたりするものはその疑いがあります。
現実に、カーブフィッティングをして右肩上がりのレポートのセットでEA開発を発注する提供者もいるくらいですから、EAにお金を出して入手しようとされている方はここで正しいEAの評価の仕方を学び、悪徳EA業者から騙されないようにしましょう。
フォワードテスト(リアルタイムテスト)
フォワードテストはリアルタイムテストとも呼ばれ、その名の通りリアルタイムでの実運用となります。
実運用といってもテスト目的であればデモ口座で行う人がほとんどですが、ブローカによってはデモ口座とリアル口座でレートが違ったり約定の成功率が違ったりする場合が多いので少額をリアル口座で運用する場合もあります。
バックテストの理想はその結果がフォワードテストでも遜色ない結果になることですが、なかなかそういったテスト結果を出すことは難しいのが現実です。
ウォークフォワードテスト
ワールドカップ・チャンピオンシップ・オブ・フューチャーズ・トレーディングで1位になったケビン・J・ダービー氏が「システムトレード検証と実践」(パンローリング社)という本の中で推奨しているテスト方式です。
この考え方はそんなに難しいわけではないのですが、多少複雑なので極力わかりやすく具体例を交えて解説します。
以下のテスト条件で設定した項目は数字が決められているわけではないので、皆さんの状況に合わせて変更してください。
テスト条件の設定例
- テスト開始年:2010年
- イン・サンプル期間:4年
- アウト・オブ・サンプル期間:1年
イン・サンプル期間とは、その期間のデータをサンプルとして最適化するという意味なので、【開始日】を2010年、【終了日】を2013年にセットして最適化をするという意味になります。
アウト・オブ・サンプル期間とは、最適化を算出する期間以外のすべての期間を差しますが、ここでは最適化後に続く1年間としますので2014年の1年間がその期間に該当します。
イン・サンプル期間で最適化したパラメータを使って【開始日】2014年の営業開始日、【終了日】2014年の営業終了日をセットしてバックテストを行います。
同様にして【開始日】と【終了日】を1年ずつずらし、最適化の【開始日】は2011年、【終了日】は2014年に設定し、その3年間の最適化したパラメータで2015年1年間のバックテストを行います。
以上のプロセスを今年(2019年)まで繰り返すと、それぞれの最適化後に行ったバックテストの期間が2014年から2019年の途中まで6年分連続して残っていることにお気づきになると思います。それらをまとめて集計することでフォワードテストに近い評価結果が得られます。
これらのプロセスを手動ではなく、専用のプログラムとしてMT4やMT5向けに開発されている方(https://www.mql5.com/en/market/product/17683)がいますので興味のある方は入手して利用されるのもよろしいかと思います(ただし有料)。
市場検知型テスト
最後にご紹介するのは、市場の特性を検知しその特性に合わせてバックテストや最適化をしていく方法です。
この方法はネットにも記事が全くなく、まだほとんどの方に知られていませんが、EA開発者は意識しているかどうかに関わらず日常的に活用している方法ですので、ユーザーのみなさんもぜひ活用いただければと思います。
極論すれば相場はトレンドがあるか無いかの2択であり、その2種類の状態が、繰り返しています。
そして多くのEAには得意な相場というものがあり、それがトレンド相場であればトレンド相場で最大の利益を創出するように最適化され、レンジ相場になれば損失を最低限に抑えるように最適化されたパラメータに切り替えていったり、場合によってはEAを停止することが望まれます。
開発者であればそれをフィルターを使ったりEAを停止するコードを書いたりして対応できますが、ユーザーの立場でそれを行おうとすれば当然そのためのツールが必要になります。
トレンド状態かレンジ状態かを検知するインジケータは、有料ですが良いものがいくらでもありますので一度探してみてください。
ここではトレンド相場を得意とするEAを例にしてその具体的方法についてご説明します。レンジ相場を得意とするEAは「トレンド相場」という言葉を「レンジ相場」に置き換えてご理解ください。
- 長期の期間で相場の状態を検知:レンジ相場とトレンド相場の期間を検知ツールで特定します。
- トレンド相場を特定した期間の最適化を行います。
- いくつかのトレンド相場で最適化したパラメータから最も強力な組み合わせを記録しておきます。
- フォワードテストにおいて検知ツールを表示しておき、トレンド相場になったら手動で記録していたパラメータに変更します。
- 以上のプロセスを自動化したい場合は開発者に依頼しフィルターとして検知ツールのロジックを組み込みます。
- 更に強力な方法としてはここで紹介したウォークフォワードテストにこの市場検知ロジックを組み込む方法があります。ウォークフォワードで設定した期間をトレンド相場の期間に限定して同様に実行すれば実現可能です。
バックテストでよく起こるエラーと対処法
指定されたテスト期間の過去データが存在しない
ヒストリカルデータのダウンロードの仕方が間違っていることや、指定した期間が所有するデータの範囲外であることが考えられます。
対処法としてはヒストリカルデータを正しく設定しなおせば済みますが、それほど詳しくない方は単に期間を短くしてもう一度実行してみてください。
ヒストリカルデータの正しいダウンロード・インポート手順は以下の記事で解説しています。
取引ができていない
一番の原因は、EAが取引通貨や時間足を指定していてそのポリシーに違反しているケースです。
EAの仕様をチェックし、テスト条件と合致しているかを再確認してください。
グラフが直線的に右斜め下に0まで直行してしまう<EA開発者の方向け>
利食い値と損切値をOrdersend()命令に入れていれば起こりませんが、ブローカによるストップ狩りを避けるためにストップ値をステルス化する目的でOrdersend()以外のカスタム関数でエグジット命令を出す設計をしているEAによく起こります。
エントリーロジックは前の足の終値で判断するが、エグジットロジックはティックの動きで判断する場合などが典型で、エントリーロジックのもとになる足が続く限りエントリーとクローズを繰り返します。
結果としてスプレッド分がどんどん損失として積み重なってしまいテスト結果のグラフが右下がりの直線となります。
対処法としては①エグジットとエントリーのロジックを前の足の終値で合わせる、②一つの足でのエントリーは1回に制限する。Time()や、Barsで検索すると具体的なコードが見つかります。
休むも相場
最近EAの開発者の間では「洗濯機じゃないんだから。全自動なんて」という声がよく聞かれます。
ほったらかしで儲かり続けるEAというのは近年非常に少なくなってきています。
原因はいくつかありますが、顕著なものとして高機能なコンピュータプログラムによる短時間における高頻度の取引(HFT:High Frequency Tradingと呼ばれています。)の影響と言われています。
どのくらいの頻度かというと1秒間に数万回にも達するというのでとても人間では追いつけません。
既に海外では90%以上のFX取引がEAで行われ、今後AIも組み込まれていくことを考えると、結果として5分間で500pipsも落ちてしまうようなフラッシュクラッシュの犠牲者はいまだに裁量天国になっている日本のみなさんに限定されていくのではないかと心配になります。
フラッシュクラッシュから完全に逃れることはできませんが、市場がクローズする週末、EAが得意としていない相場状態の時や大きな指標発表となる時間帯などはEAを停止させておくことをお勧めします。
コメント