🚀 AI 一键生成 qmt 策略代码

QMT get_factor_data 实战:使用 AI_market_level_forcast 因子

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

问题描述

如何在策略里使用 QMT 自带的 AI 预测因子?

解决方案

在 QMT 策略中使用自带的 AI 预测因子,主要通过 ContextInfo.get_factor_data 接口获取数据,并结合 AI_market_level_forcast 库中的因子字段(如 stk_p_ai)进行逻辑判断。

以下是详细的步骤说明和完整的策略代码示例。

核心步骤说明

  1. 数据准备
    • 在使用前,必须在 QMT 客户端菜单中点击 【操作】 -> 【数据管理】 -> 【补充数据】,勾选 【多因子数据】 进行下载,否则回测或运行时会获取不到数据。
  2. 获取接口
    • 使用 ContextInfo.get_factor_data(fieldList, stockList, startDate, endDate)
  3. 因子选择
    • 根据文档,AI 预测因子的库名为 AI_market_level_forcast
    • 常用因子例如 stk_p_ai(股票下一交易日上涨概率)。完整字段名为 AI_market_level_forcast.stk_p_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))

关键点解析

  1. 字段名称
    代码中使用了 AI_market_level_forcast.stk_p_ai。这是最核心的个股上涨概率因子。如果你想使用行业指数的预测,可以使用 stk_sw1_p_ai (申万一级行业) 等字段。

  2. 数据结构处理
    ContextInfo.get_factor_data 的返回值类型取决于传入参数的维度。

    • 在上述代码中,我们传入了 多个股票一个时间点
    • 此时返回的是一个 pandas.DataFrameIndex 是股票代码,Columns 是因子字段名
    • 因此使用 factor_data.loc[stock, field_name] 来获取具体数值。
  3. 时间处理
    因子数据接口要求的时间格式通常为 'YYYYMMDD' 字符串。我们使用 ContextInfo.get_bar_timetag 获取当前 K 线的时间戳,并通过辅助函数转换为字符串。

  4. 数据下载
    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 文件进行分析。