Python

【Python】分散可能なリスクの計算方法|ファイナンス理論入門

Python

はじめに

この記事では、分散可能なリスクの計算方法について解説します。ポートフォリオにおける分散可能なリスクとはなんでしょうか?

ポートフォリオ全体で言えば、例えば、負の相関を示す2銘柄を所有することと言えるでしょう。つまり、片方の銘柄の株価が下がれば、片方は上がるという銘柄です。この両者を保有することで、ポートフォリオ全体としてのリスクは、高くなると言えます。これは、正の相関が高い銘柄二つでも同様にリスクが高くなると言えます。

つまり、数学的には交互作用項が、分散可能なリスクとなります。

一方で、分散不可能なリスクとはなんでしょう?それは、経済全体にインパクトを与えるような事象があります。例えば、リーマンショックのようなインパクトの大きい事象が発生すると、株式をいかに分散しても、リスクを低減することができないです。

ここでは、ポートフォリオにおける分散可能なリスクを算出する方法を解説したいと思います。

この記事のゴール

  • ポートフォリオにおける分散可能なリスクを算出する方法を理解し、算出できるようになること

分散可能なリスクを算出する方法

分散可能なリスクを算出する例として、銘柄Aと銘柄Bを保有するケースを考えます。

  • ポートフォリオ全体のリスク:pfolio_Var
  • 銘柄Aの分散:A_rvar
  • 銘柄Bの分散:B_var
  • 銘柄Aの保有ウエイト:wa
  • 銘柄Bの保有ウエイト:wb
  • 銘柄Aと銘柄Bの共分散:ρab

この場合、ポートフォリオ全体のリスクは以下の式で表されます。

pfolio_Var = A_var*wa^2+B_var*wb^2+2*ρab*wa*wb

青色の下線部分が、分散可能なリスクとなります。つまり、分散可能なリスクは、以下2種類の方法で表すことができます。

  • 分散可能なリスク = ポートフォリオの分散 - それぞれの重み-^2*株式の株式の分散
  • 分散可能なリスク = 2*ρab*wa*wb

ポートフォリオの分散の算出方法は、以下の記事でまとめているので、わからない方は、確認してみてください。

では実際に分散可能なリスクをPythonで算出してみましょう。

開発環境

今回は、Jupyter Notebookで計算をしていきます。Jupyter Notebookのインストール方法等がわからない方は、こちらを参考にしてみてください。Anacondaをインストールすることで、Jupyter Notebookも合わせてインストールすることが可能です。

コード

ライブラリのインポート

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社の2007年から現在までの株価を取得し、二社の共分散と相関係数を算出します。

  • MSTF:マイクロソフト
  • APPL:アップル
tickers = ['MSFT', 'AAPL']

sec_data = pd.DataFrame()

for t in tickers:
    sec_data[t] = wb.DataReader(t, data_source='yahoo', start='2007-1-1')['Adj Close']

分散可能なリスクの計算

以下の方法で分散可能なリスクを算出可能です。

分散可能なリスク = ポートフォリオの分散 - それぞれの重み-^2*株式の株式の分散で計算した場合は、以下です。

sec_returns = np.log(sec_data / sec_data.shift(1))#リターンの算出
weights = np.array([0.5, 0.5])
MSFT_var_a = sec_returns['MSFT'].var() * 250#MSTFの年間の分散(リスク)
AAPL_var_a = sec_returns['MSFT'].var() * 250#AAPLの年間の分散(リスク)
dr = pfolio_var - (weights[0] ** 2 * MSFT_var_a) - (weights[1] ** 2 * AAPL_var_a)#分散可能なリスク
dr

分散可能なリスク = 2*ρab*wa*wbで計算した場合は以下です。
sec_returns.cov() * 250で年間の共分散行列を得ることができ、その共分散の部分(cov_matrix_a[“MSFT”][“AAPL”])をかけています。

cov_matrix_a = sec_returns.cov() * 250
dr2 = 2*weights[0]*weights[1]*cov_matrix_a["MSFT"]["AAPL"]

この両者の実行結果から得られる、drとdr2の値は、一致するはずです。

print (str(round(dr1*100, 3)) + ' %')
print (str(round(dr2*100, 3)) + ' %')

実行結果は、以下です。

  • 2.513 %
  • 2.513 %

両者一致することが分かります。

分散不可能なリスク

分散不可能なリスクは、分散不可能なリスク = ポートフォリオの分散 - 分散可能なリスク で算出可能です。

n_dr_1 = pfolio_var - dr
print (str(round(n_dr_1*100, 3)) + ' %')
  • 4.012 %

よって、このポートフォリオだと、分散不可能なリスクの方が大きいということがわかります。

まとめ

この記事では、分散可能なリスクの計算方法について解説しました。

分散可能なリスクは、以下二つの式で算出可能です。

  • 分散可能なリスク = ポートフォリオの分散 - それぞれの重み-^2*株式の株式の分散
  • 分散可能なリスク = 2*ρab*wa*wb

分散不可能なリスクは、以下で算出可能です。

  • 分散不可能なリスク = ポートフォリオの分散 - 分散可能なリスク

Pythonをもっと勉強したいという方は、以下を参考にしてみてください。私が、勉強に使っている本や勉強方法などを解説しています。

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

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

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

コメント

  1. […] 分散可能なリスクの計算方法 […]

  2. […] 【Python】分散可能なリスクの計算方法|ファイナンス理論入門この記事では、分散可能なリスクの計算方法について解説します。ポートフォリオにおける分散可能なリスクとはなんでし […]

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