配对交易是20世纪八十年代中期华尔街著名投行Morgan Stanley的数量交易员Nunzio Tartaglia提出的一种基于统计套利的市场中性策略。基本思想是选择两支走势相似的股票进行配对,当两支股票的价差(spread)超过历史均值时,做空高价股,同时做多低价股,目标时当价差回复到均值时赚取收益。笔者一直想尝试用老虎(TIGR)和富途(FUTU)做配对交易,正好趁清明假期验证一下可行性。
1. 避免数据窥探偏见:
配对交易作为配对交易的一种,要避免两个股票的相关性只是数据窥探的结果,未来不可持续。老虎(TIGR)和富途(FUTU)是国内最大的两个港美股交易平台,属于同一行业,且提供的产品和服务相似度很高,在经济学意义上具有稳定的相关关系。
2. 相关性检验:
相关性检验是配对交易的另一重要筛选步骤。首先通过AKShare获取TIGR和FUTU的历史数据。FUTU的上市时间较晚,2019年3月8日才在纳斯达克交易所上市。考虑到上市后短期内波动性较高,我们取3个月后,也就是2019年6月8日至今的历史数据进行统计,计算得到两支股票的相关性为0.96.一般配对交易要求两支股票的相关性至少为0.8,更严格的标准甚至要求达到0.95.从历史数据看从TIGR和FUTU的相关性完全达到了配对交易的标准。
代码如下:
defgetakdata(): tigr = ak.stock_us_daily(symbol="TIGR") futu = ak.stock_us_daily(symbol="FUTU") tigr.to_csv(r"D:/data/tigr.csv") futu.to_csv(r"D:/data/futu.csv") def corcal(): data = pd.DataFrame() tigrfile = r"D:\data\tigr.csv" tigr = pd.read_csv(tigrfile, index_col=0, parse_dates=True)['2019-06-08':] data['tigr'] = tigr['close'] futufile = r"D:\data\futu.csv" futu = pd.read_csv(futufile, index_col=0, parse_dates=True)['2019-06-08':] data['futu'] = futu['close'] data.plot() plt.show() print(data.corr())
3. 协整检验:
配对交易的关键是两支股票价格时间序列满足协整性(cointegration)。理解协整首先要理解协整必须先理解平稳性。平稳性(stationarity)是一个序列在时间推移中保持稳定不变的性质,如果一组时间序列数据是平稳的,那就意味着它的均值和方差保持不变,这种性质在统计分析中很有用。
根据经验,一个股票的时间序列显然不具备平稳性。但是如果两支股票的时间序列和的线性组合是平稳的,我们就说这两个时间序列是协整的,可以做配对交易。一般情况下,两支股票价差的长期均值不是常数,而是随股票价格上涨不对增大,使用股价的对数可避免这一问题。Spread计算公式如下:
代码如下:
def reg(x,y): regr = linear_model.LinearRegression() x_constant = pd.concat([x,pd.Series([1]*len(x),index = x.index)], axis=1) regr.fit(x_constant, y) beta = regr.coef_[0] alpha = regr.intercept_ spread = y - x*beta - alpha return spread def spread(): tigrfile = r"D:\data\tigr.csv" tigr = np.log(pd.read_csv(tigrfile, index_col=0, parse_dates=True)['2019-06-08':]['close']) futufile = r"D:\data\futu.csv" futu = np.log(pd.read_csv(futufile, index_col=0, parse_dates=True)['2019-06-08':]['close']) spread = reg(tigr,futu) spread.plot(figsize=(15, 10)) plt.ylabel('spread') plt.show()
通过历史数据计算得到TIGR和FUTU的对数股价的价差为:
从图上看,TIGR和FUTU的spread似乎是稳定的。下面我们进一步通过统计方法验证。在时间序列分析中,我们通常通过单位根检验(unit root test)来判断一个过程是否是弱平稳的。增强Dickey-Fuller (ADF)测试法是一种常用的单位根检验方法。对上面计算出的spread进行ADF测试的代码如下:
#check if the spread is stationary adf = sm.tsa.stattools.adfuller(spread, maxlag=1) print('ADF test statistic: %.02f' % adf[0]) for key, value in adf[4].items(): print('\t%s: %.3f' % (key, value)) print('p-value: %.03f' % adf[1]) 测试结果为: ADF test statistic: -1.96 1%: -3.445 5%: -2.868 10%: -2.570 p-value: 0.304
很遗憾,测试结果不能拒绝零假设(null hypothesis),无法证明spread序列的稳定性,也就无法证明TIGR和FUTU适合做配对交易。
特别说明,验证的结果只是不能证明TIGR和FUTU适合做配对交易(可能受数据量不足的影响),并不能证明TIGR和FUTU不适合做配对交易。最重要的是本文展示了完整的验证过程,希望能对大家有帮助。
未经允许不得转载:美股开户者 » 用老虎(TIGR)和富途(FUTU)做配对交易行不行