问题描述
解决方案
在 QMT 平台中,获取股票的历史市盈率(PE)和市净率(PB)数据,最直接且推荐的方法是使用 多因子数据接口 ContextInfo.get_factor_data。
该接口可以直接获取经过计算的因子值,无需用户手动通过财务报表和收盘价进行计算。
核心步骤
- 数据准备:在 QMT 客户端界面,点击菜单栏的【数据管理】->【补充数据】,勾选【多因子数据】并下载对应时间段的数据。
- 确定字段名称:根据 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。
- 市盈率 (PE):
- 调用接口:使用
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
结果解析与注意事项
-
返回值结构:
- 当传入 多个股票 和 多个日期 时,
get_factor_data返回的是一个 字典 (Dict)。 - 字典的 Key 是股票代码(如
'600000.SH')。 - 字典的 Value 是 pandas DataFrame,其中索引(Index)是时间戳,列名(Columns)是你请求的因子字段名。
- 当传入 多个股票 和 多个日期 时,
-
数据精度:
- QMT 的因子数据通常保留到小数点后四位。
-
常见问题:
- 返回为空或全为 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.PE 和 Valuation_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 获取前一交易日的数据已足够。