| 
 | 
 
α 0.01条件下 的合约 从中选取相关性较大的前三对 121408与43409 681409和791409, 681409与851410 进行配对交易。 
  
  
  
策略构建  
以681409与791409为例 做出二者中心化之后的价差 可以看到价差数据在0附近波动 我们设置一定的阈值 例如正负一个 或者两个标准差 
 σ 作为均值回复的区间进而在价差高于给定阈值时即价差值大于σ时做空高价格标的做多低价格标的 而价差值小于 
 −σ时反向操作。 
  
 在实际的操作中不同的品种对应该设置不同的阈值。 
 下面进入策略构建环节strat_pair(id 0, sig 1.8, loss 0.05)  
 具体代码有需要可以私信我:)  
 首先设置参数如下  
 id 合约对的id 在这里我们选出了三个 0, 38, 39  
 sig 为标准差的倍数 将其乘以标准差后作为上下界阈值 如果当前价差值在上界做空 反之做多。 
 loss 止损率 如果当前一笔交易的收益为负 并且其绝对值小于总收益的loss倍数 则平仓止损。 
 分别展示出三对合约的策略的参数以及对应的输出信息 在实际的测试当中当选取sig 1.8 loss 0.03时 发现在三对合约上都有较好的表现 因此本策略具有较强的鲁棒性  
  
回测结果  
Id 0时 strat_pair(id 0, sig 1.8, loss 0.03) 
  
  
 Id 38时  
  
  
 Id 39时  
  
  
  
总结  
此策略在传统的配对交易上加入了止损 同时 在筛选标的对的时候结合了相关性以及协整性 使得筛选出来的标的对更符合配对交易的宗旨 可以看到具有很好的效果。当然有待改进的地方也有几处 例如如何权衡止损率和换手率之间的关系 欢迎小伙伴批评指教  
  
核心代码示例  
def find_pairs(val): 
 clp_data pd.read_csv( min_clp_data.csv ) 
 clp_data.index clp_data[[ date , time ]] 
 close_data clp_data.drop(columns [ date , time ]) 
 sns.heatmap(close_data.corr(), annot True, square True) 
 plt.show() 
 cor close_data.corr() 
 A list() 
 B list() 
 C list() 
 for i in range(len(cor))[1:]: 
 for j in range(i 1, len(cor)): 
 if cor.iloc[i, j] val: 
 A.append(cor.index) 
 B.append(cor.index[j]) 
 C.append(cor.iloc[i, j]) 
 pairs pd.DataFrame([A, B, C], index [ cont1 , cont2 , cor_val ]) 
 return pairs, close_data 
def check_pairs(pairs, close_data): 
 raw list() 
 one_lag list() 
 for i in range(pairs.shape[1]): 
 res1 adfuller(np.diff(close_data[pairs.iloc[0]])) 
 res2 adfuller(np.diff(close_data[pairs.iloc[1]])) 
 if res1[0] res1[4][ 1% ] and res2[0] res2[4][ 1% ]: 
 one_lag.append( 1 ) 
 else: 
 one_lag.append( 0 ) 
 res1 adfuller(close_data[pairs.iloc[0]]) 
 res2 adfuller(close_data[pairs.iloc[1]]) 
 if res1[0] res1[4][ 1% ] and res2[0] res2[4][ 1% ]: 
 raw.append( 1 ) 
 else: 
 raw.append( 0 ) 
 check pd.DataFrame([raw, one_lag], index [ raw_clp , diff_clp ]).T 
 coint_res list() 
 for i in range(pairs.shape[1]): 
 co_val coint(close_data[pairs.iloc[0]], close_data[pairs.iloc[1]]) 
 if co_val[0] co_val[2][2]: 
 coint_res.append(1) 
 else: 
 coint_res.append(0) 
 coint_res pd.DataFrame(coint_res) 
 var coint_res[coint_res[0] 1].index 
 final_pairs pairs[coint_res[coint_res[0] 1].index] 
 return final_pairs 
