アセットマネージャーのためのファイナンス機械学習:ノイズ除去 Constant Residual Eigen Value Method

ファイナンスでは一般的な手法である、雑音により数値的に悪条件の共分散行列のシュリンクは、ノイズとシグナルの区別をしないので、弱いシグナルをさらに弱くしてしまう。
 Marchenko-Pastur分布をフィットすることで、ノイズとシグナルからの固有値を区別することができたので、これを用いて相関行列のNoise除去を行う方法の、Constant Residual Eigen Value Methodを行う。

 雑音由来の固有値を、この相関行列のtraceを保つような定数の固有値に置き換える。
 降順に並べた固有ベクトル$${{\lambda_{n}},n=1 \dots N}$$を、Marchenko-Pastur分布フィットから得られたカットオフ固有値$${\lambda_{+}}$$から、$${\lambda_{i} \gt \lambda_{+}}$$のシグナル由来、$${\lambda_{i+1} \le \lambda_{+}}$$の雑音由来に分け、この雑音由来の固有値を、
$${ \lambda_{j}={\displaystyle \frac{1}{N-i} }{\displaystyle \Sigma^{N}_{k=i+1} \lambda_{k} } , j=i+1, i+2 \dots N}$$
の定数に置き換える。

 この置き換えられた固有値対角行列$${\tilde{\bf{\Lambda}}}$$と、固有値とペアになっている固有ベクトルを並べた行列$${\bf{W}}$$から、固有値分解を使い、ノイズ除去された共分散行列$${\bf{C}_{1}}$$が作られる。
 ある行列$${\bf{M}}$$は、その固有値対角行列$${\bf{\Lambda}}$$とその固有ベクトル行列$${\bf{\Lambda}}$$から、
$${\bf{M}=\bf{W}\bf{\Lambda}\bf{W}^{-1}}$$
と分解できる(固有値分解)。対称行列である共分散行列の固有値ベクトルは互いに直行することから、$${{\bf W}^{-1}={\bf W}^{T}}$$。
 よって、$${\bf{C}_{1}=\bf{W}\tilde{\bf{\Lambda}}\bf{W}^T}$$、と与えられる。
 これはスニペット2.5で実装されている。

def denoisedCorr(eVal, eVec,nFacts):
    eVal_=np.diag(eVal).copy()
    eVal_[nFacts:]=eVal_[nFacts:].sum()/float(eVal_.shape[0]-nFacts)
    eVal_=np.diag(eVal_)
    corr1=np.dot(eVec, eVal_).dot(eVec.T)
    corr1=cov2corr(corr1)
    return corr1

ノイズ除去された相関関数の固有値分布と、ノイズが入った相関関数の固有値分布を比べる。

corr1=denoisedCorr(eVal0,eVec0,nFact0)
eVal1,eVec1=getPCA(corr1)

log_eVal0=np.log10(np.diag(eVal0))
num_eig0=len(eVal0)
log_eVal1=np.log10(np.diag(eVal1))
num_eig1=len(eVal1)
plt.plot(log_eVal0,range(1,num_eig0+1),label='Original')
plt.plot(log_eVal1,range(1,num_eig1+1),label='DeNoised')
plt.xlabel('$\log_{10} \lambda$')
plt.ylabel('PDF')
plt.legend()
plt.show
DeNoised シュリンケージ無し

雑音由来の固有値が綺麗に取り除かれている。

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