エクセルで株式ポートフォリオ分析(接点ポートフォリオ、資本市場線、分離定理など)

3つ以上の資産から成るポートフォリオの収益率、分散等を計算する場合には簡単な行列演算が必要となるので、エクセルによる計算例をまとめてみた。行列と聞いただけで毛嫌いする人のいるかもしれないが、単に数字の塊を操作するに過ぎないと思えば案外と気楽に付き合えると思う。エクセルでは MMULT,MINVERSE,TRANSPOEといった3つの関数を使うことで大概の計算は済ますことができ、計算に使うコマンドのパターンも限られているので、一旦コマンドパターンを作っておけば、あとは引数のセル範囲を適宜に変更するだけで自分が必要とする計算は完了する。簡単な行列演算を使って、最小分散ポートフォリオ、接点ポートフォリオ、資本市場線(CML),ポートフォリオ分離定理などについて計算実験してみる。

 エクセルの行列演算では配列数式が作られるが、その計算結果を編集しようとすると、「配列の一部を変更することはできません」といった警告メッセージが頻繁に表示され、うるさくて頭が沸騰しやすくなる。これは健康上よろしくないので、予めwindowsアクセサリのメモ帳のようなテキストエディターを起動しておき、数式を編集するときには、数式バーに出ている数式をテキストエディターに一旦貼りつけておき、次に、エクセルに出力されている配列数式の全てのセルを削除してセルを更地にしてしまい、エクセルの余白セルにテキストエディターの数式を文字列として貼り付けて、自分の好みのように編集をする。これは自己勝手流なので良い方法かどうかは分からないが、自分の経験上は心穏やかに作業が出来るようになったと思う。具体的な手順については連立方程式の解法のところで少し触れてみたい。
(When I'm trying to edit an array formula, I often see you cannot change part of an array. To avoid this, I  use a text editor like windows notepad. Before editing the cell, I  paste the cell into notepad and then editing the formula on notepad, then I delete the cells which contain the array formula  and paste the edited formula from notepad to Excel as text strings.Then
 press Ctrl+Shift+Enter in Excel)