def strat_pair(id 0, sig 1.8, loss 0.05): 
 pos [0, ] 
 ctlist pd.read_csv( ContractList.csv ) 
 cs0 ctlist[ctlist[ ContractId ] int(pairs[id].iloc[0])][ ContractSize ].iloc[0] 
 cs1 ctlist[ctlist[ ContractId ] int(pairs[id].iloc[1])][ ContractSize ].iloc[0] 
 clp close_data[pairs[id][:2]] 
 jc close_data[pairs[id].iloc[1]] - close_data[pairs[id].iloc[0]] 
 jc_val jc - np.mean(jc) 
 sigma np.std(jc_val) 
 pro list() 
 pro.append(10000) 
 up_val sig * sigma 
 down_val - up_val 
 for i in range(len(jc_val))[1:]: 
 if pos[-1] 0: 
 if jc_val up_val:  
 ret1 (clp.iloc[i - 1, 1] - clp.iloc[i, 1]) * cs1 
 ret0 (clp.iloc[i, 0] - clp.iloc[i - 1, 0]) * cs0 
 pro.append(ret1 ret0) 
 pos.append(-1) 
 elif jc_val down_val:  
 ret1 (clp.iloc[i, 1] - clp.iloc[i - 1, 1]) * cs1 
 ret0 (clp.iloc[i - 1, 0] - clp.iloc[i, 0]) * cs0 
 pro.append(ret1 ret0) 
 pos.append(1) 
 else: 
 pro.append(0) 
 pos.append(0) 
 else: 
 if pos[-1] -1:  
 if jc_val down_val:  
 ret1 (clp.iloc[i - 1, 1] - clp.iloc[i, 1]) * cs1 
 ret0 (clp.iloc[i, 0] - clp.iloc[i - 1, 0]) * cs0 
 if ret1 ret0 0 and abs(ret1 ret0) sum(pro) * loss: 
 pro.append(0) 
 pos.append(0) 
 continue 
 pro.append(ret1 ret0) 
 pos.append(-1) 
 else:  
 ret1 (clp.iloc[i, 1] - clp.iloc[i - 1, 1]) * cs1 
 ret0 (clp.iloc[i - 1, 0] - clp.iloc[i, 0]) * cs0 
 if ret1 ret0 0 and abs(ret1 ret0) sum(pro) * loss: 
 pro.append(0) 
 pos.append(0) 
 continue 
 pro.append(ret1 ret0) 
 pos.append(1) 
 else:  
 if jc_val up_val:  
 ret1 (clp.iloc[i, 1] - clp.iloc[i - 1, 1]) * cs1 
 ret0 (clp.iloc[i - 1, 0] - clp.iloc[i, 0]) * cs0 
 if ret1 ret0 0 and abs(ret1 ret0) sum(pro) * loss: 
 pro.append(0) 
 pos.append(0) 
 continue 
 pro.append(ret1 ret0) 
 pos.append(1) 
 else:  
 ret1 (clp.iloc[i - 1, 1] - clp.iloc[i, 1]) * cs1 
 ret0 (clp.iloc[i, 0] - clp.iloc[i - 1, 0]) * cs0 
 if ret1 ret0 0 and abs(ret1 ret0) sum(pro) * loss: 
 pro.append(0) 
 pos.append(0) 
 continue 
 pro.append(ret1 ret0) 
 pos.append(-1) 
 profit np.cumsum(pro) 
 fig plt.figure() 
 ax plt.subplot(211) 
 ax.plot(profit) 
 ax.set_ylabel( profit ) 
 ax plt.subplot(212) 
 ax.plot(pos) 
 ax.set_ylabel( position ) 
 ax.set_xlabel( t ) 
 p (pairs[id].iloc[0], pairs[id].iloc[1]) 
 return pos, profit, p 
  
代码以及数据链接: https://pan.baidu.com/s/1oRdBkdg9hqf9AppreUFFeA 提取码: i19x 
  
  
 高频交易——当期货配对交易加入了止损 
 高频交易——当期货配对交易加入了止损数据介绍配对交易寻找配对标的相关性协整性策略构建回测结果总结数据介绍我们有38只期货合约的tick级快照数据,每只合约的数据如下:其中的数据时间戳为100纳秒数据,并且开始于0001年1月1日,因此在这里将其转化为现实数据,并转化为分钟数据:最终的每个合约的分钟数据如下,基于此数据进行配对交易。配对交易寻找配对标的目前在配对交易的识别上比较有... 
 复制链接 
 抵扣说明: 
  1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 
 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。 |   
 
 
 
 |