问题描述
如何获取多只股票的市净率和滚动市盈率因子数据?
解决方案
在聚宽(JoinQuant)中,获取多只股票的市净率(PB)和滚动市盈率(PE TTM),最常用的方法是使用 get_fundamentals 函数查询 valuation(市值数据)表。
以下是具体的实现步骤和代码示例:
核心字段说明
在 valuation 表中:
valuation.pb_ratio:市净率(PB)。valuation.pe_ratio:市盈率(PE, TTM),即滚动市盈率。
代码实现
# -*- coding: utf-8 -*-
from jqdata import *
def initialize(context):
# 设定要查询的股票列表
stock_list = ['000001.XSHE', '600519.XSHG', '000300.XSHG']
# 调用查询函数
get_valuation_data(context, stock_list)
def get_valuation_data(context, stock_list):
# 构造查询语句
# 查询 valuation 表中的 code, pb_ratio, pe_ratio 字段
q = query(
valuation.code,
valuation.pb_ratio, # 市净率
valuation.pe_ratio # 滚动市盈率 (PE TTM)
).filter(
# 过滤条件:股票代码在 stock_list 中
valuation.code.in_(stock_list)
)
# 获取数据
# date=None 默认为回测当天的日期(避免未来函数)
df = get_fundamentals(q, date=context.current_dt)
# 打印结果
print("日期: %s" % context.current_dt)
print(df)
# 如果需要将股票代码作为索引,方便后续调用
if not df.empty:
df.set_index('code', inplace=True)
# 示例:获取平安银行的PB
if '000001.XSHE' in df.index:
pb = df.loc['000001.XSHE', 'pb_ratio']
print("平安银行 PB: %s" % pb)
补充说明
get_fundamentals(query_object, date=None):- 这是查询财务和市值数据的核心函数。
date参数:在回测中如果不填,默认使用context.current_dt(当前回测时间)。在研究环境中,如果不填,默认是最新交易日。
- 数据更新:
- 市值表(valuation)的数据是每天更新的,因此可以获取到每日的最新 PE 和 PB 数据。
- 获取历史时间序列数据:
- 如果你是在研究环境中,想要一次性获取多只股票、多日的 PE/PB 数据,可以使用
get_valuation函数(这是专门针对市值表的快捷函数):
# 获取多只股票在指定时间段内的市值数据 df = get_valuation( ['000001.XSHE', '600519.XSHG'], start_date='2023-01-01', end_date='2023-01-05', fields=['pb_ratio', 'pe_ratio'] ) print(df) - 如果你是在研究环境中,想要一次性获取多只股票、多日的 PE/PB 数据,可以使用