ポートフォリオの収益率を求める(finding the portfolio's return)

株式 A、B、Cの銘柄から成るポートフォリオで、A,B,C の投資比率が均等割合であったとすると、投資比率ベクトル X=(0.333,0.333,0.333)で表せる。3銘柄 A,B,C の収益率ベクトルをμで表し仮に
μ=(0.02,0.08,0.14) とする。横書きになっているので、うまく縦に表示できないがベクトルは全て列ベクトルとする。ポートフォリオ全体の収益率は投資比率ベクトルと収益率ベクトルの内積で求められる。下記のエクセルのシートではすべて列ベクトルで表しており以下のようになる。





ポートフォリオの収益率は0.08と計算されている。ここでの数式は  =MMULT(TRANSPOSE(C18:C20),C9:C11) と記入し、ワークシート画面上部に表示されている(数式バー fx)のところに表示されている数式をクリックして<ctrl>+<shift>+<enter>の3つのキーを同時に押すと演算結果がセルに表示される。投資比率ベクトルも収益率ベクトルも3行1列の列ベクトル(3x1)で定義しているので(1x3)*(3x1)でスカラーである内積を求めるためには、収益率ベクトルをTRASPOSE(C18:C20)として行ベクトルに転置し、MMULTを使って転置された収益率ベクトルと列ベクトルである投資比率ベクトルの積を求めている。もし、当初から収益率ベクトルが行ベクトルで、投資比率ベクトルが列ベクトルで与えられていれば、TRANSPOSEは使わずに、そのままセル範囲を記入すればよい。もし、かけ算の順序を間違えて=MMULT(C9:C11,TRANSPOSE(C18:C20)) とすると3行3列の行列が計算されてしまう。収益率ベクトル(3x1)に行ベクトルに転置された投資比率ベクトル(1x3):を乗じているので(3x1)*(1x3)の3行3列の全く意図しない行列が計算される。

ポートフォリオの分散を求める。(finding the portfolio's variance)

ポートフォリオの分散は 投資比率ベクトル(行ベクトル)×分散共分散行列×投資比率ベクトル(列ベクトル)の行列演算で求められる。仮に3銘柄の分散共分散行列が下記のように与えられたとすればポートフォリオの分散は次のようになる。



ポートフォリオの分散は0.1091と計算されている。分散共分散行列に列ベクトルの投資比率ベクトルを乗じると(3x3)*(3x1)の計算で3行1列の列ベクトルが計算され、それに投資比率ベクトルを転置した(1x3)の行ベクトルを左側から乗じて(1x3)*(3x1)で内積であるスカラーとしての分散を計算している。

連立一次方程式の解を求める(solving systems of simultaneous linear equations)

以下のような連立一次方程式を解いてみる。
x+3y+3z=8
2x-y+z=0
3x+y-3z=12

未知数はx、y、zで、これを列ベクトルX、左辺の係数をAという係数行列、右辺の定数をBという列ベクトルで表すと以下のようになる。未知数のベクトルXは
係数行列Aの逆行列に定数ベクトルBを乗じて計算できるので下記のような行列演算となる。逆行列についても取りあえずは、大げさに考えずに、例えば、3の逆数は1/3 つまり3-1 で表すのと同じ感覚で、行列バージョンの逆数が逆行列と思えばよい。

連立一次方程式


数式表示  =MMULT(MINVERSE(B63:D65),B70:B72)
と記入し、ワークシート画面上部に表示されている(数式バー fx)のところに表示されている数式をクリックして<ctrl>+<shift>+<enter>の3つのキーを同時に押すと演算結果がセルに表示され(2,3,-1)との解を得る。つまり、x=2,y=3,z=-1となる。もし、配列数式を出力させるセル範囲を間違えた場合には、数式バーに出ている数式をテキストエディターに一旦貼りつける。エクセルに出力されている配列数式のすべてのセルを削除して更地にする。次にテキストエディターの数式をエクセルの余白のセルに文字列として貼りつける。例えば、上記の例でいえば=MMULT(MINVERSE(B63:D65),B70:B72)をメモ帳に貼り付け、それからメモ帳の文字列  =MMULT(MINVERSE(B63:D65),B70:B72)  をエクセルの余白セルに文字列として貼り付ける。その後にセル範囲をB80:B82とか自分の好きな範囲に書き換えた後に、結果出力に必要なセル範囲を選択して、数式バーに出ている変更後の数式をクリックして<ctrl>+<shift>+<enter>の3つのキーを同時に押せば新たな計算結果が得られる。うまくいかない場合は配列数式が出ている全てのセルを削除して更地に戻し、上記の手順でやり直してみる。
 なお、逆行列の計算をする時には、無意味な計算を避けるために、事前に対象とする行列の行列式がゼロか非常にゼロに近い値でないことを確かめておく必要がある。下記の事例を示しておく。

逆行列の計算

 以下のような3行3列の行列Dの逆行列を求める。
 (1,2,3)
 (4,5,6)
 (7,8,9)

エクセルでは =MINVERSE(B88:D90)を使ってけ計算すると
逆行列D-1  
-4.5036E+15 9.0072E+15 -4.5036E+15
9.0072E+15 -1.80144E+16 9.0072E+15
-4.5036E+15 9.0072E+15 -4.5036E+15
を得る。もし、これが正しければDD-1は3行3列の単位行列になる筈である。
DD-1を計算すると
0.0000 0.0000 0.0000
-4.000 0.0000 -4.0000
0.0000 0.0000 0.0000
となり、単位行列になっていない。
Dの行列式を =MDETERM(B88:D90) で計算してみると限りなくゼロに近い数値となっている。このような場合は逆行列は無意味となる。
Dの2列を2倍し、そこから第1列を差し引くと第3列に等しくなり3つの列が独立でないことが分かる。このような場合は逆行列は計算できないので、
-4.5036E+15 9.0072E+15 -4.5036E+15
9.0072E+15 -1.80144E+16 9.0072E+15
-4.5036E+15 9.0072E+15 -4.5036E+15
は使えない。

以上の基本的操作法を覚えてしまえばその後の作業は大変に楽になる。
まず手始めに最小分散ポートフォリオ(global minimum variance portfolio)の計算をしてみる。

最小分散ポートフォリを求める(finding the global minimum variance portfolio)

リスク資産である株式 3銘柄 A,B,C の投資比率をX=(A,B  ,C)
3銘柄 A,B,C の収益率ベクトルをμ=(0.02,0.08,0.14)  
A,B,Cの収益率の分散共分散行列∑は以下のように与えられている。




ここでポートフォリオの分散が最小となるような投資比率を求めるには

.A + B  + C =1 

という制約条件の下にポートフォリオの分散を最小化するという条件付極値問題となる。これはラグランジュ関数Lを作り連立方程式を解くというラグランジュ乗数法を適用する。ラグランジュ関数を各変数で偏微分すると連立方程式が導ける。This is the constrained minimization problem.To solve this,the method of lagrangian multpliers is used)




ラグランジュ乗数法
これを整理すると以下のような式になる。

ラグランジュ乗数

Zは係数行列になるが最初の3行3列は分散共分散行列を2倍した数字になっている。この連立方程式を行列演算で解くと以下のようになる。



 この連立方程式を解く過程でラグランジュ乗数λの数値も計算されるが、これは使うことはない。なお、ラグランジュ乗数法の幾何学的な説明やラグランジュ乗数λの経済学的な解釈については、小山昭雄 (1995) 経済数学教室 5 微分積分の基礎 上巻 岩波書店 で詳しく論じられている。色々と読み比べをしたわけではないが、数学者により30ページほどをも費やしてラグランジュ乗数法について解説されている貴重なテキストだと思う。


最小分散ポートフォリオ
投資比率(weight of 3 stocks)
A 0.71967
B 0.16318
C 0.11715
合計 1

次に最小分散ポートフォリオの収益率と分散を求めてみる。この計算は前半で述べたような行列演算で下記のような結果を得られる。




接点ポートフォリオ(Tangent portfolio)を求めてみる(finding the tangent portfolio)

上記の最小分散ポートフォリオの計算例に無リスク資産(安全資産)を追加したポートフォリオを検討してみる。収益率や分散共分散行列は最小分散ポートフォリオの数値例と変わらないものとし、新たに無リスク資産収益率rが加わってくる。A、B、,Cの3つの危険資産とRという無リスク資産から構成されるポートフォリオの効率的フロンティアを求めることになる。無リスク資産は収益率rで定数なので、それ自体の分散はゼロとなる。また株式A,B,Cとも相関関係が無いので各株式と無リスク資産の収益率の共分散もゼロとなる。従って収益率の分散共分散行列は以下のようになる。



無リスク資産収益率をr、無リスク資産を含む全体のポートフォリオの収益率をμ
P 無リスク資産の投資比率をWRとすれば以下の制約条件の下でポートフォリオ全体の分散を最小化さすという条件付極値問題となる。これもラグランジュ関数を各変数で偏微分すると連立方程式が導ける。

制約条件

制約条件
ラグランジュ乗数

この連立方程式を解くに際して、制約条件の式で全体ポートフォリオ(リスク資産+無リスク資産)の収益率μpを何か指定する必要がある。ここではB株の収益率0.08を指定して計算しているが、無リスク資産の収益率以上であれば何でも適当な数値でよい。何かいい加減な話に聞こえるかもしれないが、敢えてインテリぶった言い方をすれば、トービン(Tobin)の分離定理の教えに従っているにすぎない。x軸にリスク指標である標準偏差をとり、y軸には収益率をとると無リスク資産収益率rを切片として接点ポートフォリを通る1次直線つまり資本市場線が引けるが、この直線は通常、右肩上がりで無限に伸びていく。つまり、どんな収益率でも計算可能ということになる。

最小分散ポートフォリオの計算と同様に連立方程式の係数行列を作る。ここまでくれば、あとは連立一次方程式を解くだけである。




行列演算で解くと以下のようになる。



Above is the efficient portfolio of 3 stocks and a risk-free asset).

