【PTrade】PTrade回测如何设置手续费和滑点?避免策略收益虚高完整教程
本方案由EasyQuant AI量化助手提供。
问题背景
很多策略回测收益很高,实盘却明显缩水,主要原因是回测没有正确设置佣金、最低手续费、滑点和成交量限制。
PTrade 提供set_commission()、set_fixed_slippage()、set_volume_ratio()等接口,可使回测成交规则更接近真实环境。
实现思路
设置股票池和回测基准。
设置佣金费率及最低佣金。
设置固定滑点。
限制每根 K 线最大可成交比例。
使用简单均线策略,比较加入交易成本前后的回测差异。
完整代码示例
def initialize(context): g.security = "510300.SS" # 均线参数 g.fast_window = 5 g.slow_window = 20 # 设置股票池与基准 set_universe([g.security]) set_benchmark("000300.SS") # 设置佣金: # commission_ratio=0.0003 即万分之三 # min_commission=5.0 即单笔最低佣金5元 set_commission( commission_ratio=0.0003, min_commission=5.0, type="ETF" ) # 设置固定滑点0.02元: # 买入成交价会更高,卖出成交价会更低 set_fixed_slippage(fixedslippage=0.02) # 单笔委托最多成交当前周期可成交量的25% set_volume_ratio(volume_ratio=0.25) # 使用成交量限制模式,避免理想化大额成交 set_limit_mode("LIMIT") log.info("回测成本参数设置完成") def handle_data(context, data): security = g.security # 获取均线所需历史收盘价 history_data = get_history( security, count=g.slow_window + 2, frequency="1d", fields=["close"] ) if history_data is None: return close_list = list(history_data["close"]) if len(close_list) < g.slow_window + 1: return # 当前均线 fast_ma_now = sum(close_list[-g.fast_window:]) / g.fast_window slow_ma_now = sum(close_list[-g.slow_window:]) / g.slow_window # 前一日均线 fast_ma_prev = sum( close_list[-g.fast_window - 1:-1] ) / g.fast_window slow_ma_prev = sum( close_list[-g.slow_window - 1:-1] ) / g.slow_window # 金叉与死叉 buy_signal = ( fast_ma_now > slow_ma_now and fast_ma_prev <= slow_ma_prev ) sell_signal = ( fast_ma_now < slow_ma_now and fast_ma_prev >= slow_ma_prev ) # 获取当前持仓 position = get_position(security) # 金叉开仓 if buy_signal and position.total_amount == 0: order_value(security, context.portfolio.cash * 0.95) log.info("金叉买入:%s" % security) # 死叉清仓 elif sell_signal and position.total_amount > 0: order_target_value(security, 0) log.info("死叉卖出:%s" % security) def after_trading_end(context, data): log.info("当日总资产:%.2f" % context.portfolio.total_value) log.info("当日可用资金:%.2f" % context.portfolio.cash)注意事项
手续费和滑点应按实际券商费率、交易品种与交易频率设置。
固定滑点适合快速模拟;高频或流动性较差的标的需采用更谨慎的假设。
set_volume_ratio()可避免回测中“一次买完市场全部成交量”的不现实情况。不要只看总收益,应同时观察最大回撤、交易次数、胜率、盈亏比和换手率。
回测使用的成本参数与实盘条件差距越小,结果越具有参考意义。
总结
PTrade 回测设置不是可有可无的步骤。手续费、滑点和成交量限制会直接影响策略的可执行性;把它们纳入回测,才能更理性地判断策略质量。
本方案由EasyQuant AI量化助手提供。
