问题描述
解决方案
在 QMT 量化交易平台中,设置回测的手续费和印花税主要有两种方式:一种是通过策略编辑器界面的“回测参数”面板进行设置,另一种是通过 Python 代码在 init 函数中调用 API 进行设置。
通常建议使用 代码设置,因为这样可以确保策略在不同机器或环境下运行时,费率参数保持一致,且代码设置的优先级高于界面设置。
以下是详细的设置方法和代码示例。
方法一:使用 Python 代码设置(推荐)
在策略的初始化函数 init(ContextInfo) 中,使用 ContextInfo.set_commission() 接口进行设置。
1. 函数说明
ContextInfo.set_commission(commissionType, commissionList)
- commissionType (int): 手续费类型。
0: 按金额比例计算(默认,如股票万三则填 0.0003)。1: 按固定值计算(按每手或每股收取固定金额)。
- commissionList (list): 包含 6 个浮点数的列表,顺序固定如下:
- open_tax: 买入印花税
- close_tax: 卖出印花税
- open_commission: 开仓手续费(买入佣金)
- close_commission: 平仓手续费(卖出佣金)
- close_tdaycommission: 平今手续费(期货专用,股票通常填 0)
- min_commission: 单笔最低手续费(如股票通常为 5 元)
2. 代码示例
以下代码展示了如何设置典型的 A 股股票费率(假设:卖出印花税千分之 0.5,买卖佣金万分之 3,最低佣金 5 元):
# -*- coding: gbk -*-
def init(ContextInfo):
# 1. 设置股票池等基础信息
ContextInfo.set_universe(['600000.SH'])
# 2. 设置回测费率
# 参数含义:[买入印花税, 卖出印花税, 买入佣金, 卖出佣金, 平今佣金, 最低佣金]
# 注意:此处费率仅为示例,请根据实际需求调整
# 卖出印花税设为 0.0005 (0.05%)
# 买卖佣金设为 0.0003 (万三)
# 最低佣金设为 5 元
commission_list = [0.0, 0.0005, 0.0003, 0.0003, 0.0, 5.0]
# 第一个参数 0 表示按金额比例计算
ContextInfo.set_commission(0, commission_list)
print("回测费率设置完成")
def handlebar(ContextInfo):
# 策略逻辑
pass
3. 简易设置模式
如果你只传入一个浮点数参数,系统会将开仓、平仓、平今手续费都设为该值,其他税费设为 0。
def init(ContextInfo):
# 仅设置统一的佣金比例为万分之三,不包含印花税和最低佣金
ContextInfo.set_commission(0.0003)
方法二:通过界面设置
如果你不想写代码,也可以在 QMT 客户端的界面中设置:
- 打开策略编辑器。
- 在右侧面板找到 【回测参数】 标签页。
- 在列表中找到以下项目进行填写:
- 手续费类型:选择“按交易额比例”或“按固定值”。
- 买入印花税 / 卖出印花税。
- 买入佣金 / 卖出佣金。
- 最低佣金。
- 点击保存或运行回测。
注意:如果代码中调用了 set_commission,则代码中的设置会覆盖界面上的设置。
常见问题 Q&A
Q: 为什么我在界面上改了费率,回测结果没变?
A: 请检查你的代码 init 函数中是否写了 ContextInfo.set_commission。代码的优先级高于界面,如果代码中写死了费率,界面修改将无效。
Q: 期货回测怎么设置?
A: 期货通常没有印花税,但有平今仓手续费。设置 commissionList 时,前两项(印花税)设为 0,重点设置第 3、4、5 项(开仓、平仓、平今手续费)。如果是按手收费,记得将 commissionType 设为 1。
Q: set_commission 支持实盘吗?
A: 不支持。该函数仅在回测模式下生效。实盘交易时,手续费由柜台系统根据你的资金账号实际费率自动结算,策略端无法修改。
Q: 如何查看回测中实际扣除的费用?
A: 回测结束后,可以在回测结果面板的“交易明细”中查看每一笔交易的“手续费”一栏,或者通过代码 get_trade_detail_data 获取交易明细进行核对。