在进行配对交易之前,需要寻找高相关性标的,二者符合如下三种模式均可以通过做多/做空组合实现套利(其本质为均值回归,或者是误差回归)
y=x+e
y=ax+e
y=ax+b+e
其中,e是正态随机误差项,a,b都是常数项,其实以上三个等式都可以用第三个等式表示,之所以分别列出,是由于目前所见到的大部分策略,其分析模块是没问题的,使用相关性和协整关系判断,但在策略构造过程中,其实只支持第一种情况(也是只是就做多1份标的,同时做空1份标的),这样会使套利效果大打折扣.
发掘高相关性的股票(期货)对,主要2方法,相关和协整,那个效果好一些,本篇文章会进行比对
# 读取数据
all_data = pd.read_csv('./single/data/rq_getprice_000300.XSHG_200901_201212_data.csv')
all_data = all_data.fillna(method='bfill').fillna(method='ffill')
all_data = all_data.dropna(axis=1)
all_data.rename(columns={'Unnamed: 0': 'date'}, inplace=True)
all_data = all_data.set_index('date')
all_data = all_data[all_data.index > '2011-01-01']
pp.pprint('all_data')
pp.pprint(all_data.head())
# 方法1,相关性法
# 计算想关性
corr_df = all_data.corr()
corr_df.loc[:, :] = np.triu(corr_df, 1)
column_list = corr_df.columns.values
corr_pair_list = [(column_list[i], column_list[j], corr_df.values[i, j]) for i in range(0, corr_df.shape[0]) for j in
range(0, corr_df.shape[0]) if abs(corr_df.values[i, j]) > 0.95]
pp.pprint(corr_pair_list)
# 想关性TOP5
top5 = pd.Series([k for i, j, k in corr_pair_list]).apply(abs).sort_values(ascending=False)[:5]
corr_pair_list = [(i, j, k) for i, j, k in corr_pair_list if abs(k) >= top5.iloc[-1]]
pp.pprint(corr_pair_list)
基于相关系数最高top5筛选出的股票对
计算diff,均值,方差和得到上下界,可视化
使用协整关系筛选套利股票对(这部分代码替换上部分代码中相关性计算排序部分即可)
注意:由于协整关系计算非常慢,如果hs300,则需要计算2-2关系300*300/2=45000次计算,太费时,故用相关系数计算top30,在计算协整关系.
# 方法2,pvalue法(相关性协助)
# 获得强协整性股票对(由于协整计算较慢,所以计算前先取得top1/2的相关性关系,在计算协整,减少计算量)
corr_df = all_data.corr()
corr_df.loc[:, :] = np.triu(corr_df, 1)
median = pd.Series(corr_df.values.flatten()).apply(abs).sort_values(ascending=False).values[30]
column_list = corr_df.columns.values
corr_pair_list = [(column_list[i], column_list[j], corr_df.values[i, j]) for i in range(0, corr_df.shape[0]) for j in
range(0, corr_df.shape[0]) if abs(corr_df.values[i, j]) > median]
pp.pprint(corr_pair_list)
coint_pvalue_list = list()
for i, j, k in corr_pair_list:
coint_pvalue_list.append((i, j, sm.tsa.stattools.coint(all_data[i], all_data[j])[1]))
# 取得p值最小的top5
top5 = pd.Series([k for i, j, k in coint_pvalue_list]).sort_values()[:5]
coint_pvalue_list = [(i, j, k) for i, j, k in coint_pvalue_list if k <= top5.iloc[-1]]
pp.pprint(coint_pvalue_list)
corr_pair_list = coint_pvalue_list
筛选出的股票对
价差diff和上下界
整体看上面结果都很不错,基本上误差都分布在mean+/- 1*std,只要价格有回归趋势,就可以通过价买入组合高价卖出组合进行套利.并且可以屏蔽系统性风险(要求持有期二者协整关系依然保持)
二者比较的化,更倾向于协整关系,留意到协整关系最后得到diff其实更为"杂乱",更符合随机分布,而相关关系得到的残差diff内部依然存在弱的趋势倾向.
参考:
统计套利(一)利用相关系数进行配对交易
https://www.ricequant.com/community/topic/2039/
统计套利(二),利用协整关系进行配对交易
https://www.ricequant.com/community/topic/2053/
统计套利(三)自动寻找协整股票对
https://www.ricequant.com/community/topic/2408/#share-source-code_content_13561_1278376
配对交易(Paper Version)
https://www.ricequant.com/community/topic/51
配对交易
https://www.ricequant.com/community/topic/849/%E9%85%8D%E5%AF%B9%E4%BA%A4%E6%98%93/3
统计套利 配对交易 第二集
https://uqer.io/v3/community/share/582b2431228e5b9c85a59585