🚀 AI 一键生成 qmt 策略代码

QMT 多因子策略开发:如何获取估值、成长性等因子数据?

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

问题描述

如何获取一批股票的市盈率(PE)和市净率(PB)历史数据?

解决方案

在 QMT 平台中,获取股票的历史市盈率(PE)和市净率(PB)数据,最直接且推荐的方法是使用 多因子数据接口 ContextInfo.get_factor_data

该接口可以直接获取经过计算的因子值,无需用户手动通过财务报表和收盘价进行计算。

核心步骤

  1. 数据准备:在 QMT 客户端界面,点击菜单栏的【数据管理】->【补充数据】,勾选【多因子数据】并下载对应时间段的数据。
  2. 确定字段名称:根据 QMT API 文档的“股票因子库_表名对照表”,我们需要关注 Valuation_and_Market_Cap(估值与市值)表。
    • 市盈率 (PE): Valuation_and_Market_Cap.PE (通常为 TTM 或动态,具体取决于数据源定义,也可以使用 Valuation_and_Market_Cap.PETTM 获取明确的 TTM 数据)。
    • 市净率 (PB): Valuation_and_Market_Cap.PB
  3. 调用接口:使用 ContextInfo.get_factor_data 获取数据。

代码实现

以下是一个完整的 Python 策略示例,展示如何在 init 函数中获取一批股票在指定时间范围内的 PE 和 PB 数据。

# -*- coding: gbk -*-

def init(ContextInfo):
    # 1. 设置需要查询的股票列表
    stock_list = ['600000.SH', '000001.SZ', '600519.SH']
    
    # 2. 设置需要查询的因子字段
    # Valuation_and_Market_Cap.PE   : 市盈率
    # Valuation_and_Market_Cap.PB   : 市净率
    # Valuation_and_Market_Cap.PETTM : 市盈率TTM (推荐使用此字段进行回测)
    field_list = [
        'Valuation_and_Market_Cap.PE', 
        'Valuation_and_Market_Cap.PB',
        'Valuation_and_Market_Cap.PETTM' 
    ]
    
    # 3. 设置起止时间 (格式:YYYYMMDD)
    start_date = '20230101'
    end_date = '20230110'
    
    # 4. 调用多因子数据接口
    # 注意:获取多只股票、多天数据时,返回的是一个字典
    # Key = 股票代码, Value = DataFrame (Index=日期, Columns=因子名)
    factor_data = ContextInfo.get_factor_data(
        field_list, 
        stock_list, 
        start_date, 
        end_date
    )
    
    # 5. 打印结果
    print("获取到的因子数据如下:")
    for stock_code, df in factor_data.items():
        print(f"\n====== 股票: {stock_code} ======")
        if not df.empty:
            print(df)
        else:
            print("无数据,请检查是否已下载多因子数据。")

def handlebar(ContextInfo):
    # 本示例仅在 init 中演示数据获取,handlebar 中无需逻辑
    pass

结果解析与注意事项

  1. 返回值结构

    • 当传入 多个股票多个日期 时,get_factor_data 返回的是一个 字典 (Dict)
    • 字典的 Key 是股票代码(如 '600000.SH')。
    • 字典的 Value 是 pandas DataFrame,其中索引(Index)是时间戳,列名(Columns)是你请求的因子字段名。
  2. 数据精度

    • QMT 的因子数据通常保留到小数点后四位。
  3. 常见问题

    • 返回为空或全为 NaN:这通常是因为本地没有下载多因子数据。请务必在客户端的【数据管理】中补充下载【多因子数据】。
    • 字段名错误:因子字段名必须严格区分大小写,且必须包含表名前缀(如 Valuation_and_Market_Cap.)。

扩展:常用的估值类因子字段

除了 PE 和 PB,你可能还需要以下相关字段(均位于 Valuation_and_Market_Cap 表下):

  • PS: 市销率
  • PCF: 市现率
  • PEG3Y: 市盈率/净利润3年复合增长率
  • StaticPE: 静态市盈率
  • ForwardPE: 动态市盈率

Q&A

Q: 为什么我运行代码后打印出来是空的或者报错?
A: 最常见的原因是本地缺少数据。QMT 的多因子数据不是实时从云端拉取的,而是依赖本地数据库。请在 QMT 客户端顶部菜单找到“数据管理” -> “补充数据”,勾选“多因子数据”,选择对应的时间段和市场进行下载。

Q: Valuation_and_Market_Cap.PEValuation_and_Market_Cap.PETTM 有什么区别?
A: PE 通常指一般的市盈率,定义可能因数据源而异(可能是静态或动态)。PETTM (Trailing Twelve Months) 是滚动市盈率,使用最近 12 个月的净利润计算,更能反映企业当前的盈利能力,在量化回测中通常更推荐使用 PETTM

Q: 如何获取当天的实时 PE/PB?
A: get_factor_data 主要用于获取历史序列数据。如果是实盘中需要当天的最新数据,且该数据尚未入库到多因子库,可以使用 ContextInfo.get_full_tick 获取最新行情快照,结合 ContextInfo.get_financial_data 获取最近的财报数据自行计算,或者查看是否有订阅的 Level-2 数据流提供相关指标。但在大多数日频策略中,使用 get_factor_data 获取前一交易日的数据已足够。