Appearance
第 15 讲:回测到现实——成本与滑点
本讲要点
回测权益要按可成交假设打折;忽略摩擦的策略不能进答辩。
1. 回测为何偏乐观
第 8–14 讲多数在用收盘价、零摩擦(或第 11 讲简单扣费)。现实中至少还有:
| 摩擦 | 直觉 |
|---|---|
| 佣金 | 按成交金额收取的费用 |
| 印花税等 | 视市场与品种而定(股票常见;ETF 规则不同) |
| 买卖价差 | 买入偏卖一价、卖出偏买一价 |
| 滑点 / 冲击 | 订单使价格不利移动;越急、越大、越不流动越明显 |
入门课不接券商 API,但必须建立:成交价 ≠ 回测里的收盘价,换手越高,折扣越大(与第 11 讲呼应)。
2. 本讲扣费方式
对月度动量 Top-2 等权,仍用:
净收益 ≈ 毛收益 − 单向换手 ×(单边成本 bps)/ 10000
对照四档假设(教学用,非实盘报价):
| 情景 | 单边成本 | 含义 |
|---|---|---|
| 理想成交 | 0 bps | 账面极限 |
| 佣金约 5bps | 5 | 偏低摩擦 |
| 佣金+滑点 | 10 | 常见入门压力测试 |
| 偏保守 | 20 | 更苛刻 |
3. 代码要点
python
for cost_bps in (0, 5, 10, 20):
ret = portfolio_period_returns(month_end, weights, cost_bps=cost_bps)
# 打印累计 / 年化 / Sharpe / 回撤,并画净值脚本:easy-quant/code/15_execution_gap.py
4. 运行结果
text
理想成交 (0bps) 累计 63.56% 年化 9.99% Sharpe 0.60 最大回撤 -24.14% 均换手 49.19%
佣金约 5bps 累计 61.10% 年化 9.67% Sharpe 0.58 最大回撤 -24.63%
佣金+滑点 10bps 累计 58.67% 年化 9.35% Sharpe 0.56 最大回撤 -25.12%
偏保守 20bps 累计 53.93% 年化 8.71% Sharpe 0.52 最大回撤 -26.09%
相对理想: 佣金约 5bps 收益差 -2.46%
相对理想: 佣金+滑点 10bps 收益差 -4.89%
相对理想: 偏保守 20bps 收益差 -9.63%| 情景 | 累计收益 | Sharpe | 相对理想 |
|---|---|---|---|
| 理想 0bps | 63.56% | 0.60 | — |
| 5bps | 61.10% | 0.58 | −2.46% |
| 10bps | 58.67% | 0.56 | −4.89% |
| 20bps | 53.93% | 0.52 | −9.63% |

读法:
- 月均单向换手约 49% 时,10bps 大约吃掉近 5 个百分点累计收益。
- 若第 11 讲改用周频,同样 bps 下损耗会更大——高频结论必须带摩擦。
- 答辩最低要求:同时给出理想与至少一档压力成本;不能只展示 0 成本曲线。
5. 本讲小结
- 佣金、价差、滑点使回测偏乐观
- 用换手 × 单边成本做可复现的压力测试
- 下一讲:研究如何监控与迭代,并对照开篇目标自评