r - 如何计算 R 中的隐含波动率
问题描述
我正在尝试基于 black scholes 变量在 R 中创建自己的函数并解决我认为的 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”我试图通过创建自己的函数来找到接近这个的估计值。
我也觉得我的 sigma 离他们应该是
我也试过:
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
}
在功能方面的任何帮助都会很棒。谢谢
解决方案
您可以使用该uniroot
函数查找隐含波动率。uniroot
求函数的根。以下是如何使用它。
call_fun <- function(s0, K, r, TT, sig) {
d1 <- (log(s0/K) + (r + sig^2/2)*TT) / (sig*sqrt(TT))
d2 <- d1 - sig*sqrt(TT)
s0*pnorm(d1) - K*exp(-r*TT)*pnorm(d2)
}
sig_impl <- function(s0, K, r, TT, .c) {
root_fun <- function(sig){
call_fun(s0, K, r, TT, sig) - .c
}
uniroot(root_fun, c(0, 1))$root
}
call_fun(100, 70, 0.05, 1, 0.16)
[1] 33.43686
sig_impl(100, 70, 0.05, 1, 33.43686)
[1] 0.1599868
请注意,我更改了一些变量名称:T
通常是保留的,TRUE
因此您不应该命名变量T
。此外,还有一个函数,sigma
所以最好不要将变量命名为 sigma。
推荐阅读
- python - Numpy数组:多条件赋值
- reactjs - 在 Redux 中合并状态对象
- reactjs - react-admin 中的 JWT 身份验证
- javascript - 如何使用 loadash 库按方法分组按月对对象数组进行分组?
- delphi - dcc64 错误 E2216 无法处理目标文件中的“.tls$”部分
- r - 使用 httr R 包获取令牌:工作一次但之后停止工作
- c++ - 更改基类指针内容而不分配新地址
- terminal - 如何在主目录中创建 .Xresource 文件?
- android - 我是否需要在 :app 模块中包含从另一个模块作为 @Singleton 提供的依赖项?
- python - 工具栏出现在屏幕底部而不是顶部