English Deutsch
preview
MQL5における市場ポジショニング戦略の体系(第1回):NVIDIAのビットワイズ戦略研究

MQL5における市場ポジショニング戦略の体系(第1回):NVIDIAのビットワイズ戦略研究

MetaTrader 5テスター |
112 0
Stephen Njuki
Stephen Njuki

はじめに

本日は、新連載「MQL5における市場ポジショニング戦略の体系」のパイロット版を公開します。本連載では、自動化されたアルゴリズム取引を中心に探究し、とりわけ株式向けに設計された、主としてロングポジション限定の戦略に焦点を当てていきます。本連載における「戦略の体系」という考え方は、インジケーターのシグナルを離散的なパターンへと分解する構造的な「ビットワイズ」アプローチに基づくだけでなく、さらに重要な機械学習の要素も取り入れたものです。前の連載で取り上げたように、これらの離散パターンは後に教師あり学習やテストへと組み合わせることが可能です。私たちの戦略的アプローチの目的は、信頼性の高いポジショニングシグナルを抽出することにあります。そのために、個別に定義されたシグナルパターンを分離し、厳密に評価していきます。

本記事では、NVIDIA Corporation (NVDA)を対象とします。同社は確立された高流動性銘柄であり、技術革新サイクルや企業の合併・買収活動に大きく影響を受ける、非常にダイナミックな企業です。この市場特性の複雑さを活用し、RSIとDeMarkerオシレーターを組み合わせた、規律ある戦術的買い限定アプローチの堅牢性を検証します。テスト期間は2021年8月から2024年6月までとします。これは、MetaTrader 5のストラテジーテスターにおいて株式分割をテスト時に反映できないという制約への対応策です。ライブ取引では多くのブローカーがこの問題を処理しますが、ストラテジーテスターではまだ完全には対応されていません。NVIDIAは世界で最も企業価値の高い企業であり、直近の2回の株式分割がテスト開始と終了の時期に非常に近接している点も考慮しています。

本連載における重要な前提の一つは、以前の「MQL5ウィザード」連載で扱った内容において、「ビットワイズ」のパターンは個別に使用した場合には機能したものの、入力パラメータ「patterns-used」で複数のパターンを組み合わせると効果が得られず、相互に干渉してしまう傾向があった点です。そこで今回は、トレーダー自身の知識や経験に基づく独立したパターン利用が必要という現象が、特定のポジション(たとえば買い限定ポジション)を維持する場合でも依然として求められるかどうかを徹底的に検証します。特定のポジション制約がなかった場合、複数のパターンを組み合わせることに反対する理由は、それらが早期に互いを打ち消し合い、学習時には「カーブフィット」の結果を生むものの、実際の環境では再現されない点にありました。

本連載の初回記事では、10種類のシグナルパターンを買い側のみで実装し、個別に検証することからスタートします。検証の基本方針は探索的です。まずは各パターンを単独でテストし、記事の草稿完成後に追加で、全パターンの組み合わせだけでなく、パターンをペアで組み合わせた場合もテストしました。この追加テストでは、10パターンすべてを一度に組み合わせる場合とは異なる結果が得られました。 

この取り組みにより、そして今後の連載でも、「市場ポジショニング戦略の体系」は、MQL5における新たな売買シグナルの発見と構築のための指針を示すだけでなく、複雑でしばしば振動的な入力を扱いやすいコードとして解釈および活用することで、取引アルゴリズムの理解を深める助けとなるでしょう。


NVIDIA Corp.(NVDA)

この企業は、半導体分野、とくに高性能計算や人工知能、ゲームに活用されるGPUにおける先駆的な役割から、裁量取引およびシステムトレードの主要な資産の一つとして際立っています。主要顧客であるOpenAIや同業競合が注目を浴びていることもあり、同社株は大きなボラティリティを伴いながら上昇傾向を示し、現在では世界で最も企業価値の高い企業の一つとなっています。

