Quantcast
Channel: Momentum
Viewing all articles
Browse latest Browse all 20

任意の共分散行列に従う正規乱数の生成

$
0
0

概要

  • 任意の共分散行列に従う正規乱数の生成
  • 共分散行列の固有値と固有ベクトルから求められる
  • 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の日次リターンの共分散行列を使用します。オリジナルデータはこんな感じ↓
original_data

元の共分散行列、相関行列はこんな感じ↓
original_cov

共分散行列に従うサンプルの生成

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という変数に、もとの共分散行列に従う(とされる)サンプルが格納されています。実際に確認したのが以下。どうやら近いっぽい。
sample_cov

ちなみに生成されたサンプルは以下のような感じ
sample_data


Viewing all articles
Browse latest Browse all 20

Trending Articles