如何计算R中的隐含波动率

问题描述 投票:3回答:3

我试图在R中基于黑色scholes变量创建我自己的函数并解决“向后”我想为sigma。

我创建了一个查找通话价格的功能;然而,现在我必须在R中找到sigma(隐含波动率)估计然后测试我的函数以查看它是否有效...我尝试了不同的功能但我似乎无法弄清楚我做错了什么,部分我认为我需要知道sigma才能找到sigma,但我不确定这是否有意义。

以下是我为Black Scholes模型中的欧洲看涨期权价格创建的函数:

call <- function(s0, K, r, T, sigma) {
  d1 <- (log(s0/K) + (r + sigma^2/2)*T) / (sigma*sqrt(T))
  d2 <- d1 - sigma*sqrt(T
  c <- s0*pnorm(d1) - K*exp(-r*T)*pnorm(d2)
  c
}

我测试了我的函数,看它是否正常使用它所做的不同代码:

call(100, 70, 0.05, 1, 0.16)
[1] 33.43686

call(300, 280, 0.03, 3, 0.18)
[1] 60.81694

call(400, 350, 0.04, 5, 0.20)
[1] 133.1626

现在我需要使用以下函数来查找sigma:

    sigma <- function(call, s0, K, r, T) {

???
    }

创建函数后,我需要使用以下方法测试它:

sigma(33.43686, 100, 70, 0.05, 1)

sigma(60.81694, 300, 280, 0.03, 3)

sigma(133.1626, 400, 350, 0.04, 5)

相同的格式,但我无法弄清楚。我需要包括一个范围或序列来找到sigma?

我试过这个,但我不相信我们应该在函数中包含'v'

sigma <- function(call, s0, K, r, T, v) {
  d1 <- (log(s0/K) + (r + v^2/2)*T) / (v*sqrt(T))
  d2 <- d1 - v*sqrt(T)
  c <- s0*pnorm(d1) - K*exp(-r*T)*pnorm(d2)
  sigma_value <- d1 - d2 / sqrt(T)
  sigma_value
}

sigma(33.43686, 100, 70, 0.05, 1, 0.16) 
[1] 0.16
sigma(60.81694, 300, 280, 0.03, 3, 0.18)
[1] 0.4614232
sigma(133.1626, 400, 350, 0.04, 5, 0.20)
[1] 0.7358743

0.16是“sigma”我试图通过创建自己的函数来找到接近此的估计值。

我也觉得我的sigmas离他们应该是

我也尝试过:

sigma <- function(call, s0, K, r, T) {
  v = seq(from = 0.1, to = .2, by = .01)
  k.range = floor(seq(from = 100, to = 400, length.out = length(v)))
  for (i in 1:length(v)) {
    d1 <- (log(s0/K[i]) + (r + (v^2)/2) * T) / (v * sqrt(T))
    d2 <- d1 - v * sqrt(T)
    C  <- s0 * pnorm(d1) - K[i] * exp(-r*T) * pnorm(d2) - call[i]
  }
  v
}

任何关于功能方面的帮助都会很棒。谢谢

r finance quantitative-finance
3个回答
© www.soinside.com 2019 - 2024. All rights reserved.