问题描述
如何获取一支股票最近三年的市盈率(PE)和净利润数据?
解决方案
在 QMT 中,获取市盈率(PE)和净利润数据通常涉及两个不同的 API 接口,因为市盈率属于多因子数据(Factor Data),而净利润属于财务数据(Financial Data)。
以下是具体的实现方案和代码示例。
核心步骤说明
-
获取市盈率 (PE):
- 使用
ContextInfo.get_factor_data()接口。 - 对应字段通常在
Valuation_and_Market_Cap(估值与市值)表中,字段名为PE(市盈率)或PETTM(滚动市盈率,如果因子库中有的话,标准字段通常是PE)。 - 注意:使用前需要在 QMT 客户端菜单栏点击【数据管理】->【补充数据】->【多因子数据】进行下载。
- 使用
-
获取净利润:
- 使用
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
关键点提示
-
数据补充:
- PE 数据:必须在 QMT 客户端界面手动下载“多因子数据”。如果代码运行结果为空或全为
NaN,通常是因为本地没有下载该时间段的因子数据。 - 财务数据:需要在数据管理中下载“财务数据”。
- PE 数据:必须在 QMT 客户端界面手动下载“多因子数据”。如果代码运行结果为空或全为
-
字段名称:
- 文档中提供的 PE 字段是
Valuation_and_Market_Cap.PE。 - 文档中提供的归母净利润字段是
ASHAREINCOME.net_profit_excl_min_int_inc。
- 文档中提供的 PE 字段是
-
数据频率:
get_factor_data获取的 PE 通常是日频数据(每个交易日一个数值)。get_financial_data获取的净利润是季度数据(每个财报发布日一个数值)。