取引戦略の開発:擬似ピアソン相関アプローチ
はじめに
既存のインジケーターから新しいインジケーターを生成することは、取引分析を強化するための非常に強力な方法です。既存のインジケーターの出力を統合する数学的関数を定義することで、トレーダーは複数のシグナルを1つの効率的なツールにまとめたハイブリッドインジケーターを作成できます。この方法により、チャート上の情報過多を減らし、解釈を簡素化しながら、各インジケーターが持つ強みを活かして意思決定の質を高めることが可能になります。
一般的なテクニカル分析では、複数のインジケーターを同時に監視し、それぞれが提供する異なるシグナルを参考にします。しかし、この方法ではチャートが複雑になり、解釈が難しくなるだけでなく、時には互いに矛盾するシグナルが発生することもあります。そこで本記事では、選択したインジケーターのシグナルを数学的に統合し、新しい単一のオシレーターとして表現する方法を提案します。
本記事では、3つのオシレーターを組み合わせて構築された新しいインジケーターを紹介します。このインジケーターは、ピアソン相関関数を改良した手法である「擬似ピアソン相関(PPC, Pseudo Pearson Correlation)」を用いて計算されます。PPCインジケーターは、オシレーター同士の動的な関係を数値化し、それを実践的な取引戦略に応用することを目的としています。
概念の概要
ピアソン相関係数(r, Pearson correlation coefficient)は、2つの変数XとYの間に存在する線形関係の強さと方向を定量化するための、よく知られた統計指標です。一般的には次の式で定義されます。

- xᵢとyᵢは、それぞれのデータサンプル点を表します。
- x̄とȳは、それぞれXとYの平均値を表します。
相関係数rの値は−1から+1の範囲を取ります。
- r = +1の場合:完全な正の線形相関
- r = −1の場合:完全な負の線形相関
- r = 0の場合:線形相関が存在しない
この式は本質的に、各データポイントが平均値からどれだけ離れているかを測定し、その値を二乗偏差の合計の平方根で標準化することで相関の強さを求める仕組みになっています。
修正された関数:擬似ピアソン相関(PPC)
この手法では、元のピアソン相関の式を修正し、平均値xとȳの代わりに第三の変数zを使用します。 つまり、平均値からの偏差を測定する代わりに、xとyの関係をzを基準として相対的に測定します。
このようにして定義された擬似ピアソン相関(r′)の式は次のように表されます。

ここで、zはxやyの平均値ではない別の変数です。そのため、この相関は通常のピアソン相関とは異なるため、「擬似相関」と呼ばれます。
この式の構造自体は元のピアソン相関と似ていますが、2変数の関係ではなく3変数間の関係を測定する点が大きく異なります。計算結果である𝑟′の値は–1から+1の範囲に収まり、次のように解釈されます。
| r'の値 | 解釈 |
|---|---|
| 1 | 完全な正の相関 |
| 0.7~0.9 | 強い正の相関 |
| 0.4~0.6 | 中程度の正の相関 |
| 0.1~0.3 | 弱い正の相関 |
| 0 | 相関なし |
| -0.1~-0.3 | 弱い負の相関 |
| -0.4~-0.6 | 中程度の負の相関 |
| -0.7~-0.9 | 強い負の相関 |
| -1 | 完全な負の相関 |
r'が正の場合、xとyはzに対して同じ方向に動いていることを意味します。一方、r′が負の場合、xとyはzに対して逆方向に動いていることを示します。
応用:擬似ピアソン相関オシレーターとその取引戦略
このセクションでは、PPCを用いて新しいオシレーターを構築し、それに基づく取引戦略を定義します。
- 擬似ピアソン相関オシレーター
この手法では、相対力指数(RSI, Relative Strength Index)、マネーフロー指数(MFI, Money Flow Index)、デマーカー(DEM, DeMarker)のよく知られている3つのテクニカル指標をPPCの入力変数として組み合わせます。 これら3つのオシレーターはいずれも0〜1の正規化された範囲で表されるため、相関関係を比較分析する際の入力データとして適しています。
RSIは、最近の価格変動の速度と大きさを測定し、資産が買われ過ぎか売られ過ぎかを評価する指標です。 純粋な価格モメンタム指標であり、特定の期間における終値の平均上昇幅と終値の平均下落幅を比較することで計算されます。
MFIはしばしば「出来高加重RSI」と呼ばれます。 RSIが価格データのみを使用するのに対し、MFIは価格と出来高の両方を考慮します。MFIでは、終値ではなく典型価格「(High+Low+Close)/3」を使用します。この典型価格に出来高を掛け合わせることで資金フロー(Money Flow)を算出し、市場の買い圧力と売り圧力を測定します。
DEMインジケーターは、現在の価格と前の期間の価格を比較することで買い圧力と売り圧力を測定する指標です。 具体的には、現在の期間の高値と前の期間の高値、現在の期間の安値と前の期間の安値を比較します。このインジケーターの目的は、買い手が新しい高値を更新できない状況(上昇の勢いの弱まり)と売り手が新しい安値を更新できない状況を検出することです。
これらのインジケーターの出力をPPC関数に統合することで、2つのインジケーター(DEMとMFI)が3つ目のインジケーター(RSI)に対してどの程度連動しているかを定量化することができます。
PPCの変数x、y、zをそれぞれDEM、MFI、RSIに置き換えると、式は次のようになります。

