Rで多次元正規分布に従う乱数を生成する(年金運用の例題付き)

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

こんにちは、毛糸です。

ファイナンス(金融工学)において、正規分布は資産の収益率をモデル化するために頻繁に用いられます。

投資対象となる資産は通常1つだけではなく、複数資産を扱いたいことも多いですから、その場合には多次元の正規分布を考えなければなりません。

本記事では統計プログラミング言語Rで多次元正規分布に従う確率変数ベクトルを生成する方法について説明します。

ライブラリ「MASS」による多次元(多変量)正規分布の乱数発生

多次元(多変量)正規分布に従う確率変数ベクトルは、多変量解析用パッケージのMASSのmvrnorm()を使って発生させることが出来ます(公式リファレンスのPDFはこちら)。

mvrnorm()は、発生させる確率変数ベクトルの個数n、期待値ベクトルmu、分散共分散行列Sigmaを与え、n組の確率変数ベクトルを返す関数です。

例えば、( mu=(1,1))、分散共分散行列( Sigma=left(  begin{array}{cc}1&0\0&1end{array}right))の2次元正規分布に従う確率変数( (x_1,x_2))を発生させるには、以下のように記述します。

#MASSライブラリを読み込む
library(MASS)
#期待値ベクトル
mu0<-c(1,1)
#分散共分散行列
Sigma0<-rbind(
  c(1,0),
  c(0,1)
)
#多次元正規分布に従う確率変数ベクトルを1組発生
mvrnorm(1,mu0,Sigma0)
#[1]  1.8590647 -0.6548381

参考>> 元データ分析の会社で働いていた人の四方山話_多変量正規分布

例題:年金資産の収益率

MASSライブラリを用いた多次元正規分布の乱数発生方法がわかったところで、応用例を考えてみましょう。
私たちの年金運用のシミュレーションです。
年金積立金は4つのリスク資産に投資されており、その収益率は正規分布に従うと仮定されています。
期待収益率と分散、相関係数の推定値は公表されており、これに基づいて投資が行われています。

(出所:https://www.gpif.go.jp/gpif/portfolio.html)

年金の期待収益率(投資4資産+余剰資金の短期資産と賃金上昇率の6次元)と分散共分散行列から、年金資産の収益率を乱数として発生させてみましょう。

分散共分散行列( Sigma)については、標準偏差ベクトル( S=(sigma_1,cdots,sigma_n))と相関係数行列( P)を用いて

[ begin{split}
Sigma=diag(S) cdot P cdot diag(S)
end{split} ]で表せます。ただし( diag(S))は( S)を対角成分に持つ対角行列で、「( cdot)」は通常の行列積(Rでは%*%)です。

#各資産クラスの期待リターン
mu<-c(2.6/100, 6.0/100, 3.7/100, 6.4/100, 1.1/100)
#各資産クラスの分散(標準偏差の2乗)
sigma<-c(0.047,0.251,0.126,0.273,0.005)
#相関行列
Rho<-rbind(
    c(1,-0.16,0.25,0.09,0.12),
    c(-0.16,1,0.04,0.64,-0.1),
    c(0.25,0.04,1,0.57,0.15),
    c(0.09,0.64,0.57,1,-0.14),
    c(0.12,-0.1,-0.15,-0.14,1))
#分散対角行列
sigma_diag<-diag(sigma)
#分散共分散行列
Sigma<-sigma_diag%*%Rho%*%sigma_diag
#多次元正規分布の発生
X <- mvrnorm(10000, mu, Sigma)

結果の確認

こうして得られた6次元確率変数ベクトルの1万個について、標本平均と標本標準偏差を計算すると、大数の法則により、パラメタとして与えたmuとsigmaに近くなるはずです。

Xは、行にサンプル数n、列に確率変数ベクトルの要素が並んでいます。列に対して平均meanと標準偏差sdを適用するには、apply(X,MARGIN=2,mean)という関数を使います。MARGIN=1はXの「列」方向に関数を適用するという意味です。
参考>>24. apply() ファミリー

#各要素の平均を計算(経済中位ケース)
apply(X,2,mean)*100
#[1] 2.591798 5.739046 3.773379 6.390514 1.097378 2.793776
#各要素の標準偏差を計算
apply(X,2,sd)*100
#[1]  4.6795340 25.1717768 12.6962985 27.2644081  0.5005285  1.9114364

いずれも理論値に近い値になっています。

まとめ

MASSライブラリを用いて多次元正規分布に従う確率変数ベクトルを生成する方法をまとめました。
多次元正規分布はファイナンスにおいてよく目にするため、しっかり使いこなせるようにしておきましょう。
  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す

*