ポートフォリオの仕組みとしての行列
ポートフォリオの問題は行列の問題です。共分散行列 Σ には各資産の分散と連動の仕方が入っており、ほとんどの作業はこれを使って何かをします。scipy.linalg.solve(A, b) は Ax=b を未知数 x について解きます。逆行列 inv(A) を求めてから掛けてはいけません。直接解く方が計算が少なく、精度の損失も小さいからです。コレスキー分解 linalg.cholesky(S, lower=True) は共分散行列を Σ=LL⊤ に分け、L は下三角行列(対角より上がゼロ)です。z が独立な標準正規乱数のベクトルなら、Lz の共分散は Σ になり、これが相関のあるリターンを作る方法です。
Σ の固有値は、独立なリスク源が実際にいくつあるかを教えてくれます。linalg.eigvalsh(S) は対称行列の固有値を小さい順に返します。相関 ρ の2資産では、相関行列の固有値は 1+ρ と 1−ρ なので、相関の高い資産は大きな固有値と極小の固有値を1つずつ持ちます。最大固有値と最小固有値の比が条件数です。条件数が大きいと行列はほぼ特異、つまりほとんど逆行列が取れず、データの小さな変化で解が大きく振れます。Σ の逆行列を使う最適化は、まさにこの点に敏感です。
Ax=b ⇒ x=solve(A,b),Σ=LL⊤,r=Lz,κ(Σ)=λminλmax(1) 2資産の手計算Σ=(4223) とします。そのコレスキー因子は
L=(2102) で、
LL⊤ は
4、
2、
2、
1+2=3 になります。独立な乱数
z=(1,1) から作る相関付きの値は
Lz=(2,1+2)=(2,2.414) です。
(2113)x=(35) は消去して
x=(0.8,1.4) と求まります。
ρ=0.9 の相関行列の固有値は
1.9 と
0.1 で、第1因子が全分散の
1.9/2=95% を担います。固有値が
1 と
3 の行列の条件数は
3 です。実データでは、
5,404 日のSPY・QQQ・TLTで、SPYとQQQの相関は
0.92、それぞれとTLTの相関は約
−0.3 です。相関行列の固有値は
0.08、
0.86、
2.06 で、1つの因子が分散の
69% を担い、条件数は
26 です。
- 逆行列ではなく解く:
solve(A, b) は inv(A) @ b より速く正確。 - コレスキーで相関を作る:独立な正規乱数に L を掛けると、共分散 Σ のリターンになる。
- 条件数に注意:相関の高い資産は Σ をほぼ特異にし、解を不安定にする。
ラボ:採点される内容
- コレスキー因子20点
- 連立方程式を解く10点
- 条件数10点
- 因子の分散の割合10点
- 各ルーチンの用途15点
- 相関付きリターンのシミュレーション10点
- なぜ逆行列を使わないか25点