接上一篇期货套利策略,随着对期货套利策略的深入了解,我发现套利策略不是那么好做的。下面将会讲碰到的一些问题。
上一篇文章中没有考虑滑点的问题,这里我们把滑点问题考虑进去。这里先说一些天勤api的买入点,天琴的买入点是当前K线的收盘价。碰到数据传输问题,还有计算等各方面问题,实际情况是无法在当前K线的收盘价买入的。这里我们把这方面问题考虑进去,利用api.wait_update()调到下一个k线数据处理,这样我们的交易点就延后一段时间了。
核心代码如下:
while now1 == now2:
api.wait_update()
now2 = datetime.datetime.strptime(quote1.datetime, "%Y-%m-%d %H:%M:%S.%f") # 当前quote的时间
# print(now1, now2)
# print(klines1['close'].iloc[-1], klines1['open'].iloc[-1])
target_pos1.set_target_volume(-1)
target_pos2.set_target_volume(1)
结果:
套利品种:‘SHFE.cu1901’和‘SHFE.cu1902’。
回测时间:2018年2月1日至2018年5月1日。
回测及套利规则:每隔30秒获取一次k线数据。我计算了历史2000个收盘价的价差1%、15%、40%、60%、85%以及99%分位数。当价差大于85%分位数并且小于99%分位数,做空‘SHFE.cu1901’,做多‘SHFE.cu1902’;当价差大于1%分位数并且小于15%分位数,做多‘SHFE.cu1901’,做空‘SHFE.cu1902’;当价差大于99%分位数或小于1%分位数,止损平仓;当价差在40%至60%之间,止盈平仓。
回测结果:
总收益率:6.66%,年化收益率:10.74%,年化夏普率:10.74,最大回测0.43%。
结果分析:
看到这个结果,我一开始有点激动。因为我把数据获取及计算的时间差都考虑进去,并且策略还能赚钱,回撤也小。但仔细一研究,并不是这样的,我们看下面这个交易情况(大多数情况都是下面这种情况)。下图是做空,但其实在那个点实际情况没有任何成交量(图片的下半截是成交量),也就是说实际情况我们可能不能在理想的价格买入或卖出,可能当前挂着的最高买单价格与我们做空价格相差几块或几十块钱,而我们的套利策略赚的就是那几块钱或几十块钱。也就是说,实际情况可能面临无法在理想价格做多或做空。
其实上述这个问题主要是因为成交量太小的缘故,那如果我挑选一个成交量多的品种或者成交量多的时间会是一个什么样的情况呢。
结果2:
套利品种:‘SHFE. cu2003’和‘SHFE. cu2004’。
回测时间:2020年1月1日至2020年3月1日。
回测结果:
总收益率:-33.79%,年化收益率:-99.83%,年化夏普率:-12.57,最大回测33.79%。
结果分析:
那产生的原因是什么呢?看下面这幅成交图。我们的成交时间和获取数据点相差了1个K线时间,但这一个K线时间里价格发生了一些波动(我们的套利策略赚的就是波动的钱),这个波动导致我们无法正确的估计价差,因此持续亏钱。其实也有一些可能是因为市场有其他机构或散户在做套利策略,大家都在博弈谁的成交时间快。还有一个原因就是手续费问题,比如正常价差波动范围时40-60之间,每次交易手续费10元,这样一算每次套利将耗费40元手续费(做空20元,做多20元),如果要盈利就必须满足价差在0以下或100以上,而这种行情能碰到概率比较低。
小结:
以上就是我个人在实现套利策略时候碰到的一些问题。个人认为解决方案就是加大套利策略开仓的限制,比如价差大于95%分位数开仓等。
我试了下限制了策略的开仓,确实能盈利但是这个开仓时机很少,可能几天一次。
对量化、数据挖掘、深度学习感兴趣的可以关注公众号,本人不定期分享有关这些方面的研究。
个人知乎:
https://www.zhihu.com/people/e-zhe-shi-wo/activities