1.股指期货概述
股指期货,用于对冲股票市场风险的金融衍生工具,恰当的应用可以有效的规避投资风险,股指期货T0交易制度,双向交易,且支持做多也支持做空的交易方式,是对T 1交易制度、单向交易的股票市场是极大的扩展,同时也兼具期货本身的套利、投机等功能属性。
在量化交易策略中,有不少追求alpha收益的策略,如果能够找到稳定赚钱的alpha,就可以通过指数期货的对冲,规避掉市场风险部分,获取超额收益。
和其他的期货品种一样,期货市场同样也存在着期保值者、投机者、套利者,股指期货市场的表现同样也表达了投资者对股票市场未来走势看法,如在2015年熊市挡住,股指期货就曾被认为是股市下跌的元凶。
股指期货到期进行交割时就是股票指数了,受政策变化、市场流动性缩减、手续费提升的影响,指数期货与股票指数的实际走势也发生着变化,本篇文章就是带大家看一下股指期货与股指的具体表现。
2.股指期货的几个重要时间点
目前,市场上已经开放的股指期货有三个,沪深300股指期货(交易代码IF)、中证500股指期货(交易代码IC),上证50股指期货(交易代码IH),首先,这里我们先整体看一下三个指数期货发布以来到现在的成交量、基差率(期货价格/指数价格 -1)的变化情况
可以看到,成交量和基差率均在2015年下半年发生了翻天覆地的变化!这是由于在2015年股指期货交易制度更改的原因。接下来,我们把三个股指期货的几个关键时间点都列出来;
- 沪深300股指期货:沪深300指数自2005年4月8日正式发布,指数期货在2010年4月16日发布
- 上证50股指期货:上证50指数自2004年1月2日起正式发布,指数期货在2015年4月16日发布
- 中证500股指期货:中证500指数在2007年1月15日正式发布,指数期货在2015年4月16日发布
其次,列出几次重要的制度变化时间点
- 金融期货限制:2015年9月7日开始,限制内容,,,,,,
(将期指非套保持仓保证金提高至40%,平仓手续费提高至万分之二十三,单个产品单日开仓交易量超过10手认定为异常交易行为,旨在进一步抑制市场过度投机) - 金融期货第一次松绑:2017年2月17日,,,
(自2月17日起,股指期货日内过度交易行为的监管标准从原先的10手调整为20手,套期保值交易开仓数量不受此限;自2月17日结算时起,沪深300、上证50股指期货非套期保值交易保证金调整为20%,中证500股指期货非套期保值交易保证金调整为30%(三个产品套保持仓交易保证金维持20%不变);自2月17日起,沪深300、上证50、中证500股指期货平今仓交易手续费调整为成交金额的万分之九点二。) - 金融期货第二次松绑:2017年9月18日,,,
(自2月17日起,股指期货日内过度交易行为的监管标准从原先的10手调整为20手,套期保值交易开仓数量不受此限;自2月17日结算时起,沪深300、上证50股指期货非套期保值交易保证金调整为20%,中证500股指期货非套期保值交易保证金调整为30%(三个产品套保持仓交易保证金维持20%不变);自2月17日起,沪深300、上证50、中证500股指期货平今仓交易手续费调整为成交金额的万分之九点二。) - 金融期货第三次松绑:2018年12月3日,,,
(中金所发布公告称,经中国证监会同意,自2018年12月3日结算时起,将沪深300、上证50股指期货交易保证金标准统一调整为10%,中证500股指期货交易保证金标准统一调整为15%;二是自2018年12月3日起,将股指期货日内过度交易行为的监管标准调整为单个合约50手,套期保值交易开仓数量不受此限;三是自2018年12月3日起,将股指期货平今仓交易手续费标准调整为成交金额的万分之四点六。)
3.不同时间段的表现
按照上面列出的时间点,这里分了如下几个时间段进行研究
沪深300股指期货分阶段的成交量、基差的均值数据
中证500股指期货分阶段的成交量、基差数据统计
上证50股指期货分阶段的成交量、基差数据统计
为了更加直观的看到变化情况,下面进行统计图展示
4.分阶段描述各个时期的特点。
这张图统计了自2015年限制之后,三个股指期货的成交量变化,成交量均在稳步提升,我们看到在政策不断松绑的
成交量回升显著,上证50从近5000手上升至超过2万手,沪深300从1.25万手上升智4万手以上
中证500中间出现了缩量的情况,但当前月的均量也已经是成倍的增长
(上证50、沪深300集中了大盘蓝筹股、中证500则反映着中小股的走势,从2017年年初之后,市场就是大盘股主导,估计与这行情有着一定的关系)
再来看基差率
- 1.基差逐步减小,深度贴水的状况逐渐改善
- 2.在2015年4月到2015年9月期间,即没有做限制之前,基差均值非常大,说明过度投机的市场,也会导致股指期货与股指偏离过大.
- 3.自2015年股灾之后基差均值首次出现正值
- 4.中证500基差率近几年均值一直维持在0.5%左右
5.汇总总结。
自从股指期货被限制之后,长期处于深度贴水状态,即股指期货长期低于股票指数。
股指期货现金交割模式下,持有成本中并未包含仓储物流等费用,也不受供求关系的影响。风险完全来自股票市场的变化,理论上二者的价格应该更加接近才对,但是由于交易手数的限制、高昂的手续费,抑制了投资者的参与,使得套保套利者对手盘缺失,整个股指期货市场流动性严重不足,基差率过大,直接影响着对股票市场的风险锁定功能,通过对冲实现的市场中性策略效果。在这种情况下空头操作将承担更大的成本,同时面临着期货价格大幅拉升的危险之中。
随着政策不断松绑,我们看到二者的价差在不断缩小,成交量也开始大幅回升,我们期待一个流动性充足,交易成本合理的股指期货市场,使得更多的策略模型能够发挥效用。
内容说明
- 行情数据获取,IC、IF、IH、指数行情数据
- 做差值、统计差值时间序列
- 结合差值表现,说明对冲过程的实际影响
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')
#行情数据获取
#输入:起止时间,返回:几个期货数据的时间序列
s_date,e_date = '2010-1-1','2019-2-13'
pool = ['IF9999.CCFX','IH9999.CCFX','IC9999.CCFX','000300.XSHG','000016.XSHG','000905.XSHG',\
'IF8888.CCFX','IH8888.CCFX','IC8888.CCFX']
df = get_price(pool,start_date=s_date,end_date=e_date,fields=['close'])['close'] #获取价格信息
df_volume = get_price(pool,start_date=s_date,end_date=e_date,fields=['volume'])['volume'] #获取成交量信息
#将主力合约的值减去行情价格,观察差值表现
diff_df = pd.DataFrame()
diff_df['IF_diff'] = df['000300.XSHG'] - df['IF9999.CCFX']
diff_df['IH_diff'] = df['000016.XSHG'] - df['IH9999.CCFX']
diff_df['IC_diff'] = df['000905.XSHG']- df['IC9999.CCFX']
diff_df.tail(5)
diff_df.plot(figsize=(15,10)) #基差
统计基差率
div_df = pd.DataFrame()
div_df['IF_div'] = (df['IF9999.CCFX'] - df['000300.XSHG'])/df['000300.XSHG']
div_df['IH_div'] = df['IH9999.CCFX']/df['000016.XSHG'] - 1
div_df['IC_div'] = df['IC9999.CCFX']/df['000905.XSHG'] - 1
div_df.plot(figsize=(15,10))#期现偏离度
#三个股指期货产品的成交量
df_volume[['IF9999.CCFX','IH9999.CCFX','IC9999.CCFX']].plot(figsize=(15,10)) #成交量变化
div_df['IC_diff'].hist(bins=100)
沪深300股指期货在2015年9月7日限制之后的成交量变化
if_df = get_price('IF9999.CCFX',fields=['volume'],start_date='2015-9-8',end_date='2018-12-30')['volume']
if_df.plot(figsize = (12,8))
s_date,e_date = '2005-1-1','2019-1-1'
pool = ['IF9999.CCFX','IH9999.CCFX','IC9999.CCFX','000300.XSHG','000016.XSHG','000905.XSHG',\
'IF8888.CCFX','IH8888.CCFX','IC8888.CCFX']
df_test = get_price(pool,start_date=s_date,end_date=e_date,fields=['close'])['close']
df_test[['000300.XSHG','000016.XSHG','000905.XSHG']].plot()
#中证500成交量变化
df_volume['IC9999.CCFX'].plot(figsize=(15,10))
分阶段统计
date1 = '20100416' #hs300期货上市
date2 = '20150416' #ss50、zz500期货上市
date3 = '20150907' #限制
date4 = '20170217' #放开1
date5 = '20170918' #放开2
date6 = '20181203' #放开3
date7 = '20190213' #至今
date_list = [date1,date2,date3,date4,date5,date6,date7]
'''
对指定时间段的成交量、基差、基差率统
'''
#df1是close价格,df2是成交量的df
def cal_mean(s_date,e_date,index,df1,df2):
df_temp1 = df1[(df1.index>=s_date) & (df1.index<e_date)]
df_temp2 = df2[(df2.index>=s_date) & (df2.index<e_date)]
mean_volume = np.mean(df_temp2[index])
if index == 'IF9999.CCFX':
stock_index = '000300.XSHG'
elif index == 'IC9999.CCFX':
stock_index = '000905.XSHG'
elif index == 'IH9999.CCFX':
stock_index = '000016.XSHG'
#期货 - 股指
basis_se = df_temp1[index] - df_temp1[stock_index]
basis_mean = np.mean(basis_se)
#期货/股指 - 1
dev_se = df_temp1[index]/df_temp1[stock_index] - 1
dev_mean = np.mean(dev_se)
return mean_volume,basis_mean,dev_mean,basis_se,dev_se
#cal_mean(s_date=date5,e_date=date6,index ='IF9999.CCFX',df1=df,df2 =df_volume)
#我们统一为 期货-指数
summary_if = pd.DataFrame(columns= ['成交量均值','基差均值','基差率'])
for d1,d2 in zip(date_list[:-1],date_list[1:]):
summary_if.loc[str(d1)+'-'+str(d2)] = cal_mean(s_date=d1,e_date=d2,index ='IF9999.CCFX',df1=df,df2 =df_volume)[:3]
summary_if
#我们统一为 期货-指数
summary_ic = pd.DataFrame(columns= ['成交量均值','基差均值','基差率'])
for d1,d2 in zip(date_list[:-1],date_list[1:]):
summary_ic.loc[str(d1)+'-'+str(d2)] = cal_mean(s_date=d1,e_date=d2,index ='IC9999.CCFX',df1=df,df2 =df_volume)[:3]
summary_ic
#我们统一为 期货-指数
summary_ih = pd.DataFrame(columns= ['成交量均值','基差均值','基差率'])
for d1,d2 in zip(date_list[:-1],date_list[1:]):
summary_ih.loc[str(d1)+'-'+str(d2)] = cal_mean(s_date=d1,e_date=d2,index ='IH9999.CCFX',df1=df,df2 =df_volume)[:3]
summary_ih
#成交量放在一张图上展示
summary_vol = pd.DataFrame(index=summary_ih.index)
summary_vol['IC_成交量']=summary_ic['成交量均值']
summary_vol['IH_成交量']=summary_ih['成交量均值']
summary_vol['IF_成交量']=summary_if['成交量均值']
summary_vol
summary_vol.plot(kind='bar',figsize=(12,8))
#单独显示限制之后的成交量情况
summary_vol.iloc[2:,:].plot(kind='bar',figsize=(12,8))
#基差率放在一张图上展示
summary_dev = pd.DataFrame(index=summary_ih.index)
summary_dev['IC_基差率']=summary_ic['基差率']
summary_dev['IH_基差率']=summary_ih['基差率']
summary_dev['IF_基差率']=summary_if['基差率']
summary_dev
summary_dev.plot(kind='bar',figsize=(12,8))
dev_df = pd.DataFrame()
dev_df['IF_基差率'] = cal_mean('2010-4-16','2019-1-1','IF9999.CCFX',df,df_volume)[-1]
dev_df['IH_基差率'] = cal_mean('2010-4-16','2019-1-1','IH9999.CCFX',df,df_volume)[-1]
dev_df['IC_基差率'] = cal_mean('2010-4-16','2019-1-1','IC9999.CCFX',df,df_volume)[-1]
dev_df.plot(figsize=(12,8))
#三个股指期货产品的成交量
df_volume[['IF9999.CCFX','IH9999.CCFX','IC9999.CCFX']].loc['2015-09-06':,:].plot(figsize=(15,10)) #成交量变化