過去5年間でNVIDIAに影響を与えた重要な市場イベントの一つが、2度の株式分割です。最初の株式分割は2021年7月におこなわれ、4分の1の株価に調整されました。直近の分割は2024年6月で、10分割が実施されました。株式分割は、株価を下げる一方で発行株数を増やすため、株価の見え方に影響を与えます。ここで重要なのは「認識」の側面です。ほとんどの金融関係者やMetaTraderに対応するブローカーは株式分割に対処する調整機能を備えていますが、MetaTraderのストラテジーテスターはこの処理に完全には対応していません。  そのため、テスト環境上のポジション(今回の場合は買いポジション)は、証拠金レベルによっては即座にマージンコールを受ける可能性があります。 

多くのブローカーでは、MetaTrader対応のものも含め、分割後に既存ポジションをクローズして分割倍率に応じた株数で再オープンすることで、過去の利益には影響を与えません。したがって、ストラテジーテスターでのテスト前に分割イベントを設定しておくことが望ましいです。また、株式分割を含まないカスタムインジケーターの価格データを使用する方法も代替策になります。さらにもっと厄介な問題として、テスト口座が一見利益を出している場合でも、株価の重要なサポート/レジスタンスレベルを誤解してしまうリスクがあります。

分割日が事前に分かっており、テスト期間中の価格の一貫性を維持することが重要であることから、本記事で使用するテスト期間は2021年8月1日から2024年6月1日までとします。この期間内で、学習および最適化は2021年8月1日から2023年6月1日までを対象とします。この期間はNVIDIAの歴史的な株価上昇の大部分を含み、AI主導の初期トレンド、いくつかの調整、および市場マイクロストラクチャーの変化をカバーしています。これにより、企業再編イベントの中で指標パターンがどの程度機能するかを検証するための比較的バランスの取れた環境が整います。

株式分割の影響を除いたカスタムシンボルを作成することも可能ですが、今回選択した短期間のブローカーデータを使用することで、2つの大きな企業調整の間における株価に対して、私たちによる「干渉」や「バイアス」を避けつつ、ほぼ同様の結果を得られます。今後の記事では、Pythonを用いて株式分割に対応したテストや調整をおこなう方法も検討します。Python IDEは、実行効率などの利点だけでなく、幅広いインジケーターやツールライブラリを利用できるため、学習だけでなくインジケーター選択にも活用可能です。今回NVIDIAではRSIとDeMarkerのペアを事前に決定していますが、今後の記事ではより厳密なインジケーター選択をおこなう予定です。


使用するインジケーター

本記事では便宜上、RSIオシレーターとDeMarkerオシレーターのペアを選択します。次回以降の記事では必ずしもこの組み合わせを使うわけではありません。両者とも一般的にはテクニカル分析に用いられ、市場環境の把握や取引シグナルの確認に活用されます。また互いに補完関係にあります。まずRSIの基本を簡単に振り返ります。

RSIは、直近の価格変動を評価することで買われすぎや売られすぎの状態を判定するために設計されたオシレーターです。出力値は常に0から100の範囲で表されます。価格変動の速度や大きさを反映することで、トレーダーはモメンタムの変化を捉えることができます。古典的な計算式は以下の通りです。

ここで

RSは相対力(Relative Strength)で、「平均上昇幅 ÷ 平均下降幅」で求めます。nは平均化期間で、通常14です。

計算手順では、まず上昇変化量Uiと下降変化量Diを求めます。

これらの値を平滑化するには、ワイルダー法や指数移動平均(EMA)を用いることができます。RSとRSIは、この2つの平滑化された値から上記式を使って算出されます。RSIが70の閾値に近い場合は買われすぎ、すなわち価格の下落反転の可能性が高いと判断されます。逆に30の閾値付近では売られすぎ、価格の上昇反転の可能性が高いとされます。ただし、非常に強いトレンドではRSIが極端なゾーンに長時間留まることがあるため、他の補完的なインジケーターと組み合わせることが推奨されます。これが本記事でDeMarkerオシレーターも併用する理由です。

DeMarkerオシレーターは、現在期間の価格極値を前期間と比較することで、基礎的な需要バランスを評価するために設計されています。これにより、買われすぎや売られすぎの状況における市場の天井や底値を把握するのに役立ちます。基本式は以下の通りです。

ここで

  • SMAは単純移動平均、
  • HとLは時系列tの高値と安値です。

出力は0から1の範囲で表され、RSIと同様に0.7以上で買われすぎ、0.3以下で売られすぎを示します。RSIとDeMarkerは互いに補完関係にあり、

