3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化选股策略中,上市公司的财务指标变化趋势(如营业收入增长率、净利润环比增长等)是极具价值的因子。JoinQuant(聚宽)提供了 get_history_fundamentals 函数,方便投资者一次性获取跨多个季度或年度的历史财务报表数据。
get_history_fundamentals 函数的主要参数定义如下:
get_history_fundamentals(security, fields, watch_date=None, stat_date=None, count=1, interval='1q', stat_by_year=False)
'000001.XSHE' 或 ['000001.XSHE', '600000.XSHG'])。balance, cash_flow, income, indicator 等表字段)。'2023q1' 或 '2022')。watch_date 与 stat_date 必须且只能指定一个。'1q': 间隔一个季度。常用于环比分析或连续季度推移。'1y': 间隔一年。常用于同比分析(如比较连续数年同季度的表现)。True,interval 必须为 '1y'。若要分析连续季度的财务趋势(如连续 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
)
若要对比历史同期数据(如连续 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
)
以下示例展示如何在 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}%")
get_history_fundamentals 最多返回 5000 条记录。若股票数量较多,建议分批次或按板块拆分获取。watch_date=context.previous_date,系统会自动根据当时已披露的财报返回数据,避免获取到未来数据。pandas.DataFrame,建议配合 df.groupby('code') 对个股的历史多期财务数据进行排序与指标计算。