问题描述
隆基股份昨晚公布了2020年报和2021季报,通过
df = get_fundamentals(query(
indicator.roe, #净资产收益率ROE(%)
indicator.pubDate #财报公布日期
).filter(
valuation.code=='601012.XSHG'
),date='2021-4-21')
print(df)
返回的是2020三季报的数据:
roe pubDate
0 6.99 2020-10-31
而通过JQDataSDK可以获取2021年一季报,但2020的年报数据则没有,是哪里出问题?
解决方案
您好!在使用 JoinQuant 的 get_fundamentals 函数获取财务数据时,遇到最新公布的年报或季报获取不到的情况,通常是由以下几个原因造成的:
1. 数据更新的延迟(T+1 机制)
上市公司“昨晚”公布的财报,交易所和各大行情数据源需要进行数据的清洗、核对和入库。聚宽的数据通常会在收盘后进行处理,并在 T+1(第二天)的凌晨或更晚些时候 更新完毕。如果您在 4月21日 白天使用 date='2021-04-21' 去查询昨晚刚公布的财报,数据库中可能尚未完成更新,因此系统会返回它在当时能看到的最新一期财报(即 2020 年三季报)。
2. date 参数与 statDate 参数的区别
在 get_fundamentals 中,date 和 statDate 的查询逻辑是不同的:
date参数:查询指定日期收盘后所能看到的最近一个单季度的数据。为了避免未来函数,它严格按照财报实际披露日期(pubDate)来回溯。statDate参数:直接指定财报统计的季度或者年份(例如'2020'或'2021q1')。
3. 为什么 JQDataSDK 能查到一季报却没有年报?
当您不指定 statDate 而是依赖默认逻辑或 date 时,系统默认返回的是单季度数据。对于年报,利润表和现金流量表等流量表,系统存储的是第四季度(q4)的单季数据,而不是全年的累计数据。如果您想明确获取 2020 年全年的年报数据,必须使用 statDate 参数。
解决方案:使用 statDate 精确获取
如果您明确知道财报已经公布,并且想要获取特定年份或季度的财报,建议直接使用 statDate 参数,而不是 date 参数。
获取 2020 年年报数据的代码示例:
df_2020_annual = get_fundamentals(query(
indicator.roe,
indicator.pubDate
).filter(
valuation.code == '601012.XSHG'
), statDate='2020') # 指定获取2020年报
print("2020年报数据:\n", df_2020_annual)
获取 2021 年一季报数据的代码示例:
df_2021_q1 = get_fundamentals(query(
indicator.roe,
indicator.pubDate
).filter(
valuation.code == '601012.XSHG'
), statDate='2021q1') # 指定获取2021年一季报
print("2021年一季报数据:\n", df_2021_q1)
总结建议:
在进行历史回测时,使用 date 参数是非常好的习惯,因为它可以严格防止未来函数。但在进行投研分析或明确需要某期财报时,使用 statDate 会更加直接和准确。如果遇到刚公布的财报查不到,建议等待数据源 T+1 更新后再试。