RSIは価格変動全般を評価する一方、DeMarkerは価格の極値ゾーンに焦点を当てます。これにより、トレーダーはモメンタムプレイと反転の両方を捉えられます。本記事では、この2つのオシレーターがNVIDIAの価格動向を対象に、買い限定の環境下で市場の微細な動きを捉える多次元的なシグナル開発に役立つかどうかを検証します。


Pattern_0:インジケーターによる隠れダイバージェンス

最初のシグナルは、価格の動きとモメンタム系オシレーターの間に生じる隠れダイバージェンスを捉えることに焦点を当てています。RSIとDeMarkerの値を傾き条件と組み合わせることで、市場の方向性バイアスを確認または否定します。使用時には、価格が安値更新を記録する一方で、RSIとDeMarkerが高値を切り上げる場合に「隠れた強気ダイバージェンス」として認識されます。これは、表面的には弱さが見えても、基礎的な強さが存在していることを示唆すると解釈されます。価格チャートでは、次のように表示されます。

価格が安値更新をする一方で、RSIとDeMarkerが高値を切り上げ(隠れ強気ダイバージェンス)、RSIの傾き(3) > 0です。

p0

一方、隠れ弱気ダイバージェンスは、価格が価格が高値を更新する一方で、両オシレーターが安値を切り下げる場合に確認されます。これは価格自体は上昇しているものの、モメンタムが衰えていることを示します。これらの条件を実装したMQL5のソースコードは以下の通りです。

//+------------------------------------------------------------------+
//| Check for Pattern 0.                                             |
//1) Price-Indicator Hidden Divergence (slope + deviation)           |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsPattern_0(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return(Low(X() + 1) > Low(X()) && DeMarker(X() + 1) < DeMarker(X()) && DeMarker(X()) < 0.4 && RSI(X() + 1) < RSI(X()) && RSI(X()) < 30.0 && RSI(X()) - RSI(X() + 3) > 0.0);
   }
   else if(T == POSITION_TYPE_SELL)
   {  return(High(X() + 1) < High(X()) && DeMarker(X() + 1) > DeMarker(X()) && DeMarker(X()) > 0.6 && RSI(X() + 1) > RSI(X()) && RSI(X()) > 70.0 && RSI(X()) - RSI(X() + 3) < 0.0);
   }
   return(false);
}

上記では、価格の安値と高値をオシレーターの安値と高値と比較することで、一定期間内で隠れダイバージェンスを判定しています。RSIの傾きは3バー間の変化量として計算され、買いの際は0より大きいことが条件となり、モメンタムが改善していることを確認するフィルタとして機能します。売りの傾きは負ですが、本記事では売りポジションは扱いません。Pattern_0シグナルのみを用いたフォワードテストの結果は以下の通りです。

r0

NVIDIAの4時間足でのフォワードテスト(2023.06.01〜2024.06.01)では、初期資金10,000ドルが11,904.57ドルに増加し、約19%の収益となりました。取引はすべて買い限定で、39回のエントリー中38回が利益、1回のみ損失でした。これによりプロフィットファクターは15.24、1取引あたりの期待収益は50ドル、シャープレシオは8を超えました。最大ドローダウンは10,000ドルに対して約500ドル(約4.5%)に収まりました。価格履歴の品質が約99%であるため、LR相関は完璧に近い1.00となりました。これは、エントリーがNVIDIAのトレンドと非常によく整合していたことを示唆しています。Zスコアは2以上で95.6%に達し、勝率の連鎖が偶然のノイズではない可能性を示しています。要するに、このシグナルではプルバック後のトレンド継続を非常にクリーンに捉えられていることが分かります。ただし、このパフォーマンスを検証するためには、たとえアウトオブサンプル期間であっても、より弱気の相場局面でもこのパターンを実行し、資金保全性能を確認することが推奨されます。


Pattern_1:傾きの変化と価格確認

2番目のシグナルであるPattern_1は、初期モメンタムの変化に基づいて構築されています。RSIとDeMarkerの傾きでこれらの変化を捉え、さらに価格が指数移動平均(EMA)によって確認されると、強気のシグナルとして機能する可能性があります。チャート上では、以下の条件を満たすとこのパターンが現れます。

