问题描述
解决方案
在 QMT 平台中,可以直接通过 ContextInfo.get_factor_data 接口获取内置的财务因子和多因子数据(如 PE、PB 等)。
这些因子数据存储在特定的表中,调用时需要遵循 表名.字段名 的格式。对于 PE(市盈率)和 PB(市净率),它们位于 Valuation_and_Market_Cap(股票因子_估值与市值)表中。
核心步骤
- 数据准备:在 QMT 客户端界面,点击菜单栏的【操作】->【数据管理】->【补充数据】,勾选【多因子数据】并下载,否则代码运行时会获取不到数据。
- 确定字段:
- PE (市盈率):
Valuation_and_Market_Cap.PE - PB (市净率):
Valuation_and_Market_Cap.PB
- PE (市盈率):
- 调用接口:使用
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 客户端的【数据管理】中下载了【多因子数据】。因子数据存储在本地,必须先下载才能读取。其次,检查 startDate 和 endDate 格式是否为 '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',即可获取该时间段内的历史因子序列。