Первое: вы должны включить оператор library
, который вы использовали для пакета rootSolve
.Где определены переменные r
и sig
?
Нет необходимости в uniroot.all
, как вы можете увидеть, проверив функцию bscall
.Нет необходимости в итерации;price
вычисляется непосредственно из входных данных.
Определите df следующим образом с учетом первого ответа.
df <- data.frame( strike = c(80,120,100,100),
# type = c("C", "C", "C","C"),
optionPrice = c(22,3,7,9),
futurePrice = c(100, 100,100,100),
time_to_expiry = c(0.1, 0.1,1,1.2))
Колонка type
закомментирована.
Определите вашу функцию bscall
как
bscall <-
function (S,K,r,T,sig) {
d1 <- (log(S/K)+(r+0.5*sig^2)*T) / (sig*sqrt(T))
d2 <- d1 - sig*sqrt(T)
price <- S*pnorm(d1) - K*exp(-r*T)*pnorm(d2)
return(price)
}
Дайте r
и sig
значение
r <- .05
sig <- 1
Примените вашу функцию к строкам df
(индексы в * 1028)* изменено из-за изменения на df
)
apply(df, 1,
function(z) bscall(z[3],z[1],r,z[4],sig) - z[2])
давая
[1] 2.258107 3.168623 32.840162 34.366636
в качестве ответа.
Остальное зависит от вас.