怎么计算隐含波动率?

论坛 期权论坛 期权     
柯西收敛   2018-10-16 00:00   35395   2
在Python里怎么计算implied volatility?
分享到 :
0 人收藏

2 个回复

倒序浏览
2#
优矿量化实验室  4级常客 | 2018-10-16 00:00:56 发帖IP地址来自
提供一些在优矿计算隐含波动率的实例,点击到社区可以一键克隆源码。


波动率与期权     作者:bin2436
波动率曲面        作者:cheng.li
Greeks 和隐含波动率微笑     作者:李自龙


下面截取波动率与期权一贴当中的计算过程供参考:


与历史波动率反映的是标的资产过去一段时间的波动程度不同,隐含波动率是资产价格未来一段时间的波动率,是由相应的期权价格估计出来。
估算隐含波动率有很多模型,详见CAL文档: https://uqer.io/help/faqCAL/#Black-Scholes-Merton%E6%A8%A1%E5%9E%8B
这里我们使用CAL包中的BSMImpliedVolatity函数计算隐含波动率。
BSMImpliedVolatity(optionType, strike, spot, riskFree, dividend, maturity, quotePrice, rawOutput=False)
  • optionType – 期权类型,1 for CALL或者 -1 for PUT
  • strike – 行权价格
  • spot – 标的股票价格
  • riskFree – 无风险利率
  • dividend – 股票红利率
  • maturity – 到期时间(年)
  • uotePrice – 期权报价
关于无风险利率,在李自龙老师的帖子当中,使用的是计算“上海银行间同业拆借利率 SHIBOR”,本篇中,我们简化操作,将无风险利率设置为常数4%。



我们总共获得42378 x 9 的有效数据,代表自2015年2月9日以来,所有50ETF期权合约在每一个交易日的相关数据。
“隐含波动率的计算并没有统一的标准。
以同一只资产为标的的期权合约有很多,执行价格和到期时间不同的期权具有不同的隐含波动率。即使到期时间相同,不同执行价格的期权也具有不同的隐含波动率。
我们通过计算以同一资产为标的的不同期权的隐含波动率的平均值来作为这一资产的隐含波动率。”——《期权波动率模型及交易策略分析》
根据报告的内容,我们将在同一交易日期的,所有Call合约的隐含波动率hv取均值,得到该日该Call的隐含波动率,Put也同理。



目前有四个因子:“股票收盘价”“30天波动率”“call合约隐含波动率”“put合约隐含波动率”。
先来看看他们之间的相互关系:



根据报告中所描述的“利用历史波动率和隐含波动率的差异来做交易”思路。
“专业的期权交易者、做市商和机构投资者通过delta对冲来做波动率交易。意思是说,他们通过买卖期权来对冲标的资产敞口部分,这样会消除股市小幅波动带来的风险。这种对冲是一个持续的随市场变化而调整的过程。为了对冲标的资产的风险,交易者捕捉资产上的历史波动率和期权价格的隐含波动率。也就是说,如果卖出期权的隐含波动率高于对冲标的资产的历史波动率,他们就会赚钱。同样的,买入期权的隐含波动率低于对冲标的资产历史波动率,也会赚钱。”


我们将数据可视化再来看下:
















3#
Big Brother  3级会员 | 2018-10-16 00:00:57 发帖IP地址来自
[h1]VBA for Excel Spreadsheet[/h1]The VBA includes two functions
  • BlackScholesCall() calculates the price of a call option
  • ImpliedVolatility() calculates implied volatility. It uses the bisection method to calculate volatility using BlackScholesCall()
Function BlackScholesCall( _
ByVal S As Double, _
ByVal X As Double, _
ByVal T As Double, _
ByVal r As Double, _
ByVal d As Double, _
ByVal v As Double) As Double Dim d1 As Double Dim d2 As Double
    d1 = (Log(S / X) + (r - d + v ^ 2 / 2) * T) / v / Sqr(T)
    d2 = d1 - v * Sqr(T)
    BlackScholesCall = Exp(-d * T) * S * Application.NormSDist(d1) - X * Exp(-r * T) * Application.NormSDist(d2)
End Function Function ImpliedVolatility( _
ByVal S As Double, _
ByVal X As Double, _
ByVal T As Double, _
ByVal r As Double, _
ByVal d As Double, _
ByVal Price As Double) As Double Dim epsilonABS As Double Dim epsilonSTEP As Double Dim volMid As Double Dim niter As Integer Dim volLower As Double Dim volUpper As Double

    epsilonABS = 0.0000001
    epsilonSTEP = 0.0000001
    niter = 0
    volLower = 0.001
    volUpper = 1

Do While volUpper - volLower >= epsilonSTEP Or Abs(BlackScholesCall(S, X, T, r, d, volLower) - Price) >= epsilonABS And epsilonABS = epsilonABS
      volMid = (volLower + volUpper) / 2
If Abs(BlackScholesCall(S, X, T, r, d, volMid) - Price)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:204
帖子:7
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP