问题描述
在回测参数设置的起止时间是 2026-3-5 到 2026-3-6,打印当前 bar 的时间,运行之后日志显示的时间却是 2023-5-23,是什么原因?
解决方案
出现回测参数设置的时间与实际打印的当前 bar 时间不一致,通常是由以下几个原因导致的:
1. 设置了未来的时间(无真实数据)
你设置的回测时间是 2026年,这属于未来的时间。QMT 平台的回测机制是基于历史真实的 K 线行情数据驱动的。由于未来时间没有任何真实的行情数据,回测引擎无法在 2026 年生成 K 线(bar)。
2. 本地数据缺失与引擎回退机制
当回测引擎在指定的时间范围内(如未来的 2026 年)找不到任何数据时,它可能会默认回退并使用你本地数据库中该品种已有的最新一根 K 线数据进行计算。日志中显示的 2023-5-23,很可能就是你本地该品种下载的最后一天的数据日期。
3. 未在“数据管理”中补充数据
即使你设置的是过去的历史时间,如果你没有在 QMT 客户端的“数据管理”中下载对应时间段的数据,回测引擎同样会因为找不到数据而使用本地缓存的旧数据,导致时间对不上。
💡 解决方法
第一步:修改为有效的历史时间
请在策略编辑器的“回测参数”中,将开始时间和结束时间修改为已经发生的历史时间段(例如 2023-01-01 到 2023-05-01)。
第二步:补充历史数据
在 QMT 客户端左侧导航栏找到 【数据管理】 -> 【补充数据】,选择你回测的品种和周期,下载对应时间段的历史数据。
第三步:使用正确的代码打印当前 Bar 时间
在 handlebar 中,可以通过 ContextInfo.get_bar_timetag() 获取时间戳,并用 timetag_to_datetime() 转换格式。标准代码如下:
#coding:gbk
def init(ContextInfo):
# 设置回测股票池
ContextInfo.set_universe(['000001.SZ'])
def handlebar(ContextInfo):
# 获取当前运行到的 K 线索引号
index = ContextInfo.barpos
# 获取当前 K 线对应的时间戳(毫秒)
timetag = ContextInfo.get_bar_timetag(index)
# 将毫秒时间戳转换为标准日期时间格式
bar_time = timetag_to_datetime(timetag, '%Y-%m-%d %H:%M:%S')
# 打印输出
print(f"当前K线索引: {index}, 对应时间: {bar_time}")
按照上述步骤补充数据并修改时间后,再次运行回测,日志中打印的时间就会严格落在你设置的回测时间区间内了。