Нахождение подразумеваемой волатильности опциона с использованием функции nlm в R
Впервые постер здесь, но нашел, что Stack Overflow очень помогает, и я благодарен великому сообществу. Я везде искал ответ на свою проблему, но безрезультатно, так что, надеюсь, я смогу здесь помочь! В настоящее время я пытаюсь написать кодовое задание для университета, и у меня возникли некоторые проблемы.
Часть задания требует, чтобы я вычислил подразумеваемую волатильность серии опционов, используя их параметры и рыночную цену. Я понимаю, что простой способ сделать это будет использовать compute.implied.volatility
функция внутри R, однако этот вопрос требует от меня решения с помощью nlm
функция. Я понимаю, что в этом случае я хочу минимизировать расстояние между фактической ценой и моей расчетной ценой, чтобы расстояние равнялось нулю. Чтобы сделать это, я, очевидно, хочу изменить волатильность опциона таким образом, чтобы она установила мою расчетную цену равной рыночной цене. Проблема, с которой я сталкиваюсь, заключается в получении nlm
функционировать, чтобы работать, как нас не учили об этом в этом курсе.
Я понимаю, что я должен кормить в петле, чтобы nlm
это позволяет ему итеративно вычислять, пока не найдет минимальное значение, которое дает результат. Я считаю, что я не кормлю в функции, которая работает с nlm
, так как в настоящее время я получаю сообщение об ошибке "Недопустимое значение функции в nlm
Оптимизатор".
Я приложил свой код, а также входные данные для работы, пожалуйста, дайте мне знать, если я написал его неправильно, или мне нужно еще немного поработать с ним, чтобы получить ответ о требуемой волатильности. Спасибо за любую помощь!
```{r}
# Load in the library's and clear workspace
{cat("\014")
rm(list=ls(all=TRUE))
options(digits=6)}
library(fBasics)
library(knitr)
library(zoo)
library(psych)
library(lubridate)
library(stats)
library(boot)
library(matrixStats)
# First setup the parameter vectors to use in calculating IV
S <- rep(1200, 12) # Price at time = 0
r <- rep(0.01, 12) # Current interest rate
T <- rep(44/365, 12) # Time till maturity of the options
X <- c(1100,1120,1140,1160,1180,1200,1220,1240,1260,1280,1300,1320) #
Strike prices of each option
type <- c(1,1,1,1,1,1,0,0,0,0,0,0) # 1 = Put and 0 = Call variable
mktprice <- c(10.5,13.8,18.2,23.9,31.2,40,31.8,23.9,17.5,12.5,9.0,6.3)
# Market price of each option
sigma <- rep(0.2, 12) # Initial guess for sigma
options.df <- data.frame(S, X, r, T, type, mktprice, sigma)
# 1. First specify the Black-Scholes Function
BS.function.call <- function(sigma, options.df){
d1 <- (log(S/X) + (r + sigma^2/2)*T) / (sigma*sqrt(T))
d2 <- d1 - sigma*sqrt(T)
st <- S * pnorm(d1) - X*exp(-r*T)*pnorm(d2)
distance <- abs(mktprice - st)
return(distance) # We want to set the distance between market price
and calculated price = 0 using nlm by changing sigma
}
BS.function.put <- function(sigma, options.df){
d1 <- (log(S/X) + (r + sigma^2/2)*T) / (sigma*sqrt(T))
d2 <- d1 - sigma*sqrt(T)
st <- -S * pnorm(-d1) + X*exp(-r*T)*pnorm(-d2)
distance <- abs(mktprice - st)
return(distance)
}
# 2. Create an initial guess for sigma
sigma.guess <- 0.2
# 3. Run the optimization function
for (i in 1:nrow(options.df)){
if(type == 0){
result[i] <- nlm(BS.function.call, sigma.guess, options.df)
}
else{
result[i] <- nlm(BS.function.put, sigma.guess, options.df)
}
}
1 ответ
Я знаю, что этот пост старый, но он не решен, поэтому я хотел бы внести свой вклад. Пакет, который вы ищете, называется RND, и его можно установить через консоль R, используя:
install.packages("RND")
Кроме того, обязательно загрузите пакет в раздел библиотеки загрузки следующим образом:
library(RND)