Rプログラミング言語での相関ジオメトリックブラウン運動のシミュレーション

In response to this question: How to simulate correlated Geometric brownian motion for n assets?

One of the responses provides an implementation in MATLAB: http://www.goddardconsulting.ca/matlab-monte-carlo-assetpaths-corr.html

私はこのコードをRプログラミング言語に移植しようとしました。実装は次のとおりです。

# Input Params:
S0 <- c(50, 48)
mu <- c(0.03, 0.03)
sig <- c(0.05, 0.05)
corr <- cbind(c(1,0.1), c(0.1,1))
dt <- 1/365
steps <- 10000
nsims <- 100

# Get the number of assets:
nAssets <- length(S0)

# Calculate the drift:
nu <- mu - sig * sig/2

# Do a Cholesky Factorization on the correlation matrix:
R <- chol(corr)

# pre allocate the output:

S <- array(1, dim=c(steps+1, nsims, nAssets))

# Generate correlated random sequences and paths:

for(idx in 1:nsims)
{
  # generate uncorrelated random sequence 
  x <- matrix(rnorm(steps * nAssets), ncol = nAssets, nrow = steps)

  # correlate the sequences 
  ep <- x %*% R

  #generate potential paths 

  S[,idx,] <- rbind(rep(1,nAssets), apply(exp(matrix(nu*dt,nrow=steps,ncol=2,byrow=TRUE) + (ep %*% diag(sig)*sqrt(dt))), 2, function(x) cumprod(x)) ) %*% diag(S0)
}

# TESTING: Compute Average Sample Correlation 
sum = 0
for(i in 1:nsims) 
{
  sum = sum + cor(S[,i,1], S[,i,2])
}
sampleCorrelation = sum/nsims 

実装が約束どおりに動作するかどうかをテストするために、私は多くのシミュレーションで2つのアセット間の平均サンプル相関を計算します。多数の法則によって、サンプル相関は、入力パラメータとして提供される理論的相関行列にかなり近くなければならない。提供された例では、2つのアセット間のサンプル相関は、平均で0.1にかなり近くなるはずです。しかし、そうではありません。したがって、提供されたRコードに問題がなければなりません。また、MATLABコードを無料のオンラインMATLABシミュレータでテストしました( http://octave-online.net/ ):これは、資産間の平均サンプル相関について正しい結果をもたらした。したがって、私は決定できないと思う移植の問題があるはずです。問題を特定できますか?

7

3 答え

あなたはまだそれを解決しましたか?例えば、ドリフトパラメータでは、dtは0から1までのベクトルのdtによるベクトルである必要があります。

私のコードは:

  GBM<-apply(BM,2,function(x) 100*exp((cumsum((r-0.5*sigma*sigma)*time)+sigma*x)))

私はすでに累積されたBrownian Motion(x)でGBMを使用しています。

2
追加された

多変量標準正規分布を使用して目的の結果を得ることができます。

require(mvtnorm)
require(matrix)

Covariance.matrix <- # your covariance matrix here
Drift <- # your drift terms here
Vol <- # your vol terms here
n <- # desired number of samples
z <- rmvnorm(n, simga=nearPD(Covariance.matrix), method="chol")
GBM <- Drift + z * Vol

正規性を仮定したくない場合は、Cornish-Fisherまたは類似のものを使用して、個々の通貨のスキューと尖度を調整することができます。

0
追加された

価格相関ではなく、RETURN相関を必ず実行してください。 また、数が収束していない場合は、ステップ数を増やして、大量のキックインの法則に十分であるようにします。

0
追加された