问题描述
聚宽技术客服小哥哥,你好。我在使用get_fundamentals_continuously获取多日财务数据时遇到一个问题?
即获取市值数据,每天都在更新,是没有问题的。但如果我用get_fundamentals_continuously这个函数读取资产负债表时,count>2就会出现数据重复问题,我看了好几篇文章都没有找到相关解决办法,不知道是没有解决这个问题,还是说用这个函数get_fundamentals就好,如果是这样,那get_fundamentals_continuously在获取其他财务数据时的意义何在。
解决方案
你好!你遇到的这个现象并不是系统的 Bug,而是由财务数据本身的发布机制决定的。
为什么会出现数据重复?
- 更新频率不同:市值数据(
valuation表,如总市值、PE、PB等)是随着每天的股价波动而每日更新的。而三大财务报表(资产负债表balance、利润表income、现金流量表cash_flow)是按季度发布的。 - 函数的查询逻辑:
get_fundamentals_continuously的逻辑是获取指定日期往前count个交易日,每天收盘后能看到的最新财务数据。因为财报几个月才发布一次,所以在两次财报发布日之间的几十个交易日里,你每天去查“最新”的资产负债表,查到的自然都是同一份(即最近一次发布的那份)。因此,当你设置count > 2时,看到连续几天的数据完全一样是非常正常的。
get_fundamentals_continuously 的意义何在?
既然财报数据会重复,为什么还要用这个函数呢?它的核心意义在于时间序列上的截面数据对齐,严格避免未来函数:
- 获取每日变动的估值数据:正如你所说,获取连续多日的 PE、PB、换手率等市值数据时,它是非常高效且必要的。
- 面板数据构建与因子计算:在量化回测中,我们经常需要计算类似
PE / 净利润增长率这样的复合因子。我们需要知道在历史上的每一天,当时的市场参与者能看到的最新净利润是多少。即使连续 60 天净利润数据没变,但 PE 每天在变,这个复合因子每天也在变。这个函数能帮你完美对齐每天的“最新财报”和“最新市值”,防止你用未来的财报数据去计算今天的因子。
如果你想获取历史各期的财报,该怎么做?
如果你不是为了获取每天的截面状态,而是想获取某只股票过去几个季度或几年的历史财报序列(比如想看过去 4 个季度的资产负债表变化),你不应该使用 get_fundamentals_continuously,而应该使用专门为此设计的 API:get_history_fundamentals。
解决方案:使用 get_history_fundamentals
这个函数可以直接按季度(1q)或年度(1y)获取历史财务数据,完美解决你说的“重复”问题。
示例代码:
from jqdata import *
# 获取平安银行过去 4 个季度的资产负债表中的现金及现金等价物
security = ['000001.XSHE']
df = get_history_fundamentals(
security,
fields=[balance.cash_equivalents],
watch_date='2023-10-01', # 观察日期
count=4, # 获取 4 个报告期
interval='1q', # 间隔为 1 个季度
stat_by_year=False
)
print(df)
总结:
- 需要每天的截面状态(包含市值和当时最新的财报,用于计算每日因子) -> 用
get_fundamentals_continuously。 - 需要历史各期的财报序列(用于分析公司基本面趋势) -> 用
get_history_fundamentals。