🚀 AI 一键生成 qmt 策略代码

QMT 策略教程:如何使用 order_target_percent 和 order_target_value API 进行自动化投资组合再平衡?

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

问题描述

请用 Python 给我写一个资产组合调仓策略,要求能够将指定股票的持仓调整到固定的目标价值或目标比例。

解决方案

这是一个基于 QMT 平台的资产组合调仓策略示例。该策略演示了如何利用 QMT 提供的 order_target_value(目标价值下单)和 order_target_percent(目标比例下单)函数,自动将持仓调整到预设的状态。

策略说明

  1. 模式选择:代码中设置了一个 MODE 变量,你可以选择 'value'(按固定金额调仓)或 'percent'(按总资产比例调仓)。
  2. 自动平衡
    • 如果当前持仓 低于 目标,策略会自动 买入 差额。
    • 如果当前持仓 高于 目标,策略会自动 卖出 差额。
  3. 执行时机:示例代码设置为在每一根 K 线结束时(或实盘的最新 Tick)触发调仓逻辑。

策略代码

# -*- coding: gbk -*-
"""
QMT 资产组合调仓策略
功能:将指定股票调整到目标持仓市值或目标持仓比例
"""

def init(ContextInfo):
    # ================= 策略参数设置 =================
    # 1. 设置资金账号 (请替换为您真实的资金账号)
    ContextInfo.accID = '6000000000' 
    
    # 2. 设置调仓模式: 'value' (按固定金额) 或 'percent' (按百分比)
    ContextInfo.rebalance_mode = 'percent' 
    
    # 3. 设置目标持仓
    # 如果模式是 'value',数字代表目标持仓金额(元)
    # 如果模式是 'percent',数字代表占总资产的比例(0.1 代表 10%)
    ContextInfo.targets = {
        '600000.SH': 0.2,  # 浦发银行:目标 20% 或 0.2元(需根据模式调整数值)
        '000001.SZ': 0.3,  # 平安银行:目标 30%
        '600519.SH': 0.1   # 贵州茅台:目标 10%
    }
    
    # ================= 系统初始化 =================
    # 绑定账号
    ContextInfo.set_account(ContextInfo.accID)
    
    # 设置股票池 (将目标股票加入股票池,以便获取行情)
    ContextInfo.set_universe(list(ContextInfo.targets.keys()))
    
    print("策略初始化完成,当前模式:{}".format(ContextInfo.rebalance_mode))

def handlebar(ContextInfo):
    # 获取当前 K 线位置,确保只在最新 K 线或回测的每根 K 线执行
    # 如果是实盘,通常建议配合定时器或只在 is_last_bar 时执行
    if not ContextInfo.is_last_bar():
        return

    # 获取当前账号
    acc_id = ContextInfo.accID
    
    # 遍历目标设置进行调仓
    for stock_code, target_num in ContextInfo.targets.items():
        
        # 模式一:按目标价值调仓
        if ContextInfo.rebalance_mode == 'value':
            # order_target_value 会自动计算当前持仓市值与目标市值的差额
            # 并自动发出买入或卖出指令,将持仓调整到 target_num 元
            # style='LATEST' 使用最新价下单,也可以改为 'FIX' 指定价等
            order_target_value(stock_code, target_num, ContextInfo, acc_id)
            
            print("【目标价值调仓】股票: {}, 目标金额: {}".format(stock_code, target_num))
            
        # 模式二:按目标比例调仓
        elif ContextInfo.rebalance_mode == 'percent':
            # order_target_percent 会根据当前账户总资产(现金+市值)计算目标市值
            # target_num 应为小数,例如 0.2 代表 20%
            order_target_percent(stock_code, target_num, ContextInfo, acc_id)
            
            print("【目标比例调仓】股票: {}, 目标比例: {:.2%}".format(stock_code, target_num))

    # 注意:如果是实盘,建议添加逻辑控制调仓频率,避免每个 Tick 都触发交易
    # 例如:只在每天特定时间(如 14:50)执行一次

代码关键点解析

  1. order_target_value(stockcode, value, ...)

    • 这是 QMT 非常强大的内置函数。它不需要你手动计算“需要买多少股”或“需要卖多少股”。
    • 逻辑:它会查询当前该股票的持仓市值。如果目标是 10万,当前只有 8万,它会自动买入 2万;如果当前有 12万,它会自动卖出 2万。
    • 注意:如果资金不足,API 将不会创建发送订单。
  2. order_target_percent(stockcode, percent, ...)

    • 逻辑:它首先计算账户的总资产(可用现金 + 所有持仓市值)。然后乘以 percent 得到目标市值,最后执行与 order_target_value 相同的买卖逻辑。
    • 参数percent 是一个 0 到 1 之间的小数。例如 0.5 代表 50%。
  3. ContextInfo.set_universe

    • 虽然交易函数可以直接对代码下单,但设置 universe 可以确保 QMT 底层准备好这些股票的行情数据,这对于回测和实盘的稳定性都很重要。
  4. 实盘建议

    • 上述代码在 handlebar 中运行。在实盘模式下,handlebar 会随行情 Tick 驱动。为了避免频繁交易(例如股价波动导致持仓比例在 19.9% 和 20.1% 之间跳动),建议配合 ContextInfo.run_time 定时器使用,或者在代码中增加时间判断(例如只在每天 14:55 调仓)。

Q&A

Q: order_target_percent 计算比例的分母是什么?
A: 分母是账户的总资产,即 可用资金 + 冻结资金 + 所有持仓的市值

Q: 如果我想用限价单(指定价格)而不是最新价调仓怎么办?
A: 可以在函数中增加 styleprice 参数。例如:
order_target_value(stock, 10000, 'FIX', 15.50, ContextInfo, acc_id)
这表示以 15.50 的价格将持仓调整到 10000 元。代码中默认省略了 style,系统默认使用 'LATEST'(最新价)。

Q: 为什么代码第一行要加 # -*- coding: gbk -*-
A: QMT 的 Python 编辑器和底层环境默认使用 GBK 编码处理中文字符。如果不加这一行,代码中的中文注释或打印语句可能会导致乱码或报错。

Q: 这个策略支持期货吗?
A: order_target_valueorder_target_percent 主要设计用于股票交易。期货交易涉及保证金、开平仓方向(开仓、平今、平昨)等复杂逻辑,通常建议使用 buy_open, sell_close 等基础函数配合自定义逻辑来实现。