我想使用布莱克·斯科尔斯找到给定增量的罢工。我可以使用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)
现在已添加库。
如果有任何指导,将不胜感激。
答案 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)