如何使用矩阵作为用户定义函数的输入并将其循环到R?

时间:2018-04-02 05:04:10

标签: r quantitative-finance computational-finance

这是我当前的脚本:

delta <- 1/52
T <- 0.5
S0 <- 25
sigma <- 0.30
K <- 25
r <- 0.05
n <- 1000000
m <- T/delta
S <- numeric(m + 1)
S[1] <- S0
#Payoff asian option
asian_option_price <- function() {
  for(j in 1:m) {
    W <- rnorm(1)
    S[j + 1] <- S[j] * exp((r - 0.5 * sigma^2) * delta + sigma * sqrt(delta) * W)
  }
  Si.bar <- mean(S)
  exp(-r * T) * max(Si.bar - K, 0)
}
#Loops
C <- raply(n, asian_option_price(), .progress = "text")

我的问题是我需要在完成第二次模拟后使用“-W”进行第二次模拟。制作脚本的方式,“W”在我的循环中,这使得我认为在此之后不可能(我认为)使用相应的“-W”。我想我需要使用一个填充rnorm()mat(x) = matrix(rnorm(m*n,mean=0,sd=1), m, n)的独立矩阵,这样我就可以在第二次模拟中使用-mat(x)。我不知道如何从循环中取出“W”并仍然使用它的相应矩阵。任何帮助都会非常有用。谢谢!

1 个答案:

答案 0 :(得分:0)

您预先分配所有随机数的想法是正确的。然后,您可以遍历各个条目。但是,采用矢量化方法更快:

delta <- 1/52
T <- 0.5
S0 <- 25
sigma <- 0.30
K <- 25
r <- 0.05
n <- 100000
m <- ceiling(T/delta)

W <- matrix(rnorm(n*m), nrow = m, ncol = n)
S <- apply(exp((r - 0.5 * sigma^2) * delta + sigma * sqrt(delta) * W), 2, cumprod)
S <- S0 * rbind(1, S)

Si_bar <- apply(S, 2, mean)
mean(pmax(Si_bar -K, 0)) * exp(-r*T)