4.63K 浏览
0

rb2005, 用DataDownloader下载的数据是有21:00:00的,但是回测的时候打印每个分钟k的datetime如下:

可以看到,是没有21:00:00这条k的(也就是日盘收盘)。我个人倾向于回测时少了一条数据。

=============================================

from datetime import date, datetime, timedelta
from contextlib import closing
from tqsdk import TqApi, TqSim, TqAccount, TqBacktest, TargetPosTask
import numpy as np
import pandas as pd
import math
import tqsdk
import time
 SYMBOL_A = "SHFE.rb2005"
 api = TqApi(TqSim(10000), backtest=TqBacktest(
    start_dt=datetime(2019, 12, 1, 8, 0, 0), end_dt=datetime(2020, 1, 11, 16, 0, 0)))
klines_a = api.get_kline_serial(SYMBOL_A, 60)
ticks_a = api.get_tick_serial(SYMBOL_A)
target_pos_a = TargetPosTask(api, SYMBOL_A)
  # 使用with closing机制确保回测完成后释放对应的资源
with closing(api):
     while True:
        api.wait_update()
        if api.is_changing(ticks_a):
            if api.is_changing(klines_a.iloc[-1], "datetime"):
                second_delta = klines_a['datetime'].iloc[-1]/1e9
                time_now = datetime.fromtimestamp(second_delta)
                print(time_now)

west 已回答的问题 2020年1月13日

同样的问题发生在9:00:00,10:30:00,13:30:00,21:00:00等时间

0

解释一下,这个现象是因为,回测是按照所有订阅的serial(即tick及K线)的时间来推进的,只有上期所和原油的serial数据的毫秒时间为5和0,其他交易所的毫秒时间都是不规律的。如DCE.m2005的某条tick的时间为2019-12-02 09:00:42.468000,这个时候,回测时的行情时间就是这个时间。而K线的datetime的毫秒都为0。

所以除了上期所和原油,其他交易所的合约在回测时tick和K线不会同时触发is_changing()函数,即你的嵌套if语句中的代码不会执行或等很久才会执行到一次。

例如,订阅SHFE.rb2005,在if is_changing(tick.iloc[-1])下输出tick的时间,显示为:

tick更新 2019-12-02 09:01:00.500000
tick更新 2019-12-02 09:01:01
tick更新 2019-12-02 09:01:01.500000
tick更新 2019-12-02 09:01:02
tick更新 2019-12-02 09:01:02.500000

———————————————–

订阅DCE.m2005,显示为:

tick更新 2019-12-02 09:01:00.485000
tick更新 2019-12-02 09:01:00.975000
tick更新 2019-12-02 09:01:01.486000
tick更新 2019-12-02 09:01:01.987000
tick更新 2019-12-02 09:01:02.475000
tick更新 2019-12-02 09:01:02.964000

west 已回答的问题 2020年1月13日
0

你好,请问能稳定重现吗,是否方便提供一下能重现回测这个问题的简短代码

lihan 发表新评论 2020年1月13日

已更新。发现还是同时订阅tick和分钟的缘故。我去掉tick的changing判断就正常了。

顺便说一下,换成DCE或者中金的品种,下面这个print根本不会触发,这个问题也请你们注意一下。