アセットマネージャーのためのファイナンス機械学習:ノイズ除去 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
ここで、固有値$${ \lambda_{-} \le \lambda \le \lambda_{+} }$$ はランダムな挙動からくる雑音とみることができる。実際は正の固有値しか扱わないので、雑音とされるのは、$${ 0 \le \lambda \le \lambda_{+}}$$である。
この記事が気に入ったらサポートをしてみませんか?