モンテカルロ法を適用したトレーディング戦略の最適化

Aleksey Nikolayev | 21 8月, 2018

コンテンツ

一般論

モンテカルロ法に関する考え方は、アナロジーの面で説明することができます。科学的なメソッドの一つです。 アナロジーの他の例には、ハミルトンのオプティコメカニカルアナロジーなどがあります。

同じ理論で記述できる2つの対象がある場合、そのうちの1つを勉強して得た知識は別のものに適用できます。 このメソッドは、他のものよりもはるかに勉強するときに非常に便利です。 アクセス可能なオブジェクトは、もう1つのモデルと見なされます。 このメソッド自体はモデリングと呼ばれます。 コンテキストに応じて、モデルはオブジェクトの1つであるか、または両方に共通する理論です。

時々、研究者はモデリングの結果を誤解します。 明示的な例を考慮すると、風のトンネルで飛行機の縮小コピーを吹き飛ばすように、すべてが明らかに思えます。 しかし、オブジェクトが関連せず直観的でない場合、結論は時々トリックのように見えるが、一般化の基礎として機能します。 オブジェクトの一般的な理論は、大まかな側面について説明します。 オブジェクトの説明の必要な精度が低いほど、理論に準拠するオブジェクトのセットが広くなります。 たとえば、ハミルトンのオプティコメカニカルアナロジーは、光の波の長さがゼロになるトレンドがある場合にのみ、正確に満たされます。 実際には、このアナロジーは小さいが、常に有限の長さのときにだけ正当化されます。 理論的なモデルが計算および結論の基礎として役立つには十分に簡単であるべきで、単純化しすぎです。

モンテカルロ法の概念を明らかにしましょう。 この理論は、確率論的 (確率) 性質を持つオブジェクトをモデリングするためのアプローチです。 このモデルは、この理論に従って構築されたアルゴリズムを持つコンピュータプログラムです。 擬似乱数ジェネレーターを使用して、必要な分布を持つ必要なランダム変数 (ランダムプロセス) をシミュレートします。

(ここではそれほど重要ではありませんが)、研究対象の性質が確率論的に決定的にもなることを強調する価値があります。 確率論的な性質を持っている理論の存在はここでは重要です。 例えば、モンテカルロ法は、通常の積分を近似計算するために用いられます。 任意のそのような積分は、ランダムな変数の数学的な期待とみなすことができるので、可能です。

モンテカルロ法を使用した最初の例は、通常、Pi 番号がランダムにテーブルの上に針を投げることによって決定されるブッフォンの針の問題の解決策であると考えられています。 このメソッドの名前は、XX 世紀の半ばに登場しました。 結局のところ、ギャンブルゲーム-例えば、ルーレット-などの乱数ジェネレータです。 また、ギャンブルのヒントには、確率論の起源では、計算のサイコロやカードの再生に関連するから始まりました。

モデリングプログラムのアルゴリズムは、メソッドプレバレンスの理由の一つであり、簡単です。 このアルゴリズムは、理論に対応する分布を持つ研究対象状態の複数のランダムに生成されたバリアント (サンプル) を備えています。 必要な特性のセットがそれぞれに対して計算されます。 その結果、大きなサンプルが届きます。 研究対象の特性の1つだけのセットがありますが、モンテカルロ法では、多くのデータから大きな数を取得し、その分布関数を構築することができます。

上記の一般的なモンテカルロモデリング構造はシンプルなようです。 ただし、実装しようとすると、複数の複雑なバリエーションが生成されることがあります。 アプリケーションをファイナンスに限定しても、この本ではどれほど膨大かが分かります。 さて、EAの安定性を研究するためにモンテカルロ法を適用します。 それには、自分のタスクを表す確率モデルが必要です。

確率論的 EA モデル

このEA を使用して実際のトレードを開始する前に、通常、テストとクオートのヒストリーの中で最適化します。 しかし、なぜ我々は過去のトレード結果が未来の結果に影響を与えると考えるのでしょうか。 当然のことながら、未来のすべてのトランザクションが過去と同じオーダーで形成されるとは考えていません。 しかし、 "アナロジー性" についての仮定を持ち合わせてはいます。 確率論を用いて、この直感的な "アナロジー性" を定式化してみましょう。 この形式化に従って、各トレードの結果は、ランダム変数の特定の実現であると考えています。 この場合のトレードの "アナロジー性 " は、対応する分布関数の近接によって決定されます。 このような形式化では、過去のトレードは、未来の分布の種類を明確にし、その可能性の結果を評価するのに役立ちます。

