独立なノイズから相関する資産へ
乱数生成器は独立な乱数を返します。資産は相関しているので、ポートフォリオのシミュレーションには正しい共分散行列 Σ をもつ乱数が必要です。コレスキー分解は LLᵀ=Σ を満たす下三角行列 L を見つけます。独立な標準正規乱数のベクトルを z とすると、Lz の共分散はちょうど L I Lᵀ=Σ です。NumPyでは乱数が行で届くので、形 (n, d) の配列 z に対して z @ L.T を計算します。scipy.linalg.cholesky(cov, lower=True) は分解を行い、行列が正定値でなければエラーを出します。これは共分散行列に問題があるという警報として役立ちます。np.random.default_rng(seed) でシードを与えれば実験は再現できます。
シミュレータがあればリスク数値を計算できます。各乱数のポートフォリオリターンは draws @ w、水準 α の1日VaRはそのリターンの α 分位点(np.quantile)にマイナスを付けたものです。正規乱数なら分散共分散法の式 -(wᵀμ+z_α√(wᵀΣw)) と一致するはずで、12資産ではその通り、シミュレーションで 2.07%、式で 2.08% です。一方、過去データでは 2.33% で、実際のリターンはどの正規モデルより裾が厚いのです。推定した共分散行列が使えなくなることもあります。2資産の相関を不可能な 1.2 にすると最小固有値が負(約 -6×10⁻⁵)になり、コレスキーは行列を拒否します。標準的な修復は scipy.linalg.eigh を使い、小さな下限未満の固有値を下限まで引き上げ、行列を再構成して対称化します。結果は正定値で、元との差は約 3×10⁻⁵ にすぎません。
- コレスキーはノイズを相関に変える:
cov = L @ L.Tのときz @ L.Tの共分散はcov。 - 正規乱数ならシミュレーションと式は一致するはず:履歴との差は厚い裾のコスト。
- 分解の失敗は情報:正定値でない行列は、小さいまたは負の固有値を引き上げて直す。
ラボ:採点される内容
- コレスキー因子10点
- 相関する乱数20点
- モンテカルロVaR25点
- パラメトリックVaR15点
- 共分散行列の修復15点
- 12資産の研究15点