🚀 AI 一键生成 joinquant 策略代码

JoinQuant get_valuation 函数详解:高效获取市盈率、市净率等多日估值数据

joinquant | 发布时间: 2025/11/28
以下内容由 EasyQuant 生成。

问题描述

怎样能一次性获取多只股票过去一个月的市盈率数据?

解决方案

在聚宽(JoinQuant)平台中,想要一次性获取多只股票在一段时间内的市盈率(PE)数据,最简单且高效的方法是使用 get_valuation 函数。

该函数专门用于获取多个标的在指定交易日范围内的市值表数据(包含PE、PB、市值等)。

以下是具体的实现代码和说明:

核心代码实现

# -*- coding: utf-8 -*-
from jqdata import *
import datetime

# 1. 设定要查询的股票列表
security_list = ['000001.XSHE', '600000.XSHG', '000002.XSHE']

# 2. 设定查询的时间范围(例如:过去30天)
# 注意:在回测中应使用 context.current_dt,在研究中可使用 datetime.now()
end_date = datetime.datetime.now().date() 
start_date = end_date - datetime.timedelta(days=30)

# 3. 调用 get_valuation 获取数据
# fields=['pe_ratio'] 指定获取市盈率(TTM)
df = get_valuation(
    security_list, 
    start_date=start_date, 
    end_date=end_date, 
    fields=['pe_ratio']
)

# 4. 打印结果
# 返回的是一个 DataFrame,包含 code, day, pe_ratio 字段
print(df)

代码详解

  1. get_valuation 函数
    • 这是获取历史市值数据的专用接口,比通用的 get_fundamentals 更适合查询连续时间段的数据。
  2. 参数说明
    • security: 股票代码列表(如 ['000001.XSHE', '600000.XSHG'])。
    • start_dateend_date: 查询的开始和结束日期。
    • fields: 指定需要的字段。市盈率对应的字段名为 'pe_ratio' (PE-TTM)。如果需要静态PE,可以使用 'pe_ratio_lyr'
  3. 返回值
    • 返回一个 pandas.DataFrame
    • 默认包含 code (股票代码) 和 day (日期) 列,以及你请求的 pe_ratio 列。

替代方案:使用 get_fundamentals_continuously

如果你不仅需要市盈率,还需要同时获取利润表或资产负债表中的其他复杂财务数据,可以使用 get_fundamentals_continuously

from jqdata import *

# 构造查询对象
q = query(valuation.pe_ratio).filter(valuation.code.in_(['000001.XSHE', '600000.XSHG']))

# 获取过去22个交易日(约一个月)的数据
# panel=False 建议设置为 False 以返回 DataFrame 格式
df = get_fundamentals_continuously(q, end_date='2023-10-27', count=22, panel=False)

print(df)

总结:对于单纯获取市盈率(PE)、市净率(PB)、市值等估值指标,推荐优先使用 get_valuation,因为它语法更简洁,且专门针对此类连续时间序列数据进行了优化。


Q&A

Q: get_valuation 函数中的 pe_ratio 是静态市盈率还是动态市盈率?
A: pe_ratio 是市盈率(TTM),即滚动市盈率,计算公式为:总市值 / 过去12个月的净利润。如果需要静态市盈率(基于上年度财报),请使用 pe_ratio_lyr

Q: 如果查询的时间段内某只股票停牌了,数据会怎么显示?
A: 如果股票在期间停牌,get_valuation 返回的数据中该股票的条目数量会少于请求的天数(即只返回有交易数据的日期),或者在某些模式下可能不返回停牌日的数据。这一点与 get_price 的填充逻辑略有不同,使用时需注意索引对齐。

Q: get_valuation 最多能返回多少条数据?
A: 为了性能考虑,该函数每次最多返回 5000 条数据。如果你查询的股票数量很多且时间跨度很长(例如全市场股票过去一年),建议分批次循环获取,或者按时间段分片获取。