確率論的定式化により, 様々な理論を構築できます。 最もシンプルでよく使われるものを考えてみましょう。 この理論では、それぞれのトレードの結果は、相対的利益k = c1/c0で明確に定義されています, ここで、 c0 c1 は、トレードの前後に資本のボリュームです。 さらに、相対的なトレード利益は、利益と呼ばれますが、 C1-C0 は絶対的なトレード利益です。 すべてのトレードの利益 (過去と未来の両方) が互いに独立しており、均等に分散されたランダム値から成ると仮定します。 その分布は、 F (x) 分布関数によって決定されます。 したがって、必要なタスクは、過去の収益性の高いトレードの値を使用して、この関数の種類を定義することです。 数学的統計の標準的な問題であり、サンプルによる分布関数の復元です。 すべてのソリューションは、常におおよその回答を提供します。 方法をいくつか見てみましょう。

  1. 近似として経験的分布関数が用いられています。

  2. トレード利益は、2つの値のいずれかを取るシンプルな離散分布を取ります。 損失確率の平均損失、または利益確率の平均利益のいずれかです。

  3. 離散ではなく、分布関数の連続 (密度を持つ) 近似を構築します。 これを実現するために,カーネル密度推定などの手法を用います。

さらに、最初のオプションを使用します-最もシンプルで普遍的です。 トレーダーは、関数自体を知ることにはあまり興味がありません。 しかし、EA の操作によって得られる利益、またはそれに対するリスクをしることが重要です。 これらの値は、分布関数で知ることができます。

この例では、モデリングアルゴリズムを指定してみましょう。 関心の対象は、未来の EA の可能性のある結果です。 明確にトレードによって定義されます。 各トレードは、利益の値によって設定されます。 利益は、上述の経験的分布に従って分配されます。 このような多数のシーケンスを生成し、それぞれに必要な特性を計算する必要があります。 このようなシーケンスの生成はシンプルです。 k1、k2、...、knのヒストリーの中で得られたトレード利益のシーケンスを定義してみましょう。 nの長さでシーケンスを生成することにより、ランダムに ( 1/nの等価確率で) ki (リターン付きサンプル) のいずれかをN回選択します。 通常、N= nは、Nが大きいため、 経験的分布によるF (x)近似精度が劣化することが想定されます。 このバージョンのモンテカルロ法は、ブートストラップメソッドと呼ばれることもあります。

上記のすべてをチャートで説明しましょう。 資本曲線を示します。 各々は、トレードの生成されたシーケンスによって決定されます。 利便性のため、異なる色で曲線をマークします。 実際には、その数ははるかに大きい-数千万です。 それぞれについて、必要なパラメータを計算し、その全体に基づいて統計的結論を下します。 明らかに、特性上の最も重要な最終利益があります。

生成された資本曲線

その他にも、確率論的定式化と EA 操作モデル化へのアプローチも可能です。 たとえば、トレードのオーダーではなく、価格オーダーをシミュレートし、EA が取得した総計の利益を調査することができます。 価格シリーズの生成の原則は、解決したいタスクに応じて選択することができます。 ただし、このメソッドでは、より多くのコンピューティングリソースが必要です。 また、メタトレーダーは現在、ランダム EAを使用するための正規のメソッドを提供していません。

理論の適用

今回のタスクは、特定の最適化基準を構築することです。 それぞれが一定の目標に対応します。 主として、トレードの全体のシリーズの結果として得られた最終的な利益です。 利益による最適化はテスタに組み込まれています。 最終的な利益に興味があるので、現在の利益からの偏差の程度を何とか評価する必要があります。 偏差値が小さいほど、システムの利益は安定します。 3つのアプローチを考えてみましょう。

  1. モンテカルロ法を通じて利益の可能な値の大きなサンプルを得ました。これで、その分布と関連付けられている量を調べることができます. この利益の平均値は非常に重要です。 この分散は重要です。これが小さければ小さいほど、より安定したEAになります。 この基準は平均的な利益の平均散布率に等しくなります。 シャープレシオに似ています。
  2. もう一つの重要な特徴は一連のトレードの利益のドローダウンです。 あまりにも多くのドローダウンは、EAが有益であっても、資産の損失につながることができます。 このような理由から、ドローダウンは通常制限されます。 可能な利益にどのように影響を与えるかを知るのに便利です。 この基準は、平均利益として定義されていますが、トレードの決済がドローダウンの許容レベルを超えたときにモデル化されているという条件です。
  3. トレード利益分配の持続性の観点から利益の安定性を測定する基準を構築します。 確率論の観点から、原則として、非定常価格増分の場合には可能であるトレード利益の定常を意味します。 これを行うには、前方テストと同様のアイデアを使用します。 最初と最後のサブサンプルにトレードの最初のサンプルを分割してみましょう。 その均質性を検証するために、統計的なテストを適用することができます。 このテストに基づいて、最適化基準を作成します。

今回の理論を示すために、MetaTrader5の配信に含まれている "Moving Average.mq5" EA を使用します。 そのコードに小さな変更を実装します。 このEA の冒頭で、ヘッダーファイルをインクルードするコード文字列を追加します。
#include <mcarlo.mqh>

EA の最後に最適化パラメータを取得して使用するためのコードを追加します。

double OnTester()
  {
   return optpr();         //最適化パラメータ
  }

基本的な計算は、 "mcarlo.mqh " ヘッダーファイルにある関数で行われます。 "MQL5/Include/" フォルダに配置します。 このファイルの main 関数はoptpr ()です。 必要な条件が満たされると、 noptprパラメータによって指定された最適化基準バリアントを計算し、それ以外の場合は0を返します。

double optpr()
  {
   if(noptpr<1||noptpr>NOPTPRMAX) return 0.0;
   double k[];
   if(!setks(k)) return 0.0;
   if(ArraySize(k)<NDEALSMIN) return 0.0;
   MathSrand(GetTickCount());
   switch(noptpr)
     {
      case 1: return mean_sd(k);
      case 2: return med_intq(k);
      case 3: return rmnd_abs(k);
      case 4: return rmnd_rel(k);
      case 5: return frw_wmw(k);
      case 6: return frw_wmw_prf(k);
     }
   return 0.0;
  }

setks ()関数は、トレード履歴に基づいてトレード利益の配列を計算します。

bool setks(double &k[])
  {
   if(!HistorySelect(0,TimeCurrent())) return false;
   uint nhd=HistoryDealsTotal();
   int nk=0;
   ulong hdticket;
   double capital=TesterStatistics(STAT_INITIAL_DEPOSIT);
   long hdtype;
   double hdcommission,hdswap,hdprofit,hdprofit_full;
   for(uint n=0;n<nhd;++n)
     {
      hdticket=HistoryDealGetTicket(n);
      if(hdticket==0) continue;

      if(!HistoryDealGetInteger(hdticket,DEAL_TYPE,hdtype)) return false;
      if(hdtype!=DEAL_TYPE_BUY && hdtype!=DEAL_TYPE_SELL) continue;

      hdcommission=HistoryDealGetDouble(hdticket,DEAL_COMMISSION);
      hdswap=HistoryDealGetDouble(hdticket,DEAL_SWAP);
      hdprofit=HistoryDealGetDouble(hdticket,DEAL_PROFIT);
      if(hdcommission==0.0 && hdswap==0.0 && hdprofit==0.0) continue;

      ++nk;
      ArrayResize(k,nk,NADD);
      hdprofit_full=hdcommission+hdswap+hdprofit;
      k[nk-1]=1.0+hdprofit_full/capital;
      capital+=hdprofit_full;
     }
   return true;
  }

sample ()関数は、元a []シーケンスからランダムなb []シーケンスを生成します。

void sample(double &a[],double &b[])
  {
   int ner;
   double dnc;
   int na=ArraySize(a);
   for(int i=0; i<na;++i)
     {
      dnc=MathRandomUniform(0,na,ner);
      if(!MathIsValidNumber(dnc)) {Print("MathIsValidNumber(dnc) error ",ner); ExpertRemove();}
      int nc=(int)dnc;
      if(nc==na) nc=na-1;
      b[i]=a[nc];
     }
  }

次に、上記の3種類の最適化基準についてそれぞれ詳細に検討します。 いずれの場合も、EURUSD の同じ時間間隔-春/夏2017の最適化を実行します。 タイムフレームは常に1時間で、テストモードは分足チャートから OHLCを使います。 カスタム最適化基準による遺伝的アルゴリズムを常に使用します。 このタスクは、実際のトレードの EA を準備するのではなく、理論を実証することですので、このようなシンプル化されたアプローチは自然だと考えられます。

ランダム散乱に対する利益のロバスト性

生成された最終的な利益のサンプルがあると仮定します。 これは、数理統計学的手法を用いて研究することができます。 下の図は、点線でマークされた中央値を持つヒストグラムを示しています。

