一般的なスプレッドシートやRには2変量正規分布の累積分布関数は実装されていないようです。そのため、自分で関数を作成する必要があります。
モンテカルロ・シミュレーションによる評価
相関行列のコレスキー分解を利用して相関のある2変量正規乱数を作成し、それぞれが閾値\( d1 \)及び\( d2 \)未満となる確率を評価しています。
解析解の評価の一部に、モンテカルロ・シミュレーションによる評価が含まれることになりますが、どういう挙動をするのか自分でよく理解したうえで、この部分についてはシミュレーションを利用するのもありだと思います。
MN <- function(d1, d2, rho, n_path) {
x <- rnorm(n_path)
y <- rnorm(n_path)
z <- rho*x + sqrt(1 - rho^2)*y
sum(x < d1 & z < d2) / n_path
}
n_pathにはシミュレーション回数を指定します。
実際に使用するにあたっては、一組の乱数セットでいくつかの累積分布関数の値を計算したいため、次のような使い方をしています。
calc_M <- function(e1, e2, e3, e4, f1, f2, f3, f4, rho, n_path) {
x <- rnorm(n_path)
y <- rnorm(n_path)
z1 <- rho*x + sqrt(1 - rho^2)*y
z2 <- -rho*x + sqrt(1 - rho^2)*y
M1 <- sum(x < -e1 & z1 < -f1) / n_path
M2 <- sum(x < -e2 & z1 < -f2) / n_path
M3 <- sum(x < -e3 & z2 < -f3) / n_path
M4 <- sum(x < -e4 & z2 < -f4) / n_path
return(c(M1, M2, M3, M4))
}
この例では、\( x \)と\( z1 \)との相関は\( \rho \)、\( x \)と\( z2 \)との相関は\( -\rho \)となります。
\( M1=BN(-e_{1}, -f_{1}, \rho) \)と\( M2=BN((-e_{2}, -f_{2}, \rho) \)は相関係数\( \rho \)、\( M3=BN(-e_{3}, -f_{3}, -\rho) \)と\( M4=BN(-e_{4}, -f_{4}, -\rho) \)は相関係数\( -\rho \)の、2変量正規分布の累積分布関数の値を計算しています。
近似式による評価
乱数を使用せずとも、近似的に評価を行う方法があります。
- DREZNER,Z. (1978):"Computation of the Bivariate Normal Integral,” Mathematics of Computation,32,277-279.
- DREZNER,Z, AND G.O.WESOLOWSKY (1990):“On the Computation of the Bivariate Normal Integral," The Journal of Statistical Computation and Simulation,35(1,2),101-107.
- GENZ,A. (2004):"Numerical Computation of Rectangular Bivariate and Trivariate Normal t Probabilities," Statistics and Computing,14,151-160.
一度作ってしまえばそれまでですがなかなか大変です。また、原論文にあたり、どのような近似が行われているのかを理解して利用しなければ、やはりブラックボックス感は拭えません。
また、有名な「フィナンシャルエンジニアリング」(注)のTechnicalNotesとして公開されている近似式があります。上の「1.」の要約のようです(筆者は原論文を確認していません。)。
Calculation of the Cumulative Probability in a Bivariate Normal Distribution
こちらを参考に実装してみるのもよいかもしれません。
(注)ジョンハル『フィナンシャルエンジニアリング〔第9 版〕―デリバティブ取引とリスク管理の総体系』(きんざい、2016)