RSIの傾き(5本)が負から正に変化し、DeMarkerの傾き(5本)が連続2本で正、かつ価格が8期間EMAを上回って終値を付けます。

p1

買い条件は、RSIの傾きを直近5本のバーで測定した際に負から正に変化したときに示されます。これは弱気モメンタムから強気モメンタムへの転換を示唆します。さらに、DeMarkerも同じ5本のバーで少なくとも連続2本が正の値を維持しており、このモメンタムが持続していることを補強します。最後に、価格がEMAを上回って終値を付けることで、短期的なレジスタンスを突破したことが確認されます。このパターンは、MQL5では以下のように実装されます。

//+------------------------------------------------------------------+
//| Check for Pattern 1.                                             |
//2) Leading-Indicator Slope Break with Price Confirmation           |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsPattern_1(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return(DeMarker(X()) - DeMarker(X() + 5) > 0.0 && RSI(X() + 1) - RSI(X() + 5 + 1) < 0.0 && RSI(X()) - RSI(X() + 5) > 0.0 && Close(X()) > Cl(X()) && Close(X() + 1) > Cl(X() + 1));
   }
   else if(T == POSITION_TYPE_SELL)
   {  return(DeMarker(X()) - DeMarker(X() + 5) < 0.0 && RSI(X() + 1) - RSI(X() + 5 + 1) > 0.0 && RSI(X()) - RSI(X() + 5) < 0.0 && Close(X()) < Cl(X()) && Close(X() + 1) < Cl(X() + 1));
   }
   return(false);
}

売り条件は、RSIの傾きが正から負に変化した場合で、弱気モメンタムへの移行を示します。また、DeMarkerも連続2本で負の傾きを示す必要があります。傾きの計算期間は買いと同様に5本のバーです。価格もEMAを下回って終値を付けることが最終確認となります。このパターンをフォワードテストした結果は以下の通りです。

r1

4時間足チャートでのこの傾きベースのパターンによるフォワードテストでは、初期資金10kが12,454に増加し、約24.5%のパフォーマンスとなりました。46回の取引がおこなわれ、そのうち45回が勝ち、負けは1回のみで勝率は97%を超えます。プロフィットファクターはほぼ18、シャープレシオは8.78、線形回帰(LR)相関は0.99と非常に高く、トレンドとの整合性が強く示されています。エクイティの最大ドローダウンは6.2%、口座残高のドローダウンはさらに小さく1.19%でした。総じて、Pattern_1はEMAによる確認を用いて短期的な反転を捉えています。しかし、取引数が46回と少なく、ストップロスやボラティリティフィルタなどの安全策が実装されていないため、このフォワードテスト結果は、これらの対策や異なる相場環境での検証がなければ、カーブフィットの可能性があると考えられます。


Pattern_2:M/W形成と価格プルバック

3番目のシグナルであるPattern_2は、RSIおよびDeMarkerオシレーター上で典型的なM(ダブルトップ)やW(ダブルボトム)の形成を検出し、さらに重要な価格のプルバックや前回の主要レベルからのスイングと組み合わせます。要するに、オシレーターのピークや谷からモメンタムの反転を捉えつつ、価格が重要なサポートやレジスタンスをリテストすることで、反転の信頼性を確認する仕組みです。買いシグナル(NVIDIAの買いのみをテスト)は、チャート上では以下のように表れます。

RSIが直近12本のバー内でW形成(2つの谷、2番目の谷 ≥ 1番目の谷)し、DeMarkerもW形成、かつ価格が以前のレジスタンスをサポートとして押さえられています。

p2

正式には、買い条件は、RSIおよびDeMarkerが直近12本のバーのいずれかでW型パターンを生成し、かつ価格が以前のレジスタンスレベルまでプルバックして現在サポートとして保持される場合に満たされます。つまり、前回の高値スイングの上で価格が保持されるケースです。M/W形成判定とパターン2の実装は、MQL5では以下の通りです。

//+------------------------------------------------------------------+
//| Detect "M" (double-top) pattern                                  |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsM(const vector &v)
{  int n = (int)v.Size();
   if(n < 5)
      return false;
   // Search sequentially for an M: high1 -> valley -> high2
   for(int i = 1; i < n - 3; i++)
   {  if(!LocalMax(v, i)) continue;  // first peak (high1)
      for(int j = i + 1; j < n - 2; j++)
      {  if(!LocalMin(v, j)) continue;  // middle trough
         for(int k = j + 1; k < n - 1; k++)
         {  if(!LocalMax(v, k)) continue;  // second peak (high2)
            double high1 = v[i];
            double valley = v[j];
            double high2 = v[k];
            // Geometric validation:
            // - both peaks should be above the valley
            // - second peak should not be significantly higher than the first (allow tiny tolerance)
            if(high1 > valley && high2 > valley && high2 <= high1 * 1.001)
               return true;
         }
      }
   }
   return false;
}
//+------------------------------------------------------------------+
//| Detect "W" (double-bottom) pattern                               |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsW(const vector &v)
{  int n = (int)v.Size();
   if(n < 5)
      return false;
   // Search sequentially for a W: low1 → peak → low2
   for(int i = 1; i < n - 3; i++)
   {  if(!LocalMin(v, i)) continue;  // first trough (low1)
      for(int j = i + 1; j < n - 2; j++)
      {  if(!LocalMax(v, j)) continue;  // middle peak
         for(int k = j + 1; k < n - 1; k++)
         {  if(!LocalMin(v, k)) continue;  // second trough (low2)
            double low1 = v[i];
            double peak = v[j];
            double low2 = v[k];
            // Simple geometric validation:
            // peak must be above both lows,
            // and second low not much lower than the first.
            if(peak > low1 && peak > low2 && low2 >= low1 * 0.999)
               return true;
         }
      }
   }
   return false;
}
//+------------------------------------------------------------------+
//| Check for Pattern 2.                                             |
//3) M/W Formation on Indicator + Price Pullback                     |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsPattern_2(ENUM_POSITION_TYPE T)
{  vector _rsi, _demarker;
   _rsi.Init(fmax(5, m_past));
   _demarker.Init(fmax(5, m_past));
   for(int i = 0; i < fmax(5, m_past); i++)
   {  _rsi[i] = RSI(i);
      _demarker[i] = DeMarker(i);
   }
   //Print(__FUNCTION__ + ": rsi, ", _rsi);
   //Print(__FUNCTION__ + ": demarker, ", _demarker);
   //_demarker.CopyIndicatorBuffer(m_demarker.Handle(), X(), 0, fmax(5, m_past)) &&
   if(T == POSITION_TYPE_BUY)
   {  return(IsW(_rsi) &&
             IsW(_demarker) &&
             Close(X()) > Close(X() + 1) && Close(X() + 1) < Close(X() + 2));
   }
   else if(T == POSITION_TYPE_SELL)
   {  return(IsM(_rsi) &&
             IsM(_demarker) &&
             Close(X()) < Close(X() + 1) && Close(X() + 1) > Close(X() + 2));
   }
   return(false);
}

売りシグナルは逆に、RSIおよびDeMarkerがM型形成を示す場合に成立します。強気シグナルと同様に、2番目のピークは1番目と同等または低くなければなりません。価格は直近サポートに到達して反発に失敗し、そのレベルがレジスタンスに変わります。最適化後、このシグナルを用いたフォワードテストの結果は以下の通りです。

r2

再び、2023年6月1日から2024年6月1日までのフォワードテストにおいて、Pattern_2を使用した場合、初期資金10,000ドルは14,000ドル強に成長し、純利益4,325ドルを記録しました。このシグナルパターンでは54回のトレードが実行され、今回の記事のテーマ通りすべて買いポジションでした。すべてが利益で決済されたため、プロフィットファクターは「未定義」となります。1取引あたり約80ドルの利益を生み、シャープレシオも9.23と非常に高くなっています。LR相関は完璧な1.0には届かず、おそらくいくつかの不利なフォワード変動によるものです(Pattern_0とは異なります)。しかし概ね、M/W構造はスイング終了時点の過熱を早期に特定するだけでなく、価格が特定の水準をリテストする局面でも、その後のフォローゾーンで正確に機能しました。

