R
在 R 程式語言中模擬相關的幾何布朗運動
針對這個問題: 如何模擬 n 個資產的相關幾何布朗運動?
其中一個響應提供了 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
為了測試實現是否按承諾工作,我計算了許多模擬中兩個資產之間的平均樣本相關性。根據大數定律,樣本相關性應該非常接近作為輸入參數提供的理論相關性矩陣。在提供的範例中,兩種資產之間的樣本相關性平均應該非常接近 0.1。然而,這種情況並非如此。所以提供的R程式碼一定有問題。我還在免費的線上 MATLAB 模擬器 ( http://octave-online.net/ ) 上測試了 MATLAB 程式碼:它給出了資產之間平均樣本相關性的正確結果。因此,一定有一個移植問題,我似乎無法確定。你能確定問題嗎?
你解決了嗎?例如在漂移參數中,dt 需要是 dt 從 0 到 1 的時間向量。
我的程式碼是:
GBM<-apply(BM,2,function(x) 100*exp((cumsum((r-0.5*sigma*sigma)*time)+sigma*x)))
我在已經累積的布朗運動 (x) 上使用 GBM。
您可以使用多元標準正態分佈來獲得所需的結果。
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 或類似的方法來調整每種貨幣的偏斜和峰度。