アセットマネージャーのためのファイナンス機械学習:ノイズ除去 Marchenko-Patstur

Marchenko-Pastur定理

サイズ$${T\times N}$$の独立同分布する乱数観測値行列を$${\bf{X}}$$とする。この観測値を生成する潜在的プロセスの平均値は$${0}$$$、分散は${\sigma^2=1}$$であれば、$${\bf{X}}$$の相関行列の固有値は、Marchenko-Pastur確率密度関数に漸近的に($${T \to \infty, N\to \infty, 1\lt T/N \lt \infty}$$)、以下に収束することが知られている。
$${f[\lambda] = \displaystyle \frac{T}{N} \frac{ \sqrt{(\lambda_{+}-\lambda)(\lambda-\lambda_{-})} }{2\pi\lambda\sigma^2} \textrm{ if } \lambda \in [ \lambda_{-},\lambda_{+}] }$$
$${ [ \lambda_{-},\lambda_{+}] }$$外の固有値は存在しない。
 ここで固有値の期待値の最大値最小値は、$${\lambda_{\pm}=\sigma^{2}(1\pm\sqrt{N/T})^2}$$と与えられている。
 これをスニペットを使い実際に行ってみる。
 
 最初に$${10000\times 1000}$$の正規分布の乱数行列を作り、その固有値の分布をヒストグラムで出力する。

r=[]
for i in range(1):
    x=np.random.normal(size=(10000,1000))
    #cov_x=np.cov(x,rowvar=0)
    corr_x=np.corrcoef(x,rowvar=0)
    eVal,eVec=np.linalg.eigh(corr_x)
    r.append(eVal)

import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=(10,6))    
plt.hist(np.array(r).ravel(),  bins=80, density=True)
plt.show

コードの中の、共分散行列、相関行列を出している np.cov(), np.correcoef()の中のrowvarは、行列$${\bf X}$$のデータ並びによる。
rowvar=1は、T(時間列)が行で、N(特徴量)が列の場合の相関/共分散行列を作ることを指示している。ここでは、正規分布なので、$${\sigma^2=1}$$のため、共分散行列と相関行列が同じになっている。

 スニペット2.1のmpPDF関数を定義する。

def mpPDF(var,q,pts):
    #Marchenko -Pastur probability density variable
    # q=T/N
    eMin,eMax=var*(1-(1./q)**.5)**2,var*(1+(1./q)**.5)**2
    eVal=np.linspace(eMin,eMax,pts)
    pdf=q/(2*np.pi*var*eVal)*((eMax-eVal)*(eVal-eMin))**.5
    if eVal.ndim == 2:
        eVal=eVal.reshape(-1)
    if pdf.ndim==2:
        pdf=pdf.reshape(-1)
    pdf=pd.Series(pdf,index=eVal)
    
    return pdf

この関数を呼び、上記の固有値分布に重ねて出力する。

pdf0=mpPDF(1.,q=x.shape[0]/float(x.shape[1]),pts=1000)

plt.figure(figsize=(10,6))    
plt.hist(np.array(r).ravel(),  bins=80, density=True)
plt.plot(pdf0,label='Marchenko-Posture')
plt.legend()
plt.show
Marchenko-Patstur

ここで、固有値$${ \lambda_{-} \le \lambda \le \lambda_{+} }$$ はランダムな挙動からくる雑音とみることができる。実際は正の固有値しか扱わないので、雑音とされるのは、$${ 0 \le \lambda \le \lambda_{+}}$$である。


この記事が気に入ったらサポートをしてみませんか?