ファクターベースドリスクパリティポートフォリオの構築

f:id:hirotaka_ka:20171227011226p:plain

はじめに

この記事では、備忘録的にリスクパリティポートフォリオ、そしてファクターベースドリスクパリティポートフォリオについて説明し、それらのRでの実装を説明します。

リスクパリティポートフォリオの概説

2010年台前半にかけて、リスクパリティ戦略によるポートフォリオ構築が話題になっています。

このようにリスクパリティ戦略が出てきた背景には、既存の最適化モデルの問題があります。従来はMarkowitzによる平均・分散アプローチが資産運用では主流でした。このモデルでは、各資産の期待収益率と分散共分散行列によって最適解が出力されます。しかし、この期待収益率の推定が非常に難しい上にその期待収益率に対してセンシティブ(少しの変化に対して、大きく最適解が変わってしまう)という問題がありました。

そこで登場してきたのがリスクパリティポートフォリオです。この構築方法では分散共分散行列だけで最適解が出力されます。この中でも分散は比較的推定が容易であることが知られており、この性質はリスクパリティポートフォリオを構築するときに好ましい性質です。その為、学術的・実務的に広がりを見せました。

この方法ではリスク寄与度(risk contribution)と呼ばれる指標を使用します。これはポートフォリオ全体のリスクを各資産に分解した値で、各資産がポートフォリオ全体のリスクにどの程度寄与しているのかを図る指標です。具体的には以下のような式で定義されます。

\displaystyle  RC_{i}=x_i \frac{\partial{R(x)}}{\partial{x_i}}

x_iは各資産の投資比率、R(x)ポートフォリオのリスクを表します。

このリスク寄与度は以下の式を満たします。

\displaystyle R(x)=\sum_{i=1}^N RC_{i}= \sum_{i=1}^N x_i \frac{\partial{R(x)}}{\partial{x}}

 リスク寄与度を全部足し合わせると、ポートフォリオ全体のリスク量と等しくなるのです。これがあたかもポートフォリオ全体のリスクを各資産に分解したような値として使用される所以です!

ここからはリスク指標が標準偏差の時を見ていきましょう。リスク指標が標準偏差の場合、リスク寄与度は以下のように計算できます。

\displaystyle RC_{i}=x_i \frac{\partial{\sigma_P(x)}}{\partial{x}}=x_i \sum_{j=1}^N \frac{x_i \sigma_{ij}}{\sigma_P}

\sigma_P=\sum_{i=1}^N \sum_{j=1}^N x_i \sigma_{ij} x_jポートフォリオ全体の標準偏差\sigma_{ij}は資産iと資産jの共分散を示しています。この計算は単純でポートフォリオ標準偏差の式を x_i微分しただけです。

実際にRで計算してみました。分散共分散行列はRoncalli and Weisang(2016)を参考にして作成しています。

#ポートフォリオの分散共分散行列
sigma<-rbind(c(0.0449016,0.0396086,0.0442209,0.0323200),
c(0.0396086,0.0733868,0.0543290,0.0357016),
c(0.0442209,0.0543290,0.0689063,0.0400982),
c(0.0323200,0.0357016,0.0400982,0.0530842)
)

#投資比率
x<-c(0.25,0.25,0.25,0.25)

#ポートフォリオの標準偏差
sigma_P<-as.numeric(sqrt(t(x)%*%sigma%*%x))

#リスク寄与度
RC<-x*(t(x)%*%sigma/sigma_P)

実際にリスク寄与度は以下のようになり、合計がポートフォリオ標準偏差と等しくなっていることがわかります。

資産1 資産2 資産3 資産4
0.04703276 0.05929095 0.06061341 0.04707741

次に、このリスク寄与度がすべての資産で均等になるように、最適化を行います。
具体的には以下のような最適化問題を解きます。

\displaystyle {\rm Minimize}  \sum_{i=1}^N \left(\frac{RC_i}{\sigma_P}-\frac{1}{N}\right)^2
\displaystyle {\rm subject \  to}  \sum_{i=1}^N x_i=1
\displaystyle \hspace{45pt} x_i \geq 0

#目的関数
obj<-function(x){
  x<-x/sum(x)
  sigma_P<-as.numeric(sqrt(t(x)%*%sigma%*%x))
  RC<-x*(t(x)%*%sigma/sigma_P)
  
  #誤差二乗和
  sum((RC/sigma_P-1/length(x))^2)
}
#最適化
res<-optim(x,obj,method="L-BFGS-B",lower=rep(0,4))
x.star<-res$par/sum(res$par)
RC.star<-x.star*(t(x.star)%*%sigma/sigma_P)

この計算によって、リスクパリティポートフォリオは以下のように計算でき、そのリスク寄与度は資産間で等しくなっています。

資産1 資産2 資産3 資産4
投資比率 0.2785453 0.2260281 0.2198282 0.2755985
リスク寄与度 0.0521757 0.0521757 0.0521757 0.0521757

ファクターベースドリスクパリティ

しかしこのリスクパリティ戦略ですが、大きな問題があります。それはユニバースに対して、敏感であることです。その為、資産ベースでリスクパリティを行うのではなく、ファクターベースでリスクパリティを行うことが考えられています。ファクターとは資産のリターンが背後に潜む、ファクターによって構成されていると考える理論のことで、食品における栄養素に例えられることがあります。

実際にRoncalli(2016)の方法に従って、このファクターベースドリスクパリティを算出してみましょう。
まず、前提として、資産とファクターは以下のような線形関係にあるとします。

\displaystyle R=AF+\epsilon

