概要
- 任意の共分散行列に従う正規乱数の生成
- 共分散行列の固有値と固有ベクトルから求められる
- pythonで乱数が生成されることを確認する
数式
線形代数のおさらいという感じですが…(― ―)
各要素が実数の対称行列\( A\) (n行n列)は
$$
A = U \cdot \Sigma \cdot U^T
$$
と対角化可能(diasonalisable)である。ただし\(U\)は各列が固有ベクトル、\(\Sigma\)は対角行列で対角要素が固有値。
このとき\(R\)を、各要素がiid標準正規分布に従う1行n列のベクトルとした場合、
$$
R \cdot \Sigma^{1/2} \cdot U^T \sim N \left( 0, A \right)
$$
となる。
pythonで確認
データの用意
今回はSP500, EURO STOXX 50, FTSEの日次リターンの共分散行列を使用します。オリジナルデータはこんな感じ↓
共分散行列に従うサンプルの生成
lo_returnという変数に日次変数が格納されていると仮定しています。
e_val, e_vec = np.linalg.eig(lo_return.cov()) iidn_sample = np.random.randn(10000, 3) correlated_sample = iidn_sample.dot(np.diag(e_val) ** 0.5).dot(e_vec.T)
correlated_sampleという変数に、もとの共分散行列に従う(とされる)サンプルが格納されています。実際に確認したのが以下。どうやら近いっぽい。
ちなみに生成されたサンプルは以下のような感じ