r - 在向量上应用 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)
现在已经添加了库。
如果有任何指导将不胜感激。
解决方案
所以我玩过并想出了以下在向量中循环的方法。但我的问题实际上是是否有办法对向量应用求解以避免遍历向量中的每个元素?
如果有任何比我想出的更有效或更优雅的解决方案,我非常感兴趣。
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)
推荐阅读
- laravel - 如何使用 Laravel 按 ID 删除 Google Sheet 中的行
- eclipse - 无法在 Eclipse 上安装 Sonarlint
- microservices - 每服务表和每服务模式有什么区别?
- postgresql - 如何优化这个 PostgreSQL 查询?
- javascript - 如何解析通过 Report-To 标头端点报告的 NEL(网络错误日志记录)错误?
- javascript - 进度条在块中更新,而不是每次更改
- python - 是否可以从 UNet 的一半中提取特征?
- html - 为什么我的css背景图片没有显示?
- unit-testing - Cmake:指定一个单独的构建工具链进行测试?
- firebase-cloud-messaging - React 本机 FCM 推送通知在 IOS Adhoc 和 TestFlight 中不起作用