Correlate関数の働き・役割
Correlate関数は、2つのベクトルの相互相関を計算するための関数です。
相互相関とは
相互相関とは、2つの信号やデータセットの類似性を測る指標であり、あるベクトルがもう一方のベクトルに対してどの程度「似ているか」を数値化するものです。この計算を行うことで、データ間の関連性やパターンを解析する際に役立ちます。
たとえば、金融データの分析では、価格変動のタイミングや動きが別の指標や市場とどの程度一致しているかを調べる際に相互相関が使われることがあります。また、データの位置関係(ずれ)による影響を調べるためにも活用されます。
Correlate関数を使用すると、簡単に相互相関を計算し、その結果をベクトルとして取得できます。この関数では、計算のモードを指定することで、どのように相関を求めるかを調整することができます。
Correlate関数の引数について
vector vector::Correlate(
const vector& v, // ベクトル
ENUM_VECTOR_CONVOLVE mode // モード
);
Correlate関数の引数は以下の2つです。それぞれの役割について詳しく説明します。
第1引数: v(2番目のベクトル)
この引数は、比較対象となる2番目のベクトルを指定します。このベクトルと呼び出し元のベクトルの相互相関が計算されます。
たとえば、2つのデータセット a
と b
の相関を求める場合、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になります。
使用例
たとえば、ベクトルa
と b
が以下のように定義されているとします。
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));
}
サンプルコード解説
- vector a と vector b の定義
- VECTOR_CONVOLVE_FULLの使用例
- a.Correlate(b, VECTOR_CONVOLVE_FULL) は、
a
とb
の全範囲での相関を計算。 - 出力される結果の長さは、
a
とb
の長さの和から1を引いた値。 - 結果はエキスパートログに出力される。
- a.Correlate(b, VECTOR_CONVOLVE_FULL) は、
- VECTOR_CONVOLVE_SAME の使用例
- a.Correlate(b, VECTOR_CONVOLVE_SAME) は、
a
と同じ長さの相関を計算。 - 中央部分の相関を取得するためのモード。
- a.Correlate(b, VECTOR_CONVOLVE_SAME) は、
- VECTOR_CONVOLVE_VALID の使用例
- a.Correlate(b, VECTOR_CONVOLVE_VALID) は、完全に重なっている部分の相関のみを計算。
- b.Correlate(a, VECTOR_CONVOLVE_FULL) の使用例
- ベクトルの順序を入れ替えることで、結果が異なる場合がある。
- 出力例の説明
エキスパートログに出力される結果は、ベクトル間の相関値を表す。