見出し画像

ハイブリッドEAの開発:ナンピン・マーチンとアンチ・モンテカルロの融合

この記事では、

  • まず、ナンピン・マーチンEAのリスクとリターンの特徴を解説します。

  • その後、ナンピン・モンテカルロEA、アンチ・マーチンEA、アンチ・モンテカルロEAへとEAの進化の過程を説明します。

  • そして、これらの戦略を組み合わせたハイブリッド・モンテカルロEAのバックテスト結果を共有し、その効果を実証します。

  • このEAは無料でダウンロード可能で、読者の皆様もご自身でバックテストや実際の運用を試すことができます。

ぜひこの機会に、ご自身でその効果をお試しください。


ハイブリッド・モンテカルロEA

まずは、この記事における最終型である「Hybrid Monte Carlo EA(HMC-EA)」のバックテスト結果をご紹介します。

バックテスト結果(2023年1月〜2024年3月)

MT5におけるバックテスト結果です。前提は以下の通りです。

  • 取引対象はGOLD

  • 期間は2023年1月〜2024年3月の1年3ヶ月

  • 初期証拠金は100万円

HMC-EA バックテスト結果

証拠金最大ドローダウンが36万円に対し、総損益は106万円となりました。つまり、原資である100万円を失わずに、1年3ヶ月で約2倍に増やせるという結果です。プロフィットファクターは1.77、リカバリーファクターは2.94となり、指標も良好です。

損益グラフ

MT5の損益グラフ(残高推移グラフ)は以下の通りです。

HMC-EA 損益グラフ

少し横長で見づらいので、同じ結果のグラフ表示を変えたものが以下です。

HMC-EA

通常のナンピンEA場合、残高(青線)に比べて有効証拠金(緑線)が下に出る(含み損を抱える)のが特徴ですが、このEAの場合は上に出る(含み益を抱える)のが見て取れるかと思います。これがアンチ・マーチンゲールやアンチ・モンテカルロの特徴です。

以後、このグラフ形式で、各種EAを比較検証していきます。

ナンピン・マーチンEAとは

「ナンピン・マーチンEA」といっても、特定の統一されたロジックがあるわけではないですが、以下のような特徴を持つことが多いです。

  1. エントリーの実行:最初に「buy」または「sell」のエントリーを行います。

  2. ナンピン戦略の採用:エントリーした価格が不利な方向に動いた場合、追加で同じポジションにエントリーします。このように追加エントリーを行う戦略が「ナンピン」と呼ばれます。

  3. ロット数の増加:ナンピン時、最初のエントリーのロット数を一定の倍率で増やしてエントリーを行います。このようなロット数の増加戦略は「マーチンゲール法」として知られています。

  4. 利確のタイミング:価格が一定程度戻った際に利益を確定します。この戦略は、価格が一方的に不利な方向に動き続けることは滅多になく、いつかは価格が一定程度戻るという前提に基づいています。

このように、ナンピンとマーチンゲール法を組み合わせた戦略を備えたEA(エキスパートアドバイザー)を「ナンピン・マーチンEA」と呼ぶことがあります。

マーチンゲール法とは

ここで、ナンピン・マーチンEAにも採用されているマーチンゲール法についてもう少し基本から考えてみます。

マーチンゲール法は、ギャンブルや投資の戦略の一つで、特に賭け事においてよく知られています。この戦略の基本的な考え方は、負けた場合に次の賭けで前回の損失を回収し、さらに利益を上げるために賭け金を倍にしていくことです。マーチンゲール法は、特にコイン投げのような50/50の勝率を持つゲームで使用されることが多いですが、実際にはどのようなギャンブルにも適用することができます。

マーチンゲール法の基本的なステップ

  1. 初期賭け金を決める:まず最初に、賭ける金額を決めます。

  2. 賭けて勝つか負けるか:賭け事をして、勝った場合はそのまま利益を得て、初期賭け金で再び賭けます。負けた場合は次のステップへ進みます。

  3. 賭け金の倍増:負けた場合、次に賭ける金額を2倍にします。これにより、勝った場合にはこれまでの損失を全て回収し、さらに初期賭け金と同額の利益を上げることができます。

  4. 勝つまで繰り返す:勝つまでこのプロセスを繰り返します。勝ったら、初期賭け金に戻ります。

