计算最优套保比率
交叉套保是指期货合约的标的资产与被套保资产不一致,比如某公司配置了上证180指数ETF基金,但是市场上没有上证180指数的期货合约,该公司只能选择沪深300指数期货、上证50指数期货或中证500指数期货来套保。
最优套保比率也称为最小方差套保比率,记为h*,表示被套保资产价格变化一个单位需要多少份期货合约来对冲。构建线性方程∆S=α+h*×∆F+ε,其中∆S和∆F分别表示在套保期间内,被套保资产价格的变化和用于套保的期货价格变化。很多时候∆S和∆F用各自的日收益率数据来代替。根据线性回归的计算式可得h*=ρσs/σF=∆S/∆F,过程类似于求CAPM的β系数。
假设某一基金公司配置了上证180指数ETF基金,该公司只能选择沪深300指数期货IF1812合约、上证50指数期货IH1812合约或中证500指数期货IC1812合约来套保,这三个合约的挂牌日均是2018年4月23日,最后交易日均是2018年12月21日,根据最优套保比率选择最合适的合约。
step1:读入上证180指数ETF基金净值和三个期货合约结算价数据:
import numpy as np
import pandas as pd
data=pd.read_excel('C:/lenovo/Desktop/上证180ETF与期货合约.xlsx',index_col=0)
data.head()
Out[1]:
上证180ETF IF1812 IC1812 IH1812
交易日期
2018-04-23 3.218 3669.4 5524.0 2614.2
2018-04-24 3.278 3753.0 5681.8 2687.8
2018-04-25 3.261 3743.6 5677.4 2670.0
2018-04-26 3.216 3672.6 5598.8 2628.2
2018-04-27 3.217 3686.8 5612.6 2626.2
step2:生成各自的日对数收益率序列:
SHre=np.log(data.iloc[:,0]/data.iloc[:,0].shift(1)).dropna()
IFre=np.log(data.iloc[:,1]/data.iloc[:,1].shift(1)).dropna()
ICre=np.log(data.iloc[:,2]/data.iloc[:,2].shift(1)).dropna()
IHre=np.log(data.iloc[:,3]/data.iloc[:,3].shift(1)).dropna()
step3:以这三种期货合约的对数收益率数据作为自变量,上证180指数ETF对数收益率为因变量分别进行回归:
import statsmodels.api as sm
IF=sm.add_constant(IFre)
IC=sm.add_constant(ICre)
IH=sm.add_constant(IHre)
model1=sm.OLS(SHre,IF).fit()
model1.summary()
Out[3]:
<class 'statsmodels.iolib.summary.Summary'>
"""
OLS Regression Results
==============================================================================
Dep. Variable: 上证180ETF R-squared: 0.946
Model: OLS Adj. R-squared: 0.946
Method: Least Squares F-statistic: 2854.
Date: Fri, 14 Feb 2020 Prob (F-statistic): 3.31e-105
Time: 17:35:06 Log-Likelihood: 715.08
No. Observations: 165 AIC: -1426.
Df Residuals: 163 BIC: -1420.
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.0002 0.000 0.628 0.531 -0.000 0.001
IF1812 0.8735 0.016 53.419 0.000 0.841 0.906
==============================================================================
Omnibus: 1.256 Durbin-Watson: 2.687
Prob(Omnibus): 0.534 Jarque-Bera (JB): 0.866
Skew: 0.114 Prob(JB): 0.648
Kurtosis: 3.271 Cond. No. 65.8
==============================================================================
同理可得另外两种期货的线性回归模型结果,可决系数R2分别为0.72和0.929,最优套保比率分别为0.6657和0.922。若以R2最高的模型作为最优选择,那么IF1812合约作为套套保合约最合适,R2达到了0.946,最优套保比率为0.8735。可画图看一下拟合效果:
import matplotlib.pyplot as plt
plt.plot(IFre,model1.params[0]+model1.params[1]*IFre,'r-')
plt.scatter(IFre,SHre,marker='o')
plt.xlabel('IF1812')
plt.ylabel('SH180ETF')
套保最优期货合约数
接下来计算套期保值者需要多少数量的期货合约进行套保操作。假设QS表示被套保的资产数量,QF表示一份期货合约的规模,N* 表示用于套保的最优期货合约份数,那么有N* ×QF×∆F=QS×∆S,代入h*=∆S/∆F得N*=h*QS/QF。
接上例,假定该基金公司在2018年12月28日按照收盘净值2.768元买入上证180指数ETF一亿元,同时用沪深300期货IF1901合约空头头寸(当日结算价为3003.6元)来套保,假定最优套保比率不变,求最优期货合约份数:
def n(h,qs,qf):
return h*qs/qf
n(model1.params[1],100000000,3003.6*300)
Out[6]: 96.9344687900856
因此要卖出IF1901合约97份。
套保组合的动态盈亏
接上例,假定在套保完成后,随着基金净值和期货合约价格的变化,整体套保组合的效果也在发生改变,根据下表信息计算这三个交易日的套保组合盈亏情况:
日期 | 2019年1月11日 | 2019年1月14日 | 2019年1月15日 |
---|---|---|---|
基金净值(元) | 2.836 | 2.815 | 2.867 |
期货合约结算价 | 3095.0 | 3069.4 | 3126.2 |
net0=2.768;N=97;F0=3003.6;Q=100000000
net=pd.Series([2.836,2.815,2.867])
F=pd.Series([3095.0,3069.4,3126.2])
for i in range(3):
r=Q*((net[i]/net0)-1)-300*N*(F[i]-F0)#这时用一般收益率公式更合理
print('第{}个交易日套保组合的累积盈亏为{:.2f}'.format(i+1,r))
第1个交易日套保组合的累积盈亏为-203092.60
第2个交易日套保组合的累积盈亏为-216803.12
第3个交易日套保组合的累积盈亏为8929.60
可见最优套保比率的计算不是一劳永逸的,要想获得最佳的套期保值效果,可以考虑建立动态的套保模型比如DCC-GARCH、Copula等。