上記の解はリスク資産と無リスク資産の投資割合の合計が1となるような解なので、リスク資産だけで構成される接点ポートフォリオの投資割合は下記のようにして計算し、次に 接点ポートフォリオの収益率と分散を以下のように計算する。
 なお、空売りは制限されていない前提でのポートフォリオなので投資割合がマイナスの時は空売りを意味している。

calculating the weights of 3 stocks of the tangent portfolio



上記のようにシャープレシオ(Sharpe ratio)は0.230928となりこれが資本市場線(CML)の傾き(slope)となる。
無リスク資産を含む全体のポートフォリオの収益率と分散は以下のように計算できる。




無リスク資産を含む全体のポートフォリオの 分散の計算に際しては前述したように無リスク資産収益率rは定数なので、それ自体の分散はゼロとなり、リスク資産とも相関関係が無いので共分散もゼロとなる。従ってポートフォリオ(リスク資産+無リスク資産)の分散は簡単な式になる。

ポートフォリオの分散

リスク資産と無リスク資産を含む全体のポートフォリオの収益率が 資本市場線の上にあるかどうかも確認しておく。



資本市場線の算式通りで、リスク(標準偏差)が0.303125に見合う収益率が0.08であることが確認できる。(We can confirm the return of the  portfolio of 3 stocks and a risk-free asset is on the CML)

