はじめに
異なる銘柄の株価には、何かしらの関係があると考える方が合理的です。例えば、テック企業の株価があがるとバリューセクターの株価は下がるという場合などです。
このように二つの銘柄の関係性を示すのが、共分散です。今回はこの、共分散とポートフォリオのリスクをPythonを使って算出する方法を解説したいと思います。
共分散の求め方
共分散とは、2 組の対応するデータ間での、平均からの偏差の積の平均値で表されます。
まずは以下ので例を見てみましょう。
項目 | 数学 | 国語 |
---|---|---|
平均点 | 50 | 50 |
Aさんの点数 | 30 | 70 |
偏差 | -20 | 20 |
偏差の積 | -20 × 20 = −400 |
- (数学の平均点)ー(Aさんの数学の点数)= -20
- (国語の平均点)ー(Aさんの国語の点数)= 20
- 偏差の積は、-20 × 20 = −400となります。
この値が共分散です。
共分散の値が以下3つの場合で関係性が分かれます
- 正の場合:同じ方向の値動き(正の相関関係)
- 負の場合:逆の方向の値動き(負の相関関係)
- ゼロの場合は値動きに関係なし
似たようなものに相関係数というものがあります。
相関係数は、この共分散をそれぞれの変数の標準偏差で割った値です。
相関係数をρ、共分散をcav(X,Y)、それぞれの標準偏差をσxとσyとすると、以下の数式で求めることができます。
標準偏差がわからない等があれば、以下の記事を参考にしてみてください。
共分散だと、データの値によって増減してしまい、とこ並びで比較しにくいという特徴があります。そこで、相関係数を用います。相関係数は、
- -1:負の相関
- 0:相関なし
- 1:生の相関
となり、複数のペアの相関関係を比較するときに、横ならべにして、どちらが相関が強いか?などの分析をすることができます。
株価の共分散
では、Pythonをつかって株価の共分散を算出してみましょう。
ライブラリのインポート
pandas_datareaderだけは、Anacondaには含まれていないので、こちらは、別途インストールしてください。
インストール方法は、以下のコマンドを入力することで可能です。
- Mac:ターミナル
- Windows:コマンドプロンプト
pip install pandas_datareader
以下のライブラリをインポートします。
- numpy
- pandas
- pandas_datareader
import numpy as np
import pandas as pd
from pandas_datareader import data as wb
株価の読み込み
今回は、以下2社の1995年から現在までの株価を取得し、二社の共分散と相関係数を算出します。
- MSTF:マイクロソフト
- APPL:アップル
tickers = ['MSFT', 'AAPL']
sec_data = pd.DataFrame()
for t in tickers:
sec_data[t] = wb.DataReader(t, data_source='yahoo', start='1995-1-1')['Adj Close']
年間のリターンとリスクの算出
sec_returns[['MSFT', 'AAPL']].mean() * 250#リターン
sec_returns[['MSFT', 'AAPL']].std() * 250 ** 0.5#リスク
リターンとリスクの算出方法に関しては、以下の記事を参考にしてみてください。
共分散の求め方
Pythonで共分散を求めるには、以下のように求めます。
- .cov():共分散行列を算出することができる
cov_matrix = sec_returns.cov()
cov_matrix
実行結果は以下です。2列2行の行列として出力されました。
- 1行1列目:MSFTとMSFTの分散を表します。
- 2行2列目:AAPLとAAPLの分散を表します。
- 1行2列目,2行1列目:MSFTとAAPLの共分散を表します。
sec_returns['MSFT'].var()
var()で分散を求めることができます。出力結果は、以下です。1行1列目の値と同じ値になることがわかります。
- 0.0003990941491658921
つまり、1行2列目,2行1列目の0.000227というのが、MSFTとAAPLの共分散を表します。
ポートフォリオのリスクの計算
ポートフォリオは以下の割合で持つと仮定し、そのときのポートフォリオのリスクを算出します。
- MSTF(マイクロソフト):50%
- APPL(アップル):50%
ポートフォリオの分散は、以下の式で求められます。ここで交互作用項にρ12(共分散)をかけるのがミソです。
- (w1σ1+w2σ2)^2 =(w1σ1)^2+(w2σ2)^2+2w1σ1w2σ2ρ12
それを行列で表すと以下の式となります。
weights = np.array([0.5, 0.5])
ポートフォリオの分散は以下で、算出可能です。
pfolio_var = np.dot(weights.T, np.dot(sec_returns.cov() * 250, weights))
pfolio_var
- 0.10349659697619111
ポートフォリオのボラティリティは以下で、算出可能です。
pfolio_vol = (np.dot(weights.T, np.dot(sec_returns.cov() * 250, weights))) ** 0.5
pfolio_vol
- 0.32170886990599296
まとめ
今回はこの、共分散とポートフォリオのリスクをPythonを使って算出する方法を解説しました。
pythonでは以下の方法で、共分散(行列)を算出可能です。
- .cov():共分散行列を算出することができる
また、ポートフォリオのリスク(年間)は、以下で算出可能です。
- np.dot(weights.T, np.dot(sec_returns.cov() * 250, weights))
Pythonをもっと勉強したいという方は、以下を参考にしてみてください。私が、勉強に使っている本や勉強方法などを解説しています。
ファイナンス理論に関しては、以下の記事を参照ください。
今回の記事は、以上です。
最後までお読みいただきありがとうございました。
コメント
[…] 【Python】共分散とポートフォリオのリスクの計算|ファイナンス理論の基礎異なる銘柄の株価通しには、何かしらの関係があると考える方が合理的です。例えば、テック企業の株価があ […]
[…] 共分散とポートフォリオのリスクの計算 […]
[…] 【Python】共分散とポートフォリオのリスクの計算|ファイナンス理論の基礎異なる銘柄の株価通しには、何かしらの関係があると考える方が合理的です。例えば、テック企業の株価があ […]
[…] 【Python】共分散とポートフォリオのリスクの計算|ファイナンス理論の基礎異なる銘柄の株価通しには、何かしらの関係があると考える方が合理的です。例えば、テック企業の株価があ […]