【金融】中国vix、skew指数的Python实现

本文介绍了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 使用实例


1 vix、skew介绍

Cboe波动率指数(VIX)是一个实时指数,代表市场对标准普尔500指数(SPX)近期价格变化相对强度的预期。因为它是从具有近期到期日期的SPX指数期权的价格派生出来的,隐含30天的波动性远期预测。波动率,通常被视为衡量市场情绪的一种方式,特别是市场参与者的恐惧程度。

该指数通常以其股票代码而闻名,通常简称为“VIX”。它由Cboe期权交易所(Cboe)创建,并由Cboe全球市场维护。它是交易和投资领域的重要指数,因为它提供了市场风险和投资者情绪的可量化衡量标准。

  • Cboe波动率指数(VIX)是一个实时市场指数,代表市场对未来30天波动率的预期。
  • 投资者在做出投资决策时使用VIX来衡量市场的风险,恐惧或压力水平。
  • 交易者还可以使用各种期权和交易所交易产品交易VIX,或者他们可以使用VIX值对衍生品进行定价。
  • VIX通常在股票下跌时上升,在股票上涨时下降。

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)

2 vix、skew计算公式

【VIX计算】

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期权价格

【SKEW 计算】

与 VIX 的计算方法十分相似,在挑选出标的期权后,计算出近月和次近月的偏度 S, 加权平均后使用插值法得到 30 日均值,最后进行简单代数变换得到偏度指数 SKEW。

偏度 S 的计 算公式如下:

 其中,𝑅是 50ETF 未来 30 日对数回报率,𝜇是𝑅的均值,𝜎是𝑅的标准差。

由于 S 可正可负,且波动范围较窄,不利于作为观测指数, 我们对 S 进行简单的代数变换,得到偏度指数 SKEW:

SKEW = 100 − 10 × S

对S进行展开代换: 

 其中,

varepsilon i是对 K0 和 F0 差值的修正项:

3【API文档】 Python实现class CVIX类,计算中国版VIX及SKEW

代码就不展示了,需要进一步交流的小伙伴欢迎私信~

CVIX中的属性和方法如下:

CVIX

 3.1 CVIX属性

  • start_date :需要计算VIX和SKEW的数据的起始日期(数据类型可以传入是datatime、字符串'%Y/%m/%d'、'%Y-%m-%d'、'%Y%m%d',事实上在计算时都会将所有跟时间相关的数据全部转为datetime,CVIX中内置了函数timeformat将上述格式进行转化)。
  • end_date :需要计算VIX和SKEW的数据的最后日期,数据类型同start_date。
  • trade_days: 程序中用于判断日期是否为交易日的数据,在使用中需要包含[start_date ,end_date ]中的所有交易日,也可以大于上述范围,但不能小于上述范围(数据类型为list,传入包含了你想要研究的日期的一个交易日list,elements为datetime)。
  • option_data:dataframe期权数据,其中【当前交易日】命名为"trade_date",【期权名称】命名为name,【行权价】命名为"exe_price",【开盘价】命名为"open",【最高价】命名为"highest",【最低价】命名为"lowest"【收盘价】命名为"close",【结算价】命名为"settlement_price",【call还是put】命名为"call_put",【最后行权日】命名为"last_edate",其中必须包含的字段有trade_date、exe_price、close、call_put、last_edate。
  • shibor:dataframe shibor数据,【当前交易日】命名为"date",不同期限从隔夜到1年分别命名为"on""1w""2w""1m""3m""6m""9m""1y"。
  • currenrdt_param:字典数据,在日期currendt下,计算VIX和SKEW指标所需的参数,所包含的参数如上图所示。

3.2 CVIX方法

3.2.1 load_data(trade_days,option_data,shibor)

作用:将数据装载到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

返回值:无。

3.2.2 set_currentdt(date)

作用:设置currentdt,若不设置则在初始化CVIX对象时将currentdt设为start_date

参数: date:datetime或常见的日期字符串

3.2.3 basic_inf()

作用:获取计算VIX当天(currentdt)的所有期权。

参数:无。

返回值:tuple

            vix_option_data:交易日为self.currenrdt_param["currenrdt"]的所有期权截面数据

            vix_enddate:vix_option_data中所有期权截面数据的最后行权日列表(升序排序)

3.2.4 vix_shibor()

作用:对现有的shibor利率期限结构进行插值,计算得到计算VIX当天(currentdt)的所有期权的期限相应的无风险利率。

参数:无

返回值:tuple

            vix_shibor:list,对应期限的无风险利率

            periods:list,期限列表

3.2.5 cal_singleday_params()

作用:基于currentdt当天,计算公式中的参数,并存储到self.currenrdt_param中的相应变量中。其计算的结果可由实例对象.currenrdt_param调用。

参数:无

返回值:无

3.2.6 vix_singleday()

作用:计算单独某天(currentdt)的vix值并返回

参数: 无

返回值:float,对应的VIX指数值

3.2.7 Skew_singleday()

作用:计算单独某天(currentdt)的SKEW值并返回

参数: 无

返回值:float,对应的SKEW指数值

3.2.8 vix_skew()

作用:将从start_date到end_date期间的vix和skew全部计算出来,并保存到self.c_vix中,也同时返回此表。

参数:无

返回值:DataFrame,index为日期,columns=["C-VIX","C-SKEW"]

3.3 使用实例

数据就不提供了,想要进一步交流的小伙伴欢迎私信~

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: 

 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>