この前置きのうえで強調しておきたいのは、この結果はあまりに完璧であるため、盲目的に信用すべきではないという点です。途中のエクイティドローダウンは最大8%に達しましたが、赤字で決済されたポジションはありませんでした。54連勝という結果は悪い戦略ではありませんが、前述のパターンと同様に「過剰にカーブフィットされた美しい曲線」の可能性があります。Pattern_2を変動の激しい相場や弱気相場に耐えさせるためには、リスク管理、ボラティリティフィルタ、より厳密な決済ロジックの実装が必要です。Pattern_2を単独で運用すると危険ですが、高次のトレンドフィルタと組み合わせて、過熱エントリーのタイミングツールとして使用すれば有望であると言えるでしょう。それ単独では「思わぬ痛手」を受けるリスクがあります。


Pattern_3:圧縮ブレイクアウトとオシレーターのダイバージェンス

次のシグナルであるPattern_3では、NVIDIAの価格が圧縮された状態にある局面を特定することに焦点を当てています。これは狭い値幅での推移として現れます。このパターンの基本原則は、ATRや適切なボラティリティ指標で示されるような低ボラティリティの市場局面は、その後ブレイクアウトや強い方向性の動きが発生しやすいという点です。Pattern_3では、ブレイクアウトが発生した場合に、オシレーターのダイバージェンスを利用してその信号を確認します。チャート上では、買いシグナルは次のように現れます。

買いシグナルは、価格が一定期間狭い値幅に収まっていた状態(ATRが小さい、または8本の高値と安値の差が狭い状態)から値幅の上限を突破したときに発生します。この際、RSIが20期間の平均を上回り、かつDeMarkerが上昇していることが条件となります。さらに、RSIとDeMarkerが圧縮期間中に高値や安値を切り上げていれば、買いバイアスはより強化されます。

p3

このパターンの買いシグナルは、価格が一定期間、狭い値幅内に収まっていた場合に発生します。この期間は最適化可能なパラメータとして設定します。値幅に留まる期間は、調整可能な期間における高値と安値の差が縮小していることで判定します。この圧縮状態では、RSIおよびDeMarkerが高値または安値を切り上げる(もしくは切り下げる)ことで、ダイバージェンスを示し、モメンタムの蓄積が期待されます。ブレイクアウトは、価格が前回の高値を超え、RSIが20期間平均より上にあり、DeMarkerも上昇していることで確認されます。さらに、オシレーター間で同時に高値または安値が切り上がっている場合、Pattern_3の買いシナリオはさらに強化されます。MQL5での実装は次の通りです。

//+------------------------------------------------------------------+
//| Check for Pattern 3.                                             |
//4) Compression Breakout with Indicator Divergence                  |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsPattern_3(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return(Hi(X() + m_past + 1) - Lo(X() + m_past + 1) > Hi(X() + 1) - Lo(X() + 1) &&
             Close(X()) > Hi(X()) &&
             RSI(X()) > RSI(X() + m_past) &&
             DeMarker(X()) > DeMarker(X() + 1));
   }
   else if(T == POSITION_TYPE_SELL)
   {  return(Hi(X() + m_past + 1) - Lo(X() + m_past + 1) > Hi(X() + 1) - Lo(X() + 1) &&
             Close(X()) < Lo(X()) &&
             RSI(X()) < RSI(X() + m_past) &&
             DeMarker(X()) < DeMarker(X() + 1));
   }
   return(false);
}

売りシグナルのロジックは上記買いシナリオのミラーで、価格が狭い値幅に収まり、RSIとDeMarkerが低下している場合に、値幅の下限を突破することで成立します。買いパターン同様、RSIが平均を下回り、DeMarkerが下降していることは、価格下落のブレイクを支持する材料となります。Pattern_3は、いわば「嵐の前の静けさ」を特定し、その後の価格ブレイクに備えるために重要です。ここで活躍する主要な手法の一つが、前述の通りオシレーターのダイバージェンスを見つけることです。2023年6月1日から2024年6月1日までのNVIDIA株価を対象に、Pattern_3のみを使用してフォワードテストを実施した結果、最適化済み設定では以下のような結果が得られました。

r3

