全名应该是商品期货主力合约切换导致的Bug记录

品种:商品期货 rb

回测数据:tb提取的分钟线

实时数据:ctp获取

Bug描述:策略当中需要一段时间的历史数据进行指标计算,主力切换导致这段历史数据里面含有两份合约的数据,分别是rb1901和rb1905,这两个合约于20181128 21:00切换,价差竟然达到了300点左右,以当时rb1901 3700的价格,也达到了8%,导致指标计算的误差非常大,开了错单。

很早前就知道这个问题的存在,但是一直没有动力去调整,一直用策略的鲁棒性安慰着自己。但是这次的切换价差到达了8%,还开了错单,没有这么考验鲁棒性的,还是打算修复一下。

我是先改的线上策略,线上策略的主力切换数据从新浪财经网站上获取。

线上修改方案:以该bug为例子,主力切换后我在rb1905上进行交易,把rb1901的OHLC数据全部减去300点的价差,这个300是20181128 15:00(rb1901) 和 20181128 21:00(rb1905)的价差。也叫左侧价差调整。

但是交易了几单全部都在亏损,发现有点问题,忽然想到有问题,虽然还没有达到下架策略的条件,但是也有点奇怪。后来发现是回测的问题,我的回测优化是在主力切换价差未做调整的情况下做的,现在实盘又是调整后的数据。。。。。。

为什么要用tb的数据呢?其实我是有tick数据的,以前尝试过清洗一次,发现早期的数据问题太多了就一直没弄,个人量化者就是啥都得干。就直接提取tb的分钟线,质量还行又方便,为了节省时间嘛, 所以这次还是在tb的数据上做文章。

回测修改方案

找出tb主连合约分钟线的切换点 在指标计算的价格buffer中进行左侧价差调整 给策略发信号让策略在切换的前半个小时就平仓而且暂停交易,切换后再重新开启交易

* 找出tb主连合约分钟线的切换点

一个相对好点的办法去识别就是持仓量的变化,因为大部分的主力切换规则都与持仓量相关,比如:次主力的持仓量在某一天大于主力的持仓量后,第二天进行切换。但是每个公司的规则都不一样,我对比过新浪财经上的切换时间和tb的就不一样,所以我觉得最后还是得把自己的数据搞全,这样回测和实盘都用自己的主力切换规则,这样才是最好的。

我发一张tb分钟线的图就一目了然了

rb888 分钟线

这次tb数据的切换比新浪财经的晚一天。红线上面和红线下面就是切换前后的数据,变化最明显的就是最后一列数据:持仓量

所以我设置了一个阀值,把持仓量变化大于了这个阀值的点就当做主力切换点,当然这个是近似值,出来的结果我都人工review了的。

看看我找出来的rb的主力切换时间列表:

switch_time_list = [
        "20090720_0900", "20090810_0900", "20090901_0900", "20091012_0900", "20091110_0900", "20091201_0900",
        "20100309_0900", "20101014_0900",
        "20110210_0900", "20110808_0900", "20111103_0900",
        "20120302_0900", "20120712_0900", "20121023_0900",
        "20130219_0900", "20130704_0900", "20131031_0900",
        "20140305_0900", "20140708_0900", "20141021_0900",
        # 夜盘开始
        "20150311_2100", "20150720_2100", "20151104_2100",
        "20160311_2100", "20160817_2100", "20161125_2100",
        "20170322_2100", "20170807_2100", "20171108_2100",
        "20180328_2100", "20180816_2100", "20181129_2100",
    ]

2和3应该不复杂,我是用的vnpy,我是在ArrayManager和BarManager中做了调整,很快就能实现。

这个bug修改了之后,重新做一次回测优化,发现参数变得还不少,看来这个bug对回测准确性的影响确实不小。

我把主力切换数据和寻找切换时间的代码放在了github上,暂时只有rb的数据,如有需要的朋友可以直接使用,也希望有兴趣的朋友可以新增其他品种的数据。

mhxueshan/dominant_contract_switch