我有一项任务,要求我使用一系列期权的参数和市场价格来计算隐含波动率。我知道最简单的方法是在R中使用compute.implied.volatility函数,但是这个问题需要我使用nlm函数来解决。我明白,在这种情况下,我希望最小化实际价格和我计算的价格之间的距离,使距离为零。要做到这一点,我显然希望改变期权的波动率,使其将我计算的价格设置为等于市场价格。我在这个问题上遇到的麻烦是让nlm函数工作,因为我们在这门课上没有学到太多关于它的知识。
我知道我应该向nlm提供一个循环,使它能够迭代计算,直到找到产生结果的最小值。我相信我没有输入一个可以与nlm一起工作的函数,因为我目前收到了一个“nlm优化器中的无效函数值”的错误。
我已经附加了我的代码以及要使用的输入,如果我写得不正确,或者如果我需要对它进行更多的修改以获得所需的易失性的答案,请让我知道。感谢大家的帮助!
```{r}在库中加载并清除工作区
{cat("\014")
rm(list=ls(all=TRUE))
选项(digits=6)}
库(FBasics)
库(Knitr)
图书馆(Zoo)
库(心理)
库(Lubridate)
库(统计信息)
库(引导)
库(MatrixStats)
首先设置在计算IV时使用的参数向量
S <- rep(1200,12) #时间价格=0
R <- rep(0.01,12) #当前利率
T <- rep(44/365,12) #期权到期时间
X <- c(1100,1120,1140,1160,1180,1200,1220,1240,1260,1280,1300,1320) #
每种期权的执行价
type <- c(1,1,1,1,1,0,0,0,0,0,0,0)#1= Put,0=调用变量
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)
每种期权的市场价格
sigma <- rep(0.2,12) # sigma的初始猜测
options.df <- data.frame(S,X,r,T,type,type,sigma)
1.首先指定Black-Scholes函数
函数<- BS.function.call (sigma,options.df){
d1 <- (log(S/X) + (r + sigma^2/2)T) / (sigmasqrt(T))
d2 <- d1 - sigma*sqrt(T)
st <- S pnorm(d1) - Xexp(-rT)pnorm(d2)
距离<- abs(mktprice - st)
return( distance ) #我们想设置市场价格之间的距离
并使用nlm通过更改sigma计算出价格=0
}
函数<- BS.function.put (sigma,options.df){
d1 <- (log(S/X) + (r + sigma^2/2)T) / (sigmasqrt(T))
d2 <- d1 - sigma*sqrt(T)
st <- -S P范数(-d1)+Xexp(-rT)P范数(-d2)
距离<- abs(mktprice - st)
回车(距离)
}
2.为sigma创建一个初始猜测
sigma.guess <- 0.2
3.运行优化函数
对于(i in 1:nrow(options.df)){
if(键入== 0){
result[i] <- nlm(BS.function.call, sigma.guess, options.df)}
否则{
result[i] <- nlm(BS.function.put, sigma.guess, options.df)}
}
发布于 2021-01-11 01:52:00
我知道这个帖子很老,但它还没有解决,所以我会提供一些意见。您要查找的软件包是RND,可以使用以下命令通过R控制台进行安装:
install.packages("RND")此外,请确保在加载库部分中加载包,如下所示:
library(RND)https://stackoverflow.com/questions/52788568
复制相似问题