仮に、非常にアグレッシブな投資家がいて資金調達も無リスク資産利子率で無制限に可能であるとする。その投資家が、リスク資産と無リスク資産を含む全体のポートフォリオの収益率が100%となるようなポートフォリオ編成を依頼してきたとする。その投資家の要請に応えるには、上記の計算例のなかの収益率μP =0.08を1.0に置き換えて投資比率を求めればよい。エクセルのシートは自動計算してくれるので ベクトル X の解 は
WA -1.455545987
WB 4.634874294
WC 5.231648149
WR -7.410976455
合計     1.0

を得る。ここで無リスク資産の投資比率がマイナスの7.41と計算されている。これの意味するところは、利子率0.01で7.41098倍の借入を行いその資金と自己資金をあわせてリスク資産ポートフォリオに8.41097投資して、最終的に投資比率合計が1となるポートフォリオを示している。非常に大きなレバレッジを使ったポートフォリオになっている。なお、リスク資産のみから成る接点ポートフォリの投資比率は下記のように収益率8%の場合と変化はない。まさに、ポートフォリオの分離定理が成り立っていることが確認できる。

リスク資産だけのポートフォリオ の投資比率の計算
WA+WB+WC=-1.45555+4.634874+5.231648 = 8.410976455
A 投資比率 -0.173053152 =-1.45555/8.410976
B 投資比率 0.55105068 =4.634874/8.410976
C 投資比率 0.622002472 =5.231648/8.410976
    合計    1



接点ポートフォリオの求め方(別法)


上記の計算法の他に超過収益率から接点ポートフォリオを求めることもできる。
つまり、

制約条件

という 制約条件式を下記のような数式整理をして一本の制約条件に集約する方法である。

制約条件

この場合はポートフォリオ(リスク資産+無リスク資産)の超過収益率(μp-r)の
制約条件下でポートフォリオの分散を最小化する条件付極値問題となる。これもラグランジュ関数を各変数で偏微分すると連立方程式が導ける。


ラグランジュ乗数法

以上を整理すると下記のような 連立一次方程式を得る。

連立一次方程式

分散共分散行列の数値は変わらないので以下のように与えられている。

分散共分散行列


係数行列は以下のようになる。


係数行列

行列演算で連立方程式を解くと下記のようになる。

行列演算

ここで得た解は他に無リスク資産がある場合のリスク資産の投資ウエートを示しており、リスク資産だけのポートフォリオにおける投資割合は下記のようにして求める。

接点ポートフォリオ計算





準分散、ソルティノレシオ、LPM、UPMの計算例 in Excel



金融工学を初等数学で 目次