问题描述
我先是手动下载财务数据
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):只有在您设定的时间范围(20240801到20241120)内,该股票刚好发布了财报公告,才能取到数据。如果该股票在 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. 其他排查建议
- 确认数据下载是否完整:在 QMT 客户端的【数据管理】->【补充数据】中,确保勾选了“财务数据”,并且下载的时间范围覆盖了您查询的区间。
- 检查字段是否存在:某些公司可能在特定季度没有披露某项具体的财务指标(例如某些轻资产公司固定资产可能为空),您可以尝试同时查询一个通用字段(如
CAPITALSTRUCTURE.total_capital总股本)来交叉验证是否是单字段缺失的问题。 - 注意 Pandas 版本:QMT 返回的是 Pandas 数据结构(Series、DataFrame 或 Panel),请确保您的代码逻辑正确处理了这些数据结构中的
NaN值。