ポートフォリオ選択理論(Markowitz, 1952)
はじめに
今回から何度かに分けて金融系の記事を載せていきます。
主に金融経済学と呼ばれる分野に対する簡単(かつ本質的)な紹介をします。
実例に基づくPythonのコードを載せることで、納得感を抱いていただけるようにしました。
あくまで過去の研究の紹介であり、何か新しい発見をもたらすものではないことをご承知おきください。
予定としては以下のような3回に分けて記事を掲載しようと思います。
投資行動の原理
賢くお金稼ぎ、もとい資産運用をしたいという場合どのような行動をすれば良いのでしょうか。
例えば昨今で一番爆発力があるのは仮想通貨とかハイテク株に資産を投じることだと思いますが、なぜ誰もがそうするわけではないのでしょうか。
この問いについてはおそらく多くの人が「リスクが大きいから」と答えるかと思います。
その一方で、もっとも低リスクでお金を増やす方法である銀行預金は最近敬遠され気味です。
これはなぜかというと、「リターンが少ないから」でしょう。
つまり、人間は「リスクが少なく・リターンが高い」投資を追い求める存在なのです。
これはトレードオフとも呼ばれ、両方を同時には実現できないという点で大きな課題となっています。
これに対して「ポートフォリオ選択理論」という形で一定の答えを出したのがHarry Markowitzです。
今回は1952年に発表された論文、PORTFOLIO SELECTION*1の内容をご紹介します。
使用データと基本統計量
今回は米国のIBM社・American Express(AXP)社に投資することを考えます。*2
2社の株価はYahoo! Financeから取得し、年ベースに直したものを使用します。
#Import Libraries import numpy as np import pandas as pd import matplotlib.pyplot as plt import levy # functions def log_rtn(data): lg_data = np.log(data) lg_data_sft = lg_data.shift() rtn = lg_data - lg_data_sft rtn = rtn.dropna(how="any") return rtn def load(name): data = pd.read_csv(name+".csv") data.columns = ["date", name] data.date = pd.to_datetime(data.date) data.set_index('date', inplace=True) return data
ライブラリをimportして関数を宣言して
# Load Data IBM= load("IBM") AXP = load("AXP") # Log Return IBM = log_rtn(IBM) AXP = log_rtn(AXP) # Concatenate # "data" represents historical (yearly) returns as a matrix data = pd.concat([IBM, AXP], axis=1, join="inner") res = np.zeros([2,2]) res[0] = data.mean()*100 res[1] = data.std()*100 res = pd.DataFrame(res, index=["Mean", "Std"], columns=["IBM", "AXP"]) display(res) display(data.corr())
- それぞれの銘柄に対して年次収益率を計算する
- 年次収益率の平均・標準偏差を計算する
という形でIBM・AXPのリターン特性を出しました。単位は全て(%/Year)です。
IBM | AXP | |
Mean | 3.956971 | 7.029903 |
Std | 24.478995 | 30.758780 |
IBMは年平均収益率が3.9%, 収益率のブレを表す標準偏差が24.4%
AXPはそれぞれ7.0%, 30.7%となっております。
また、相関行列は以下のようになります。
IBM | AXP | |
IBM | 1.000000 | 0.478393 |
AXP | 0.478393 | 1.000000 |
この2銘柄間の相関係数は0.47であることがわかります。
以上の計算は価格ベースではなくて、収益率ベースで行なっていることにご注意ください。(理由はこちら:見落としがちな相関係数の話 - ii_da_ba_shi’s blog)
モデリングにおける「仮定」
もっとも大事なことを今から書きます。現代ポートフォリオ理論における仮定、いわば注意書きです。
実際の金融市場は複雑すぎるので、いくつかの仮定を置くことでモデリングしているのですが、その中でもっとも強い2つの仮定を以下に記します。
分散投資の定量的評価
さて、この2社に対して投資を行うのですが、どのような投資手法がいいのでしょうか。
例えば、一社に全部Betする方法、それもいいと思います。
リスクを取って大きなリターンを狙うならAXP、ローリスクローリターンを望むならIBMということになります。
一方で、分散投資、すなわち2社に投資を分散させる方法もあります。
Markowitzの業績は、この分散投資におけるリスクとリターンを定式化したことにあります。
以下の式が分散投資ポートフォリオにおけるリターンおよびリスクです。
理論的背景としては、多次元正規分布の和です。
2つの銘柄は独立ではないため、単純な平均・分散の足し合わせではないというところに注意しましょう。
res = np.zeros([100, 2]) for i in range(100): w = np.array([1-i/100, i/100]) mu_p = np.dot(w, data.mean()) sig_p = np.sqrt(np.dot(np.dot(w, data.cov()), w)) res[i] = [mu_p, sig_p] res = pd.DataFrame(res, columns=["mu_p", "sig_p"])*100 res.plot(kind="scatter", x="sig_p", y="mu_p")
実際に投資割合を少しずつ変えながらプロットしたものが以下の図になります。
各点はポートフォリオへの配分割合を1%ずつ動かしたときのリスク・リターンのプロファイルです。
こうして見てみると、一番収益率の良い投資がAXP100%(リスク30.7%, リターン7.0%)であることは間違いありませんが、一番リスクの低い投資はIBM100%(リスク24.4%, リターン3.9%)ではなく、AXPとIBMへの分散投資であることがわかります。具体的にはIBMに29%, AXPに71%の分散投資を行うと、リスクは23%で済むようです。
これが分散投資の威力です。なぜ分散投資によってリスクが低減するのかということは感覚的な説明にとどめますが、一言で言うとするなら、銘柄間の相関係数が小さければ小さいほど、リスクが小さくなるということです。反対の動きをする銘柄を組み合わせることでリスクを減らすことができます。
ひとまず1回目はこの辺で終わりとします。次回はこの続きから
*1:https://doi.org/10.1111/j.1540-6261.1952.tb01525.x
*2:この2社を選んだ理由は特にないのですが、前者のサマーインターン選考で散々待たされた上に落とされたのはちょっと根に持ってます