期权定价的核心主要在于资产价格波动率。资产价格波动率的计算方法较多,本文将简要介绍几种主要的基本算法与garch模型算法。
历史波动率
➢ 过去一段时间,标的波动的程度
• 确定基于的价格,如每日收盘价
• 计算每日价格收益率
• 计算一段时间内收益率标准差
• 标准差进行年化
Parkinson波动率
➢ 极差构造波动率
➢ 更快的收敛于真实波动率
• 模拟几何布朗运动,基于极差的估计量方差/收盘价-收盘价估计量的方差 ≥ 5
优点: • 引入日内极差的计算方式,提供更全面的信息
缺点: • 只适用于几何布朗运动的波动率估计,不能处理趋势和跳空
Garman-Klass波动率
极差 + 收盘价
➢ 更快收敛于真实波动率 • 模拟几何布朗运动,基于极差的估计量方差/收盘价-收盘价估计量的方差 ≈ 8
优点: • 相比于基于收盘价的算法,收敛效率提高 • 充分利用可获取的价格信息
缺点: • 有时偏差比Parkinson算法更大
Roger-Satchell波动率
➢ 极值+收盘价、开盘价
➢ 放宽限制条件,引入存在非零均值参数
优点:允许趋势的存在
缺点:同样无法处理价格的跳空
Garman-Klass-Yang-Zhang波动率
Garman-Klass的基础上,允许开盘跳空
优点:弥补Garman-Klass无法处理开盘跳空的情况
缺点:当资产收益率均不为零时,会高估波动率
Yang-Zhang波动率
➢ 适用于开盘价格跳空 ➢ 收盘价-开盘价 + 开盘价-收盘价 + Rogers-Satchel的加权平均
➢ 收敛效率:基于极差的估计量方差/收盘价-收盘价估计量的方差 ≈ 14
• 与开盘跳空所导致的波动率/整体波动率,高度相关
优点: • 通常情况,拥有最小估计误差 • 能够处理漂移项和价格跳空 • 在可用数据的使用上最为有效
缺点: • 如果价格过程由跳空主导,效果会降低到与收盘价与收盘价的方式差不多
EWMA波动率
➢ 指数加权移动平均模型
➢ 基本思想:不同时间的数据以不同的权重,权重随着时间以指数速度衰减
约束条件𝜆通常取0.94,𝜆越大,权重之间的差别越小
缺点:忽略连续回报率之间可能的相关性、波动率均值回归的特性
GARCH波动率
➢ GARCH(广义自回归条件异方差)
• ARCH误差序列,低阶自相关的拟合
• 日频数据,ARCH中的滞后阶数m很大,应用难度增加
➢ GARCH用少量𝜎t的滞后值替代许多𝑎𝑡的滞后值
➢ 构成:波动率估计值+相关性因素+均值回归因素
➢ GARCH(1,1)
python实践
if __name__=='__main__':
ori_df=pd.read_excel('ori_df.xlsx')
val=volatility(ori_df,20,245,yearly=True)
df=pd.DataFrame()
df['date']=ori_df['date']
df['hv_sigma']=val.history_volatility().values
df['parkinson_sigma']=val.Parkinson()
df['Garman_Klass_sigma']=val.high_low_close_valitility()
df['Garman_Klass_YZ_sigma']=val.Garman_Klass_YZ()
df['Yang_Zhang_sigma']=val.Yang_Zhang()
df['Roger_Satchell_sigma']=val.Roger_Satchell()
df['ema_sigma']=val.ewma_volatility(alpha_=0.94)
df['garch_sigma']=val.garch_volatility()
plt.figure(figsize=(15,4))
x=pd.to_datetime(df['date'])
plt.plot(x,df['hv_sigma'],label='hv_sigma')
plt.plot(x,df['parkinson_sigma'],label='parkinson_sigma')
plt.plot(x,df['Garman_Klass_sigma'],label='Garman_Klass_sigma')
plt.plot(x,df['Garman_Klass_YZ_sigma'],label='Garman_Klass_YZ_sigma')
plt.plot(x,df['Yang_Zhang_sigma'],label='Yang_Zhang_sigma')
plt.plot(x,df['Roger_Satchell_sigma'],label='Roger_Satchell_sigma')
plt.plot(x,df['ema_sigma'],label='ema_sigma')
plt.plot(x,df['garch_sigma'],label='garch_sigma')
plt.legend()
plt.show()