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

JoinQuant量化平台获取多只股票连续历史财务数据(三维数据)详解

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

问题描述

如何获取数据?

大佬们,我想问一下,如何获取全部时点的所有股票的财务信息,有点像三维的。

解决方案

在JoinQuant(聚宽)平台上,想要获取多只股票在多个历史时点的财务数据(即你提到的“股票 x 财务指标 x 时间”的三维面板数据),主要有两种高效的方法。具体取决于你需要的是每日更新的财务/估值数据,还是按季度/年度发布的定期财报数据

方法一:获取连续多日的财务/估值数据(推荐)

如果你需要获取市值、市盈率(PE)、换手率等每天都在变动的财务衍生数据,可以使用 get_fundamentals_continuously 函数。它可以一次性查询多只股票在过去 count 个交易日的数据。

核心APIget_fundamentals_continuously(query_object, end_date=None, count=None, panel=True)

代码示例

from jqdata import *

# 1. 构造查询对象:查询换手率、总市值、每股收益(EPS)
q = query(
    valuation.turnover_ratio,
    valuation.market_cap,
    indicator.eps
).filter(
    valuation.code.in_(['000001.XSHE', '600000.XSHG', '000002.XSHE'])
)

# 2. 获取连续5个交易日的数据
# 注意:pandas 0.25版后Panel被移除,强烈建议设置 panel=False 返回等效的 DataFrame (MultiIndex)
df_3d = get_fundamentals_continuously(q, end_date='2023-10-01', count=5, panel=False)

print(df_3d)

注意:出于性能考虑,该接口单次返回总条数不能超过5000条(即 查询的股票数量 * count < 5000)。如果需要全市场所有股票的长期数据,必须分批次(按时间段或按股票池)循环获取。

方法二:获取历史多个季度/年度的财报数据

如果你需要获取纯粹的财务报表数据(如营业收入、净利润、经营现金流等),这些数据是按季度发布的。此时应使用 get_history_fundamentals 函数。

核心APIget_history_fundamentals(security, fields, watch_date=None, stat_date=None, count=1, interval='1q', stat_by_year=False)

代码示例

from jqdata import *

# 1. 定义股票池和需要查询的财务字段
securities = ['000001.XSHE', '600000.XSHG']
fields = [
    balance.cash_equivalents,           # 现金及现金等价物
    income.total_operating_revenue,     # 营业总收入
    indicator.inc_net_profit_year_on_year # 净利润同比增长率
]

# 2. 获取过去5个季度的数据
df_history = get_history_fundamentals(
    security=securities, 
    fields=fields, 
    stat_date='2023q3', 
    count=5, 
    interval='1q', 
    stat_by_year=False
)

print(df_history)

注意:该接口同样有单次最多返回5000条数据的限制,且不支持 valuation(市值表)的查询。

突破5000条限制的实战建议

由于你提到想要获取“全部时点的所有股票”,这必然会触发5000条的限制。在实际量化研究中,通常采用以下方式分批获取并拼接:

import pandas as pd
from jqdata import *

all_stocks = list(get_all_securities(['stock']).index)
batch_size = 100 # 每次查询100只股票
all_data = []

# 假设我们要获取过去10天的估值数据
count_days = 10 

for i in range(0, len(all_stocks), batch_size):
    stock_batch = all_stocks[i:i+batch_size]
    q = query(valuation).filter(valuation.code.in_(stock_batch))
    
    # 100只股票 * 10天 = 1000条 < 5000条限制
    batch_df = get_fundamentals_continuously(q, end_date='2023-10-01', count=count_days, panel=False)
    all_data.append(batch_df)

# 将所有批次合并为一个大型的 MultiIndex DataFrame
final_3d_df = pd.concat(all_data)

通过上述分批循环的方法,你就可以在本地或研究环境中构建出包含全市场、全时段的“三维”财务特征面板数据集了。