🚀 AI 一键生成 qmt 策略代码

QMT 回测时 get_market_data_ex 获取 1m 数据异常怎么办?

qmt | 发布时间: 2026/5/21
以下内容由 EasyQuant 生成。

问题描述

获取历史分钟级别的数据拿到的都是当前交易日收盘数据

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 分钟数据,接口可能只会返回内存中缓存的最新行情数据。

解决方法:

  1. 打开 QMT 客户端,点击顶部菜单栏的 【数据管理】
  2. 选择 【补充数据】
  3. 选择你需要回测的市场、品种,周期务必勾选“1分钟线”
  4. 设置好时间范围(覆盖你的回测时间),点击下载。下载完成后重新运行回测。

2. 时间参数格式不正确

get_market_data_ex 接口对 start_timeend_time 的格式有严格要求。必须是字符串格式,且格式为 'YYYYMMDD''YYYYMMDDHHMMSS'

排查方法:
检查你传入的 start_timeend_time 变量:

  • 错误格式:'2023-11-01'datetime 对象。
  • 正确格式:'20231101''20231101093000'

3. 回测模式下的接口调用逻辑

在逐 K 线回测(handlebar)中,如果你想获取当前 K 线及之前的历史数据,通常不需要指定绝对的 start_timeend_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 线。