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

市場成分が金融データに含まれていると、証券のあるクラスターに与える影響を相関関係によって説明しずらくなる。この市場成分の除去は、他の音が聞こえなくなるような大きな音を除くのと同じ原理である。
 市場成分からくる固有値は、大体理論的固有値よりもはるかに大きく、一番目にくる。よって、この市場の成分由来の固有値からくる共分散行列成分を、ノイズ除去された共分散行列から引き、相関行列を作り直せば良い。
$${ \tilde{{\bf C}}_{2} =\tilde{{\bf C}}_{1}-{\bf W}_{M}{\bf \Lambda}_{M} {\bf W}_{M}^{T} = {\bf W}_{D}{\bf \Lambda}_{D} {\bf W}_{D}^{T} }$$
ここで、$${{\bf W}_{M}}$$は市場成分の固有ベクトル行列で、$${{\bf \Lambda}_{M}}$$は市場成分の固有値、$${{\bf W}_{D}}$$は非市場成分の固有ベクトルで、固有値が$${{\bf \Lambda}_{D}}$$である。
 デトーニングは以下のように実装される(練習問題:2.1)。

def detoned_corr(corr, eVal, eVec, mc=1):
    # mc: the number of market component, default 1
    
    eVal_mc = eVal[:mc, :mc]
    eVec_mc = eVec[:, :mc]
    corr_mc = np.dot(eVec_mc, eVal_mc).dot(eVec_mc.T)
        
    corr = corr - corr_mc
    corr = cov2corr(corr)
    
    return corr

 このデトーニングをCREMでノイズ除去された相関行列に行い、除去後の固有値分布を比べたのが以下のコードと図である。

corr_dt_dn = detoned_corr(corr1, eVal1, eVec1)

eVal_dt, eVec_dt = getPCA(corr_dt_dn)

log_eVal_dt=np.log10(np.diag(eVal_dt))
num_eig_dt=len(eVal_dt)

plt.plot(range(1,num_eig0+1),log_eVal0,label='Original')
plt.plot(range(1,num_eig1+1),log_eVal1,label='DeNoised CREM')
plt.plot(range(1,num_eig2+1),log_eVal2,label='DeNoised TC')
plt.plot(range(1,num_eig_dt+1),log_eVal_dt,label='DeToned +CREM')
plt.xlabel('PDF')
plt.ylabel('$\log_{10} \lambda$')
plt.legend()
plt.show
ノイズ除去+デトーニング


デトーニングされた相関行列は、少なくとも一つの固有ベクトルが除去されているので、特異行列となっている。クラスターリングには問題ではないが、平均分散ポートフォリオの最適化には、非ゼロの主成分上でポートフォリオを最適化して、元の基底に戻す作業が必要である。
$${w^{\ast}={\bf W}_{D} f^{\ast} }$$

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