3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant (聚宽) 平台中使用 get_fundamentals 获取财务数据时,如果相邻两天(如 2018-04-01 和 2018-04-02)获取到的数据出现明显差异(一天完整,另一天出现大量缺失值 NaN),通常是由上市公司财报的新披露引起的。
以下是导致该现象的几个核心原因及排查解决方法:
get_fundamentals 在使用 date 参数时,其底层逻辑是获取指定日期(含)之前上市公司最新发布的一期财务报表数据。
NaN。NaN。为了验证是否是因为财报更新导致的缺失,您可以在查询时把财报的统计周期 (statDate) 和 发布日期 (pubDate) 一并查出来对比一下:
from jqdata import *
# 查询您需要的字段,同时加上 statDate
q = query(
valuation.code,
income.statDate, # 财报所属的报告期
income.pubDate, # 财报实际发布日期
income.operating_revenue
).filter(
valuation.code == '000001.XSHE'
)
# 分别打印两天的结果进行对比
df_0401 = get_fundamentals(q, date='2018-04-01')
df_0402 = get_fundamentals(q, date='2018-04-02')
print("4月1日数据:\n", df_0401)
print("4月2日数据:\n", df_0402)
如果发现 statDate 从 2017-12-31 变成了 2018-03-31,或者 pubDate 刚好是 2018-04-02,这就印证了是新财报披露导致的数据缺失。
如果您希望在回测或研究中保持数据的一致性,避免因为新财报披露导致突然的缺失值,可以采取以下方案:
方案一:使用 statDate 明确指定报告期
如果您需要特定季度的完整数据,可以直接放弃 date 参数,改用 statDate 参数(例如 statDate='2017q4')。
注意:在回测中使用 statDate 极易引入未来函数(因为您可能在财报实际发布前就获取到了该数据),请务必谨慎使用,通常仅建议在研究环境中使用。
方案二:数据清洗与前值填充 (Fillna)
在量化策略中,遇到财务数据缺失是常态。建议在获取数据后,使用 Pandas 的 fillna 方法,利用行业均值或该股票的历史前值进行填充:
# 使用前值填充或设为0
df = get_fundamentals(q, date='2018-04-02')
df = df.fillna(method='ffill').fillna(0)
方案三:使用 get_history_fundamentals 获取历史多期数据
使用 get_history_fundamentals 可以一次性获取过去多个季度的财务数据,如果最新一期有缺失,可以在代码逻辑中回退使用上一季度的有效数据。