🚀 AI 一键生成 joinquant 策略代码

如何用 JoinQuant API 获取多因子数据并构建选股模型?

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

问题描述

如何获取多只股票的市净率和滚动市盈率因子数据?

解决方案

在聚宽(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)

补充说明

  1. get_fundamentals(query_object, date=None)
    • 这是查询财务和市值数据的核心函数。
    • date 参数:在回测中如果不填,默认使用 context.current_dt(当前回测时间)。在研究环境中,如果不填,默认是最新交易日。
  2. 数据更新
    • 市值表(valuation)的数据是每天更新的,因此可以获取到每日的最新 PE 和 PB 数据。
  3. 获取历史时间序列数据
    • 如果你是在研究环境中,想要一次性获取多只股票、多日的 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)