用老虎(TIGR)和富途(FUTU)做配对交易行不行

配对交易是20世纪八十年代中期华尔街著名投行Morgan Stanley的数量交易员Nunzio Tartaglia提出的一种基于统计套利的市场中性策略。基本思想是选择两支走势相似的股票进行配对,当两支股票的价差(spread)超过历史均值时,做空高价股,同时做多低价股,目标时当价差回复到均值时赚取收益。笔者一直想尝试用老虎(TIGR)和富途(FUTU)做配对交易,正好趁清明假期验证一下可行性。

1. 避免数据窥探偏见:

配对交易作为配对交易的一种,要避免两个股票的相关性只是数据窥探的结果,未来不可持续。老虎(TIGR)和富途(FUTU)是国内最大的两个港美股交易平台,属于同一行业,且提供的产品和服务相似度很高,在经济学意义上具有稳定的相关关系。

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不适合做配对交易。最重要的是本文展示了完整的验证过程,希望能对大家有帮助。

发表评论

邮箱地址不会被公开。 必填项已用*标注