🚀 AI 一键生成 qmt 策略代码

如何在 QMT 策略中获取上市公司的财务数据(如市盈率、净利润)?

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

问题描述

如何获取一支股票最近三年的市盈率(PE)和净利润数据?

解决方案

在 QMT 中,获取市盈率(PE)和净利润数据通常涉及两个不同的 API 接口,因为市盈率属于多因子数据(Factor Data),而净利润属于财务数据(Financial Data)

以下是具体的实现方案和代码示例。

核心步骤说明

  1. 获取市盈率 (PE)

    • 使用 ContextInfo.get_factor_data() 接口。
    • 对应字段通常在 Valuation_and_Market_Cap(估值与市值)表中,字段名为 PE(市盈率)或 PETTM(滚动市盈率,如果因子库中有的话,标准字段通常是 PE)。
    • 注意:使用前需要在 QMT 客户端菜单栏点击【数据管理】->【补充数据】->【多因子数据】进行下载。
  2. 获取净利润

    • 使用 ContextInfo.get_financial_data() 接口。
    • 对应字段在 ASHAREINCOME(利润表)中。常用字段为 net_profit_excl_min_int_inc(归属于母公司所有者的净利润)或 net_profit_incl_min_int_inc(净利润)。

Python 策略代码示例

以下代码展示了如何获取“贵州茅台(600519.SH)”最近三年的 PE 和 归母净利润数据。

# -*- coding: gbk -*-
import datetime

def init(ContextInfo):
    # 1. 设置要查询的股票代码
    stock_code = '600519.SH'
    
    # 2. 计算时间范围:最近三年
    now = datetime.datetime.now()
    end_date = now.strftime('%Y%m%d')
    start_date = (now - datetime.timedelta(days=365 * 3)).strftime('%Y%m%d')
    
    print(f"查询区间: {start_date} 至 {end_date}")
    print(f"查询标的: {stock_code}")
    print("-" * 30)

    # ==============================================
    # 获取市盈率 (PE) - 使用多因子接口
    # ==============================================
    # 字段格式:表名.字段名
    # Valuation_and_Market_Cap.PE 代表 市盈率
    factor_fields = ['Valuation_and_Market_Cap.PE']
    
    # 获取数据
    # 返回格式通常为 dict 或 DataFrame,取决于传入的是单股还是多股
    pe_data = ContextInfo.get_factor_data(
        factor_fields, 
        [stock_code], 
        start_date, 
        end_date
    )
    
    print("【市盈率 (PE) 数据示例 (最近5条)】:")
    if stock_code in pe_data:
        # pe_data[stock_code] 是一个 DataFrame,index是日期,columns是因子名
        df_pe = pe_data[stock_code]
        # 打印最后5行
        print(df_pe.tail())
    else:
        print("未获取到PE数据,请检查是否已下载多因子数据。")
    
    print("-" * 30)

    # ==============================================
    # 获取净利润 - 使用财务数据接口
    # ==============================================
    # 字段格式:表名.字段名
    # ASHAREINCOME.net_profit_excl_min_int_inc 代表 归属于母公司所有者的净利润
    financial_fields = ['ASHAREINCOME.net_profit_excl_min_int_inc']
    
    # 获取数据
    # report_type='announce_time' 按公告日获取,'report_time' 按报告期获取
    # 这里演示按公告日获取,这样能看到数据发布的时间点
    fin_data = ContextInfo.get_financial_data(
        financial_fields, 
        [stock_code], 
        start_date, 
        end_date, 
        report_type='announce_time'
    )
    
    print("【归母净利润数据示例 (最近5条)】:")
    # get_financial_data 返回结构较为复杂,单股单时间段通常返回 Series 或 DataFrame
    # 这里 fin_data 对于单股通常直接返回 DataFrame (Index=日期) 或 Series
    try:
        # 如果返回的是 Series (单字段)
        print(fin_data.tail())
    except:
        print(fin_data)

def handlebar(ContextInfo):
    # 本策略仅在 init 中演示数据获取,无需盘中运行
    pass

关键点提示

  1. 数据补充

    • PE 数据:必须在 QMT 客户端界面手动下载“多因子数据”。如果代码运行结果为空或全为 NaN,通常是因为本地没有下载该时间段的因子数据。
    • 财务数据:需要在数据管理中下载“财务数据”。
  2. 字段名称

    • 文档中提供的 PE 字段是 Valuation_and_Market_Cap.PE
    • 文档中提供的归母净利润字段是 ASHAREINCOME.net_profit_excl_min_int_inc
  3. 数据频率

    • get_factor_data 获取的 PE 通常是日频数据(每个交易日一个数值)。
    • get_financial_data 获取的净利润是季度数据(每个财报发布日一个数值)。