マーチンゲール法のFX取引への適用

FX取引に当てはめてみます。

  1. 初期賭け金を決める:まず最初に、初期ロット数と利確幅を決めます。(例えば、初期ロット数:0.01、利確幅:5.00)

  2. 賭けて勝つか負けるか:初期ロット数でエントリーを行い、利確した場合はそのまま利益を得て、初期ロット数で再びエントリーします。利確幅と同じだけ価格が逆方向に動いてしまった場合は次のステップへ進みます。

  3. 賭け金の倍増:利確幅と同じだけ価格が逆方向に動いてしまった場合、総ロット数が最初の2倍になるように追加エントリーを行います。(例えば、総ロット数が0.02になるように、0.01を追加エントリー)これにより、利確した場合にはこれまでの損失を全て回収し、さらに初期ロット数と同額の利益を上げることができます。

  4. 勝つまで繰り返す:利確できるまでこのプロセスを繰り返します。利確したら、初期ロット数に戻ります。

このルールに従うと、負け続けた場合のエントリーのロット数推移は以下のようになります。

  • 0.01(合計0.01)

  • 0.01(合計0.02)

  • 0.02(合計0.04)

  • 0.04(合計0.08)

  • 0.08(合計0.16)

つまり、エントリー時の合計ロット数を追加エントリーする(合計ロット数が2倍になる)というシンプルな構造です。

マーチンゲール法の前提の確認

ここで、このマーチンゲール法という戦略においては、以下の前提が重要であるということを改めて確認します。

  • 勝ちの場合も負けの場合も、同じ損益(勝ちの場合はプラス、負けの場合はマイナス)となること

  • 毎回の勝敗から生じる損益は、常に一定の損益 × 一定倍率(基準ロット数の定数倍)となること

つまり、これを実現するためには、毎回のエントリーにおける利確幅とロスカット幅は一定である必要があります。そして勝敗の判定がついたらすぐに、追加エントリーを行なって合計ロット数を調整する必要もあります。

ナンピン・マーチンEAの設計

ここからは、今回開発するEAの基本設計に入ります。マーチンゲール法の基本に則った設計としますが、基準幅を決めた後は単純にその価格だけ動いたかどうかを勝敗判定に用います。利確を勝ち、ロスカットを負け、というような考え方は取り入れません。

基本戦略

  1. 取引通貨はGOLD、勝敗の基準幅は5.00とする。

  2. スタート時の価格を基準価格とし、基準幅だけ上昇したら勝ち、下落したら負けとする。

  3. 上記のルールのみで、ターゲット数 = 1からスタートして、勝敗に応じてマーチンゲール法を適用して、ターゲット数を計算し続ける。

  4. ターゲット数が変更されたタイミングで、追加のエントリーまたはポジションのクローズ注文を行い、常にポジション数をターゲット数と一致させるようにする。

エントリー注文やクローズ注文は、あくまでターゲット数に合わせるために行います。

シナリオの流れ

  1. スタート時:
    GOLDの価格が2,000からスタート
    スタート時にエントリーを行う
    基準価格:2,000、ターゲット数:1

  2. 勝敗判定(1回目):
    価格が2,005に上昇(+5、勝ち)
    勝ったのでターゲット数は1にリセット
    ターゲット数が変わらないので取引は行わない
    基準価格:2,005、ターゲット数:1

  3. 勝敗判定(2回目):
    価格が2,000に下落(-5、負け)
    負けたのでターゲット数は2倍の2に変更
    ポジション数が2になるように+1だけ追加エントリー
    基準価格:2,000、ターゲット数:2

  4. 勝敗判定(3回目):
    価格が2,005に上昇(+5、勝ち)
    勝ったのでターゲット数は1にリセット
    ターゲット数が1になるように-1だけポジションをクローズ
    基準価格:2,005、ターゲット数:1

  5. 勝敗判定(4回目):
    価格が2,000に下落(-5、負け)
    負けたのでターゲット数は2倍の2に変更
    ポジション数が2になるように+1だけ追加エントリー
    基準価格:2,000、ターゲット数:2

  6. 勝敗判定(5回目):
    価格が1,995に下落(-5、負け)
    負けたのでターゲット数は2倍の4に変更
    ポジション数が4になるように+2だけ追加エントリー
    基準価格:1,995、ターゲット数:4

  7. 勝敗判定(6回目):
    価格が2,000に上昇(+5、勝ち)
    勝ったのでターゲット数は1にリセット
    ポジション数が1になるように-3だけポジションをクローズ
    基準価格:2,000、ターゲット数:1

