因子投资-18-回测偏差交易成本与容量
回测收益常在三处被虚增:信息提前、失败样本消失、交易假设过于理想。统计显著不能修复这些结构错误。本讲用时间线审计未来函数、幸存者偏差、修订与选择,再把毛收益转换为含成本和容量的净收益。
本节解决什么问题
回测收益常在三处被虚增:信息提前、失败样本消失、交易假设过于理想。统计显著不能修复这些结构错误。本讲用时间线审计未来函数、幸存者偏差、修订与选择,再把毛收益转换为含成本和容量的净收益。
前置知识与学习目标
需要第 08、17 讲。学完后能识别未来函数、幸存者/选择偏差与过拟合,能分解佣金、卖出印花税、滑点、冲击和借券成本,并用成交额参与率做容量情景。
直觉与手算
策略月毛收益 1%,单边换手 80%。假设买卖佣金各 3bp、卖出印花税 5bp、双边平均滑点各 10bp。粗略每月成本:
净收益约 0.752%。若交易量放大使冲击再增加 30bp,净收益只剩 0.452%。毛 Sharpe 不代表资金可实现 Sharpe。
时间线同样重要:财报 4 月 28 日盘后公告、4 月 30 日形成月末信号、5 月首日成交,收益从成交后开始。任何把它放回 3 月 31 日的连接都是未来函数。
定义与公式
五类偏差
- 未来函数: 决策使用当时未公开数据、未来成分或同收盘成交。
- 幸存者偏差: 只保留期末仍上市、仍存续基金或有完整历史者。
- 数据修订偏差: 使用后来重述财报、回填行业或最终复权版本。
- 选择偏差: 样本进入规则与未来结果相关,如删除退市收益缺失股票。
- 过拟合/数据窥探: 同一样本反复选变量、参数和起止点。
审计时间线:
成本模型
令买入、卖出权重分别为 B(t)、S(t):
印花税通常方向不对称;费率需按历史日期与品种重建。冲击可用参与率的非线性函数:
Q 是订单金额,ADV 是平均日成交额,σ 是波动代理。它是情景模型,不是普遍定律。
容量
设每只股票最大日成交额参与率 p,允许 D 天完成,目标权重绝对值 |w(i)|,则资金规模 AUM 必须近似满足:
真正容量还受价格冲击、组合集中、赎回、涨跌停和借券限制影响。应报告净 Alpha 随 AUM 的曲线,而非单一容量数字。
Python 最小实验
1 | |
A 股实现注意事项
历史佣金下限、过户费、印花税、涨跌停幅度、T+1、融资融券和板块制度会变化,不能用今天参数覆盖全历史。停牌、涨停买不到、跌停卖不出需要订单状态机;“成交额足够”也不保证收盘价成交。微盘策略容量应以个股尾部 ADV 和压力日流动性约束。
常见错误与边界
- 今天成分回溯、报告期连接、同收盘成交。
- 退市股票最后一天无损消失。
- 交易成本只用佣金,忽略税、价差、冲击和借券。
- 用平均成交额估容量,忽略最拥挤持仓。
- 先看结果再选择成本参数。
- 最终测试集反复查看。
- 净收益高于毛收益却没有返佣/做市机制解释。
成本模型也可能过拟合。保守、中性、乐观三组参数和实际成交校准比精细但不可验证的冲击公式更诚实。
原书与论文
原书第 5 章(192–223)是实践风险主线,第 7 章(291–377)讨论前沿。Hou、Xue、Zhang(2020)复现异象:DOI;McLean、Pontiff(2016)研究发现与发表后衰减:DOI。
练习
- 画财报、信号、成交、收益时间轴并列出可用字段。
- 用当前存续股票与历史股票池回测同一信号。
- 对 10/30/100bp 滑点和 1%/5%/10% 参与率做二维情景。
- 加入退市损失和无法卖出天数。
- 写一份不查看最终测试集的模型选择协议。
小结与下一步
回测先审信息与样本,再谈统计;先算可成交毛收益,再扣完整成本与容量。未来函数和幸存者偏差会制造不存在的信号,冲击和约束会把纸面 Alpha 变成更小净收益。下一讲进入风险模型、优化与归因。