期权的隐含波动率计算与图形

论坛 期权论坛 期权     
tomtom   2020-4-10 13:51   18547   1
隐含波动率的计算  
  通过BS公式无法反解出隐含波动率,常用的求解方法有牛顿迭代法和二分法。
     牛顿迭代法    

主要思路是,先设定一个初始波动率值,比如20%;然后建立一种迭代关系:如果由初始波动率值得到的期权价格高于市场价格,那么初始波动率减少一定的量(因为期权价格与波动率成正比),反之增加,如此迭代;直到计算出的期权价格越来越逼近市场真实价格,可设置一个阈值,比如二者之差的绝对值小于一个基点就认为它们相等。
  假设某一期权的S、K、r、σ和t分别为5.29,6,0.04,0.24和0.5,看涨期权的市场价格为0.1566,看跌期权的市场价格为0.7503,求解这两种期权的隐含波动率。
  1. from scipy.stats import norm
  2. import numpy as np
  3. def bscall(S,K,r,sigma,t):
  4. d1=(np.log(S/K)+(r+0.5*sigma**2)*t)/(sigma*np.sqrt(t))
  5. d2=d1-sigma*np.sqrt(t)
  6. return S*norm.cdf(d1)-K*np.exp(-r*t)*norm.cdf(d2)
  7. def bsput(S,K,r,sigma,t):
  8. d1=(np.log(S/K)+(r+0.5*sigma**2)*t)/(sigma*np.sqrt(t))
  9. d2=d1-sigma*np.sqrt(t)
  10. return -S*norm.cdf(-d1)+K*np.exp(-r*t)*norm.cdf(-d2)

  11. def newton_call(P,S,K,r,t):
  12. sigma=0.2
  13. while abs(bscall(S,K,r,sigma,t)-P)>0.0001:
  14. if bscall(S,K,r,sigma,t)>P:
  15. sigma-=0.0001
  16. else:
  17. sigma+=0.0001
  18. return sigma
  19. def newton_put(P,S,K,r,t):
  20. sigma=0.2
  21. while abs(bsput(S,K,r,sigma,t)-P)>0.0001:
  22. if bsput(S,K,r,sigma,t)>P:
  23. sigma-=0.0001
  24. else:
  25. sigma+=0.0001
  26. return sigma
  27. print('看涨期权隐含波动率为{:.4f}\n看跌期权隐含波动率为{:.4f}'.format(newton_call(0.1566,5.29,6,0.04,0.5),newton_put(0.7503,5.29,6,0.04,0.5)))

  28. 看涨期权隐含波动率为0.2426
  29. 看跌期权隐含波动率为0.2446
复制代码
二分法    
二分法的计算效率要比牛顿迭代法快一倍,因为二分法是折半迭代。其基本思路是设定波动率的初始最小值和最大值,以及居中值,形成两个区间;然后都代入BS公式看市场价格位于哪个区间内;之后该区间再折半,如此往复,最终求出的居中波动率值就是隐含波动率。
  1. def binary_call(P,S,K,r,t):
  2. sigma_up=1
  3. sigma_down=0.001
  4. sigma_mid=(sigma_up+sigma_down)/2
  5. while abs(bscall(S,K,r,sigma_mid,t)-P)>0.0001:
  6. if bscall(S,K,r,sigma_down,t)<P<bscall(S,K,r,sigma_mid,t):
  7. sigma_up=sigma_mid
  8. sigma_mid=(sigma_mid+sigma_down)/2
  9. elif bscall(S,K,r,sigma_up,t)>P>bscall(S,K,r,sigma_mid,t):
  10. sigma_down=sigma_mid
  11. sigma_mid=(sigma_up+sigma_down)/2
  12. else:
  13. print('error!')
  14. return sigma_mid
  15. def binary_put(P,S,K,r,t):
  16. sigma_up=1
  17. sigma_down=0.001
  18. sigma_mid=(sigma_up+sigma_down)/2
  19. while abs(bsput(S,K,r,sigma_mid,t)-P)>0.0001:
  20. if bsput(S,K,r,sigma_down,t)<P<bsput(S,K,r,sigma_mid,t):
  21. sigma_up=sigma_mid
  22. sigma_mid=(sigma_mid+sigma_down)/2
  23. elif bsput(S,K,r,sigma_up,t)>P>bsput(S,K,r,sigma_mid,t):
  24. sigma_down=sigma_mid
  25. sigma_mid=(sigma_up+sigma_down)/2
  26. else:
  27. print('error!')
  28. return sigma_mid
  29. print('看涨期权隐含波动率为{:.4f}\n看跌期权隐含波动率为{:.4f}'.format(binary_call(0.1566,5.29,6,0.04,0.5),binary_put(0.7503,5.29,6,0.04,0.5)))

  30. 看涨期权隐含波动率为0.2427
  31. 看跌期权隐含波动率为0.2447