最終的な利益のヒストグラム

最適化基準の2つのアナロジーのバージョンを構築します。 mean_sd ()およびmed_intq ()関数で計算されます。 オプションの共通部分は、散布の尺度に対する平均の比率を表すということです。 その差は、平均と分散がどのように決定されるかにあります。 最初のケースでは、算術平均と標準偏差は、2番目の-選択の中央値4分位幅の範囲です。 利益が高ければ高いほど、分散が小さければ小さいほど、両者の価値は高くなります。 ここでは、1つのトレードではなく、トレードの全体のシリーズの利益を意味するが、シャープレシオに明らかなアナロジー性があります。 基準の2番目のバリアントは、最初のものと比較してスパイクに耐性があります。

double mean_sd(double &k[])
  {
   double km[],cn[NSAMPLES];
   int nk=ArraySize(k);
   ArrayResize(km,nk);
   for(int n=0; n<NSAMPLES;++n)
     {
      sample(k,km);
      cn[n]=1.0;
      for(int i=0; i<nk;++i) cn[n]*=km[i];
      cn[n]-=1.0;
     }
   return MathMean(cn)/MathStandardDeviation(cn);
  }

double med_intq(double &k[])
  {
   double km[],cn[NSAMPLES];
   int nk=ArraySize(k);
   ArrayResize(km,nk);
   for(int n=0; n<NSAMPLES;++n)
     {
      sample(k,km);
      cn[n]=1.0;
      for(int i=0; i<nk;++i) cn[n]*=km[i];
      cn[n]-=1.0;
     }
   ArraySort(cn);
   return cn[(int)(0.5*NSAMPLES)]/(cn[(int)(0.75*NSAMPLES)]-cn[(int)(0.25*NSAMPLES)]);
  }

この条件によって最適化された EA のテスト結果の2つのペアです。 最初のペアでは、最初のバリアントの最適化結果と、比較に最大利益の結果があります。 スムーズな資本曲線を与えるので、明らかに、最初の1つは、望ましいものと言えます。 最終的な利益は、必要に応じて、トレードの量を増やすことによって増加することができます。

最大安定性

最大利益

最適化基準の2番目のバリアントには、同じ結果のペアが用意されています。 ここから同じ結論を引き出すことが可能です。

最大安定性

最大利益


ドローダウンに対する利益の堅牢性

トレードの各生成されたシーケンスのドローダウンの量を監視します。 トレードシリーズの最初の部分の後に残っている資本がrmndminパラメータによって設定されたよりも小さい場合、残りのトレードは破棄されます。 下の図は、相対的なドローダウンレベルを超えた場合に、資本が変更をストップし、資本線の最終セクションが水平になることを示しています。

相対的なドローダウンの制限の場合の資本曲線

絶対的な、相対的なドローダウンの2つの基準の計算オプションがあります。 絶対的なドローダウンの場合には、資本のシェアは、その初期値から計算されますが、相対的なドローダウンの場合には、計算は最大のものから行われます。 パラメータバリアントを計算する関数は、応じてrmnd_abs ()およびrmnd_rel ()と呼ばれます。 どちらの場合も、基準の値は、生成された利益の平均です。

double rmnd_abs(double &k[])
  {
   if (rmndmin<=0.0||rmndmin>=1.0) return 0.0;
   double km[],cn[NSAMPLES];
   int nk=ArraySize(k);
   ArrayResize(km,nk);
   for(int n=0; n<NSAMPLES;++n)
     {
      sample(k,km);
      cn[n]=1.0;
      for(int i=0; i<nk;++i)
        {
         cn[n]*=km[i];
         if(cn[n]<rmndmin) break;
        }
      cn[n]-=1.0;
     }
   return MathMean(cn);
  }

double rmnd_rel(double &k[])
  {
   if (rmndmin<=0.0||rmndmin>=1.0) return 0.0;
   double km[],cn[NSAMPLES],x;
   int nk=ArraySize(k);
   ArrayResize(km,nk);
   for(int n=0; n<NSAMPLES;++n)
     {
      sample(k,km);
      x=cn[n]=1.0;
      for(int i=0; i<nk;++i)
        {
         cn[n]*=km[i];
         if(cn[n]>x) x=cn[n];
         else if(cn[n]/x<rmndmin) break;
        }
      cn[n]-=1.0;
     }
   return MathMean(cn);
  }

適切なrmndmin固定パラメータを用いて最適化を行うか, 最適値を探すことができます。

