R

在 R 程式語言中模擬相關的幾何布朗運動

  • May 3, 2017

針對這個問題: 如何模擬 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 或類似的方法來調整每種貨幣的偏斜和峰度。

引用自:https://quant.stackexchange.com/questions/25219