问题描述
hist_data = ContextInfo.get_market_data_ex(
fields=[],
stock_code=[stock_code],
period='1m',
count=-1,
start_time=start_time,
end_time=end_time,
# fill_data=True,
)
在回测系统中我回测 2025-11-01 到 2025-11-03 号数据,1m 级别数据只能拿到当前收盘价数据为什么,而且历史时间内的数据都是为当前交易日今天收盘价数据。是不能这样用吗?
解决方案
在 QMT 平台的回测系统中使用 ContextInfo.get_market_data_ex 获取历史分钟(1m)数据时,如果发现拿到的全是当前交易日的最新收盘价,通常是由以下几个原因导致的。请按照以下步骤进行排查和修改:
1. 本地未补充历史分钟数据(最常见原因)
QMT 平台在回测和运行策略时,依赖本地下载的历史数据。如果本地没有你所请求时间段的 1 分钟数据,接口可能只会返回内存中缓存的最新行情数据。
解决方法:
- 打开 QMT 客户端,点击顶部菜单栏的 【数据管理】。
- 选择 【补充数据】。
- 选择你需要回测的市场、品种,周期务必勾选“1分钟线”。
- 设置好时间范围(覆盖你的回测时间),点击下载。下载完成后重新运行回测。
2. 时间参数格式不正确
get_market_data_ex 接口对 start_time 和 end_time 的格式有严格要求。必须是字符串格式,且格式为 'YYYYMMDD' 或 'YYYYMMDDHHMMSS'。
排查方法:
检查你传入的 start_time 和 end_time 变量:
- 错误格式:
'2023-11-01'或datetime对象。 - 正确格式:
'20231101'或'20231101093000'。
3. 回测模式下的接口调用逻辑
在逐 K 线回测(handlebar)中,如果你想获取当前 K 线及之前的历史数据,通常不需要指定绝对的 start_time 和 end_time,而是利用 count 参数向前取数据。如果指定了未来的时间或未生效的时间,可能会导致取数异常。
推荐的回测取数写法:
在 handlebar 中,如果你想获取当前时间点往前推的 N 根 1 分钟 K 线,建议将 end_time 留空(默认以当前回测到的 K 线时间为准),并设置 count。
def handlebar(ContextInfo):
stock_code = '000001.SZ'
# 获取当前回测时间点往前推 100 根 1 分钟 K 线
hist_data = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close', 'volume'],
stock_code=[stock_code],
period='1m',
count=100, # 向前取 100 根
start_time='', # 留空
end_time='', # 留空,默认以当前回测到的 bar 时间为截止
dividend_type='front', # 建议设置复权方式
subscribe=False # 回测获取历史数据不需要订阅
)
if stock_code in hist_data:
df = hist_data[stock_code]
print(df)
4. 检查回测主图周期
如果你在策略编辑器的“基本信息”中设置的主图周期是“日线(1d)”,但在代码中强行获取 1m 数据,虽然接口支持跨周期获取,但必须确保 1m 数据已经下载。如果主图是日线,end_time 留空时,获取到的 1m 数据截止时间是该日线的收盘时间。
总结
你遇到的现象 90% 是因为没有在“数据管理”中下载对应品种的 1 分钟历史数据。请先去下载数据,然后确保时间字符串格式为 'YYYYMMDD',即可正常获取到历史分钟 K 线。