我有一个任务要求我使用它们的参数和市场价格计算一系列期权的隐含波动率。我知道做到这一点的简单方法是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)
}
}