🚀 AI 一键生成 qmt 策略代码
立即体验

QMT平台如何利用order_percent与order_lots构建等比例仓位分配策略?

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

问题描述

qmt 仓位管理:order_percent 与 order_lots 的资金分配对比
qmt 怎么利用 order_percent 和 order_lots 构建等比例仓位分配策略?

解决方案

QMT 仓位管理:order_percent 与 order_lots 的资金分配对比及策略实现

在量化交易中,仓位管理是决定策略风险和收益的核心要素。QMT(Quantitative Mining Terminal)平台提供了多种便捷的交易函数。本文将重点对比 order_percent(指定比例交易)order_lots(指定手数交易) 的资金分配差异,并展示如何利用它们构建一个等比例仓位分配策略


一、 函数核心对比

1. order_percent (指定比例交易)

  • 用法order_percent(stockcode, percent[, style, price], ContextInfo[, accId])
  • 机制:发送一个等于目前投资组合总价值(持仓市值 + 剩余现金)指定百分比的买/卖单。percent 为小数(如 0.2 代表 20%)。
  • 特点
    • 动态自适应:自动根据当前账户总资产计算下单金额,无需手动获取资产和计算股数。
    • 自动向下取整:A股交易以手(100股)为单位,该函数会自动将计算出的股数向下调整为100股的整数倍。
    • 安全机制:若可用资金不足,API 将不会创建或发送订单。

2. order_lots (指定手数交易)

  • 用法order_lots(stockcode, lots[, style, price], ContextInfo[, accId])
  • 机制:直接指定买入或卖出的手数(1手 = 100股)。正数代表买入,负数代表卖出。
  • 特点
    • 精确控制:直接控制交易数量,适合对盘口和成交量有极高精准度要求的策略。
    • 需手动计算资金:若要实现等比例分配,必须先手动获取最新价格、账户总资产,再计算出对应的手数,编写逻辑相对繁琐。

资金分配对比表

对比维度 order_percent order_lots
资金计算 自动(基于总资产比例) 手动(需自行编写计算公式)
仓位调整 适合动态调仓、比例配置 适合固定数量交易、网格交易
代码复杂度 极简,一行代码搞定比例 较复杂,需结合最新价与资产计算
A股兼容性 自动向下取整至手 需手动确保传入的 lots 为整数

二、 等比例仓位分配策略构建

假设我们的策略目标是:将账户资金均分为5等份(每只股票占总资产的20%),对股票池中的5只股票进行等比例买入配置。

方案 A:使用 order_percent 实现(推荐,代码最简)

由于 order_percent 自动以总资产为基准,我们只需对股票池中的每只股票分配 0.2 (20%) 的比例即可。

方案 B:使用 order_lots 实现(手动计算)

需要先获取当前总资产 ContextInfo.capital(回测模式)或通过 get_trade_detail_data 获取可用资金,再获取目标股票的最新价格,计算出可买手数。


三、 QMT Python 策略源码示例

以下源码展示了如何在一个策略中,分别使用这两种方式实现等比例建仓:

#encoding:gbk
import pandas as pd

def init(ContextInfo):
    # 设定股票池(5只目标股票)
    ContextInfo.stock_pool = ['600000.SH', '000001.SZ', '600036.SH', '000002.SZ', '600016.SH']
    ContextInfo.set_universe(ContextInfo.stock_pool)
    
    # 设定等比例权重:5只股票,每只20%
    ContextInfo.target_percent = 0.2 
    
    # 记录是否已建仓
    ContextInfo.is_traded = False

def handlebar(ContextInfo):
    if ContextInfo.is_traded:
        return
        
    # 仅在最后一根Bar(或盘中实时)触发建仓
    if ContextInfo.is_last_bar():
        
        # ==================== 方式一:使用 order_percent 极简建仓 ====================
        print("--- 开始使用 order_percent 进行等比例建仓 ---")
        for stock in ContextInfo.stock_pool:
            # 目标买入每只股票占总资产的 20%
            order_percent(stock, ContextInfo.target_percent, 'LATEST', ContextInfo)
            print(f"已发送 {stock} 比例买入委托: {ContextInfo.target_percent * 100}%")
            
        # ============================================================================
        
        """
        # ==================== 方式二:使用 order_lots 手动计算建仓 ====================
        print("--- 开始使用 order_lots 进行等比例建仓 ---")
        # 1. 获取当前账户总资产 (回测模式下可用 ContextInfo.capital)
        total_asset = ContextInfo.capital 
        per_stock_fund = total_asset * ContextInfo.target_percent # 每只股票分配的金额
        
        for stock in ContextInfo.stock_pool:
            # 2. 获取最新分笔数据中的最新价
            full_tick = ContextInfo.get_full_tick([stock])
            if stock in full_tick:
                latest_price = full_tick[stock]['lastPrice']
                if latest_price > 0:
                    # 3. 计算可买股数并向下取整到手 (1手=100股)
                    target_shares = per_stock_fund / latest_price
                    target_lots = int(target_shares / 100)
                    
                    if target_lots > 0:
                        order_lots(stock, target_lots, 'LATEST', ContextInfo)
                        print(f"{stock} 最新价: {latest_price}, 分配资金: {per_stock_fund}元, 委托手数: {target_lots}手")
        # ============================================================================
        """
        
        ContextInfo.is_traded = True

四、 交易建议

  1. 调仓首选 order_percent:在多因子轮动或指数成分股等比例重平衡策略中,使用 order_percent 可以极大减少因价格波动和资产变动带来的繁琐计算。
  2. 注意滑点与手续费:使用 order_percent 分配 100% 资金时,建议预留 1-2% 的资金空间(即总比例设为 98%),以防止因滑点或手续费导致可用资金不足而下单失败。