复制代码
    可以发现两种方法计算出的结果差别非常小,但是二分法的效率更高。
波动率微笑和波动率偏斜    
波动率微笑(smile)描述了期权隐含波动率和执行价格之间的关系,即在其他条件相同的情况下,期权的隐含波动率在平值点附近最小,在虚值和实值区域更大;若隐含波动率在低执行价格区域高于高执行价格区域(即单调递减),那么就称为波动率偏斜(skew),对于股票期权来说这种情况更常见。
    以2018年6月27日到期的、不同执行价格的上证vix.shtml" target="_blank" class="relatedlink">50ETF期权合约在2017年12月29日的收盘价数据为研究对象,看涨看跌期权各有7支。当天50ETF的净值为2.859元,无风险利率为六个月的shibor,当天为4.8823%。7支执行价格从2.7元至3元的看涨期权收盘价分别为0.2841,0.2486,0.2139,0.1846,0.1586,0.1369,0.1177;7支执行价格从2.7元至3元的看跌期权收盘价分别为0.0464,0.0589,0.0750,0.0947,0.1183,0.1441,0.1756。根据上述数据画出两种期权的波动率微笑(偏斜)。
  1. from datetime import date
  2. t=(date(2018,6,27)-date(2017,12,29)).days/365
  3. S=2.859;r=0.048823
  4. K=np.arange(2.7,3.05,0.05)
  5. Pcall=np.array([0.2841,0.2486,0.2139,0.1846,0.1586,0.1369,0.1177])
  6. Pput=np.array([0.0464,0.0589,0.0750,0.0947,0.1183,0.1441,0.1756])
  7. volcall=np.zeros_like(K)
  8. for i in range(len(K)):
  9. volcall[i]=(binary_call(Pcall[i],S,K[i],r,t))
  10. volput=np.zeros_like(K)
  11. for i in range(len(K)):
  12. volput[i]=(binary_put(Pput[i],S,K[i],r,t))
  13. import matplotlib.pyplot as plt
  14. from pylab import mpl
  15. mpl.rcParams['font.sans-serif']=['SimHei']
  16. mpl.rcParams['axes.unicode_minus']=False
  17. plt.plot(K,volcall,label='50ETF认购期权')
  18. plt.plot(K,volput,label='50ETF认沽期权')
  19. plt.xlabel('执行价格')
  20. plt.ylabel('隐含波动率')
  21. plt.title('50ETF期权的波动率微笑(偏斜)')
  22. plt.legend()
  23. plt.grid()
复制代码

  理论上根据平价公式,相同执行价格、到期日等条件下的看涨看跌期权计算出来的隐含波动率应该相同,否则存在套利机会。但是事实上由于交易成本、卖空限制等因素,看涨看跌期权的隐含波动率允许存在一定的偏差,在这个合理的偏差范围内,平价套利是无法实施的。


波动率微笑/偏斜现象的解释
   
 关于波动率微笑的形成,主要是因为BS公式假定资产价格服从对数正态分布,而事实上该资产服从一个更加尖峰厚尾的分布,两边尾部的风险更高,因此隐含波动率更大;同时资产价格有跳跃现象(比如外汇期权的外汇受到央行管制),期权价值的不确定性增大,这也会导致两边变成肥尾。

  波动率偏斜现象(左高右低)在股票期权中更为常见,因为股票价格也不是完全服从对数正态分布,而是一种尖峰、左肥尾、右瘦尾的分布(股票涨得少跌得多),因此左尾更加肥厚,表明隐含波动率更高。

  还有一种较为可靠的解释是崩盘恐惧症(crashophobia):低执行价格区域对应的虚值看跌期权按照BS模型定价很低,但是实际上没这么低(股灾不少见),导致市面上定价有溢价,因此高的价格形成了高的σ。




分享到 :
0 人收藏

1 个回复

倒序浏览
转自:小粉桥反手王
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

下载期权论坛手机APP