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

QMT如何通过代码动态设置回测手续费与滑点?(附完整Python示例)

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

问题描述

qmt 回测参数调优:代码配置 set_commission 与 set_slippage 详解
请教在QMT中如何通过代码动态设置回测的手续费和滑点?

解决方案

QMT回测参数动态设置详解:代码配置手续费与滑点

在量化回测中,手续费(佣金与印花税)滑点(交易摩擦成本)是决定回测结果真实性的关键因素。QMT平台虽然支持在界面(回测参数面板)中手动设置这些数值,但通过Python代码在 init 初始化函数中进行动态配置更加灵活,且代码中的设置会覆盖界面上的默认配置

本文将详细介绍如何使用 ContextInfo.set_slippage()ContextInfo.set_commission() 接口进行高精度的回测参数调优。


1. 动态设置回测滑点:set_slippage

滑点用于模拟真实交易中的冲击成本。QMT提供了三种滑点设置模式。

接口定义

ContextInfo.set_slippage(slippageType, slippage)

参数说明

  • slippageType (滑点类型)
    • 0:按 Tick跳数 设置滑点。
    • 1:按 固定值(价格绝对值) 设置滑点。
    • 2:按 价格比例 设置滑点。
  • slippage (滑点值):对应的数值(如价格比例 0.001 代表 0.1%)。

代码示例

def init(ContextInfo):
    # 示例:按照固定价格设置滑点值为 0.01 元
    ContextInfo.set_slippage(1, 0.01)

2. 动态设置手续费率:set_commission

手续费设置支持按比例或按手(股)数计算,并且可以精细化配置买入印花税、卖出印花税、开仓手续费、平仓手续费、平今手续费及最低佣金。

接口定义

ContextInfo.set_commission(commissionType, commissionList)

参数说明

  • commissionType (手续费类型)
    • 0:按比例(如万分之三写为 0.0003)。
    • 1:按每手/股(固定金额)。
  • commissionList (手续费明细列表):包含 6 个数值的列表:
    [open_tax, close_tax, open_commission, close_commission, close_tdaycommission, min_commission]
    1. open_tax:买入印花税
    2. close_tax:卖出印花税
    3. open_commission:开仓(买入)手续费
    4. close_commission:平仓(平昨)手续费
    5. close_tdaycommission:平今手续费
    6. min_commission:单笔最低佣金(如A股常见的5元起征)

极简调用提示:如果只传入一个数值(如 ContextInfo.set_commission(0.0003)),QMT会默认将开仓、平仓、平今手续费均设为该值(此处为万三),其余税费和最低佣金设为 0,此时 commissionType 默认为 0。

代码示例

def init(ContextInfo):
    # 示例:设置A股经典税费(买入无印花税,卖出千分之一印花税,佣金万三,单笔最低5元)
    # 列表对应:[买入税, 卖出税, 开仓佣金, 平昨佣金, 平今佣金, 最低佣金]
    commissionList = [0, 0.001, 0.0003, 0.0003, 0, 5]
    ContextInfo.set_commission(0, commissionList)

3. 完整回测配置模板

以下是一个完整的QMT回测初始化模板,展示了如何同时配置初始资金、滑点、手续费,并在 handlebar 中读取这些设置:

#coding:gbk

def init(ContextInfo):
    # 1. 设置回测标的
    ContextInfo.set_universe(['600000.SH'])
    
    # 2. 设置初始资金
    ContextInfo.capital = 1000000
    
    # 3. 设置滑点:按固定价格滑点 0.02 元
    ContextInfo.set_slippage(1, 0.02)
    
    # 4. 设置手续费:买入无税,卖出千一税,佣金万二点五,最低5元
    comm_list = [0, 0.001, 0.00025, 0.00025, 0, 5]
    ContextInfo.set_commission(0, comm_list)
    
    print("回测环境初始化完成!")

def handlebar(ContextInfo):
    # 仅在第一根Bar打印配置信息进行确认
    if ContextInfo.barpos == 0:
        # 获取当前设定的滑点与手续费
        current_slippage = ContextInfo.get_slippage()
        current_commission = ContextInfo.get_commission()
        
        print("当前滑点配置:", current_slippage)
        print("当前手续费配置:", current_commission)

4. 核心注意事项

  1. 仅支持回测模式set_slippageset_commissionget_slippageget_commission 等函数仅在回测模式下有效。在实盘或模拟盘运行模式下,手续费和滑点由真实的交易柜台和市场决定,这些函数无实际意义。
  2. 必须在 init 中设置:为了确保回测引擎正确计算每一笔历史交易的成本,滑点和手续费的设置代码必须写在 init(ContextInfo) 函数中。写在 handlebar 中将无法生效或导致计算异常。
  3. 优先级高于界面:若代码中调用了设置函数,回测时将完全以代码中的参数为准,界面“回测参数”面板中的设置将被覆盖。