问题描述
调用 api:
get_raw_financial_data
取得的数据里边有总股本,CAPITALSTRUCTURE.total_capital
取出来的数据里有好多是空的。
这是咋回事?
时间是 20241231
解决方案
在 QMT 平台中调用财务数据接口(如 ContextInfo.get_financial_data)获取总股本(CAPITALSTRUCTURE.total_capital)时遇到大量空值,通常是由以下几个原因导致的。特别是针对 20241231 这个时间点,有其特殊性。
1. 财报发布的时间差(最常见原因)
财务数据是基于上市公司的定期报告(季报、半年报、年报)更新的。2024年12月31日是 2024 年年报的报告期截止日,但上市公司的年报实际公告日期通常在次年的 1月到4月底 之间。
QMT 的 get_financial_data 接口中有一个重要参数 report_type:
- 默认值
announce_time(按公告期取数):如果你查询的时间段是 20241231 附近,而此时大部分公司还没有发布年报,系统按公告时间去查,自然取不到 2024 年报的数据,从而返回空值。 report_time(按报告期取数):如果你想明确获取 2024 年报(即报告期为 20241231)的数据,需要将参数显式设置为report_time。但前提是该公司的年报已经发布且数据已更新到本地。
2. 本地财务数据未补充
QMT 的财务数据接口是读取本地数据的。如果你的客户端没有下载最新的财务数据,即使公司已经发布了财报,你也无法通过代码获取到。
解决方法:
在 QMT 客户端界面,点击菜单栏的 操作 -> 数据管理 -> 补充数据,勾选“财务数据”,选择你需要的时间范围进行下载补充。
3. 接口调用参数设置建议
为了避免取不到数据,建议在调用时明确指定 report_type,并确保查询的时间范围内有数据。以下是正确的调用示例:
def handlebar(ContextInfo):
# 准备参数
fieldList = ['CAPITALSTRUCTURE.total_capital']
stockList = ['600000.SH', '000001.SZ']
startDate = '20241231'
endDate = '20241231'
# 方式一:按报告期取数(推荐用于获取特定财报季的数据)
# 注意:如果此时年报尚未发布,即使按报告期查也可能为空
df_report = ContextInfo.get_financial_data(fieldList, stockList, startDate, endDate, report_type='report_time')
print("按报告期查询结果:\n", df_report)
# 方式二:按公告期取数(默认方式,适合模拟实盘时的信息流)
# 如果要获取最新股本,建议将 endDate 设置为当前日期,startDate 往前推一段时间
df_announce = ContextInfo.get_financial_data(fieldList, stockList, '20240101', '20241231', report_type='announce_time')
print("按公告期查询结果:\n", df_announce)
4. 其他可能的原因
- 股票状态:你查询的
stockList中可能包含了在 20241231 尚未上市的新股,或者已经退市的股票。 - 字段名称:确保字段名拼写完全正确,总股本的正确字段为
CAPITALSTRUCTURE.total_capital。
总结建议:
首先去 QMT 的“数据管理”里手动补充最新的财务数据。其次,理解 announce_time 和 report_time 的区别,如果是做历史回测,建议使用 announce_time 以避免未来函数;如果是单纯想看 2024 年底的股本截面数据,且数据已发布,请使用 report_time。