損益計算

一連の流れを、エントリー注文とクローズ注文に注目して損益を計算してみます。

  1. スタート時:
    初期エントリー:+1
    エントリー価格:2,000
    保有ポジション:2,000 × 1

  2. 勝敗判定(1回目):勝ち
    取引なし
    保有ポジション:2,000 × 1

  3. 勝敗判定(2回目):負け
    追加エントリー:+1
    追加エントリー価格:2,000
    保有ポジション:2,000 × 2

  4. 勝敗判定(3回目):勝ち
    ポジションクローズ:-1
    クローズ価格:2,005
    実現損益:(2,005 - 2,000) × 1 = +5
    保有ポジション:2,000 × 1

  5. 勝敗判定(4回目):負け
    追加エントリー:+1
    追加エントリー価格:2,000
    保有ポジション:2,000 × 2

  6. 勝敗判定(5回目):負け
    追加エントリー:+1
    追加エントリー価格:1,995
    保有ポジション:2,000 × 2 + 1995 × 1

  7. 勝敗判定(6回目):勝ち
    ポジションクローズ:-2
    クローズ価格:2,000
    実現損益:(2,000 - 2,000) × 2 = ±0
    保有ポジション:1,995 × 1

クローズ注文を行なったのが、勝敗判定3回目と6回目で、合計損益は+5です。また、最後に残っている保有ポジションは含み損益が+5ですので、最終損益は+10という評価になります。

ここで、このルールに従うと常に保有ポジションを1つ持ち続けることになります。しかし、ここでは無視しているスプレッド等も考慮するとこれは無駄なので、ターゲットとなる数を常に1つ減らした状態で考えることにします。

損益計算(スタート時エントリーなし)

ターゲット数を1つ減らして、スタート時およびリセット時にエントリーは行わない方法で考えてみます。

  1. スタート時:
    保有ポジション:なし

  2. 勝敗判定(1回目):勝ち
    取引なし
    保有ポジション:なし

  3. 勝敗判定(2回目):負け
    追加エントリー:+1
    追加エントリー価格:2,000
    保有ポジション:2,000 × 1

  4. 勝敗判定(3回目):勝ち
    ポジションクローズ:-1
    クローズ価格:2,005
    実現損益:(2,005 - 2,000) × 1 = +5
    保有ポジション:なし

  5. 勝敗判定(4回目):負け
    追加エントリー:+1
    追加エントリー価格:2,000
    保有ポジション:2,000 × 1

  6. 勝敗判定(5回目):負け
    追加エントリー:+1
    追加エントリー価格:1,995
    保有ポジション:2,000 × 1 + 1995 × 1

  7. 勝敗判定(6回目):勝ち
    ポジションクローズ:-2
    クローズ価格:2,000
    実現損益:(2,000 - 2,000) × 1 + (2,000 - 1,995) × 1 = +5
    保有ポジション:なし

この変更により、勝ち判定になる度に保有ポジションはいったん無くなります。また、最終損益は実現損益が+10となり、先ほどのケースと同等になります。
一般的に取引回数だけスプレッド(手数料)が発生しますので、取引回数は減らせるなら減らした方が望ましいということでこちらの仕組みを採用します。

両建て戦略の導入

さらに、これまではbuyポジションだけを考えていましたが、sellポジションについても同じシナリオで考えてみます。

  1. スタート時:
    保有ポジション:なし

  2. 勝敗判定(1回目):負け
    追加エントリー:+1
    追加エントリー価格:2,005
    保有ポジション:2,005 × 1

  3. 勝敗判定(2回目):勝ち
    ポジションクローズ:-1
    クローズ価格:2,000
    実現損益:(2,005 - 2,000) × 1 = +5
    保有ポジション:なし

  4. 勝敗判定(3回目):負け
    追加エントリー:+1
    追加エントリー価格:2,005
    保有ポジション:2,005 × 1

  5. 勝敗判定(4回目):勝ち
    ポジションクローズ:-1
    クローズ価格:2,000
    実現損益:(2,005 - 2,000) × 1 = +5
    保有ポジション:なし

  6. 勝敗判定(5回目):勝ち
    取引なし
    保有ポジション:なし

  7. 勝敗判定(6回目):負け
    追加エントリー:+1
    追加エントリー価格:2,000
    保有ポジション:2,000 × 1