その制限は、より顕著な効果を与えるため、相対的なドローダウンに関連付けられている基準にのみ結果を提供してみましょう。 rmndmin固定値のバリアントで最適化を実施します。0.95, 0.75 と 0.2です。

rmndmin = 0.95

rmndmin = 0.75

rmndmin = 0.2

rmndminの値が低いほど、ドローダウンが目立たなくなりますが、最適化の結果は通常の利益最大化と同じようなものになります。 大きい数の法則の結果として考慮することができます。-確率理論の主義. 画像では、この効果は、垂直軸によって異なる尺度を持っているので、顕著ではありません 。 加えて、rmndmin値の減少に起因する増加ドローダウンが明らかにされていません。

ここで、最適化された数にrmndminパラメータを含め、同じ基準で最適化を継続します。

rmndmin=0.55

最適値rmndmin = 0.55を取得します。 このような値では、ドローダウンは容認できず、アカウント残高のほぼ半分に達する可能性があります。 したがって、実際のトレードでは使用できません。 しかし、ここで別の利点があります。 大きなドローダウンを待つことには、ほとんどの場合意味がないことが分かります。 これはトレーディングルールの後半に対応しています。 "利益を成長させ、損失を防ぐ "。

価格非定常性に対する利益配分の頑健性

価格の動作が変わることがあります。 同時に、EA のタスクの成果を安定させたいと考えています。 EA の確率モデルの点から、非定常価格増分の場合でも、トレード利益定常を必要とすることを意味します。

最適化基準は、最終的なものとのトレードシーケンスの最初の部分を比較します。 近いほど、その値が大きくなります。 近さはウィルコクソンマンホイットニー基準に基づいて決定されます。 そのエッセンスを説明しましょう。 トレードの2つのサンプルを持っていると仮定します。 この基準は、サンプルの1つが別の標本に対してどの程度シフトされるかを決定します。 シフトが小さいほど、基準値が高くなります。 イメージで説明しましょう。 各サンプルは、対応するヒストグラムで表されます。 基準の最大値は、中央の画像にあります。

サンプルの相対ポジション

この場合、モンテカルロ法自体は使用されません。 しかし、WMW 基準の大きな値は、トレード利益分配のタイプが維持されるという仮定を確認するので、そのアプリケーションを正当化します。

このファイルはまた別の規準の変形-利益によって WMW 規準のプロダクトを特徴付けます。

double frw_wmw(double &k[])
  {
   if (fwdsh<=0.0||fwdsh>=1.0) return 0.0;
   int nk=ArraySize(k), nkf=(int)(fwdsh*nk), nkp=nk-nkf;
   if(nkf<NDEALSMIN||nkp<NDEALSMIN) return 0.0;
   double u=0.0;
   for (int i=0; i<nkp; ++i)
     for (int j=0; j<nkf; ++j)
       if(k[i]>k[nkp+j]) ++u;
   return 1.0-MathAbs(1.0-2.0*u/(nkf*nkp));
  }

double frw_wmw_prf(double &k[])
  {
   int nk=ArraySize(k);
   double prf=1.0;
   for(int n=0; n<nk; ++n) prf*=k[n];
   prf-=1.0;
   if(prf>0.0) prf*=frw_wmw(k);
   return prf;
  }

WMW基準の直接的な使用は、損失を作るオプションを間違える可能性があるので、問題があります。 利益値によって EA を最適化し、このパラメータの小さな値でオプションを破棄する方が良いでしょうが、それを行う方法は不明です。 WMW 基準点から最適なオプションの数を選択することができますし、その中から最大の利益を与えるものを選択します。

10のベストパスのうち2つの例を提供します。 一つは収益性があり、もう1つは損失になります。

利益

損失

WMW の基準は、同じ時間間隔または異なる時間間隔で1つのEAで2つの異なるEAを比較するときにより有用であると考えられます。 しかし、このような比較を定期的に行う手法はまだ明確ではありません。


また、利益によって WMW 基準の積と等しい基準によって最適化の例をあげます。 どうやら、利益を元に行う単純な最適化に似ています。そしてそれは有用であると言えますによって、その使用が過剰であることを意味シンプルな最適化に似ています。

wmw * profit

結論

この記事では、マークされたトピックの側面について触れました。 かんたんな言葉で締めくくりましょう。

添付ファイル

#
名称
 種別 詳細
1
Moving Average_mcarlo.mq5 Script
Modified standard Moving Average.mq5
2
mcarlo.mqh ヘッダーファイル
すべての必要な計算を実行する関数を持つメインファイル