我正在使用R模拟亚洲期权(金融衍生品)。对于这个问题,必须模拟随机数和某种随机游走。结果必须非常精确。
因此,必须考虑n = 2 * 10 ^ 8个路径和360个中间点。这总计为必须生成的2 * 10 ^ 8 * 360个随机数。这显然超过了the maximum size of a matrix in R。
到目前为止,我使用了以下代码。将ST声明为全局变量,我能够多次运行该函数并完成任务。
library(fOptions)
set.seed(123)
MC.C = function(n=2*10^8,
d = 360,
Time = 1,
r = 0.05,
sigma = 0.25,
S0 = 100
){
delta.t = Time/d
Payoff = 0
St = 0
log.St = log(S0)
Z = 0
ST <<- 0
Z = matrix(rnorm.pseudo(n=n, dimension = d), byrow = TRUE, ncol = d)
for(i in 1:d){
log.St = log.St+(r-0.5*sigma^2)*delta.t + sigma*sqrt(delta.t)*Z[,i]
St = St + exp(log.St)
}
ST <<- append(0, St/d)
}
然而,这非常耗时。
我的目标是尽快获得解决方案。我有两个问题:
我会非常感谢任何答案或指出我所犯的错误。
这是我的代码变体:
library("fOptions")
set.seed(123)
MC.C = function(n=2*10^8, d=360, Time=1, r=0.05, sigma=0.25, S0=100) {
delta.t <- Time/d
St <- 0
log.St <- log(S0)
for(i in 1:d) {
Zi <- rnorm.pseudo(n=n, dimension=1)
log.St <- log.St + (r-0.5*sigma^2)*delta.t + sigma*sqrt(delta.t)*Zi
St <- St + exp(log.St)
}
St/d
}
X <- MC.C(n=2e2, d=7)
通过将常数(r-0.5*sigma^2)*delta.t
和sigma*sqrt(delta.t)
存储在对象中,您可以加快速度。