buy戦略とsell戦略を混ぜ合わせて、両建て戦略としたパターンは以下のようになります。
「netターゲット=buyターゲット - sellターゲット」です。

  1. スタート時:
    buyターゲット:0
    sellターゲット:0
    netターゲット:0

  2. 勝敗判定(1回目):buy勝ち、sell負け
    buyターゲット:0
    sellターゲット:1
    netターゲット:-1

  3. 勝敗判定(2回目):buy負け、sell勝ち
    buyターゲット:1
    sellターゲット:0
    netターゲット:1

  4. 勝敗判定(3回目):buy勝ち、sell負け
    buyターゲット:0
    sellターゲット:1
    netターゲット:-1

  5. 勝敗判定(4回目):buy負け、sell勝ち
    buyターゲット:1
    sellターゲット:0
    netターゲット:1

  6. 勝敗判定(5回目):buy負け、sell勝ち
    buyターゲット:2
    sellターゲット:0
    netターゲット:2

  7. 勝敗判定(6回目):buy勝ち、sell負け
    buyターゲット:0
    sellターゲット:1
    netターゲット:-1

この仕組みを採用したEAを「Nanpin Martin EA(NM-EA)」とします。これが本記事におけるベースモデルとなります。

NM-EAのバックテスト結果

MT5におけるバックテスト結果です。前提は以下の通りです。

  • 取引対象はGOLD

  • 期間は2023年1月〜2024年3月の1年3ヶ月

  • 初期証拠金は100万円

  • ロット数は0.01

  • マーチン倍率は2.0倍

  • 最大ポジション数は80

NM2.0-EA

このEAの特徴は以下の通りです。

  • ターゲット数にしたがってポジション数が調整されます。

  • 各ポジションのロット数は、設定した0.01で固定です。

  • 最大ポジション数を80に設定しているので、最大で0.01のポジションを80個持ちます。合計ロット数は0.80が最大です。

  • ターゲット数が80を超えると、ターゲット数が初期値である0にリセットされます。

最後の特徴が、いわゆるロスカットの状態で、これまで積み上がっていたロット数(ターゲット数)を一気に減らす形になるので、大きな損失が発生することが多いです。グラフ上でも多数のロスカット状態が確認できると思います。

マーチン倍率を1.5倍に変更

典型的なナンピンマーチン(マーチン倍率が2倍)は、コツコツドカン(利益を少しずつ積み重ねるが、一度の損失で利益が吹き飛んでしまう)要素が強いです。それをマイルドにする戦略として、マーチン倍率を2.0倍ではなく1.5倍にするなどの工夫が考えられます。

そこで、マーチン倍率を1.5倍にしたバージョンを「NM1.5-EA」として、バックテストを行なってみます。

バックテスト結果

前提は以下の通りで、倍率を変えたのみです。

  • 取引対象はGOLD

  • 期間は2023年1月〜2024年3月の1年3ヶ月

  • 初期証拠金は100万円

  • ロット数は0.01

  • マーチン倍率は1.5倍

  • 最大ポジション数は80

NM1.5-EA

コツコツドカンの頻度は減ったように見えますが、1つの大きなドカン(損失)がとても目立ちます。結果的に残高も100万円付近ということで、タイミングによっては残高を大きく減らしてしまうということがあり得ます。

NM1.5とNM2.0の比較

2つの残高推移グラフを重ねてみます。

NM1.5 vs NM2.0
  • NM2.0の方が、調子の良い時の利益が大きい(角度が急)

  • 途中でロスカットしてしまう頻度がNM2.0の方が高い

  • NM1.5は、利益も損失もおさえた形である

以上の特徴が見て取れます。

分解モンテカルロ法の導入

マーチン倍率1.5倍にしても、結局はコツコツドカンから抜け切れなかったということで、よりマイルドに、マーチンゲール法ではなく分解モンテカルロ法を採用してみます。

