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

JoinQuant 财务环比与同比分析:get_history_fundamentals API 的 interval 参数详解

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 财务环比分析:get_history_fundamentals 的 interval 参数详解

Question: 如何在 joinquant 中获取同比或环比的多期历史财务报表?

解决方案

JoinQuant 财务环比与同比分析:get_history_fundamentals API 的 interval 参数详解

在量化选股策略中,上市公司的财务指标变化趋势(如营业收入增长率、净利润环比增长等)是极具价值的因子。JoinQuant(聚宽)提供了 get_history_fundamentals 函数,方便投资者一次性获取跨多个季度或年度的历史财务报表数据。


1. 函数 API 核心参数介绍

get_history_fundamentals 函数的主要参数定义如下:

get_history_fundamentals(security, fields, watch_date=None, stat_date=None, count=1, interval='1q', stat_by_year=False)
  • security: 股票代码或股票代码列表(例如 '000001.XSHE'['000001.XSHE', '600000.XSHG'])。
  • fields: 查询的财务数据字段列表(包含 balance, cash_flow, income, indicator 等表字段)。
  • watch_date: 观察日期。若指定,则返回该日期前(含)已发布的最新报表数据(有效避免未来函数)。
  • stat_date: 统计报告期(如 '2023q1''2022')。watch_datestat_date 必须且只能指定一个。
  • count: 查询历史报告期的数量。
  • interval: 关键参数,指定报告期的间隔:
    • '1q': 间隔一个季度。常用于环比分析或连续季度推移。
    • '1y': 间隔一年。常用于同比分析(如比较连续数年同季度的表现)。
  • stat_by_year: 是否返回年报数据(Boolean)。若为 Trueinterval 必须为 '1y'

2. 环比与同比查询实现逻辑

2.1 财务环比分析 (interval='1q')

若要分析连续季度的财务趋势(如连续 4 个季度的营业收入变化):

# 获取 2023Q1 及之前连续 4 个季度的财务数据 (2022Q2, 2022Q3, 2022Q4, 2023Q1)
df_q = get_history_fundamentals(
    security=['000001.XSHE'],
    fields=[income.total_operating_revenue, income.net_profit],
    stat_date='2023q1',
    count=4,
    interval='1q',
    stat_by_year=False
)

2.2 财务同比分析 (interval='1y')

若要对比历史同期数据(如连续 4 年的第一季度数据,用以计算同比增速):

# 获取 2023Q1、2022Q1、2021Q1、2020Q1 的第一季度财务数据
df_y = get_history_fundamentals(
    security=['000001.XSHE'],
    fields=[income.total_operating_revenue, income.net_profit],
    stat_date='2023q1',
    count=4,
    interval='1y',
    stat_by_year=False
)

3. JoinQuant 策略代码示例:计算单股营业收入环比增长率

以下示例展示如何在 JoinQuant 策略中使用 get_history_fundamentals 提取连续两季度的营业收入并计算环比增长率:

from jqdata import *

def initialize(context):
    set_benchmark('000300.XSHG')
    set_option('use_real_price', True)
    run_daily(check_financial_growth, time='10:00')

def check_financial_growth(context):
    stocks = ['000001.XSHE', '600000.XSHG']
    
    # 使用 watch_date 锁定当前逻辑时间的前一天,防止未来函数
    watch_dt = context.previous_date
    
    # 获取每个股票最近 2 个季度的单季营业收入
    df = get_history_fundamentals(
        security=stocks,
        fields=[income.total_operating_revenue],
        watch_date=watch_dt,
        count=2,
        interval='1q'
    )
    
    # 按股票代码分组计算环比增长率
    for code, group in df.groupby('code'):
        if len(group) == 2:
            revenue_old = group.iloc[0]['total_operating_revenue']
            revenue_new = group.iloc[1]['total_operating_revenue']
            
            if revenue_old and revenue_old > 0:
                growth_rate = (revenue_new - revenue_old) / revenue_old * 100
                log.info(f"股票: {code}, 上期营收: {revenue_old:.2f}, 本期营收: {revenue_new:.2f}, 环比增长: {growth_rate:.2f}%")

4. 注意事项

  1. 数据返回上限:单次调用 get_history_fundamentals 最多返回 5000 条记录。若股票数量较多,建议分批次或按板块拆分获取。
  2. 未来函数规避:在回测或模拟交易中,推荐使用 watch_date=context.previous_date,系统会自动根据当时已披露的财报返回数据,避免获取到未来数据。
  3. 数据分组处理:由于返回结果为 pandas.DataFrame,建议配合 df.groupby('code') 对个股的历史多期财务数据进行排序与指标计算。