Симуляция превышает память - PullRequest
       10

Симуляция превышает память

0 голосов
/ 04 сентября 2018

Я моделирую азиатский вариант (производную от финансовых инструментов), используя R. Для этой задачи необходимо смоделировать случайные числа и какой-то случайный обход. Результаты должны быть чрезвычайно точными.

Таким образом, n = 2 * 10 ^ 8 путей и 360 промежуточных точек должны быть рассмотрены. Это составляет 2 * 10 ^ 8 * 360 случайных чисел, которые должны быть сгенерированы. Это явно превышает максимальный размер матрицы в 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. Как еще больше ускорить код?

Я был бы очень благодарен за любые ответы или за указание на ошибки, которые я сделал.

1 Ответ

0 голосов
/ 04 сентября 2018

Это мой вариант вашего кода:

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) в объектах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...