问题描述
只找到申万一级行业估值数据,其它指数,如:沪深300、中证500等指数,有PE、PB的估值数据吗?
谢谢!
解决方案
根据 JoinQuant 官方 API 文档的说明,聚宽目前不直接提供指数(如沪深300、中证500等)的 PE(市盈率)、PB(市净率)等估值数据(官方文档明确指出:“目前不支持行业的行情数据,及指数的PE/股息率”)。
但是,您完全可以通过获取指数成分股及其权重,结合个股的财务估值数据,自己动手计算出指数的估值。通常指数的 PE/PB 计算采用调和平均法或总市值/总净利润法。
解决方案与计算步骤
- 使用
get_index_stocks获取指定日期的指数成分股列表。 - 使用
get_index_weights获取这些成分股在指数中的权重。 - 使用
get_fundamentals或get_valuation获取成分股当天的个股 PE、PB 数据。 - 利用权重和个股估值,计算指数的加权估值。
Python 源码示例
以下是在聚宽研究环境中计算沪深300指数 PE 和 PB 的示例代码(采用调和平均法计算):
from jqdata import *
import pandas as pd
def get_index_pe_pb(index_code, date):
# 1. 获取指数成分股
stocks = get_index_stocks(index_code, date=date)
# 2. 获取成分股权重
weights_df = get_index_weights(index_code, date=date)
if weights_df is None or weights_df.empty:
print("未获取到权重数据")
return None, None
# 3. 获取成分股的估值数据 (PE, PB)
q = query(
valuation.code,
valuation.pe_ratio,
valuation.pb_ratio
).filter(valuation.code.in_(stocks))
val_df = get_fundamentals(q, date=date)
# 4. 合并数据
df = pd.merge(val_df, weights_df, on='code')
# 5. 数据清洗:剔除亏损(PE<0)或无数据的股票以防计算异常
# 注意:严格的指数估值通常会将亏损股按整体市值/净利润计算,这里为了简便采用剔除异常值后重新分配权重的方法
df = df[(df['pe_ratio'] > 0) & (df['pb_ratio'] > 0)].copy()
# 重新归一化权重
df['weight'] = df['weight'] / df['weight'].sum()
# 6. 计算指数PE和PB (调和平均法:1 / sum(W_i / PE_i))
index_pe = 1 / sum(df['weight'] / df['pe_ratio'])
index_pb = 1 / sum(df['weight'] / df['pb_ratio'])
return index_pe, index_pb
# 测试:获取沪深300在2023-05-04的估值
date_str = '2023-05-04'
pe, pb = get_index_pe_pb('000300.XSHG', date_str)
print(f"沪深300在 {date_str} 的估值 -> PE: {pe:.2f}, PB: {pb:.2f}")
总结
虽然 API 没有现成的字段直接调用,但借助聚宽强大的底层数据(get_index_weights 和 get_fundamentals),您可以非常灵活地计算出任何宽基指数或自定义股票池的整体估值水平。