🚀 AI 一键生成 qmt 策略代码

QMT调用get_financial_data返回全NaN怎么办?

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

问题描述

get_financial_data返回全NAN,财务数据已经提前下载过

我先是手动下载财务数据
data = ContextInfo.get_financial_data(['ASHAREBALANCESHEET.fix_assets'], ['300679.SZ'], '20240801', '20241120')
print(data)

输出
请问是何原因?

解决方案

在 QMT 平台中调用 ContextInfo.get_financial_data 获取财务数据时返回全 NaN,通常是由查询时间范围与财报发布机制不匹配参数设置不当引起的。即使已经下载了财务数据,也需要注意以下几个关键点:

1. 核心原因:report_type 参数与时间范围不匹配

get_financial_data 函数有一个可选参数 report_type,它的默认值是 'announce_time'(按公告日取数)。

  • 按公告日 (announce_time):只有在您设定的时间范围(2024080120241120)内,该股票刚好发布了财报公告,才能取到数据。如果该股票在 8 月 1 日前发布了中报,且在 11 月 20 日后才发布三季报(或者三季报发布日刚好没被包含),那么在这个区间内就没有公告记录,从而返回全 NaN
  • 按报告期 (report_time):按财报的截止日期取数(如一季报 0331,中报 0630,三季报 0930,年报 1231)。

2. 解决方法

方法一:将 report_type 改为 'report_time' 并对齐财报日期

如果您想获取特定季度的财务数据,建议按报告期查询,并将时间范围包含标准的财报截止日(例如 2024 年三季报截止日为 20240930)。

def handlebar(ContextInfo):
    # 扩大时间范围,并指定 report_type='report_time'
    data = ContextInfo.get_financial_data(
        fieldList=['ASHAREBALANCESHEET.fix_assets'], 
        stockList=['300679.SZ'], 
        startDate='20240630',  # 包含中报
        endDate='20240930',    # 包含三季报
        report_type='report_time'
    )
    print(data)

方法二:扩大按公告日查询的时间范围

如果您坚持使用默认的 'announce_time',请将时间范围扩大,确保涵盖了该股票发布财报的实际日期(例如扩大到过去一年)。

def handlebar(ContextInfo):
    # 扩大时间范围以确保捕获到公告日
    data = ContextInfo.get_financial_data(
        fieldList=['ASHAREBALANCESHEET.fix_assets'], 
        stockList=['300679.SZ'], 
        startDate='20230101', 
        endDate='20241120'
    )
    print(data)

3. 其他排查建议

  1. 确认数据下载是否完整:在 QMT 客户端的【数据管理】->【补充数据】中,确保勾选了“财务数据”,并且下载的时间范围覆盖了您查询的区间。
  2. 检查字段是否存在:某些公司可能在特定季度没有披露某项具体的财务指标(例如某些轻资产公司固定资产可能为空),您可以尝试同时查询一个通用字段(如 CAPITALSTRUCTURE.total_capital 总股本)来交叉验证是否是单字段缺失的问题。
  3. 注意 Pandas 版本:QMT 返回的是 Pandas 数据结构(Series、DataFrame 或 Panel),请确保您的代码逻辑正确处理了这些数据结构中的 NaN 值。