在向量上应用uniroot

时间:2018-11-22 10:17:17

标签: r

我想使用布莱克·斯科尔斯找到给定增量的罢工。我可以使用uniroot来实现单个即期价值和波动率值,但希望此方法可以跨现货价值向量和波动性价值向量工作。我的以下示例已简化,一旦可行,我将扩展到更大的向量...

我已经看到以前有一篇文章在uniroot上使用sapply来解决另一个问题。尝试过在这里申请,但运气不佳。

您能帮我弄清楚该怎么做吗?

非常感谢!

library(rootSolve)
library(ragtop)

CallPut <- 1 # Call
Spot <- c(110, 112, 114)
Rate <- 0 # For simplicity
T <- 0.5 # half a year
Vol <- c(0.07, 0.08, 0.09)
TargetDelta <- 0.5
Lower <- c(100, 102, 104)
Upper <- c(120, 122, 124)

solve.for.strike <- function(Strike) {  
  BS <- blackscholes(CallPut, Spot, Strike, Rate, T, Vol)  
  TargetDelta - BS$Delta
}

test <- uniroot(solve.for.strike, lower = Lower, upper = Upper)

也尝试使用uniroot.all,但不起作用:

test <- uniroot.all(solve.for.strike, c(100, 120), lower = 100, upper = 120)

现在已添加库。

如果有任何指导,将不胜感激。

1 个答案:

答案 0 :(得分:0)

因此,我玩耍了,并提出了遍历向量的以下内容。但是我的问题确实是是否有一种方法可以对向量应用求解,从而避免必须遍历向量中的每个元素?

如果有比我想出的解决方案更有效或更优雅的解决方案,请非常感兴趣。

CallPut <- 1 # Call
Spot <- c(110, 112, 114)
Rate <- 0 # For simplicity
T <- 0.5
Vol <- c(0.07, 0.08, 0.09)

solve.for.strike <- function(Strike, S, V, D) {
  BS <- blackscholes(CallPut, S, Strike, 0, T, V)  
  D - BS$Delta
}

loop.uniroot <- function(i, delta) {
  uniroot(solve.for.strike, lower=Spot[i]*0.95, upper=Spot[i]*1.05, S=Spot[i], V=Vol[i], D=delta)$root
}

test3 <- mapply(loop.uniroot, 1:3, delta = 0.5)
test4 <- sapply(1:3, loop.uniroot, delta = 0.5)