CorrCoef

ピアソン相関係数(線形相関係数)を計算します。

matrix matrix::CorrCoef(
  const bool    rowvar=true // 観測値の行ベクトルまたは列ベクトル
);
 
scalar vector::CorrCoef(
  const vector&  b          // 2番目のベクトル
);
 

戻り値

ピアソンの積率相関係数

注意事項

相関係数は[-1, 1]の範囲にあります。

浮動小数点の丸めにより、結果の配列はエルミートでなく、対角要素が1でなく、要素が不等式abs(a) <= 1を満たさない場合があります。その状況を改善するために、実数部と虚数部が間隔[-1, 1]にクリップされますが、これは複雑なケースではあまり役に立ちません。

次は、MQL5を使用して2つのベクトルの相関係数を計算するための単純なアルゴリズムです。

double VectorCorrelation(const vector& vector_x,const vector& vector_y)
 {
  ulong n=vector_x.Size()<vector_y.Size() ? vector_x.Size() : vector_y.Size();
  if(n<=1)
    return(0);
 
  ulong i;
  double xmean=0;
  double ymean=0;
  for(i=0; i<n; i++)
    {
    if(!MathIsValidNumber(vector_x[i]))
        return(0);
    if(!MathIsValidNumber(vector_y[i]))
        return(0);
    xmean+=vector_x[i];
    ymean+=vector_y[i];
    }
  xmean/=(double)n;
  ymean/=(double)n;
 
  double s=0;
  double xv=0;
  double yv=0;
  double t1=0;
  double t2=0;
//--- 計算
  s=0;
  for(i=0; i<n; i++)
    {
    t1=vector_x[i]-xmean;
    t2=vector_y[i]-ymean;
    xv+=t1*t1;
    yv+=t2*t2;
    s+=t1*t2;
    }
//--- 確認する
  if(xv==0 || yv==0)
    return(0);
//--- 結果を返す
  return(s/(MathSqrt(xv)*MathSqrt(yv)));
 }

 

MQL5の例

  vectorf vector_a={1,2,3,4,5};
  vectorf vector_b={0,1,0.5,2,2.5};
  Print("vectors correlation ",vector_a.CorrCoef(vector_b));
//---
  matrixf matrix_a={{1,2,3,4,5},
                   {0,1,0.5,2,2.5}};
  Print("matrix rows correlation\n",matrix_a.CorrCoef());
  matrixf matrix_a2=matrix_a.Transpose();
  Print("transposed matrix cols correlation\n",matrix_a2.CorrCoef(false));
  matrixf matrix_a3={{1.0f, 2.0f, 3.0f, 4.0f, 5.0f},
                     {0.0f, 1.0f, 0.5f, 2.0f, 2.5f},
                     {0.1f, 1.0f, 2.0f, 1.0f, 0.3f}};
  Print("rows correlation\n",matrix_a3.CorrCoef());
  Print("cols correlation\n",matrix_a3.CorrCoef(false));
 
 /*
  vectors correlation 0.9149913787841797
  matrix rows correlation
  [[1,0.91499138]
   [0.91499138,1]]
  transposed matrix cols correlation
  [[1,0.91499138]
   [0.91499138,1]]
  rows correlation
  [[1,0.91499138,0.08474271]
   [0.91499138,1,-0.17123166]
   [0.08474271,-0.17123166,1]]
  cols correlation
  [[1,0.99587059,0.85375023,0.91129309,0.83773589]
   [0.99587059,1,0.80295509,0.94491106,0.88385159]
   [0.85375023,0.80295509,1,0.56362146,0.43088508]
   [0.91129309,0.94491106,0.56362146,1,0.98827404]
   [0.83773589,0.88385159,0.43088508,0.98827404,1]]
  */

 

Pythonの例

import numpy as np
va=[1,2,3,4,5]
vb=[0,1,0.5,2,2.5]
print("vectors correlation")
print(np.corrcoef(va,vb))
 
ma=np.zeros((2,5))
ma[0,:]=va
ma[1,:]=vb
print("matrix rows correlation")
print(np.corrcoef(ma))
print("transposed matrix cols correlation")
print(np.corrcoef(np.transpose(ma),rowvar=False))
print("")
 
ma1=[[1,2,3,4,5],[0,1,0.5,2,2.5],[0.1,1,0.2,1,0.3]]
print("rows correlation\n",np.corrcoef(ma1))
print("cols correlation\n",np.corrcoef(ma1,rowvar=False))
 
transposed matrix cols correlation
[[1.         0.91499142]
[0.91499142 1.        ]]
 
rows correlation
[[1.         0.91499142 0.1424941 ]
[0.91499142 1.         0.39657517]
[0.1424941  0.39657517 1.        ]]
cols correlation
[[1.         0.99587059 0.98226063 0.91129318 0.83773586]
[0.99587059 1.         0.99522839 0.94491118 0.88385151]
[0.98226063 0.99522839 1.         0.97234063 0.92527551]
[0.91129318 0.94491118 0.97234063 1.         0.98827406]
[0.83773586 0.88385151 0.92527551 0.98827406 1.        ]]