🚀 AI 一键生成 qmt 策略代码

QMT获取历史数据为何出现NaN值?SuspendFlag异常解析

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

问题描述

为什么获取历史数据在没有停牌下会出现部分股票nan值或空值,数据不稳定还是限制?

出现nan值的SuspendFlag为1,实际它没有停牌

解决方案

在 QMT 平台中获取历史数据时,如果遇到未停牌的股票出现 nan 值或空值,且 SuspendFlag 显示为 1(停牌状态),通常不是因为平台的限制或数据源本身不稳定,而是由于本地数据缺失或参数设置不当导致的。以下是具体原因分析及解决方法:

一、 出现 NaN 值及 SuspendFlag 异常的原因

  1. 本地历史数据未补充完整(最常见原因)
    QMT 的历史数据获取函数(如 get_history_dataget_market_data 等)主要依赖于本地客户端缓存的数据。如果您在代码中请求了某只股票在特定时间段的数据,但该数据并未提前下载到本地,QMT 底层在读取不到数据时,会默认该时间段没有交易,从而将其标记为停牌(SuspendFlag=1),并返回 nan 或空值。

  2. skip_paused 参数设置问题
    在调用 get_history_dataget_market_data 时,有一个参数 skip_paused(是否停牌填充)。

    • 如果设置为 False,当遇到本地没有数据的 K 线时,系统不会用前一交易日的数据进行填充,而是直接返回 nan
    • 即使设置为 True,如果该股票在本地完全没有更早的历史数据作为基准来填充,依然会返回 nan
  3. 除权除息或复权数据未更新
    如果您请求的是复权数据(如 dividend_type='front'),但本地的除权除息因子表未更新,可能导致计算复权价格时出现异常空值。

  4. 新股上市或退市时间不匹配
    请求的时间区间包含了该股票尚未上市或已经退市的日期,这些日期的数据自然为空。

二、 解决方法

1. 手动补充本地数据(关键步骤)

在运行策略或回测之前,必须确保本地数据完整:

  • 打开 QMT 客户端,进入 【数据管理】 -> 【补充数据】
  • 选择您策略中需要的市场品种(如沪深A股)以及对应的周期(如日线、1分钟线)。
  • 设定好时间范围,点击下载补充。确保出现 nan 的股票数据已被完整下载。

2. 检查并调整 API 参数

在代码中获取数据时,确保开启了停牌填充功能(通常默认开启,但建议显式声明):

# 使用 get_history_data 时,确保 skip_paused=True
his_data = ContextInfo.get_history_data(100, '1d', 'close', skip_paused=True)

# 推荐使用更稳定的 get_market_data_ex 接口
data = ContextInfo.get_market_data_ex(
    fields=['open', 'high', 'low', 'close'], 
    stock_code=['000001.SZ'], 
    period='1d',
    start_time='20230101', 
    end_time='20231001',
    dividend_type='front', 
    fill_data=True,  # 停牌填充
    subscribe=True   # 开启订阅,确保能拉取到最新数据
)

3. 补充财务及除权数据

如果您使用了复权方式获取数据,请在【数据管理】中同时补充财务数据除权除息数据,以保证复权因子的正确计算。

总结

QMT 出现未停牌股票返回 nanSuspendFlag=1 的现象,90% 以上是因为本地对应周期的 K 线数据缺失。请务必养成在回测或实盘前,通过客户端【数据管理】工具补充完整历史数据的习惯。如果补充数据后仍有问题,建议检查请求的时间区间是否超出了股票的实际存续期。