【MQL5】Correlate関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク

Correlate関数の働き・役割

Correlate関数は、2つのベクトル相互相関を計算するための関数です。

相互相関とは

相互相関とは、2つの信号やデータセットの類似性を測る指標であり、あるベクトルがもう一方のベクトルに対してどの程度「似ているか」を数値化するものです。この計算を行うことで、データ間の関連性やパターンを解析する際に役立ちます。

たとえば、金融データの分析では、価格変動のタイミングや動きが別の指標や市場とどの程度一致しているかを調べる際に相互相関が使われることがあります。また、データの位置関係(ずれ)による影響を調べるためにも活用されます。

Correlate関数を使用すると、簡単に相互相関を計算し、その結果をベクトルとして取得できます。この関数では、計算のモードを指定することで、どのように相関を求めるかを調整することができます。

Correlate関数の引数について

vector vector::Correlate(
  const vector&          v,        // ベクトル
  ENUM_VECTOR_CONVOLVE  mode      // モード
  );

Correlate関数引数は以下の2つです。それぞれの役割について詳しく説明します。

第1引数: v(2番目のベクトル)

この引数は、比較対象となる2番目のベクトルを指定します。このベクトルと呼び出し元のベクトル相互相関が計算されます。

たとえば、2つのデータセット ab の相関を求める場合、a.Correlate(b, mode) のように使用します。

第2引数: mode(計算モード)

この引数は、相互相関の計算モードを指定します。

Correlate関数の第2引数mode では、相互相関の計算モードを指定します。このモードには、列挙型 ENUM_VECTOR_CONVOLVE識別子を使用します。それぞれの識別子の役割について以下に詳しく説明します。

ENUM_VECTOR_CONVOLVEについて

VECTOR_CONVOLVE_FULL

VECTOR_CONVOLVE_FULL は完全相互相関を計算するモードです。
このモードでは、2つのベクトルが全範囲で重なるように計算され、結果のベクトルの長さは、元の2つのベクトルの長さの和から1を引いた値になります。計算結果には、すべての可能な位置の相互相関が含まれます。

例: もしベクトルa の長さが 5、b の長さが 3 であれば、結果のベクトルの長さは 5+3−1=7になります。

VECTOR_CONVOLVE_SAME

VECTOR_CONVOLVE_SAMEは呼び出し元ベクトルと同じ長さの相互相関を計算するモードです。
このモードでは、相関の中心部分のみが取り出され、結果として呼び出し元ベクトルと同じ長さのベクトルが得られます。中心部分を重点的に分析する場合に適しています。

例: もしベクトルa の長さが 5 で、このモードを指定した場合、結果のベクトルも長さ 5 になります。

VECTOR_CONVOLVE_VALID

VECTOR_CONVOLVE_VALIDは有効な相関部分のみを計算するモードです。
このモードでは、2つのベクトルが完全に重なっている部分の相関値だけが計算されます。そのため、結果のベクトルの長さは元のベクトル同士が完全に重なっている部分の数に依存します。

例: もしベクトルa の長さが 5、b の長さが 3 であれば、結果のベクトルの長さは 5−3+1=3になります。

使用例

たとえば、ベクトルab が以下のように定義されているとします。

vector a = {1, 2, 3, 4, 5};
vector b = {0, 1, 0.5};

この場合、相関を計算するには以下のように記述します。

vector result = a.Correlate(b, VECTOR_CONVOLVE_FULL);

ここで VECTOR_CONVOLVE_FULLを指定することで、完全な相関を求めることができます。

Correlate関数の戻り値について

Correlate関数戻り値は、2つのベクトル相互相関を表すベクトルです。このベクトルは、指定された計算モード(mode 引数)に応じて異なる長さと内容を持ちます。以下に、それぞれの計算モードごとの戻り値の内容を説明します。

VECTOR_CONVOLVE_FULLモードの場合

完全相互相関を計算するモードでは、戻り値として元の2つのベクトルが全範囲で重なるように計算された相関値が返されます。戻り値ベクトルの長さは、元の2つのベクトルの長さの和から1を引いた値になります。

たとえば、ベクトルa の長さが 5、b の長さが 3 の場合、戻り値ベクトルの長さは 7 となり、それぞれの位置における相関値が格納されます。

VECTOR_CONVOLVE_SAMEモードの場合

呼び出し元ベクトルと同じ長さの相関を計算するモードでは、戻り値として、中心部分の相関値が返されます。この場合、戻り値ベクトルの長さは呼び出し元のベクトルの長さと一致します。

たとえば、ベクトルa の長さが 5 で、このモードが指定された場合、戻り値ベクトルの長さも 5 となります。

VECTOR_CONVOLVE_VALIDモードの場合

有効な相関部分のみを計算するモードでは、2つのベクトルが完全に重なっている部分の相関値が戻り値として返されます。戻り値ベクトルの長さは、元のベクトル同士が完全に重なっている部分の数に依存します。

たとえば、ベクトルa の長さが 5、b の長さが 3 の場合、戻り値ベクトルの長さは 3 となり、それぞれの位置における有効な相関値が格納されます。

戻り値の型

戻り値は常にベクトル型(vector)として返されます。このベクトルには、相関値が順番に格納されており、計算モードに応じてその内容が異なります。

Correlate関数を使ったサンプルコード

//+------------------------------------------------------------------+
//| スクリプトのエントリーポイント                                 |
//+------------------------------------------------------------------+
void OnStart()
{
   // ベクトルを定義します
   // ベクトルaは1から5までの値を持つ
   vector a = {1, 2, 3, 4, 5};
   
   // ベクトルbは0、1、0.5の値を持つ
   vector b = {0, 1, 0.5};
   
   // VECTOR_CONVOLVE_FULLモードを使用してaとbの完全相関を計算し、結果をエキスパートログに出力
   // 完全相関では、2つのベクトルが全範囲で重なった結果が出力される
   Print("full\n", a.Correlate(b, VECTOR_CONVOLVE_FULL));
   
   // VECTOR_CONVOLVE_SAMEモードを使用してaとbの中央部分の相関を計算
   // 呼び出し元ベクトル(ここではa)と同じ長さの相関結果が出力される
   Print("same\n", a.Correlate(b, VECTOR_CONVOLVE_SAME));
   
   // VECTOR_CONVOLVE_VALIDモードを使用してaとbの有効な部分の相関を計算
   // 有効な相関部分のみが出力される
   Print("valid\n", a.Correlate(b, VECTOR_CONVOLVE_VALID));
   
   // bを呼び出し元として、aとの完全相関を計算
   // ベクトルの順序を入れ替えることで異なる相関結果が得られる
   Print("full\n", b.Correlate(a, VECTOR_CONVOLVE_FULL));
}

サンプルコード解説

  1. vector a と vector b の定義
    • ベクトルa は、値 {1, 2, 3, 4, 5} を持つデータセット。
    • ベクトルb は、値 {0, 1, 0.5} を持つデータセット。
  2. VECTOR_CONVOLVE_FULLの使用例
    • a.Correlate(b, VECTOR_CONVOLVE_FULL) は、ab の全範囲での相関を計算。
    • 出力される結果の長さは、ab の長さの和から1を引いた値。
    • 結果はエキスパートログに出力される。
  3. VECTOR_CONVOLVE_SAME の使用例
  4. VECTOR_CONVOLVE_VALID の使用例
  5. b.Correlate(a, VECTOR_CONVOLVE_FULL) の使用例
    • ベクトルの順序を入れ替えることで、結果が異なる場合がある。
  6. 出力例の説明
    エキスパートログに出力される結果は、ベクトル間の相関値を表す。
タイトルとURLをコピーしました