首页 > 解决方案 > 在向量上应用 uniroot

问题描述

我想使用 black-scholes 找到给定三角洲的罢工。我可以将 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)

现在已经添加了库。

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

标签: r

解决方案


所以我玩过并想出了以下在向量中循环的方法。但我的问题实际上是是否有办法对向量应用求解以避免遍历向量中的每个元素?

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

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)

推荐阅读