问题描述
get_fundamentals() 历史回测时只能获取4个月的财务数据?
解决方案
问题解答
在 JoinQuant(聚宽)平台中,get_fundamentals() 函数的设计初衷是获取指定日期(横截面)的财务数据快照,而不是获取时间序列上的历史连续数据。如果您在回测中发现只能获取到最近几个月(或几个季度)的数据,通常是因为对该函数的机制存在误解,或者使用了错误的 API。
为什么会产生“只能获取4个月数据”的错觉?
- 横截面数据特性:
get_fundamentals(query_object, date=None, statDate=None)默认返回的是在date这一天能看到的最新一期财务报表数据。因为财报是按季度发布的(一年4份),它只会返回距离该日期最近的那一份财报数据,而不是过去几个月的连续数据。 - 回测中的 date 默认值:在回测中,如果不传入
date参数,默认值是context.current_dt的前一天。这意味着它总是随着回测时间的推进,动态获取当时的最新财报。
正确获取历史连续财务数据的方法
如果您需要获取某只股票过去多个季度或多个年度的历史财务数据,应该使用以下两个专门的时间序列财务数据 API:
1. 使用 get_history_fundamentals()(推荐)
该函数专门用于获取多个季度/年度的三大财务报表和财务指标数据。
优势:可以直接指定获取过去 count 个季度(或年度)的数据,非常适合做时间序列的财务分析。
代码示例:
from jqdata import *
def initialize(context):
g.security = ['000001.XSHE']
run_daily(market_open, time='09:30')
def market_open(context):
# 获取平安银行过去5个季度的营业总收入和现金等价物
df = get_history_fundamentals(
g.security,
fields=[balance.cash_equivalents, income.total_operating_revenue],
watch_date=context.current_dt.date(),
count=5,
interval='1q',
stat_by_year=False
)
print(df)
2. 使用 get_fundamentals_continuously()
如果您需要获取连续多个交易日的财务衍生数据(如每天更新的市盈率 PE、市净率 PB、总市值等),应使用此函数。
代码示例:
from jqdata import *
def market_open(context):
# 查询平安银行过去5个交易日的换手率和总市值
q = query(valuation.turnover_ratio, valuation.market_cap).filter(valuation.code.in_(['000001.XSHE']))
# 获取连续5天的数据
df = get_fundamentals_continuously(q, end_date=context.previous_date, count=5, panel=False)
print(df)
总结与注意事项
- 单日截面选股:使用
get_fundamentals()。 - 多期财报分析(如过去4个季度的净利润):使用
get_history_fundamentals()。 - 连续多日估值指标(如过去10天的PE):使用
get_fundamentals_continuously()。 - 避免未来函数:在回测中,尽量依赖系统默认的
date(即context.previous_date)或watch_date,避免手动传入未来的statDate(如在2015年1月强行请求2015q1的数据),否则会导致未来函数报错或获取到空值。