问题描述
客户反馈进行的日策略的回测,正常应该只亏手续费,但是根据手续费的计算,与累计盈亏不符;
解决方案
在 ptrade 量化平台进行回测时,如果发现累计盈亏的亏损额大于您计算出的手续费,最常见的原因是回测引擎默认计算了滑点(Slippage)成本。
1. 什么是滑点?
滑点是指在真实交易中,委托价格与实际成交价格之间的价差。为了让回测结果更逼近真实的交易环境,ptrade 引擎在撮合成交时,默认会加入滑点成本。
根据 ptrade API 文档,平台提供了两种滑点设置方式,且都有默认值:
- 比例滑点 (
set_slippage):默认滑点比例为0.1(即千分之一)。最终成交价格 = 委托价格 ± 委托价格 * slippage / 2。 - 固定滑点 (
set_fixed_slippage):默认固定滑点为0.0。
如果您在策略中没有显式地关闭滑点,系统会按照默认的比例滑点扣除额外的交易成本,这就是导致累计盈亏与纯手续费计算不符的原因。
2. 如何解决?
如果您希望在回测中只计算手续费,不计算滑点(例如为了纯粹验证交易逻辑),您需要在策略的 initialize 函数中,显式地将滑点设置为 0。
代码示例:
def initialize(context):
# 设置股票池
g.security = '600570.SS'
set_universe(g.security)
# 1. 将比例滑点设置为 0
set_slippage(slippage=0.0)
# 2. 将固定滑点设置为 0(可选,默认为0)
set_fixed_slippage(fixedslippage=0.0)
# 3. 设置您预期的手续费率(例如万分之三,最低5元)
set_commission(commission_ratio=0.0003, min_commission=5.0)
def handle_data(context, data):
# 您的交易逻辑
pass
3. 总结与建议
- 排查误差:当回测收益与手工计算出现偏差时,首先检查手续费 (
set_commission) 和 滑点 (set_slippage/set_fixed_slippage) 的设置。 - 实盘贴近度:虽然将滑点设置为 0 可以让账面数据完全符合理论计算,但在实际交易中滑点是不可避免的(尤其是市价单或流动性较差的标的)。建议在最终评估策略时,保留一定的滑点设置,以测试策略的抗冲击成本能力。