Cov

共分散行列を計算します。

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

パラメータ

b

[in] 2番目のベクトル

注意事項

共分散行列を計算します。

次は、MQL5を使用して2つのベクトルの共分散行列を計算するための単純なアルゴリズムです。

bool VectorCovariation(const vector& vector_a,const vector& vector_b,matrix& matrix_c)
 {
  int i,j;
  int m=2;
  int n=(int)(vector_a.Size()<vector_b.Size()?vector_a.Size():vector_b.Size());
//--- checks
  if(n<=1)
    return(false);
  for(i=0; i<n; i++)
    {
    if(!MathIsValidNumber(vector_a[i]))
        return(false);
    if(!MathIsValidNumber(vector_b[i]))
        return(false);
    }
//---
  matrix matrix_x(2,n);
  matrix_x.Row(vector_a,0);
  matrix_x.Row(vector_b,1);
  vector t=vector::Zeros(m);
//--- 計算
  for(i=0; i<m; i++)
    for(j=0; j<n; j++)
        t[i]+=matrix_x[i][j]/double(n);
  for(i=0; i<m; i++)
    for(j=0; j<n; j++)
        matrix_x[i][j]-=t[i];
//--- syrk C=alpha*A^H*A+beta*C(beta=0は検討しない)
  matrix_c=matrix::Zeros(m,m);
  for(i=0; i<m; i++)
    {
    for(j=0; j<n; j++)
       {
        double v=matrix_x[i][j]/(n-1);
        for(int i_=i; i_<m; i_++)
          matrix_c[i][i_]+=v*matrix_x[i_][j];
       }
    }
//--- force symmetricity
  for(i=0; i<m-1; i++)
    for(j=i+1; j<m; j++)
        matrix_c[j][i]=matrix_c[i][j];
//---
  return(true);
 }

 

MQL5の例

  matrix matrix_a={{3,-2.1},{1.1,-1},{0.12,4.3}};
  Print("covariation cols\n",matrix_a.Cov(false));
  Print("covariation rows\n",matrix_a.Cov());
 
  vector vector_a=matrix_a.Col(0);
  vector vector_b=matrix_a.Col(1);
  Print("covariation vectors\n",vector_a.Cov(vector_b));
 
 /*
  covariation cols
  [[2.144133333333333,-4.286]
   [-4.286,11.71]]
  covariation rows
  [[13.005,5.355,-10.659]
   [5.355,2.205,-4.389]
   [-10.659,-4.389,8.736199999999998]]
  covariation vectors
  [[2.144133333333333,-4.286]
   [-4.286,11.71]]
 */

 

Pythonの例

import numpy as np
matrix_a=np.array([[3,-2.1],[1.1,-1],[0.12,4.3]])
matrix_c=np.cov(matrix_a,rowvar=False)
print("covariation cols\n",matrix_c)
matrix_c2=np.cov(matrix_a)
print("covariation rows\n",matrix_c2)
 
vector_a=matrix_a[:,0]
vector_b=matrix_a[:,1]
matrix_c3=np.cov(vector_a,vector_b)
print("covariation vectors\n",matrix_c3)
 
covariation cols
[[ 2.14413333 -4.286     ]
[-4.286     11.71      ]]
covariation rows
[[ 13.005   5.355  -10.659 ]
[ 5.355   2.205   -4.389 ]
[-10.659   -4.389   8.7362]]
covariation vectors
[[ 2.14413333 -4.286     ]
[-4.286     11.71      ]]