今回のフォワードテストにおけるPattern_3のストラテジーテスター報告は、既に述べた他のパターン同様、NVIDIAのブレイクアウト戦略として堅実な結果を示しました。買いロジックのみを実行しており、これはこの期間における米国テック株の上昇傾向と一致しています。パターンはRSIがその平均値を上回り、DeMarkerが上昇していることを条件としてブレイクアウトを確認します。このフォワードテストでは、EAは78回の取引を実行し、すべて黒字決済となり、初期資金10,000ドルに対して3,000ドル以上の純利益を記録しました。これは約30%のリターンで、1取引あたり平均約39ドルの利益、プロフィットファクター9.63、LR相関0.99を示しています。最大エクイティドローダウンはわずか5.7%でした。78連勝という驚異的な結果は、このパターンがNVIDIAのトレンドに沿って、固定利益目標にもかかわらず安定してエントリーできていることを示しています。 

Pattern_3はNVIDIAの上昇トレンドにおけるエントリーおよびエグジットポイントの特定に強みを示していますが、改善の余地もあります。最大ドローダウンは約40%、単一取引の最大損失は3,700ドル超であり、これはブレイクアウトの失敗や急反転に対するリスクを示しています。回復係数(リカバリーファクター)や連勝数によって一定の評価は可能ですが、より効果的なストップ管理の必要性は依然として残ります。


Pattern_4:オシレーター確認付きスイング失敗

今回の記事で取り上げる最後のシグナル、Pattern_4は、ラリー・ウィリアムズが提唱したスイングの概念を応用したもので、RSIとDeMarkerを用いてモメンタムの変化を確認する手法です。典型的な閾値レベルに依存せず、オシレーターの動き自体をシグナルとして活用します。Pattern_4(買い)のチャート上での表現は、次のように示すことができます。

RSIが強気のフェイラースイングを形成します(RSIが30未満まで下落した後、前回の高値を上回って回復し、直前の谷を下回らない)。かつ、DeMarkerが0.45を上回り、価格が直近のスイングハイを上回って終値を付けます。

p4

買い条件は、RSIが売られすぎ水準(通常は30)を下回った後、再び上昇して前回の高値を上回り、谷を下回らずに反発する、いわゆる強気のフェイラースイングが形成されたときに発動します。DeMarkerも0.45以上に上昇してモメンタムを確認します。さらに、価格が前回のスイング高値を上回って終値をつけることで、強気シグナルが確定します。このパターンは、MQL5では以下のように実装されます。

//+------------------------------------------------------------------+
//| Check for Pattern 4.                                             |
//5) Failure Swing (Williams-style) on RSI + Dem confirmation        |
//+------------------------------------------------------------------+
bool CSignalRSI_DeMarker::IsPattern_4(ENUM_POSITION_TYPE T)
{  if(T == POSITION_TYPE_BUY)
   {  return((Close(X()) >= Hi(X()) || Close(X()) >= High(X() + 1)) &&
             RSI(X() + 2) < RSI(X() + 1) && RSI(X() + 1) > RSI(X()) && RSI(X()) <= 30.0 &&
             DeMarker(X()) > 0.45);
   }
   else if(T == POSITION_TYPE_SELL)
   {  return((Close(X()) <= Lo(X()) || Close(X()) <= Low(X() + 1)) &&
             RSI(X() + 2) > RSI(X() + 1) && RSI(X() + 1) < RSI(X()) && RSI(X()) >= 70.0 &&
             DeMarker(X()) < 0.55);
   }
   return(false);
}

売り条件は、RSIが買われすぎ水準(通常は70)を上回ったのち、前回の安値を下回る形で下降し、過去の高値を再度試さない場合に成立します。これにより、弱気のフェイラースイングが形成されます。DeMarkerは0.55以下を維持し、価格が前回のスイング安値を下回って終値をつけることで、売りシグナルが確認されます。これまでの4つのパターンと同様の条件で最適化後にフォワードテストをおこなうと、以下の結果が得られました。


r4


Pattern_4は、NVIDIAの上昇スイングに精度高くエントリーすることができ、30%のリターンを生み出しました。フォワードテストでは57回の取引がおこなわれ、すべて勝ちとなり、シャープレシオは9.20、LR相関は0.99となりました。これまでのパターンと同様に、利益係数が未定義でほぼエクイティドローダウンがゼロであることから、NVIDIAの強気相場に偏りすぎている可能性があります。弱気相場での追加ストレステストや、ボラティリティフィルターやリスク管理の導入は、このパターンを実運用で考慮する前に必要な前提条件となります。 MQL5ウィザードで使用できる完全なソースを以下に添付します。



