3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化回测中,手续费(佣金与印花税)和滑点(交易摩擦成本)是决定回测结果真实性的关键因素。QMT平台虽然支持在界面(回测参数面板)中手动设置这些数值,但通过Python代码在 init 初始化函数中进行动态配置更加灵活,且代码中的设置会覆盖界面上的默认配置。
本文将详细介绍如何使用 ContextInfo.set_slippage() 和 ContextInfo.set_commission() 接口进行高精度的回测参数调优。
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)
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]
open_tax:买入印花税close_tax:卖出印花税open_commission:开仓(买入)手续费close_commission:平仓(平昨)手续费close_tdaycommission:平今手续费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)
以下是一个完整的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)
set_slippage、set_commission、get_slippage、get_commission 等函数仅在回测模式下有效。在实盘或模拟盘运行模式下,手续费和滑点由真实的交易柜台和市场决定,这些函数无实际意义。init 中设置:为了确保回测引擎正确计算每一笔历史交易的成本,滑点和手续费的设置代码必须写在 init(ContextInfo) 函数中。写在 handlebar 中将无法生效或导致计算异常。