ここでRは資産のリターンのベクトル、Fはファクターのリターンのベクトルです。これらは横に資産、縦に時系列データが入っている行列を想像してください。Aはそれらをつなぐ因子行列と呼ばれる行列です。
実際にこのAを推定するときは、ある資産のリターンをファクターリターンで回帰を行い、その回帰式のベータが横一列に並び、それが資産ごとで縦に並んでいるイメージです。


次にファクターエクスポージャーx(ポートフォリオに対するファクターの割合・ポートフォリオのベータに相当)とアセットエクスポージャーy(投資比率のこと)は以下の関係にあります。

\displaystyle y=A^\top{T}x

これをxの式にすると以下のようになります。

\displaystyle x=\left(\begin{array}{cc}
      B^+ & \tilde{B}^+
    \end{array}\right)
\left(
\begin{array}{c}
      y\\
      \tilde{y}
    \end{array}
\right)

ここでBAの転置であり、B^+BのMoore-Penrose inverse行列です。これは正則でない行列に対して逆行列に近い行列を与える操作です。また、 \tilde{B}^+B^+に対して、左零空間に基底を張る行列で、これは \tilde{B}^+ B^+ = 0となることを示しています。(0はアセットの数からファクターの数だけ引いた次元を持っています)

ファクターに対するリスク寄与度は以下のように書き表せます。

\displaystyle
RC(F_j)=y_j \frac{\partial{R(x)}}{\partial{y_j}} = x^\top{T} (AA^\top{T}) \frac{\partial{R(x)}}{\partial{x}}

またこのモデルではadditional factorと呼ばれるファクターが存在します。これらは回帰式の残差に相当する部分で、アセットの数からファクターの数だけ引いたadditional factorが存在します。要はアセットの次元からファクターの次元まで減ってしまっているため、それらの差の部分を示します。これらに対するリスク寄与度は

\displaystyle
RC(\tilde{F}_j)=\tilde{y}_j \frac{\partial{R(x)}}{\partial{\tilde{y}_j}} =  x^\top{T} (I_n-AA^+) \frac{\partial{R(x)}}{\partial{x}}

と計算できます。これらはリスク指標を標準偏差とした時、以下のように計算できます。

\displaystyle
RC(F_j)=\frac{(A^\top x)_j (A^+ \Sigma x)_j}{\sigma_P}
\displaystyle
RC(\tilde{F}_j)=\frac{(\tilde{B} x)_j (\tilde{B} \Sigma x)_j}{\sigma_P}

なお
\displaystyle
\left(
\begin{array}{cc}
     B^+ & \tilde{B}^+
    \end{array}
\right)^{-1}=
\left(
\begin{array}{c}
     B\\
     \tilde{B}
    \end{array}
\right)
という関係があります。


実際に計算してみましょう。数学的な定義は比較的難しいですが、これらの関数はRに組み込まれているため、簡単に求めることができます。

library(MASS)
A<-rbind(c(0.9,0,0.5),
             c(1.1,0.5,0),
             c(1.2,0.3,0.2),
             c(0.8,0.1,0.7)
)
B<-t(A)
A.plus<-ginv(A)
B.plus<-ginv(B)
B.tilde.plus<-Null(B.plus)

B.bar<-cbind(B.plus,B.tilde.plus)
B.tilde<-solve(B.bar)[-c(1:length(A[1,])),]

RC.F<-(t(A)%*%x)*(A.plus%*%sigma%*%x)/sigma_P
RC.tilde.F<-(B.tilde%*%x)*(B.tilde%*%sigma%*%x)/sigma_P

これらの結果から、以下のようなファクターリスク寄与度が算出できました。

ファクター1 ファクター2 ファクター3 additional factor 1
0.17235202 0.02035163 0.02116794 0.00014295

ファクターエクスポージャーの大きいファクター1のリスク寄与度が大きく、2,3は小さい結果となりました。また、同様にファクター3つとadditional factorを足し合わせると全体の標準偏差と等しくなります。

ファクターのリスク寄与度が算出されたところで、ファクターリスク寄与度が均等になるように配分することを考えます。

やり方は前の章でのアセットベースでのリスクパリティと全く同じです。リスク寄与度の算出方法が変わっただけです。

obj<-function(x){
  x<-x/sum(x)
  sigma_P<-as.numeric(sqrt(t(x)%*%sigma%*%x))
  RC.F<-(t(A)%*%x)*(A.plus%*%sigma%*%x)/sigma_P
  RC.tilde.F<-(B.tilde%*%x)*(B.tilde%*%sigma%*%x)/sigma_P
  
  #誤差二乗和
  sum((RC.F/sigma_P-1/3)^2)
}

res<-optim(x,obj,method="L-BFGS-B",lower=rep(0,4))
x.star<-res$par/sum(res$par)
RC.F<-(t(A)%*%x.star)*(A.plus%*%sigma%*%x.star)/sigma_P
RC.tilde.F<-(B.tilde%*%x.star)*(B.tilde%*%sigma%*%x.star)/sigma_P
資産1 資産2 資産3 資産4
投資比率 0 0.39243535 0.00579411 0.60177054
リスク寄与度 0 0.0927818 0.001241312 0.1298707

ファクター1 ファクター2 ファクター3 additional factor 1
ファクターエクスポージャー 0.9200482 0.2581330 0.4223982 0.06304726
リスク寄与度 0.07449179 0.07447801 0.07449111 0.0004329

ファクターに対するリスク寄与度がすべてのファクターで等しくなっています。このようにして、ファクターベースドのリスクパリティポートフォリオを求めることができました。

おわりに

今回の記事ではRを使って、ファクターベースドリスクパリティポートフォリオを求めました。
しかし、この方法では最適化がなかなか難しく、一意な解が出力されないそうです。
今後も見守って行きたいですね!