使用R的亚洲期权定价

时间:2017-03-14 21:15:57

标签: r options montecarlo quantitative-finance

使用蒙特卡罗模拟,亚洲期权的定价近似为:

delta <- 1/12
T <- 2
S0 <- 100
sigma <- 0.20
K <- 100
r <- 0.01
n <- 10^4
m <- T/delta
S <- S0
for(i in 1:n) {
  for(j in 1:m) {
    W <- rnorm(1)
    Si <- S[length(S)]*exp((r-0.5*sigma^2)*delta + sigma*sqrt(delta)*W)
    S <- c(S, Si)
  }
Si.bar <- mean(S[-1])
Ci <- exp(-r*T)*max(Si.bar - K, 0)
}
mean(Ci)

for(j in 1:m) for循环运行完美,我认为......但是当我运行n次时,使用for(i in 1:n) S越来越小n。当n增长时,它几乎减少到零。这导致平均值(Si.bar <- mean(S[-1])远低于执行价格,K = 100。

我无法弄清楚最后两行代码有什么问题。由于支付功能,我得到亚洲看涨期权为0的值。此选项的正确解决方案是大约7(mean(Ci)

的值

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。首先,通过重复连接来构建向量在R中是低效的。相反,您应该预先分配向量,然后分配给其成员。

其次,据我了解,目的是重复内循环n次并将输出存储到向量C的成员中,然后再取平均值。这不是你现在正在做的事情 - 外部循环的每次迭代都会使S更长并覆盖Ci,使得最后一个语句mean(Ci)毫无意义。

这是代码的修正版本。我部分地使用plyr来使代码更整洁,部分用于其进度条功能。

library(plyr)
delta <- 1/12
T <- 2
S0 <- 100
sigma <- 0.20
K <- 100
r <- 0.01
n <- 10^4
m <- T/delta
S <- numeric(m + 1)
S[1] <- S0
asian_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[-1])
  exp(-r * T) * max(Si.bar - K, 0)
}
C <- raply(n, asian_price(), .progress = "text")
mean(C)

# [1] 7.03392