本文共 2919 字,大约阅读时间需要 9 分钟。
在进行配对交易之前,需要寻找高相关性标的,二者符合如下三种模式均可以通过做多/做空组合实现套利(其本质为均值回归,或者是误差回归)
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.valuescorr_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)# 想关性TOP5top5 = 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.valuescorr_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值最小的top5top5 = 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转载地址:http://whyws.baihongyu.com/