Octaveでアセットアロケーション計算

Octaveで行列計算をしてみました。お題は投資の期待収益率と期待リスク。山田FP事務所-アセットアロケーションの作り方を参考に式を組んでみました。

前提となる統計計算

金融資産のアセットクラスの割合を入力すると、現時点の期待収益率と期待リスクを計算します。キーになる数式は次のようなものです。

\begin{eqnarray}
期待収益率(\%) &=& \sum_{i=1}^{n}{(配分比)_{i}(収益率)_{i}}\\\\
期待リスク(\%) &=& \sqrt{\sum_{i,j=1}^{n}{(相関係数)_{ij}(配分比)_{i}(リスク)_{i}(配分比)_{j}(リスク)_{j}}}
\end{eqnarray}

トータルの期待収益率は個々の期待収益率を配分比に応じて強弱をつけて集計したもの。トータルの期待リスクは基本的には分散の加法性に相関係数を加味したものです。

ここでのリスクは統計量でいうところの標準偏差になります。今回アセットクラスは国内と海外それぞれについて株式と債券の組み合わせ4つに加えて短期資金のトータル5つを考えます。期待収益率および期待リスクを行列で書き直すと以下のとおり。

行列計算を成立させるために変換やら転置やらおこなっています。

\begin{eqnarray}
R_{total}(\%) &=& \left(\begin{array}{ccc}P_{ds}&P_{db}&P_{fs}&P_{fb}&P_{c}\end{array}\right)\left(\begin{array}{ccc}R_{ds}\\R_{db}\\R_{fs}\\R_{fb}\\R_{c}\end{array}\right)\\\\
&=& \left(\begin{array}{ccc}1&1&1&1&1\end{array}\right)\left(\begin{array}{ccc}0.33&0&0&0&0\\0&0.03&0&0&0\\0&0&0.50&0&0\\0&0&0&0&0\\0&0&0&0&0.14\end{array}\right)\left(\begin{array}{ccc}4.2\\1\\5\\1.8\\0.1\end{array}\right)\\\\
\sigma_{total}(\%) &=& \sqrt{(\left(\begin{array}{ccc}\rho_{ds-ds}&\rho_{ds-db}&\rho_{ds-fs}&\rho_{ds-fb}&\rho_{ds-c}\\\rho_{db-ds}&\rho_{db-db}&\rho_{db-fs}&\rho_{db-fb}&\rho_{db-c}\\\rho_{fs-ds}&\rho_{fs-db}&\rho_{fs-fs}&\rho_{fs-fb}&\rho_{fs-c}\\\rho_{fb-ds}&\rho_{fb-db}&\rho_{fb-fs}&\rho_{fb-fb}&\rho_{fb-c}\\\rho_{c-ds}&\rho_{c-db}&\rho_{c-fs}&\rho_{c-fb}&\rho_{c-c}\end{array}\right)\left(\begin{array}{ccc}P_{ds}&0&0&0&0\\0&P_{db}&0&0&0\\0&0&P_{fs}&0&0\\0&0&0&P_{fb}&0\\0&0&0&0&P_{c}\end{array}\right)\left(\begin{array}{ccc}\sigma_{ds}\\\sigma_{db}\\\sigma_{fs}\\\sigma_{fb}\\\sigma_{c}\end{array}\right))^{\mathrm{T}}\left(\begin{array}{ccc}P_{ds}&0&0&0&0\\0&P_{db}&0&0&0\\0&0&P_{fs}&0&0\\0&0&0&P_{fb}&0\\0&0&0&0&P_{c}\end{array}\right)\left(\begin{array}{ccc}\sigma_{ds}\\\sigma_{db}\\\sigma_{fs}\\\sigma_{fb}\\\sigma_{c}\end{array}\right)}\\\\
&=& \sqrt{(\left(\begin{array}{ccc}1&0&0.7&0.3&0\\0&1&0&0.2&0\\0.7&0&1&0.5&0\\0.3&0.2&0.5&1&0\\0&0&0&0&1\end{array}\right)\left(\begin{array}{ccc}0.33&0&0&0&0\\0&0.03&0&0&0\\0&0&0.50&0&0\\0&0&0&0&0\\0&0&0&0&0.14\end{array}\right)\left(\begin{array}{ccc}18\\2\\20\\10\\0.1\end{array}\right))^{\mathrm{T}}\left(\begin{array}{ccc}0.33&0&0&0&0\\0&0.03&0&0&0\\0&0&0.50&0&0\\0&0&0&0&0\\0&0&0&0&0.14\end{array}\right)\left(\begin{array}{ccc}18\\2\\20\\10\\0.1\end{array}\right)}
\end{eqnarray}

記号一覧

  • R:期待収益率
  • P:配分比
  • ρ:相関係数
  • σ:期待リスク

添字一覧

  • ds:国内株式(Domestic Stocks)
  • db:国内債券(Domestic Bonds)
  • fs:海外株式(Foreign Stocks)
  • fb:海外債券(Foreign Bonds)
  • c:短期資金(Cash)

配分比は2017年7月現在のものです。期待収益率や相関係数は平成25年10月18日付けの国家公務員共済組合連合会、基本ポートフォリオ見直しの附属資料から持ってきました。

Octaveで関数を作る

Octaveの使い方自体は数値演算言語OCTAVEによるプログラム入門を参考にしました。

Octaveはインタープリタ方式でちまちま入力することも可能ですが、シェルスクリプトのように命令群を関数化したファイルを読み込むことで入力の手間を省くことができます。

function asset()
alloc=[0.33 0 0 0 0; 0 0.03 0 0 0; 0 0 0.50 0 0; 0 0 0 0 0; 0 0 0 0 0.14];
# 国家公務員共済組合連合会
# 平成25年10月18日版基本ポートフォリオ見直しの附属資料より
# 国内株式;国内債券;外国株式;外国債券;短期資金
exp_of_return=[4.2;1;5;1.8;0.1];
risk_of_return=[18;2;20;10;0.1];
correl_coeff=[1 0 0.7 0.3 0;0 1 0 0.2 0;0.7 0 1 0.5 0;0.3 0.2 0.5 1 0;0 0 0 0 1];
printf("国内株式:%d%%, 国内債券:%d%%\n",alloc(1,1)*100,alloc(2,2)*100)
printf("外国株式:%d%%, 外国債券:%d%%\n",alloc(3,3)*100,alloc(4,4)*100)
printf("短期資金:%d%%\n",alloc(5,5)*100)
ave_return=([1 1 1 1 1]*alloc*exp_of_return);
risk=sqrt((correl_coeff*(alloc*risk_of_return))'*(alloc*risk_of_return));
printf("期待収益率:%.2f%%\n",ave_return)
printf("期待リスク:%.2f%%\n",risk)

octave –no-guiで起動したらasset.mファイルを読み込みます。(拡張子は指定しない)

octave:1> asset
国内株式:33%, 国内債券:3%
外国株式:50%, 外国債券:0%
短期資金:14%
期待収益率:3.93%
期待リスク:14.78%

でた!

この期待リスク、正規分布を仮定すると2σは欲しいところ。ということで2倍の29.56%を採用すると、期待リターンは3.93%±29.56%となり、-25.63%から33.49%の間で変動します。

調子が悪い時に25%もの損失を許容できるのか!?Σ( ̄。 ̄ノ)ノ

2017年7月17日追記
なんか色々と間違っていたので修正しました。

 

  • 期待リスクの計算で配分比を考慮していなかった
  • 期待収益率に対する期待リスクの関係を間違って解釈していた
0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments