期权的隐含波动率—python方法求解

   现实世界中,获得波动率的准确估计很难,BSM期权定价模型对波动率十分敏感。
   一般来说,估计波动率的方法有两种,一种是历史波动率,另一种是隐含波动率。
   历史波动率处理起来比较简单,且在论文研究中并不算主流,接下来对隐含波动率求解进行简单的展示。
   给定BSM看涨期权公式,一个价格为C0的欧式看涨期权的隐含波动率σ,就是求解其他条件不变时下列隐含方差的解。 

在这里插入图片描述
隐含波动率的一些常识:

  1. 隐含波动率是使BSM模型价格等于期权当前市场价格的标准差
  2. 隐含波动率是投资者从股票市场上获得的最有价值,最准确的信息之一
  3. 波动率曲面是指具有同一标的物,不同执行价格和不同到期时间的期权所隐含的波动率不同
  4. 对于任何给定的价格,隐含波动率与期权到期日之间的关系被称为隐含波动率的期限结构,相对于长期期权,波动率微笑在短期期权中更加明显
  5. 通常,平价期权给出的隐含波动率更低,深度价内和深度价外期权给出的波动率最高,这种现象称为波动率微笑
  6. 观察指数期权给出的隐含波动率,可以了解投资者对市场波动率的看法
  7. 从期权定价模型本身来说,公式中的波动率指的是未来的波动率数据,这使历史波动率始终存在着较大的缺陷。为了回避这一缺陷,一些学者将目光转向隐含波动率。
  8. 隐含波动率具体计算思路是: 不论用何种理论的理论模型对市场上交易的期权用模型确定其合理的期权价值,一般需要用到6个标准参数:执行价格(K)、到期时间(t)、标的资产价格(S)、利率(rf)、标的资产息票率(q)和波动率。
  9. 前五个参数可以从市场中和期权合约中获取,只有波动率是未知的参数。
  10. 因此,将期权市场价格以及除波动率之外的5个参数代入期权定价公式后推导出波动率,由此计算出的波动率称为隐含波动率。
  11. 因此,隐含波动率是根据期权的市场价格反推出来的波动率,也是市场自身对未来波动率的预期值, 是市场参与者通过期权交易的买卖报价对未来波动率达成的共识。
  12. 代码如下(使用的数据分别为EURO STOXX 50 index data/上证50ETF期权数据)
  13. EURO STOXX 50 看涨期权的隐含波动率求解
  14. EURO STOXX 50的数据部分如下:
    期权的隐含波动率—python方法求解_第1张图片

代码如下:

import numpy as np
import pandas as pd
import sys
sys.path.append('******文件路径') #写出读取文件的位置可自动读取对应的文件
from BSM_imp_vol import call_option#先定义了求解call option的算法
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['font.family'] = 'serif'

# Pricing Data
pdate = pd.Timestamp('30-09-2014') #2014年9月30日当天为观察日期
# column names to be used
cols = ['Date', 'SX5P', 'SX5E', 'SXXP', 'SXXE',
        'SXXF', 'SXXA', 'DK5F', 'DKXF', 'DEL']
# reading the data with pandas
es = pd.read_csv(es_url,  # filename
                 header=None,  # ignore column names
                 index_col=0,  # index column (dates)
                 parse_dates=True,  # parse these dates
                 dayfirst=True,  # format of dates
                 skiprows=4,  # ignore these rows
                 sep=';',  # data separator
                 names=cols)  # use these column names
# deleting the helper column
del es['DEL']
S0 = es['SX5E']['30-09-2014']
r = -0.05

#
# Option Data
#
data = pd.HDFStore('********数据文件路径/es50_option_data.h5', 'r')['data']

#
# BSM Implied Volatilities
#


def calculate_imp_vols(data):
    ''' Calculate all implied volatilities for the European call options
    given the tolerance level for moneyness of the option.'''
    data['Imp_Vol'] = 0.0
    tol = 0.30  # tolerance for moneyness
    for row in data.index:
        t = data['Date'][row]
        T = data['Maturity'][row]
        ttm = (T - t).days / 365.
        forward = np.exp(r * ttm) * S0
        if (abs(data['Strike'][row] - forward) / forward) < tol:
            call = call_option(S0, data['Strike'][row], t, T, r, 0.2)
            data.loc[row, 'Imp_Vol'] = call.imp_vol(data.loc[row, 'Call'])
    return data


#
# Graphical Output 图像输出
#
markers = ['.', 'o', '^', 'v', 'x', 'D', 'd', '>', '<']


def plot_imp_vols(data):
    ''' Plot the implied volatilites. '''
    maturities = sorted(set(data['Maturity']))
    plt.figure(figsize=(10, 5))
    for i, mat in enumerate(maturities):
        dat = data[(data['Maturity'] == mat) & (data['Imp_Vol'] > 0)]
        plt.plot(dat['Strike'].values, dat['Imp_Vol'].values,
                 'b%s' % markers[i], label=str(mat)[:10])
    plt.grid()
    plt.legend()
    plt.xlabel('strike')
    plt.ylabel('implied volatility')


脚本运行完成后,调用一下:

mats = sorted(set(data['Maturity']))
pd.DatetimeIndex(mats)
dat = data[(data.Maturity == mats[0])
        | (data.Maturity == mats[2])
        | (data.Maturity == mats[3])]
data['Date'] = pd.DatetimeIndex(data['Date'])
data['Maturity'] = pd.DatetimeIndex(data['Maturity'])
plot_imp_vols(data)

输出的隐含波动率图像为:

期权的隐含波动率—python方法求解_第2张图片
接下来,调用put option计算隐含波动率的算法,重复以上的程序,得到看跌期权的隐含波动率
期权的隐含波动率—python方法求解_第3张图片
15.上证50ETF期权数据分析
代码基本一致,换一下数据之后的看涨期权和看跌期权隐含波动率分别如图所示:
期权的隐含波动率—python方法求解_第4张图片
期权的隐含波动率—python方法求解_第5张图片
以上图中也可看出,对于任何给定的价格,隐含波动率与期权到期日之间的关系被称为隐含波动率的期限结构,相对于长期期权,波动率微笑在短期期权中更加明显 。

这期分享就到这里,边学习边分享。

你可能感兴趣的:(python,机器学习,大数据,算法,人工智能)