本文介绍了vix和skew指数,并实现了CVIX.py用于计算中国的上述指数,给出了CVIX的相应文档。但代码和数据就不提供咯~想要进一步交流的小伙伴欢迎私信~
目录
1 vix、skew介绍
2 vix、skew计算公式
【VIX计算】
【SKEW 计算】
3【API文档】 Python实现class CVIX类,计算中国版VIX及SKEW
3.1 CVIX属性
3.2 CVIX方法
3.2.1 load_data(trade_days,option_data,shibor)
3.2.2 set_currentdt(date)
3.2.3 basic_inf()
3.2.4 vix_shibor()
3.2.5 cal_singleday_params()
3.2.6 vix_singleday()
3.2.7 Skew_singleday()
3.2.8 vix_skew()
3.3 使用实例
Cboe波动率指数(VIX)是一个实时指数,代表市场对标准普尔500指数(SPX)近期价格变化相对强度的预期。因为它是从具有近期到期日期的SPX指数期权的价格派生出来的,隐含30天的波动性远期预测。波动率,通常被视为衡量市场情绪的一种方式,特别是市场参与者的恐惧程度。
该指数通常以其股票代码而闻名,通常简称为“VIX”。它由Cboe期权交易所(Cboe)创建,并由Cboe全球市场维护。它是交易和投资领域的重要指数,因为它提供了市场风险和投资者情绪的可量化衡量标准。
2010 年,CBOE 推出偏度指数 SKEW,该指数主要描述隐含波动率曲线的斜率走 势情况,波动率曲线越陡,SKEW 越大。通常,股票市场的风险分布特征可以由市 场参与者对风险分布的预期波动率、峰度、偏度三个指标刻画,SKEW 指数正是依 据期权价格编制的风险分布偏度,反映投资者对于市场尾部风险预期,对市场极端 情况的发生有预警功能,所以又称为“黑天鹅指数”,是波动率指数 VIX的有效补充。 在 1987 年 10 月的金融危机后,S&P500 隐含波动率曲线斜率骤然升高,业界开始 重新审视经典模型 BLACK-SCHOLES模型中的一些假设,并深入探究波动率微笑、 隐含波动率曲线的不对称性、市场大幅下跌带来的模型失效等问题,SKEW 指数顺 势而生。SKEW 指数聚焦于市场的“尾部风险”,即收益中异常值出现的频率远高于 正态分布的情况,常被用于市场忽略的盲点信息、尾部风险因素及因投资者过度乐 观形成的风险进行示警,可预示市场黑天鹅事件的发生。
SKEW 反映了市场的尾部风险,是负面极端事件发生的度量指标,描述了隐含波动 率曲线的斜率走势情况,根据计算公式,SKEW 指数围绕 100 上下波动。当 SKEW=100 时,市场预期收益率整体呈正态分布;当 SKEW>100 时,市场预期收 益率整体左偏;当 SKEW<100 时,市场预期收益率整体右偏;SKEW 越大,左偏 程度越大,预期尾部风险越大,说明市场有较大概率发生“黑天鹅”事件。例如,2016 年 11 月英国宣布“脱欧”,而 S&P 500 SKEW 早些时间已经异常波动,于 2016 年 6 月 28 日冲至 153.66,达到历史高点;SKEW 在 2016 年 11 月 3 日达到 141.18 的高 位,而 11 月 8 日,美国大选宣布结果,特朗普当选总统。SKEW 对于超出预期的“黑 天鹅”事件有提前预警能力。
国外研究发现,SKEW 与 VIX 指标变动的相关性极低,二者结合分析,可以更为全 面地衡量投资组合风险敞口,能够捕捉尾部风险的 SKEW 常被作为波动率指数 VIX 的补充指标。(东北证券:市场波动风险度量: VIX 与 SKEW 指数构建与应用,2018-07-07)
CBOE公布的VIX白皮书《The CBOE Volatility Index - VIX®》详细介绍了VIX具体编制方法,其核心计算公式如下:
其中,
σ1:近月波动率
NT:近月合约剩余到期时间(以分钟计)
T:NT/N365
R:无风险利率
S:认购期权价格与认沽期权价格相差最小的执行价
F:S+eRT×[认购期权价格(S)−认沽期权价格(S)]
K0:小于F且最接近于F的执行价
Ki:由小到大的所有执行价(i=1,2,3,….)
ΔKi:第i个执行价所对应的执行价间隔
P(Ki):若Ki小于K0,为Ki对应的Put期权价格;若Ki大于K0,为Ki对应的Call期权价格;若Ki等于K0,为Ki对应的Call/Put期权价格
与 VIX 的计算方法十分相似,在挑选出标的期权后,计算出近月和次近月的偏度 S, 加权平均后使用插值法得到 30 日均值,最后进行简单代数变换得到偏度指数 SKEW。
偏度 S 的计 算公式如下:
其中,是 50ETF 未来 30 日对数回报率,是的均值,是的标准差。
由于 S 可正可负,且波动范围较窄,不利于作为观测指数, 我们对 S 进行简单的代数变换,得到偏度指数 SKEW:
SKEW = 100 − 10 × S
对S进行展开代换:
其中,
是对 K0 和 F0 差值的修正项:
代码就不展示了,需要进一步交流的小伙伴欢迎私信~
CVIX中的属性和方法如下:
currenrdt_param:字典数据,在日期currendt下,计算VIX和SKEW指标所需的参数,所包含的参数如上图所示。
作用:将数据装载到CVIX实例对象中,以供后续运算。
参数:
trade_days:list,传入包含了你想要研究的日期的一个交易日list,elements为datetime;
option_data:dataframe期权数据,其中【当前交易日】命名为"trade_date",【期权名称】命名为name,【行权价】命名为"exe_price",【开盘价】命名为"open",【最高价】命名为"highest",【最低价】命名为"lowest"【收盘价】命名为"close",【结算价】命名为"settlement_price",【call还是put】命名为"call_put",【最后行权日】命名为"last_edate",其中与日期相关的数据均需转为datetime;
shibor:dataframe shibor数据,【当前交易日】命名为"date", 不同期限从隔夜到1年分别命名为"on""1w""2w""1m""3m""6m""9m""1y", 其中与日期相关的数据均需转为datetime
返回值:无。
作用:设置currentdt,若不设置则在初始化CVIX对象时将currentdt设为start_date
参数: date:datetime或常见的日期字符串
作用:获取计算VIX当天(currentdt)的所有期权。
参数:无。
返回值:tuple
vix_option_data:交易日为self.currenrdt_param["currenrdt"]的所有期权截面数据
vix_enddate:vix_option_data中所有期权截面数据的最后行权日列表(升序排序)
作用:对现有的shibor利率期限结构进行插值,计算得到计算VIX当天(currentdt)的所有期权的期限相应的无风险利率。
参数:无
返回值:tuple
vix_shibor:list,对应期限的无风险利率
periods:list,期限列表
作用:基于currentdt当天,计算公式中的参数,并存储到self.currenrdt_param中的相应变量中。其计算的结果可由实例对象.currenrdt_param调用。
参数:无
返回值:无
作用:计算单独某天(currentdt)的vix值并返回
参数: 无
返回值:float,对应的VIX指数值
作用:计算单独某天(currentdt)的SKEW值并返回
参数: 无
返回值:float,对应的SKEW指数值
作用:将从start_date到end_date期间的vix和skew全部计算出来,并保存到self.c_vix中,也同时返回此表。
参数:无
返回值:DataFrame,index为日期,columns=["C-VIX","C-SKEW"]
数据就不提供了,想要进一步交流的小伙伴欢迎私信~
from datetime import datetime
import numpy as np
import pandas as pd
import os
import CVIX#自编CVIX
from CVIX import CVIX
# ######################数据读取/参数设置############################################
option_type = "沪深交易所_50_options"#修改这里以获得不同的期权标的vix
#可选:
#沪深交易所_300_options
#沪深交易所_创业板指_options
#中金所_300_options
trade_days = list(pd.to_datetime(pd.read_excel("./tradeday.xlsx")["DateTime"]))#交易日列表
option_data = pd.read_excel("./"+option_type+".xlsx")#期权数据
shibor = pd.read_excel("./shibor_interst.xlsx")#shibor数据
option_data["trade_date"] = pd.to_datetime(option_data["trade_date"])#将日期列转为datetime
option_data["last_edate"] = pd.to_datetime(option_data["last_edate"])#将日期列转为datetime
shibor["date"] = pd.to_datetime(shibor["date"])#将日期列转为datetime
start_date,end_date = "2020-01-01","2022-09-22"#起始日,终止日,修改这里以获得不同时间区间的vix
########################计算vix#####################################################
cvix = CVIX(start_date,end_date)#实例化一个CVIX对象
cvix.load_data(trade_days=trade_days,option_data=option_data,shibor=shibor)#将数据传入实例
cvix_df = cvix.vix_skew()#运算得到vix和skew数据
#保存数据
save_dir = "./vixdata/"
if os.path.exists(save_dir):
cvix_df.to_excel(save_dir+str(start_date)+"to"+str(end_date)+option_type+"_CVIX.xlsx")
else:
os.mkdir(save_dir)
cvix_df.to_excel(save_dir+str(start_date)+"to"+str(end_date)+option_type+"_CVIX.xlsx")
输出概览:
C-VIX | C-SKEW | |
2020-01-02 00:00:00 | 15.7316 | 102.8924 |
2020-01-03 00:00:00 | 15.52662 | 99.51645 |
2020-01-06 00:00:00 | 16.14925 | 101.9488 |
2020-01-07 00:00:00 | 16.4536 | 100.6074 |
2020-01-08 00:00:00 | 16.284 | 100.843 |
2020-01-09 00:00:00 | 15.91538 | 102.3336 |
2020-01-10 00:00:00 | 15.55822 | 101.9634 |
2020-01-13 00:00:00 | 15.26987 | 102.5067 |
2020-01-14 00:00:00 | 15.01378 | 107.681 |
2020-01-15 00:00:00 | 14.94262 | 107.9715 |
2020-01-16 00:00:00 | 14.2497 | 113.3097 |
2020-01-17 00:00:00 | 13.86249 | 111.703 |
2020-01-20 00:00:00 | 13.70987 | 109.3929 |
2020-01-21 00:00:00 | 15.3784 | 95.1505 |
2020-01-22 00:00:00 | 14.4472 | 94.99732 |
2020-01-23 00:00:00 | 16.53679 | 98.43133 |
...... | ...... | ...... |
画图看一下:
cvix_df["C-VIX"].plot(color = "black",figsize = (20,12),marker = "",linestyle = "-",linewidth=2.8)
cvix_df["C-SKEW"].plot(color = "black",figsize = (20,12),marker = "",linestyle = "-",linewidth=2.8)
VIX:
SKEW: