【问题标题】:Simulation exceeds memory模拟超出内存
【发布时间】:2018-09-04 10:56:58
【问题描述】:

我正在使用 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)
    }

但是,这非常耗时。

我的目标是尽快找到解决方案。我的两个问题是:

  1. 如何处理超出 R 中矩阵内存的模拟?
  2. 如何进一步加速代码?

我会非常感谢任何答案或指出我所犯的错误。

【问题讨论】:

标签: r matrix memory size simulation


【解决方案1】:

这是我的代码变体:

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.tsigma*sqrt(delta.t) 存储在对象中来加快速度。

【讨论】:

    猜你喜欢
    • 2016-11-23
    • 2020-08-09
    • 2017-09-12
    • 1970-01-01
    • 2013-09-12
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    相关资源
    最近更新 更多