在TqSdk 1.2.0版本中,我们希望向大家着重介绍一下 get_kline_serial() 中新增的多合约K线同时订阅功能。
这个时候有同学可能就会问了,我之前版本中也可以分批使用几次get_kline_serial()传输进入不同的合约代码来获取K线,那这个功能有什么具体的好处呢?
具体我们认为有以下两个优点:
第一点,代码更简洁优美
以示例钢厂利润套利策略为例,以前我们订阅螺纹钢,铁矿石,焦炭期货合约行情,我们需要这样去写
klines_rb = api.get_kline_serial(SYMBOL_rb, 86400) klines_i = api.get_kline_serial(SYMBOL_i, 86400) klines_j = api.get_kline_serial(SYMBOL_j, 86400)
而现在我们只需要一行代码即可
klines = api.get_kline_serial([SYMBOL_rb,SYMBOL_i,SYMBOL_j], 86400)
然后主合约的字段名为原始K线数据字段,从第一个副合约开始,字段名在原始字段后加数字,如第一个副合约的开盘价为 “open1” , 第二个副合约的收盘价为 “close2″。
第二点,K线是更加严格意义上的时间对齐
举例来说,螺纹钢的夜盘时间是21:00-23:00,焦炭和铁矿石的交易时间是21:00—23:30,如果我们用日线的收盘价做相减那么是正确的日线时间对齐,但是如果我们订阅的是5min K线然后做的相减,就会造成时间差错位比如在23.25分的以下代码,就是螺纹钢在23.00时的收盘价减去23.25min 焦炭和铁矿石的收盘价
index_spread = klines_rb.close - 1.6 * klines_i.close - 0.5 * klines_j.close
在我们更新K线多合约品种后能有效的避免这个问题,它会遵循以下法则:
- 每条K线都包含了订阅的所有合约数据,即:如果任意一个合约(无论主、副)在某个时刻没有数据(即使其他合约在此时有数据), 则不能对齐,此多合约K线在该时刻那条数据被跳过,现象表现为K线不连续(如主合约有夜盘,而副合约无夜盘,则生成的多合约K线无夜盘时间的数据)。
- 若设置了较大的序列长度参数,而所有可对齐的数据并没有这么多,则序列前面部分数据为NaN(这与获取单合约K线且数据不足序列长度时情况相似)。
- 若主合约与副合约的交易时间在所有合约数据中最晚一根K线时间开始往回的 8964*周期 时间段内完全不重合,则无法生成多合约K线,程序会报出获取数据超时异常。
即时间严格对齐,用该价差序列可以更准确提供我们想要的信息
index_spread = klines.close - 1.6 * klines.close1 - 0.5 * klines.close2
同时需要注意的是,目前多合约K线订阅功能暂不支持回测,若在回测时获取多合约K线,程序会报出获取数据超时异常。