4.74K 浏览
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日
您正在查看2个答案中的1个,单击此处查看所有答案。