【R语言】可转债隐含波动率的逆推计算教程( 二 )


if (c-cest>0.00001) {low<-sigmasigma<-(sigma+up)/2
考虑另一种相反情形,如果差小于0.0001,那就说明估计量太大了,此时先把上界移下来至中位数0.5,那么此时的IV就是之前(sigma+low)/2,比如(0.5+0)/2=0.25,就从刚开始的0 ~1区间缩小到了0.25 ~0.5,此时再把0.25这个估计值代入BSM函数算出新的期权价格,再次比较,循环往复 。
else {up<-sigmasigma<-(sigma+low)/2}
那么通过while语句整个逻辑就走通了,从结构上来说可以把这个函数看做一个while语句包住一个if判断语句,之前的BSM函数是为了验证估计的波动率是否够精确,这篇教程仅使用了看涨期权的IV推算,大家可以再增加一个参数并再嵌套利一个if语句实现同时包含看跌和看涨的IV计算,这个内容就当做学习后的练手了,相信做完看涨+看跌的组合函数,对这类没有解析式的倒退运算就都能有思路了,以下是完整代码,仅供参考,谢谢!
option<-function(n,s,k,r,sig){d<-(log(s/k)+(r+sig^2/2)*n)/(sig*sqrt(n))d2<-d-sig*sqrt(n)c<-s*pnorm(d)-k*exp(-r*n)*pnorm(d2)return(c)}implied<-function(n,s,k,r,c){ ##c为实际看涨期权价格##sigma<-0.5cest<-0up<-1low<-0while (abs(c-cest)>0.00001) {cest<-option(n,s,k,rf,sigma)if (c-cest>0.00001) {low<-sigmasigma<-(sigma+up)/2} else {up<-sigmasigma<-(sigma+low)/2}}return(sigma)}implied(0.25,28,30,0.02,1.5) ##试验结果##