问题描述
如题,今天的代码只能返回一条记录,前些天一直都很正常。
代码很简单,如下:
q = jq.query(jq.balance).filter(jq.balance.code=='000651.XSHE')
df = jq.get_fundamentals(q)
df
解决方案
您好!出现 get_fundamentals 只返回一条记录的情况,是由于该 API 的默认查询机制决定的。
原因分析
根据 JoinQuant 的 API 文档,get_fundamentals(query_object, date=None, statDate=None) 函数主要用于获取截面数据。
当您没有传入 date 或 statDate 参数时:
- 在研究环境中,
date默认取平台的最新日期(通常是昨天)。 - 在回测环境中,
date默认取context.current_dt的前一天。
这意味着,系统会返回在默认日期这一天,该股票所能看到的最新一期财务报表数据。因为您只查询了 '000651.XSHE' 这一只股票,所以自然只会返回最新的一条记录。
解决方法
如果您希望获取该股票历史多个季度或年度的财务数据,建议使用以下几种方法:
方法一:使用 get_history_fundamentals (推荐)
这是专门用于获取多个季度/年度历史财务数据的 API,使用起来非常方便。
from jqdata import *
# 获取格力电器过去 5 个季度的资产负债表数据
df = get_history_fundamentals(
security='000651.XSHE',
fields=[balance.total_assets, balance.total_liability], # 填入您需要的具体字段
stat_date='2023q3', # 指定结束的报告期
count=5, # 获取 5 个报告期
interval='1q', # 间隔为 1 个季度
stat_by_year=False
)
print(df)
方法二:使用 get_fundamentals_continuously
如果您想按交易日连续获取多天的财务数据(例如每天的市值、PE等),可以使用此函数。
q = query(balance).filter(balance.code == '000651.XSHE')
# 获取过去 5 个交易日每天能看到的最新财务数据
df = get_fundamentals_continuously(q, end_date='2023-10-31', count=5, panel=False)
print(df)
方法三:循环传入 statDate
如果您坚持使用 get_fundamentals,可以通过列表推导式或循环,传入不同的季度参数(如 '2022q1', '2022q2')。
q = query(balance).filter(balance.code == '000651.XSHE')
# 获取 2022 年四个季度的资产负债表
rets = [get_fundamentals(q, statDate='2022q'+str(i)) for i in range(1, 5)]
import pandas as pd
df_all = pd.concat(rets)
print(df_all)
总结:get_fundamentals 默认就是获取单期截面数据的。如果您之前感觉“正常”返回了多条,可能是因为之前查询时没有加 .filter(code=='...') 从而返回了全市场所有股票的截面数据(多条记录),或者使用了其他的 API。