Применить uniroot на вектор - PullRequest
0 голосов
/ 22 ноября 2018

Я бы хотел найти забастовку для данной дельты с помощью чёрных ямок.Я могу сделать это, используя uniroot для одного спотового значения и значения волатильности, но хотел бы, чтобы это работало с вектором спотовых значений и вектором значений волатильности.Мой нижеприведенный пример упрощен, как только он заработает, я расширюсь до гораздо больших векторов ...

Я видел, что есть предыдущий пост, использующий sapply в uniroot для другой проблемы.Попытался подать заявку здесь и не получил много удачи.

Не могли бы вы помочь мне разобраться, как это сделать?

Большое спасибо!

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 голосов
/ 22 ноября 2018

Итак, я поиграл и нашел следующее, которое проходит через векторы.НО мой вопрос действительно заключается в том, есть ли способ применить решение к вектору, чтобы избежать необходимости циклически проходить по каждому элементу в векторе?

Если есть более эффективное или элегантное решение для этого, чем то, что у меня естьпридумаю, мне очень интересно.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...