ADM-EA(分解モンテカルロ法)のロジック詳細解説

※アフィリエイト広告を利用しています

広告

この記事では、ADM-EA(分解モンテカルロ法)のロジックを解説していきます。

EAを作成するスキルがある程度あれば、この記事を読むだけで同様のEAを作成することは可能だと思いますので、是非オリジナルEAの作成にチャレンジしてみてください。

広告

ADM-EA(分解モンテカルロ法)とは

以下のページで配布しているEAです。一度バックテストやデモ口座での運用を試してみて、どのような挙動か確認することをオススメします。

使用するテクニカル指標

ロジックは比較的シンプルで、テクニカル指標としては以下の3つしか使用しません。

移動平均線(MA: Moving Average)

移動平均線は、ある特定期間内の価格の平均値を表示するテクニカル指標の一つです。この指標は、時間を経て価格の変動を滑らかにするために使用されます。結果として得られるラインは、短期的な価格の変動を緩和し、長期的なトレンドをより明確に示します。

DMI (Directional Movement Index)

DMIは、市場のトレンド強度を評価するために使用されるテクニカル指標の1つです。DMIは、プラスDI(+DI)、マイナスDI(-DI)およびADX(Average Directional Index)の3つの成分から成り立っています。+DIと-DIは、市場の上昇と下降の動きをそれぞれ測定し、ADXはこれらの動きの強さを示す指数です。これらの指標を使って、市場がどの程度トレンドを持っているか、またその強さはどの程度かを評価することができます。

ATR (Average True Range)

ATRは、市場のボラティリティを測定するためのテクニカル指標です。ATRは、特定の期間中に価格がどれだけ動いたかを平均化することで、その価格変動の範囲を計算します。これは、市場のボラティリティが高いときにはATR値が高く、低いときにはATR値が低くなることを意味します。投資家は、ATRを使用して市場のボラティリティを判断し、トレード戦略を立てる際のリスク管理に利用します。

ロジック詳細

