问题描述
大佬们,我想问一下,如何获取全部时点的所有股票的财务信息,有点像三维的。
解决方案
在JoinQuant(聚宽)平台上,想要获取多只股票在多个历史时点的财务数据(即你提到的“股票 x 财务指标 x 时间”的三维面板数据),主要有两种高效的方法。具体取决于你需要的是每日更新的财务/估值数据,还是按季度/年度发布的定期财报数据。
方法一:获取连续多日的财务/估值数据(推荐)
如果你需要获取市值、市盈率(PE)、换手率等每天都在变动的财务衍生数据,可以使用 get_fundamentals_continuously 函数。它可以一次性查询多只股票在过去 count 个交易日的数据。
核心API:get_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 函数。
核心API:get_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)
通过上述分批循环的方法,你就可以在本地或研究环境中构建出包含全市场、全时段的“三维”财务特征面板数据集了。