リスクパリティポートフォリオの構築手法の紹介

 近年、リスクパリティ(別名:リスク等価)によるポートフォリオ構築が注目を集めています。従前より広く知られてきた平均分散モデルによるポートフォリオ構築は、ポートフォリオのリスク水準が選択可能である反面、期待収益率( {\textstyle \mu})の推定が難しく入力変数が安定的ではないという大きな欠点がありました。これに対して、リスクパリティは分散のみを入力変数とした、リスクベースのポートフォリオ構築手法です*1。一般的には分散は期待収益率と比べて推定が行いやすいと言われており、よってリスクベースのポートフォリオ構築手法は、平均分散モデルよりも入力変数がロバストであると言えます。また、リスクパリティポートフォリオシャープレシオ比で優れた投資成果も指摘されています*2


 リスクパリティによるポートフォリオ構築は、「リスク量が同じならば、それによって得られるリターンには資産間での差は無い」という立場を取ります。具体的には、「ポートフォリオ内の各アセットクラスのリスク寄与度を均一にする」ことで、ポートフォリオの構築を実現します。


 では「ポートフォリオ内の各アセットクラスのリスク寄与度を均一にする」とはどういうことか、数学的に考えてみましょう。リスク寄与度は、資産 {\textstyle i}の微小変動に対するポートフォリオの総リスク微小変動として定義すると、数式では以下のように記述できます。なお {\textstyle w_i}を資産 {\textstyle i}の投資比率、 {\textstyle \sigma_P}ポートフォリオ {\textstyle P}全体のリスク(標準偏差)とします。

資産 {\textstyle i}のリスク寄与度 { \displaystyle  = w_i\frac{\partial \sigma_P}{\partial w_i}}
ここで、{ \displaystyle \sqrt{\sum_{i=1}^{N} \left( w_i\frac{\partial \sigma_P}{\partial w_i}\right) }} = \sigma_P,  {\textstyle \sum_{i=1}^{N} w_i = 1}

これがポートフォリオに組み入れるすべての資産について等しくなるような {\textstyle w_i, w_j}を求めるポートフォリオ選択問題を考えると。

{ \displaystyle w_i\frac{\partial \sigma_P}{\partial w_i} = w_j\frac{\partial \sigma_P}{\partial w_j} = \lambda}

 {\displaystyle \forall i=1, 2, ..., N,   j=1, 2, ..., N}

これがリスクパリティのコンセプトです。ところが上記の数式をよく検討してみると、投資比率をあらわす {\textstyle w_i}を変動させた時に、両辺の {\textstyle \sigma_P}までもが変わってしまい、解析的には解けそうにありません。


 このような問題を非線形方程式と呼び、数値的な解法が提唱されています。当ブログでは既存の論文*3、またその他コースマテリアル*4を参考にして、Newton法による数値解を求めるアルゴリズムを独自にR言語で実装しました。

rm(list=ls(all.names=TRUE)) #全変数をクリア
epsilon <- 0.0001
#R: 相関行列の入力
R <- matrix(
    c(1,0.16,-0.06,-0.05
    ,0.16,1,-0.25,0.27
    ,-0.06,-0.25,1,0.56
    ,-0.05,0.27,0.56,1)
,nrow=4,ncol=4)
#var: リスクベクトルの入力
var <- diag(c(0.0540,0.2215,0.1325,0.1959),nrow=4,ncol=4)

V <- var %*% R %*% var
N <- nrow(V)

#w: 初期条件, y_0: 初期条件
w <- matrix(1/N,N) 
y_n <- matrix(cbind(t(w), 0.3)) 

i <- 0
while (1) {
    lambda <- rev(y_n)[1]
    w = y_n[1:N]
    J_n <- rbind(cbind(V+lambda*diag((1/w)^2),(-1)*1/w),cbind(t(matrix(1,nrow=N,ncol=1)),0))
#F_n
    F_n <- rbind(V %*% w - lambda*(1/w),t(matrix(1,nrow=N,ncol=1)) %*% w -1)
    y_n1 <- y_n - solve(J_n) %*% F_n
    if ((sqrt(sum((y_n1 - y_n)*(y_n1 - y_n))) < epsilon)) {
        break
    }
    y_n <- y_n1
#i: Newton法の繰り返し回数を計測
    i <- i + 1
}

#y_n[1]〜y_n[N]までが各資産の投資比率をあらわす
#y_n[N+1]は各資産のリスク寄与度をあらわす
print(y_n)

#sigma: ポートフォリオのリスク
sigma <- sqrt(t(w) %*% V %*% w)
print(sigma)

#y_n[N+1]は各資産のリスク寄与度だから、その総計はポートフォリオのリスク=sigmaに一致
print(sqrt(y_n[N+1]*N))


 入力すべき変数はR:相関行列 および var:リスクベクトルの2つです。上記の例では国内債券、国内株式、外国債券、外国株式の4資産にフォーカスし、年金積立金管理運用独立行政法人(GPIF)の公表している4資産のリスク・相関係数を利用しています*5。その実行結果、すなわちリスクパリティポートフォリオにおける投資比率は以下の通りです。

> print(y_n)
[,1]
[1,] 0.5444692977 → 国内債券54%
[2,] 0.1298101306 → 国内株式13%
[3,] 0.2181479252 → 外国債券22%
[4,] 0.1075726465 → 外国株式11%
[5,] 0.0009178011

 Rとvarの入力を変えていただければ何資産でも対応できますので、是非試してみてください。

*1:"Risk-Parity versus Mean-Variance", UBS Quant Keys, 16 May 2014

*2:"リスクパリティポートフォリオはこれからも優れるのか", 大森(三井住友信託銀行), 2013

*3:"Efficient Algorithms for Computing Risk Parity Portfolio Weights", Denis Chaves, Jason Hsu, Feifei Li, and Omid Shakernia, 2012

*4:"EE103 - Applied Numerical Computing (Fall 2011-12)", Prof. L. Vandenberghe UCLA

*5:"リスクに着目したポートフォリオの構築手法に関する考察", 飯田(三井住友信託銀行), 2012

(ご利用条件)当ブログは筆者の個人的見解を述べたものであり、筆者の所属する団体またはその公式見解とは一切関係がありません。当ブログは特定の金融商品の売買を推奨または勧誘またはあっせんするものではありません。当ブログにおいて情報提供の対価として閲覧者から金銭を徴収することはありません。当ブログの内容の正確性に関しては万全を期していますが、筆者は何らその保証を行うものではありません。投資は自己責任です。当ブログの内容をもとにして生じた損害について、筆者は一切の責任を負いません。