アセットマネージャーのためのファイナンス機械学習:ポートフォリオの構築 マーコウィッツ解の不安定性

 共分散と相関係数の関係は、
$${\rho_{i,j}=\frac{\sigma_{i,j}{\sigma_i \sigma_j}}$$で与えられることから、相関行列は共分散行列を標準化したものであると言える。よって、相関行列の行列式が発散する時は、最小分散ポートフォリオ$${{\bf \omega}^\ast}$$を計算する今日分散行列の逆行列$${{\bf V}}$$も発散する。
 ポートフォリオ内の証券の相関が高い($${0 \ll |\rho| < 1}$$)時、凸最適化から得られた$${{\bf \omega}^\ast}$$は不安定である。よって、$${\rho \approx 0}$$の時のみ、マーコウィッツ解の安定性は保証される。

共分散不安定性の原因

ノイズによる共分散不安定性は、特徴量N、サンプル数Tの$${N/T}$$比できまる。これは、Marchenko-Pasture分布の下限$${\lambda_-}$$は$${N/T}$$比が大きくなるにつれ小さくなり、上限$${\lambda_+}$$は大きくなることから、分布幅が広がることからきている。
 しかし、データのシグナル構造からくる$${\rho}$$は、$${N/T}$$比とは無関係であって、サンプル数を多くしても改良されない。高い$${\rho}$$は証券ユニバース内のグループが強い相関を示していることから、このグループの共通固有ベクトルへ市場の価格変動の影響が強くなれば、その固有値によって分散が決定される。一方、相関行列は標準化されているから、そのグループ内の固有値を減少させることでしか、固有値は増加できない。これによって、最大固有値と最小固有値の比である条件数は高くなる。
 数値的なこの現象は、スニペット7.1とスニペット7.2に実装されている。ノイズ除去の実験で使用したブロックフォーム関数を使用する。

import numpy as np
import pandas as pd
import MarPat as MP
import matplotlib.pyplot as plt, seaborn as sns

corr0 = MP.formBlockMatrix(2, 2, .5)
eVal, eVec = np.linalg.eigh(corr0)
matrix_condition_number = max(eVal)/min(eVal)
print(matrix_condition_number) 

fig, ax = plt.subplots(figsize=(9,7))  
sns.heatmap(corr0, cmap='viridis')
plt.show()

ブロック内の相関が0.5、ブロック間の相関がゼロの二つのブロックからなる相関行列を形成し、固有値から条件数を導出する。

ブロック対角相関行列

この条件数は3。
 二つのうち、一つのブロックでブロック内相関をゼロとして、条件数を求める。

from scipy.linalg import block_diag
corr0 = block_diag(MP.formBlockMatrix(1,2, .5))
corr1 = MP.formBlockMatrix(1,2, .0)
corr0 = block_diag(corr0, corr1)
eVal, eVec = np.linalg.eigh(corr0)
matrix_condition_number = max(eVal)/min(eVal)
print(matrix_condition_number) 
    
fig, ax = plt.subplots(figsize=(9,7))  
sns.heatmap(corr0, cmap='viridis')
plt.show()
ブロック対角相関行列 支配的なブロック

ブロック内相関を0.5に保ったブロックが相関行列の条件数を支配し、条件数は3のままである。

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