数列のルール

分解モンテカルロ法は、ある数列を用意した状態で、勝敗に応じて数列を変化させることで賭け金の調整を行います。

  1. 初めに[0, 1]という数列を準備する。

  2. 数列の左端と右端を足し合わせた数だけ賭ける。(最初は0+1=1)

  3. 負けた場合:賭け金額を数列の右端に加える

  4. 勝った場合:数列の一番右端と一番左端を消す

  5. 数列が完全に消えた場合は、数列をリセット。数列は[0, 1]から再びスタートする。

  6. 数列が1つ残った場合は、数字をなるべく均等に分解する。数列は、分解した2つの数字を並べた数列を使用する。
    例:数字分解時は、小さい数字を左に、大きい数字を右に書く。
    「5→[2, 3]」、「8→[4, 4]」、「11→[5, 6]」

分解モンテカルロ法の特徴を簡単にまとめると以下の通りです。

  • 数列がリセットされると最終的な収支はプラスになる。

  • ロット数の増大が緩やかで、損失は時間をかけて緩やかに回収する。

  • 以上より、リスクを軽減させたマーチンゲール法の改良版ともいえる。

シナリオの流れ

NM-EAにおいてマーチンゲール法を適用していた部分を分解モンテカルロ法に置き換えて、同じシナリオを適用してみます。
数列の左端の数字と右端の数値を足して、-1したものがターゲット数になります。

  1. スタート時:
    buyターゲット:0 ← [0, 1]
    sellターゲット:0 ← [0, 1]
    netターゲット:0

  2. 勝敗判定(1回目):buy勝ち、sell負け
    buyターゲット:0 ← [0, 1]
    sellターゲット:0 ← [0, 1, 1]
    netターゲット:0

  3. 勝敗判定(2回目):buy負け、sell勝ち
    buyターゲット:0 ← [0, 1, 1]
    sellターゲット:0 ← [0, 1]
    netターゲット:0

  4. 勝敗判定(3回目):buy勝ち、sell負け
    buyターゲット:0 ← [0, 1]
    sellターゲット:0 ← [0, 1, 1]
    netターゲット:0

  5. 勝敗判定(4回目):buy負け、sell勝ち
    buyターゲット:0 ← [0, 1, 1]
    sellターゲット:0 ← [0, 1]
    netターゲット:0

  6. 勝敗判定(5回目):buy負け、sell勝ち
    buyターゲット:0 ← [0, 1, 1, 1]
    sellターゲット:0 ← [0, 1]
    netターゲット:0

  7. 勝敗判定(6回目):buy勝ち、sell負け
    buyターゲット:1 ← [1, 1]
    sellターゲット:0← [0, 1, 1]
    netターゲット:1

このシナリオの場合、勝敗判定(5回目)まではターゲット数が変化しないため取引を行いません。勝敗判定(6回目)で初めてエントリー注文を行うことになります。

バックテスト結果

前提は以下の通り今までと同様です。

  • 取引対象はGOLD

  • 期間は2023年1月〜2024年3月の1年3ヶ月

  • 初期証拠金は100万円

  • ロット数は0.01

  • 最大ポジション数は80

NMC-EA

単独のグラフだけ見てもわかりづらいので、重ねたグラフで確認してみます。

NMC vs NM1.5

NMCがナンピン・モンテカルロEA、NM1.5がナンピン・マーチンEAです。NMCの方が負ける時に大きく負けている様子がわかります。これは、最大ポジション数を80という設定にしているせいもありそうです。マーチンゲール法の場合、ターゲット数は、2, 4, 8, 16, 32, 64, 128と2倍ずつ増えていきます。80を超える場合はリセットされるので、80という設定は実質64と同じことです。一方の分解モンテカルロ法の場合は、数列のパターンによっては80ギリギリまでになることもあるので、1回の負けによる損失が大きくなる可能性があります。

アンチ・マーチンゲール法

さて、続いて少し発想を変えてアンチ・マーチンゲール法というものを採用してみます。アンチ・マーチンゲール法とは、その名の通りマーチンゲール法の逆です。マーチンゲール法では、負けたらロット数を増やし続けて、勝ったらリセットするという戦略でしたが、アンチ・マーチンゲール法では、勝ったらロット数を増やし続けて、負けたらリセットするという戦略になります。