この式は擬似ピアソン相関オシレーターを定義しており、RSIを基準としてDEMとMFIの動的な関係を測定します。
PPCオシレーターは次のように解釈できます。
- +1:DEMとMFIがRSIに対して同方向に動いている(強い正の相関)
- −1:DEMとMFIがRSIに対して逆方向に動いている(強い負の相関)
- ≈ 0:DEMとMFIの間にRSIを基準とした明確な線形関係がない
この相関ベースのオシレーターは、コンパクトでありながら強力な分析ツールとなります。3つのオシレーターの挙動を1つの指標に統合することで、チャート分析の簡素化、複数インジケーターのコンフルエンス(シグナルの合致)の検出、モメンタムと市場強度の一致または乖離の把握を容易にします。
- PPCインジケーターのコード構造:
このセクションでは、PPCインジケーターのコード構造と、それをどのように取引手法に組み込むかについて詳しく解説します。
#property indicator_maximum 1 #property indicator_minimum -1 #property indicator_level1 -0.80 #property indicator_level2 -0.50 #property indicator_level3 0.00 #property indicator_level4 0.50 #property indicator_level5 0.80
インジケーターの特性は、最大値を1、最小値を−1に設定することで定義します。また、インジケーターのラインレベルは±0.8および±0.5に設定されています。
//---- Inputs input int CorrPeriod = 21; input int RSIPeriod = 14; input int MFIPeriod = 14; input int DeMPeriod = 14;
ユーザーは、RSI、MFI、DEMの期間、および相関計算に使用するインジケーター値の数(CorrPeriodと呼ばれる)を調整できます。
IndicatorSetString(INDICATOR_SHORTNAME, StringFormat("PPr[ Corr=%d RSI=%d MFI=%d DeM=%d ]", CorrPeriod, RSIPeriod, MFIPeriod, DeMPeriod)); // Create indicator handles rsi_handle = iRSI(_Symbol, _Period, RSIPeriod, PRICE_CLOSE); mfi_handle = iMFI(_Symbol, _Period, MFIPeriod,VOLUME_TICK); dem_handle = iDeMarker(_Symbol, _Period, DeMPeriod); if(rsi_handle == INVALID_HANDLE || mfi_handle == INVALID_HANDLE || dem_handle == INVALID_HANDLE) { Print("Error creating indicator handles"); return(INIT_FAILED); }
初期化時には、インジケーターの短縮名が設定され、RSI、MFI、DEMインジケーターのハンドルが作成されます。さらに、各ハンドルが正常に作成されたかを確認し、エラーが発生していないかをチェックします。
void OnDeinit(const int reason) { if(rsi_handle != INVALID_HANDLE) IndicatorRelease(rsi_handle); if(mfi_handle != INVALID_HANDLE) IndicatorRelease(mfi_handle); if(dem_handle != INVALID_HANDLE) IndicatorRelease(dem_handle); }
初期化解除処理では、すべてのインジケーターハンドルを解放し、システムリソースを解放するとともに、適切なメモリ管理を確保します。
for(int i = pStart; i<rates_total; i++) { double sum_xy = 0.0; double sum_x2 = 0.0; double sum_y2 = 0.0; for(int j = 0; j < CorrPeriod; j++) { int sh = i - j; // Get RSI value double rsi = rsi_buffer[sh]; // Get MFI value double mfi = mfi_buffer[sh]; // Get DeMarker value double dem = dem_buffer[sh]; // Deviations relative to RSI double dx = (dem - rsi); double dy = (mfi - rsi); sum_xy += dx * dy; sum_x2 += dx * dx; sum_y2 += dy * dy; } double denom = MathSqrt(sum_x2 * sum_y2); if(denom > 0.0) CorrBuffer[i] = sum_xy / denom; //Pseudo Pearson r in [-1, +1] else CorrBuffer[i] = EMPTY_VALUE; }
このコード部分では、DEM、MFI、RSIの入力インジケーターを用いてPPCの値を計算します。計算された相関値は、チャート上に描画するためにCorrBufferに格納されます。 さらに、PPCの分母がゼロになる場合には空の値を割り当てることで、ゼロ除算エラーを防ぎ、インジケーターの安定した動作を確保しています。
- PPCオシレーターのデモ
PPCオシレーターのMetaTrader 5版をIndicatorsフォルダに配置して正常にコンパイルした後、カスタムインジケーターの一覧から選択してチャートに適用するだけで使用できます。以下のGIFは、その動作とリアルタイムでの挙動を示しています。

図1:擬似ピアソン相関のデモ1

図2:擬似ピアソン相関のデモ2
ATRインジケーターと同様に、PPCインジケーターはRSI、MFI、DEMのように直接的な売買方向を示すものではありません。代わりに、これらのオシレーター間の相関関係を測定し、互いに収束している(正の相関)か、あるいは乖離している(負の相関)かを示します。
- 戦略開発とテストフレームワーク
PPCオシレーターを開発した後の次のステップは、実際の市場環境でこのフレームワークを検証するためのシンプルな取引戦略を設計することです。この戦略では、PPCオシレーターと移動平均(MA)インジケーターを組み合わせ、相互補完的な取引フレームワークを構築します。
移動平均はトレンド方向のフィルターとして機能し、市場が全体として上昇傾向にあるのか、下降傾向にあるのかを判断するのに役立ちます。 基本ロジックとして、短期移動平均が長期移動平均を上回る場合(新たな上昇トレンドの可能性)にのみ買いシグナルが生成され、売りシグナルはその逆の条件で生成されます。
一方、PPCオシレーターは、このトレンド環境の中でエントリーシグナルを生成する役割を担います。これら2つの戦略要素は、PPCの値から推測されるさまざまな市場状態を活用するように設計されています。
戦略1:「相関モメンタム」戦略
この戦略は、モメンタム系インジケーター(RSI、MFI、DeM)が突然強く一致し、現在のトレンド方向に統一されたモメンタムの動きが始まることを示唆したときに、取引にエントリーすることを目的としています。- 買いシグナル: PPCの値が+0.5の閾値を上方向にクロスしたときに発生します。これは強い正の相関モメンタム状態への移行を示しており、かつMAが上昇トレンドを示している場合に成立します。
- 売りシグナル: PPCの値が+0.5の閾値を上方向にクロスしたときに発生しますが、これはMAが下降トレンドを示している状況で起こります。この場合、下方向への強い協調モメンタムの動きを示唆します。
戦略2:「非相関」戦略
この戦略は逆張りの考え方に基づいています。基礎となるモメンタムインジケーター(DEMとMFI)がRSIに対して互いに乖離し、その関係が大きく崩れる(強い負の相関)場合にエントリーします。これはモメンタムの消耗点と、短期トレンド方向への反転の可能性を示唆します。
- 買いシグナル: PPCの値が−0.5の閾値を下方向にクロスしたときに発生します。これは強い負の相関状態への急落を示し、同時に短期トレンドが依然として上昇トレンドである場合に成立します。この極端な乖離が、その後の急激な価格上昇によって解消される可能性があるという考え方です。
- 売りシグナル: PPCの値が−0.5の閾値を下方向にクロスし、かつ短期トレンドが下降トレンドである場合に発生します。これはPPCの極端な乖離により、さらなる価格下落が起こる可能性を見込むものです。

図3:取引戦略フレームワーク
相関状態と非相関状態の両方をテストすることで、トレーダーはPPCオシレーターがさまざまな市場局面でどのように振る舞うかを分析し、自分のトレーディングスタイルやリスク許容度により適した設定を判断することができます。
エキスパートアドバイザーのコード構造
この段階では、PPCインジケーターを利用するエキスパートアドバイザー(EA)のコード構造を確認します。このセクションでは、EAがPPCオシレーターと移動平均フィルタをどのように統合して、前述の取引戦略を自動化しているかを説明します。また、インジケーターシグナルを解釈し、トレードエントリーを生成し、定義された相関戦略に基づいてポジションを管理するための論理フロー、主要な関数、および意思決定コンポーネントについて概説します。
//--- Input parameters input double Lots = 0.01; input double StopLoss = 300; input double TakeProfit = 700; input int Slippage = 3; input int CorrPeriod = 21; input int RSIPeriod = 14; input int MFIPeriod = 14; input int DeMPeriod = 14; input double PPr = 0.5; // PseudoCorrelatedValue (0.1 to 1) input int FastMAPeriod = 2; input int SlowMAPeriod = 20;
まず、EAの入力パラメータを定義します。これにより、トレーダーは設定パネルを通じてEAの動作を外部から制御および調整することができます。これらのパラメータは、取引管理やインジケーター設定に柔軟性を提供します。
主な取引関連パラメータは以下の通りです。
- Lots:各取引のポジションサイズを指定します。
- StopLossとTakeProfit:ポイント単位で決済水準を定義し、許容される最大損失と目標利益を設定します。
- Slippage:注文価格から許容される価格のずれを指定し、市場が不安定な状況でもよりスムーズな注文執行を可能にします。
これらの取引管理パラメータに加えて、EAにはインジケーター設定用の入力も含まれています。
- CorrPeriod、RSIPeriod、MFIPeriod、DeMPeriod:PPCオシレーターおよびその基礎となるインジケーター(RSI、MFI、DEM)のパラメータを設定および調整するためのものです。
- PPrパラメータ:エントリーシグナルが発生する相関の閾値を表します。これは取引エントリーに使用されるPPCオシレーターの感度レベルを定義します。PPrの値が0〜1の範囲で設定されると、EAはその負の値(−PPr)を自動的に計算し、反対方向の相関閾値として使用します。
- FastMAPeriodとSlowMAPeriodパラメータ:全体的なトレンド方向を判断するために使用される移動平均(MA)インジケーターの期間を定義します。FastMAは最近の価格変動に素早く反応して短期的な動きを捉え、SlowMAは価格変動を平滑化することで、より広い市場トレンドを示します。
//--- Strategy Selection input bool EnableStrategy1 = true; // Enable Strategy 1 Correlated input bool EnableStrategy2 = false; // Enable Strategy 2 NotCorrelated
このパラメータにより、EAがどの取引戦略(戦略1または戦略2)に従うかをユーザーが選択できます。EAは常に1つの取引のみを実行するように設計されており、取引の重複や競合を防ぎます。
両方の戦略が同時にtrueに設定された場合、EAはリアルタイムで条件を満たした最初の戦略を優先して実行します。この論理的な保護機構により、意図した戦略構造を維持しつつ、一貫性のある競合のない取引実行が保証されます。
//--- Create indicator handles indicatorHandle = iCustom(Symbol(), Period(), IndicatorName, CorrPeriod, RSIPeriod, MFIPeriod, DeMPeriod); fastMaHandle = iMA(Symbol(), Period(), FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE); slowMaHandle = iMA(Symbol(), Period(), SlowMAPeriod, 0, MODE_EMA, PRICE_CLOSE);
EAの初期化段階では、iCustom関数が呼び出され、PPCインジケーターの出力値を取得してindicatorHandleに格納します。このハンドルにより、EAは稼働中を通してPPCオシレーターのリアルタイム相関データにアクセスすることができます。
同様に、iMA関数を使用して高速移動平均(FastMA)と低速移動平均(SlowMA)の値を取得します。これらはそれぞれfastMAHandleとslowMAHandleに格納され、EAが市場のトレンドを継続的に追跡できるようになります。これらのハンドルは、EAが売買シグナルを生成および評価し、実行するために依存する主要なデータ接続の中核を形成します。
void OnDeinit(const int reason) { if(indicatorHandle != INVALID_HANDLE) IndicatorRelease(indicatorHandle); if(fastMaHandle != INVALID_HANDLE) IndicatorRelease(fastMaHandle); if(slowMaHandle != INVALID_HANDLE) IndicatorRelease(slowMaHandle); }
初期化解除の段階では、すべてのインジケーターおよび移動平均のハンドルが解放されます。これによりシステムリソースが解放され、効率的なメモリ管理が確保されます。この処理は、EAの実行中および終了後におけるメモリリークやリソース競合の発生を防ぎ、EAの安定性とパフォーマンスを維持します。
//+------------------------------------------------------------------+ //| Check for new bar | //+------------------------------------------------------------------+ bool IsNewBar() { datetime currentBar = iTime(Symbol(), Period(), 0); if(currentBar == lastBar) return false; lastBar = currentBar; return true; }
IsNewBar関数は、EAが新しいバー(ローソク足)が形成されたときにのみロジックを1回だけ実行することを保証します。これにより、同一バー内でEAが計算を繰り返したり複数のエントリーをおこなったりすることを防ぎ、効率を高めるとともに不要な処理を削減します。
//--- STRATEGY 1 (Correlated) --- if(EnableStrategy1 && corr_prev < PPr && corr_curr > PPr) { if(maFast[0] > maSlow[0]) OpenTrade(ORDER_TYPE_BUY, "Strategy1 BUY"); else if(maFast[0] < maSlow[0]) OpenTrade(ORDER_TYPE_SELL, "Strategy1 SELL"); } //--- STRATEGY 2 (Not Correlated) --- if(EnableStrategy2 && corr_prev > -PPr && corr_curr < -PPr) { if(maFast[0] > maSlow[0]) OpenTrade(ORDER_TYPE_BUY, "Strategy2 BUY"); else if(maFast[0] < maSlow[0]) OpenTrade(ORDER_TYPE_SELL, "Strategy2 SELL"); }
このコード部分では、前述した戦略1および戦略2のエントリー条件が定義されています。PPCインジケーターから取得した相関値と移動平均のトレンド方向を評価し、買いまたは売りのシグナルを発生させるかどうかを判断します。
その後、OpenTrade関数が呼び出され、取引が実行されます。この関数は主に、注文タイプ(BuyまたはSell)とコメント(取引の識別用)の2つのパラメータを受け取ります。このコメントは、実行時に取引の発生元や使用された戦略を識別するのに役立ちます。このような構造化された方法により、各取引が明確に定義された条件のもとで実行されるため、EAの透明性と追跡可能性が向上します。
EAのデモンストレーション
このセクションでは、上記で説明した取引ロジックに基づいてEAがどのように動作するかを示します。EAは定義された相関条件とトレンド条件を用いて潜在的な取引機会を識別し、自動的に取引を実行します。
図4は、ユーザーが調整および最適化できる各種パラメータを示しています。これらのパラメータは、EAの全体的なパフォーマンスを向上させるために使用できます。これらには、ロットサイズ、ストップロス、テイクプロフィット、スリッページなどの取引入力のほか、CorrPeriod、RSIPeriod、MFIPeriod、DeMPeriod、PPr、移動平均期間などのインジケーターパラメータが含まれます。これらの設定を調整することで、トレーダーはEAをさまざまな市場環境に適応させ、精度を高め、より良いリスクリワードレシオを実現することができます。

図4:PPC EAの入力パラメータ
図5は、EAがリアルタイムで取引注文を実行するプロセスを示しています。この例では戦略1を使用し、事前に定義された取引条件に基づいてEAがどのように自動的にポジションを開閉するかを示しています。
PPCの相関値と移動平均のトレンドが一致して有効なエントリーシグナルが生成されると、EAはそれに応じて買いまたは売り注文を出します。各取引にはストップロスとテイクプロフィットが設定されており、これらはEAの入力パラメータで定義されています。テイクプロフィットは市場が有利な方向に動いた場合に利益を確定し、ストップロスは市場がポジションと逆方向に動いた場合の損失を制限します。
この図は、EAの自動意思決定プロセスを視覚的に理解するのに役立ちます。すなわち、どのように機会を検出し、取引を実行し、そして人手を介さずにリスクを管理するのかを示しています。

図5:PPC EA取引執行
結論
本記事では、既存のインジケーターを数学的に定義された関数によって改良し、新しく強力な分析ツールを作成できることを示しました。提案した関数は擬似ピアソン相関と呼ばれ、RSI、MFI、DEMの3つの入力変数を使用して、それらの間の相関の度合いを測定する単一の出力値を生成します。従来のピアソン相関係数と同様に、PPCの値は−1から+1の範囲で表され、選択されたオシレーター間の相関の強さと方向を示します。インジケーターはこれらの相関値をチャート上に視覚的に表示し、トレーダーが市場モメンタムにおける強い相関や弱い相関の期間を容易に観察できるようにします。
さらに、PPCインジケーターはEAに組み込まれ、取引判断を自動化しました。移動平均フィルタと組み合わせることで、正の相関に基づく戦略(戦略1)と負の相関に基づく戦略(戦略2)の2つの取引戦略が開発および検証されました。両戦略とも、定義されたロジックに従ってトレードを実行することに成功し、トレンドフォロー型インジケーターと組み合わせた場合にPPCが有効なエントリーシグナルとして機能する可能性を示しました。
総合的に見ると、擬似ピアソン相関のアプローチは、オシレーター間の関係性を定量化する新しい方法を提供し、市場の動きを理解するための追加的な洞察をトレーダーにもたらします。さらなる最適化とバックテストをおこなうことで、PPCインジケーターはより適応的でデータ駆動型の取引システムを構築するうえで有用な要素となる可能性があります。
本研究の次の章では、PPCインジケーターを用いたEAの強みと弱みを評価するため、さまざまな金融商品や通貨ペアに対して戦略のテストを実施する予定です。今後の実験から得られるさらなる洞察と結果にご期待ください。
| ファイル | 説明 |
|---|---|
| PseudoPC.mq5 | 価格データにおける方向性の関係を測定するために設計された擬似ピアソン相関(PseudoPC)インジケーターを含むファイルです。 |
| PPCorr_EA.mq5 | PseudoPCインジケーターを基盤として構築されたEAを含むファイルであり、 インジケーターのシグナルとそのロジックに基づいて自動的に取引を実行します。 |
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/20065
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
プライスアクション分析ツールキットの開発(第50回):MQL5でのRVGI、CCI、SMA Confluenceエンジンの開発
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
MQL5とデータ処理パッケージの統合(第6回):市場フィードバックとモデル適応の融合
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
相関 フィルタを使用していない同じストラテジーと比較した、テストEAの実際のパフォーマンス指標を含むレポートを見ることができれば最高です - そうすれば、新しいインジケータの効率を推定することができます。
同じ期間のオシレーターのほとんどは、定義上、高い相関が あり、その相関を 使用することは、ほとんど興味がありません。複数の異なる期間の分析は理にかなっていますが、おそらくすべてのトレーダーは自分の好みのオシレーター、つまり同じ種類のオシレーターでそれを行うでしょう。