まずは概要として一連の処理の流れを簡単に説明します。

  • DMIを用いて、買い(ロング)エントリーを行うか売り(ショート)エントリーを行うかを判断します。
  • MAを用いて、エントリータイミングを決定します。
  • ATRを用いて、利確幅と損切り幅を決定します。
  • ポジションはロング(buy)またはショート(sell)のどちらか1つしか持ちません。そのポジションが利確または損切りをするまで、次のポジションは持ちません。
  • エントリーしたポジションは、必ず勝ち(利確)または負け(損切り)で終了します。この勝率を50%くらい(出来れば半分以上勝てるようにしたい)を目指します。
  • 勝率50%でも安定的に利益を積み重ねられるように、分解モンテカルロ法を用いて各トレードのロット数を調整します。

    なお、コードでロジックを確認したい方は以下の記事をご参照ください。

    以下は、それぞれのプロセスについて具体的に説明します。

    DMIによるエントリー判断

    プラスDI(+DI)、マイナスDI(-DI)を用いて、以下の条件で買いフラグまたは売りフラグを判定します。

    • +DI > -DI であれば、買い(DMI_flg = 1)
    • +DI < -DI であれば、売り(DMI_flg = -1)

      非常に単純で、この条件であれば必ず買いまたは売りのフラグが立つことになりますが、これを1分足、5分足、15分足、1時間足の全てで判定します。

      つまり、

      • 1分足、5分足、15分足、1時間足の全てで+DI > -DI であれば、買い
      • 1分足、5分足、15分足、1時間足の全てで+DI < -DI であれば、売り

        という条件になります。

        MAによるエントリー判断

        上記のDMIによって売買判断は入れているのですが、買いフラグが立ったらすぐにエントリーするというわけではなく、MA(移動平均線)を用いてより有利なタイミングでエントリー出来るように調整します。

        具体的には、

        • 1分足のMAよりも一定幅だけ乖離している場合のみエントリーする

          という条件を加えます。

          ATRによるクローズ判断

          上記の通りDMIとMAと用いてポジションを保持したら、今度はクローズ条件を設定します。

          こちらも以下の通り非常にシンプルです。

          • エントリー時のATR(1時間足)の一定倍を利確幅に設定する
          • エントリー時のATR(1時間足)の一定倍を損切り幅に設定する

            この際、利確幅に使用する倍率を損切り幅に使用する倍率よりも少し大きめにしておくことで、勝率50%でもトータル損益をプラスに持っていくことが可能になります。

            分解モンテカルロ法によるロット数調整

            例えば、初期ロット数を0.01とした場合、常に0.01で取引を行わずに、過去の勝敗の推移に応じてロット数を調整する戦略を取り入れます。

            このロット数を調整する方法が分解モンテカルロ法ですが、以下の記事で詳細に解説していますのでここでは省略いたします。

            Pythonによるバックテストで検証

            以上のロジックについて、Python(Google Colab)を用いて具体的に検証してみたいと思います。

            ティックデータ(Bid値とAsk値)

            まずは、ティックデータを用意します。以下のようにGBPJPYのティックデータをMT5からダウンロードしました。

            このbidとaskの履歴を用いて、バックテスト(損益シミュレーション)を行います。

            バーデータ(四本値)

            続いて、使用するバーデータ(四本値)もMT5からダウンロードしました。

            上記は1時間足ですが、1分足、5分足、15分足、1時間足をそれぞれ用意しておきます。

            バーデータにテクニカル指標の追加

            バーデータ(四本値)に以下のようにATRとMA、DMI_flgを追加します。

            ここでは詳細は省略しますが、「pandas_ta」というライブラリを使用しました。

            Google Colaboratory の Python のバージョンが 3.9 にアップグレードされたことに伴って、talibのインポートでエラーが出るようになってしまったようです。したがって、代替策として上記「pandas_ta」を使用しています。

            ティックデータにテクニカル指標の追加

            これまでのデータを用いて、以下のようにティックデータに必要なテクニカル指標(フラグ)を追加します。

            例えば一番上のレコードを見てみると、DMI_flgは全て-1なので売りフラグです。さらに、MA_M1とbidを比較して乖離幅を確認して、エントリーするかどうかを判定します。

            利確幅は、基準となるATRが0.341870ですので、例えばATRの2倍と設定する場合は0.68になります。

            バックテストの実施(ロット数調整なし)

            上記ロジックを組み込んだ関数を用いて、バックテストを行います。

            パラメーター設定

            初期ロット数: 0.01
            エントリー幅: 60
            利確係数: 2.4
            ロスカット係数: 2.3
            最大ロット数: 0.01

            まずは、最大ロット数を0.01に設定することでロット数を0.01固定にします。

            エントリー幅というのは、移動平均線(MA)からどの程度乖離した場合にエントリーを行うかという乖離幅の基準値です。

            バックテスト結果

            期間: 2022年1月〜2023年3月
            総損益: 23,198円
            総利益: 224,571円
            総損失: 201,373円
            取引数: 482(勝率 52.28%)
            プロフィットファクター: 1.12

            ひとまず1年3ヶ月という期間で実施しましたが、勝率は52.28%とまずまずの結果になりました。損益グラフも以下の通り、やや右肩上がりです。

            バックテストの実施(分解モンテカルロ法)

            続いて、分解モンテカルロ法によるロット数調整を取り入れてバックテストを行います。

            パラメーター設定

            初期ロット数: 0.01
            エントリー幅: 60
            利確係数: 2.4
            ロスカット係数: 2.3
            最大ロット数: 0.30

            最大ロット数は0.30に設定しておきます。分解モンテカルロ法により計算されたロット数が0.30を上回った場合は、0.01にリセットされます。それ以外のパラメーターは、先ほどと同様です。

            バックテスト結果

            期間: 2022年1月〜2023年3月
            総損益: 66,235円
            総利益: 324,297円
            総損失: 258,062円
            取引数: 482(勝率 52.28%)
            プロフィットファクター: 1.27

            勝率は52.28%と先ほどと全く同じです。各取引のロット数だけ変化するようになっています。結果としては、総損益は大きくなり、プロフィットファクターも1.27と上昇しています。損益グラフもより右肩上がりになっていることがわかります。

            まとめ

            以上、いかがでしたでしょうか。この記事では、ロジックの説明にフォーカスしたため実際のコードは省略しました。それぞれのロジックにおけるコードの詳細等は、別記事でまとめるようにいたします。

            コードの詳細

            以下の記事にて、ADM-EAのコード全文を掲載し始めました。

            Python版のコード

            以下の記事にて、今回行ったバックテストと同内容のPythonコードを全てまとめました。是非ご確認ください。

            MT5用EAのダウンロード

            以下のページでMT5用のEAを配布しています。ロジックは本記事で紹介したものになっています。是非お試しください。

            タイトルとURLをコピーしました