使用 R 的亚洲期权定价

Pricing of Asian Option using R

亚洲期权的近似定价,使用Monte Carlo模拟,通过:

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 loop 运行s 完美,我认为...但是当我运行它n次时,使用for(i in 1:n) S变得越来越小名词当 n 增长时,它减少到几乎为零。这导致平均值 (Si.bar <- mean(S[-1]) 远低于行使价,K= 100。

我想不通最后两行代码有什么问题。由于收益函数,亚洲看涨期权的价值为 0。该选项的正确解是取值大约为 7 (mean(Ci))

您的代码有几个问题。首先,在 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