问题描述
解决方案
在 QMT 策略中使用自带的 AI 预测因子,主要通过 ContextInfo.get_factor_data 接口获取数据,并结合 AI_market_level_forcast 库中的因子字段(如 stk_p_ai)进行逻辑判断。
以下是详细的步骤说明和完整的策略代码示例。
核心步骤说明
- 数据准备:
- 在使用前,必须在 QMT 客户端菜单中点击 【操作】 -> 【数据管理】 -> 【补充数据】,勾选 【多因子数据】 进行下载,否则回测或运行时会获取不到数据。
- 获取接口:
- 使用
ContextInfo.get_factor_data(fieldList, stockList, startDate, endDate)。
- 使用
- 因子选择:
- 根据文档,AI 预测因子的库名为
AI_market_level_forcast。 - 常用因子例如
stk_p_ai(股票下一交易日上涨概率)。完整字段名为AI_market_level_forcast.stk_p_ai。
- 根据文档,AI 预测因子的库名为
策略示例代码
本策略逻辑:每日获取股票的 AI 上涨概率预测值。如果上涨概率大于 55% 则买入,小于 45% 则卖出。
# -*- coding: gbk -*-
import pandas as pd
import time
def init(ContextInfo):
# 设置资金账号
ContextInfo.accid = '600000248'
ContextInfo.set_account(ContextInfo.accid)
# 设置股票池,这里以几只股票为例
# 实际使用中可以使用 ContextInfo.get_sector('000300.SH') 获取沪深300成分股
stock_list = ['600000.SH', '000001.SZ', '600519.SH']
ContextInfo.set_universe(stock_list)
# 策略运行周期一般为日线
ContextInfo.period = '1d'
# 设置买入的AI概率阈值
ContextInfo.buy_threshold = 0.55
# 设置卖出的AI概率阈值
ContextInfo.sell_threshold = 0.45
def handlebar(ContextInfo):
# 获取当前K线的时间
index = ContextInfo.barpos
timetag = ContextInfo.get_bar_timetag(index)
# 将时间戳转换为 YYYYMMDD 格式的字符串,用于获取因子数据
current_date = timetag_to_datetime(timetag, '%Y%m%d')
# 获取当前股票池
stock_list = ContextInfo.get_universe()
# 定义需要获取的AI因子字段
# stk_p_ai: 股票下一交易日上涨概率
field_list = ['AI_market_level_forcast.stk_p_ai']
# 获取因子数据
# 注意:这里 startDate 和 endDate 都设为当前日期,获取当日的预测值
factor_data = ContextInfo.get_factor_data(
field_list,
stock_list,
current_date,
current_date
)
# 如果没有获取到数据,直接返回
if factor_data is None or factor_data.empty:
print(f"日期 {current_date} 未获取到AI因子数据,请检查是否已下载多因子数据。")
return
# 获取当前持仓信息
positions = get_trade_detail_data(ContextInfo.accid, 'stock', 'position')
holding_stocks = [obj.m_strInstrumentID for obj in positions]
# 遍历股票池进行交易逻辑判断
for stock in stock_list:
# 从返回的 DataFrame 中提取该股票的 AI 预测概率
# get_factor_data 在 "代码列表n-时间范围为1" 时返回 DataFrame index=代码 ,columns=字段
try:
if stock in factor_data.index:
ai_prob = factor_data.loc[stock, 'AI_market_level_forcast.stk_p_ai']
else:
continue
except KeyError:
continue
print(f"日期: {current_date}, 股票: {stock}, AI上涨概率: {ai_prob:.4f}")
# 交易逻辑
# 情况1: AI预测上涨概率 > 0.55 且 未持仓 -> 买入
if ai_prob > ContextInfo.buy_threshold and stock not in holding_stocks:
print(f"触发买入: {stock}, 概率 {ai_prob}")
# 按最新价买入 1000 股
order_shares(stock, 1000, 'LATEST', 0, ContextInfo, ContextInfo.accid)
# 情况2: AI预测上涨概率 < 0.45 且 持仓 -> 卖出
elif ai_prob < ContextInfo.sell_threshold and stock in holding_stocks:
print(f"触发卖出: {stock}, 概率 {ai_prob}")
# 卖出所有持仓 (0 表示卖出全部)
order_target_value(stock, 0, 'LATEST', 0, ContextInfo, ContextInfo.accid)
def timetag_to_datetime(timetag, format_str):
"""
辅助函数:将毫秒时间戳转换为指定格式的字符串
"""
import time
return time.strftime(format_str, time.localtime(timetag / 1000))
关键点解析
-
字段名称:
代码中使用了AI_market_level_forcast.stk_p_ai。这是最核心的个股上涨概率因子。如果你想使用行业指数的预测,可以使用stk_sw1_p_ai(申万一级行业) 等字段。 -
数据结构处理:
ContextInfo.get_factor_data的返回值类型取决于传入参数的维度。- 在上述代码中,我们传入了 多个股票 和 一个时间点。
- 此时返回的是一个
pandas.DataFrame,Index 是股票代码,Columns 是因子字段名。 - 因此使用
factor_data.loc[stock, field_name]来获取具体数值。
-
时间处理:
因子数据接口要求的时间格式通常为'YYYYMMDD'字符串。我们使用ContextInfo.get_bar_timetag获取当前 K 线的时间戳,并通过辅助函数转换为字符串。 -
数据下载:
AI 因子属于“多因子数据”范畴,必须手动下载。如果回测时发现factor_data为空或报错,请务必检查客户端右下角的数据下载任务是否完成。
常见 AI 因子列表
根据 QMT 文档,可用的 AI 预测因子包括:
| 因子字段名 | 说明 |
|---|---|
AI_market_level_forcast.stk_p_ai |
股票下一交易日上涨概率 |
AI_market_level_forcast.stk_sw1_p_ai |
申万一级行业指数下一交易日上涨概率 |
AI_market_level_forcast.stk_zx1_p_ai |
中信一级行业指数下一交易日上涨概率 |
Q&A
Q: 为什么运行策略时提示获取不到 AI 因子数据?
A: 最常见的原因是本地没有数据。请在 QMT 客户端顶部菜单栏点击“数据管理”,选择“补充数据”,在弹出的窗口中勾选“多因子数据”,并选择对应的时间段进行下载。
Q: AI 因子的数值范围是多少?
A: stk_p_ai 等概率因子的数值范围通常是 0 到 1(即 0% 到 100%)。数值越大代表模型预测上涨的可能性越高。
Q: 这个 AI 因子是盘中实时更新的吗?
A: 通常不是。AI 因子一般是基于收盘后的数据计算生成的,用于预测下一交易日的表现。因此,它更适合用于日线级别的策略,在每日收盘后或次日开盘前获取数据进行决策。
Q: 如何查看某个股票具体的 AI 因子历史值?
A: 你可以编写一个简单的脚本,在 init 函数中直接调用 get_factor_data 获取一段时间的数据并打印出来,或者将数据导出到 CSV 文件进行分析。