Python

【Python】共分散とポートフォリオのリスクの計算|ファイナンス理論の基礎

Python

はじめに

異なる銘柄の株価には、何かしらの関係があると考える方が合理的です。例えば、テック企業の株価があがるとバリューセクターの株価は下がるという場合などです。

このように二つの銘柄の関係性を示すのが、共分散です。今回はこの、共分散とポートフォリオのリスクをPythonを使って算出する方法を解説したいと思います。

共分散の求め方

共分散とは、2 組の対応するデータ間での、平均からの偏差の積の平均値で表されます。

まずは以下ので例を見てみましょう。

項目数学国語
平均点5050
Aさんの点数3070
偏差-2020
偏差の積-20 × 20 = −400
  • (数学の平均点)ー(Aさんの数学の点数)= -20
  • (国語の平均点)ー(Aさんの国語の点数)= 20
  • 偏差の積は、-20 × 20 = −400となります。

この値が共分散です。

共分散の値が以下3つの場合で関係性が分かれます

  • 正の場合:同じ方向の値動き(正の相関関係)
  • 負の場合:逆の方向の値動き(負の相関関係)
  • ゼロの場合は値動きに関係なし

似たようなものに相関係数というものがあります。

相関係数は、この共分散をそれぞれの変数の標準偏差で割った値です。

相関係数をρ、共分散をcav(X,Y)、それぞれの標準偏差をσxとσyとすると、以下の数式で求めることができます。

{\displaystyle \rho ={\frac {\operatorname {cov} (X,Y)}{\sigma _{X}\sigma _{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をもっと勉強したいという方は、以下を参考にしてみてください。私が、勉強に使っている本や勉強方法などを解説しています。

ファイナンス理論に関しては、以下の記事を参照ください。

今回の記事は、以上です。

最後までお読みいただきありがとうございました。

コメント

  1. […] 【Python】共分散とポートフォリオのリスクの計算|ファイナンス理論の基礎異なる銘柄の株価通しには、何かしらの関係があると考える方が合理的です。例えば、テック企業の株価があ […]

  2. […] 共分散とポートフォリオのリスクの計算 […]

  3. […] 【Python】共分散とポートフォリオのリスクの計算|ファイナンス理論の基礎異なる銘柄の株価通しには、何かしらの関係があると考える方が合理的です。例えば、テック企業の株価があ […]

  4. […] 【Python】共分散とポートフォリオのリスクの計算|ファイナンス理論の基礎異なる銘柄の株価通しには、何かしらの関係があると考える方が合理的です。例えば、テック企業の株価があ […]

タイトルとURLをコピーしました