🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant 平台 get_fundamentals() 获取历史财务数据限制及正确用法

joinquant | 发布时间: 2026/6/4
以下内容由 EasyQuant 生成。

问题描述

get_fundamentals()

get_fundamentals() 历史回测时只能获取4个月的财务数据?

解决方案

问题解答

在 JoinQuant(聚宽)平台中,get_fundamentals() 函数的设计初衷是获取指定日期(横截面)的财务数据快照,而不是获取时间序列上的历史连续数据。如果您在回测中发现只能获取到最近几个月(或几个季度)的数据,通常是因为对该函数的机制存在误解,或者使用了错误的 API。

为什么会产生“只能获取4个月数据”的错觉?

  1. 横截面数据特性get_fundamentals(query_object, date=None, statDate=None) 默认返回的是在 date 这一天能看到的最新一期财务报表数据。因为财报是按季度发布的(一年4份),它只会返回距离该日期最近的那一份财报数据,而不是过去几个月的连续数据。
  2. 回测中的 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 的数据),否则会导致未来函数报错或获取到空值。