🚀 AI 一键生成 qmt 策略代码

QMT 多因子策略:如何调用平台内置的风格与技术因子?

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

问题描述

如何直接调用平台自带的 PE、PB 等因子数据?

解决方案

在 QMT 平台中,可以直接通过 ContextInfo.get_factor_data 接口获取内置的财务因子和多因子数据(如 PE、PB 等)。

这些因子数据存储在特定的表中,调用时需要遵循 表名.字段名 的格式。对于 PE(市盈率)和 PB(市净率),它们位于 Valuation_and_Market_Cap(股票因子_估值与市值)表中。

核心步骤

  1. 数据准备:在 QMT 客户端界面,点击菜单栏的【操作】->【数据管理】->【补充数据】,勾选【多因子数据】并下载,否则代码运行时会获取不到数据。
  2. 确定字段
    • PE (市盈率): Valuation_and_Market_Cap.PE
    • PB (市净率): Valuation_and_Market_Cap.PB
  3. 调用接口:使用 ContextInfo.get_factor_data(fieldList, stockList, startDate, endDate)

策略代码示例

以下是一个完整的策略代码示例,展示如何在 handlebar 中获取指定股票在指定时间段内的 PE 和 PB 数据。

# -*- coding: gbk -*-

def init(ContextInfo):
    # 设置股票池,这里以浦发银行和平安银行为例
    ContextInfo.set_universe(['600000.SH', '000001.SZ'])
    
    # 可以在这里做一些初始化操作
    print("策略初始化完成")

def handlebar(ContextInfo):
    # 获取当前K线对应的索引
    index = ContextInfo.barpos
    
    # 获取当前K线的时间戳
    timetag = ContextInfo.get_bar_timetag(index)
    
    # 将时间戳转换为字符串格式 YYYYMMDD,用于因子接口
    # 注意:timetag_to_datetime 返回格式可控,这里我们需要 YYYYMMDD
    current_date = timetag_to_datetime(timetag, '%Y%m%d')
    
    # 定义需要获取的因子列表
    # 格式为:表名.字段名
    # PE (市盈率) 和 PB (市净率) 都在 Valuation_and_Market_Cap 表中
    factor_fields = [
        'Valuation_and_Market_Cap.PE',  # 市盈率
        'Valuation_and_Market_Cap.PB'   # 市净率
    ]
    
    # 获取股票池列表
    stock_list = ContextInfo.get_universe()
    
    # 调用多因子数据接口
    # 这里 start_date 和 end_date 设置为同一天,获取当天的数据
    # 如果需要历史序列,可以调整 start_date
    factor_data = ContextInfo.get_factor_data(
        factor_fields, 
        stock_list, 
        startDate=current_date, 
        endDate=current_date
    )
    
    # 打印结果
    # 返回的数据类型通常是 pandas DataFrame 或 Series,取决于查询的维度
    print(f"日期: {current_date} 的因子数据:")
    print(factor_data)
    
    # 示例:如何访问具体数据 (假设返回的是 DataFrame)
    if not factor_data.empty:
        try:
            # 注意:返回数据的索引结构可能因查询范围不同而不同
            # 此处演示简单的访问逻辑
            for stock in stock_list:
                if stock in factor_data.index:
                    pe_val = factor_data.loc[stock, 'Valuation_and_Market_Cap.PE']
                    pb_val = factor_data.loc[stock, 'Valuation_and_Market_Cap.PB']
                    print(f"股票: {stock}, PE: {pe_val}, PB: {pb_val}")
        except Exception as e:
            print(f"数据解析异常: {e}")

常用估值因子对照表

为了方便您调用其他相关因子,以下是 Valuation_and_Market_Cap 表中常用的字段对照:

因子代码 (字段名) 中文名称 说明
PE 市盈率 股价 / 每股收益
PB 市净率 股价 / 每股净资产
PS 市销率 股价 / 每股销售额
PCF 市现率 股价 / 每股现金流
PEG3Y PEG (3年) 市盈率 / 净利润3年复合增长率
MktValue 总市值 单位:元
NegMktValue 流通市值 单位:元
StaticPE 静态PE 基于上年度财报
ForwardPE 动态PE 基于预测或推算

Q&A

Q: 调用 get_factor_data 返回空数据或报错怎么办?
A: 请首先检查是否已在 QMT 客户端的【数据管理】中下载了【多因子数据】。因子数据存储在本地,必须先下载才能读取。其次,检查 startDateendDate 格式是否为 'YYYYMMDD' 字符串。

Q: 如何获取 TTM (滚动) 类型的财务数据?
A: TTM 数据通常位于 Derived_Data (股票因子_衍生数据) 表中。例如,净利润 TTM 的字段是 Derived_Data.NetProfitTTM,营业总收入 TTM 是 Derived_Data.TRevenueTTM

Q: 因子数据是复权的吗?
A: QMT 的多因子库中的价格相关因子(如基于股价计算的指标)通常是基于当时的不复权或特定复权逻辑计算的,具体数值建议结合行情数据进行核对。对于 PE/PB 这类比率,通常直接使用即可,无需额外复权处理。

Q: 可以获取历史的 PE 数据吗?
A: 可以。在 get_factor_data 函数中,将 startDate 设置为过去的时间(如 '20220101'),endDate 设置为 '20221231',即可获取该时间段内的历史因子序列。