バックテスト結果

前提は以下の通り今までと同様で、マーチン倍率は1.5倍で試してみます。

AM1.5-EA

コツコツドカンが、利益コツコツ損失ドカンだったところ、損失コツコツ利益ドカンに変化したことがわかります。

2つのグラフを重ねてみましょう。

AM1.5 vs NM1.5

ぱっと見、綺麗な線対称に見えます。しかし、よく見てみると対称の基準となる線が水平ではなく、右肩下がりであることがわかります。

単純に2つの残高を合計してからグラフにしてみるとよくわかります。

NM1.5 + AM1.5

綺麗な右肩下がりのグラフです。これは、単純にナンピン・マーチンとアンチ・マーチンを組み合わせても、スプレッドの分だけ損失が発生して残高は減り続けてしまうということを示唆しています。

アンチ・モンテカルロ法

同様に、分解モンテカルロ法の勝敗による判定を逆にした戦略であるアンチ・モンテカルロ法を採用してバックテスト結果を見てみましょう。

バックテスト結果

こちらは、逆にする前は最終損益がマイナスになっていただけあり、最終的な損益はプラスになっています。

AMC-EA

先ほどと同様にグラフを重ねてみましょう。

AMC vs NMC

こちらもぱっと見では線対称に見えますが、残高を合計した状態でグラフにしてみると以下の通りです。

NMC + AMC

ハイブリッド・モンテカルロEAの開発

さて、以上を踏まえて、今回のEAのご紹介です。

発想としては、

  • コツコツ部分はナンピン・モンテカルロ(NMC)を採用したい

  • ドカン部分はアンチ・モンテカルロ(AMC)を採用したい

という非常にシンプルなものに基づきます。
このNMCとAMCを組み合わせたハイブリッドEAということで、「Hybrid Monte Carlo EA(HMC-EA)」と名付けます。

バックテスト結果

前提はこれまでと同様です。このグラフは、この記事の冒頭で掲載したものです。

HMC-EA

グラフを重ねてみましょう。

HMC vs NMC/AMC

ベースはAMCに近い動きをしつつ、コツコツとドカンがそれぞれ利益方向に改善されていることが見て取れます。

これまで見てきたEAも全て重ねてみましょう。

HMC vs others

バックテスト期間の前半は、中間的な損益パフォーマンスですが、後半に入るとその力を十分に発揮して結果を残していることがわかります。

GOLDという取引対象の特徴として、大きく動く時は一定の方向に動きやすいという傾向がありますが、その流れに上手く乗ることで損益を大きくプラスに持っていってる様子です。ナンピン系のEAと異なり、大きく動くときに損失(マイナス)が大きくなりすぎたりしない(むしろプラスの方向に働く)というのが大きな特徴です。

Dynamicモードの追加

以下の記事の通り、既存のStaticモードに加えて、Dynamicモードを追加しました。

EAのダウンロード

今回のEAは以下からダウンロード可能です。MT5用EAとMT4用EAをどちらも用意しました。

アップデート情報

2024/5/1 ver2.0 : Dynamicモードを追加しました。

MT5用EA

HMC-EA.ex5

MT4用EA

HMC-EA.ex4

ひとまず、以下の条件で無料で提供します。中身の詳しいロジックやコードについては別途有料記事にするかもしれません。

  • 是非、バックテストやデモ口座で自由に試してみてください。何か不具合やお気付きの点があればお知らせください。お問い合わせはこちらから。必ず対応するというわけではなく、今後の開発の参考にさせていただきます。

  • 詳しいハイブリッド(混ぜ合わせ)の方法は非公開です。バックテストで色々と試して検討してみてください。

以下のようなインプットを用意していて、この記事で紹介しているEAタイプを1~5で選択可能にしています。
また、StaticモードとDynamicモードを1~2で選択可能にしています。

HMC-EAのインプット

詳しい使用方法

バックテスト方法と実際に取引を行うためのEAのセッティング方法についての詳細を以下の記事にまとめました。あわせてご覧ください。


よろしければサポートお願いします。いただいたサポートは今後の記事の執筆に活用させていただきます。