結論

これで、「MQL5における市場ポジショニング戦略の体系」の第1回を終えます。本記事では、NVIDIAを対象に、単一ポジションタイプに限定したシグナルパターンを体系的に検証する基盤を築きました。今後の連載では、複数の株式を対象に同様の手法を試す予定であり、単一ポジションタイプによるテストは多くの場合、買いポジションを中心に行われます。今回テストしたNVIDIAは、期間中持続的な上昇モメンタムが支配的でしたが、単に買いのみのシステムを試すことに意味はないのでしょうか。答えは「ある」です。単一ポジションタイプのEAを使うことで、複数のシグナルパターンを組み合わせた取引をより効率的に運用することが狙いです。

前の連載を振り返ると、「ビットワイズ」学習の大きな課題は、個々のシグナルパターンは単独では良好に機能しても、組み合わせると互いに打ち消し合い、取引で得られた良好な結果が単なるカーブフィットに過ぎず、アウトオブサンプルの価格では再現できなかった点です。今回の単一ポジションタイプ手法は、この問題を検証および活用することを目的としており、今後の連載では、2パターンのみ、または3パターンのみを組み合わせたテストも検討していく予定です。

名前 説明
EMC-1.mq5 ヘッダに参照ファイルを示す組み立て済みEA
SignalEMC-1.mqh カスタムシグナルクラスファイル

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/20020

添付されたファイル |
EMC-1.mq5 (8.32 KB)
SignalEMC_1.mqh (50.47 KB)
MetaTrader 5機械学習の設計図(第5回):逐次ブートストラップ - ラベルのバイアス除去とリターンの向上 MetaTrader 5機械学習の設計図(第5回):逐次ブートストラップ - ラベルのバイアス除去とリターンの向上
逐次ブートストラップは、金融機械学習におけるブートストラップサンプリングを再構築する手法であり、時間的に重複するラベルを積極的に回避することで、より独立性の高い学習サンプル、より鋭い不確実性推定、そしてより堅牢な取引モデルを実現します。この実践ガイドでは、その直感的な考え方を説明し、アルゴリズムを段階的に示し、大規模データセット向けの最適化コードパターンを提供し、シミュレーションおよび実際のバックテストを通じて測定可能な性能向上を実証します。
MQL5標準ライブラリエクスプローラー(第3回):エキスパート標準偏差チャネル MQL5標準ライブラリエクスプローラー(第3回):エキスパート標準偏差チャネル
CTradeクラスとCChartObjectStdDevChannelクラスを用いたエキスパートアドバイザー(EA)を開発し、さらに収益性を高めるためのいくつかのフィルタを適用します。前回の議論で扱った理論を実装へ落とし込むことが目的です。また、MQL5標準ライブラリとその内部コードベースを理解するのに役立つ、もう一つの簡単なアプローチも紹介します。本記事では、これらの概念を実践的に学ぶことができます。
MQL5での取引戦略の自動化(第38回):傾斜角フィルタ付き隠れRSIダイバージェンス取引 MQL5での取引戦略の自動化(第38回):傾斜角フィルタ付き隠れRSIダイバージェンス取引
スイングポイントを用いて隠れRSIダイバージェンスを検出するMQL5 EAを構築します。これは、価格とRSIに対して、スイング強度、バー間隔、許容誤差、傾き角度のフィルタを適用し、検証済みのシグナルで固定ロット、SL/TP(pips単位)、およびオプションのトレーリングストップを用いて売買を実行するシステムです。
古典的な戦略を再構築する(第17回):テクニカル指標のモデリング 古典的な戦略を再構築する(第17回):テクニカル指標のモデリング
金融における古典的機械学習手法によって課されている「ガラスの天井」をいかに打ち破るかに焦点を当てます。統計モデルから引き出せる価値に対する最大の制約は、モデルそのもの、すなわちデータやアルゴリズムの複雑さではなく、それらを適用する方法論にあるようです。言い換えれば、真のボトルネックはモデルの内在的能力ではなく、私たちがそれをどのように運用しているかにあるのかもしれません。