投资笔记 · DoggyDad 原创
回测为什么那么漂亮:从数据时点到过拟合的完整检查
用可执行的研究流程检查未来信息、幸存者偏差、多重试验、成本与样本外验证,让回测成为找错工具。
60-SECOND BRIEF
一分钟速览
- 回测必须模拟当时能知道什么、能交易什么,而不只是套用历史价格。
- 反复查看并调整的测试集,已经不再是独立测试集。
ANSWER-FIRST SUMMARY
本文回答什么问题
用可执行的研究流程检查未来信息、幸存者偏差、多重试验、成本与样本外验证,让回测成为找错工具。
- 主题分类:投资笔记
- 关键词:回测、过拟合、量化交易
一条平滑向上的回测曲线,可能代表真实规律,也可能只是数据泄漏、成本遗漏或大量试验之后的幸运产物。代码运行正确,并不等于实验设计正确。

回测最有价值的用途,是在投入资金之前发现策略的弱点。为此,首先要把“如果当时真的交易,会发生什么”写得足够具体。
把研究假设冻结在看结果之前
以一个假想策略为例:每月按某项盈利质量指标排序,买入排名靠前的一组股票,持有一个月。需要先确定股票池、数据可用时点、排序规则、调仓日、成交价格、权重、费用以及无法成交时如何处理。
如果这些规则是在看过收益曲线之后不断补上的,就很难知道最终结果来自经济规律,还是来自对历史的迎合。
建立实验记录很有帮助:保存假设、数据版本、参数、代码版本、试验日期和结果。不只记录成功的版本,也记录被淘汰的方案。否则研究者自己也容易忘记,所谓“第一个有效信号”前面已经试过多少次。
时间戳比公式更容易出错
假设某份年报在 4 月公布,回测却从 1 月起使用其中的数据,就把未来信息带回了过去。即使数据库把这条数据标记为上一年年末,也不意味着当时的投资者已经知道。
类似问题还包括:使用今天修订后的历史数据、用今天的指数成分回测过去、只保留仍上市的公司、先看当天收盘价生成信号却假设能按同一个收盘价成交。
数据清洗和特征标准化也必须遵守时间边界。用全部样本计算均值、缺失值填充规则或行业分类,再切分训练和测试,可能在不显眼的地方泄漏未来信息。
合理的历史模拟需要保留退市、停牌、分红、拆股和当时可投资范围等信息。不同市场的涨跌幅、交易单位、卖空与结算约束,也会影响策略能否执行。
试得越多,越需要怀疑最好的那个
如果随机生成很多策略,总会出现一些漂亮曲线。选择其中最好的再报告,会让偶然性看起来像能力。
Bailey 等人的回测过拟合研究讨论了这种多重试验问题,也提醒单纯保留一段样本并不总能解决策略选择偏差。本文不把任何单一检验视为通用认证,而是强调保存整个选择过程。
把参数从几十组扩大到几千组,不是免费增加发现真理的机会,也同时增加了拟合噪声的机会。经济机制、参数稳定区间与独立验证,应该共同约束搜索。
样本外验证需要真正的边界
一种基本做法是按时间划分研究、验证与最终测试区间,再通过滚动训练模拟模型随时间更新。时间序列通常不宜直接随机打乱,因为这样可能破坏信息顺序和相关结构。
如果标签使用未来一个月的收益,相邻训练与测试样本之间可能共享同一段未来信息,需要隔离重叠区间。具体留出长度应由标签与持有期决定,不能机械套用一个天数。
最关键的是:一旦根据测试集结果修改策略,它就参与了开发。不能调整十次后,仍称第十次结果为“完全样本外”。需要另一个未使用的检验阶段,或诚实披露结果已被反复参考。
成交模型决定曲线能否走出电脑
至少区分佣金及适用税费、买卖价差、滑点、市场冲击、融资与借券成本。滑点与价差定义要一致,避免重复扣除,也不能遗漏。
以教学数字说明:策略每次完整进出预期毛收益 0.4%,若完整成本约 0.3%,剩余空间只有 0.1%。成本增加一点,结果就可能反转。换手率高的策略尤其敏感。
还要模拟部分成交、没有成交、交易暂停与集中退出。纸面交易可以帮助发现数据和订单流程问题,却不能完全复现真实排队、冲击成本与压力时流动性。
不只问赚了多少,还要问靠什么赚
除了累计收益,可以检查最大回撤、恢复时间、尾部损失、风险暴露、交易集中度和容量。夏普比率也应谨慎解释:收益自相关、极端损失和短样本,都可能让表面指标过于乐观。
把收益按时间、资产、行业和市场环境拆开。如果大部分利润来自少数无法重复的交易,或者某个特殊年份,需要解释它们与策略机制的关系。
最终交付物不该只有一张净值图,而应包括:预先定义的规则、数据时点说明、全部重要试验、成本假设、样本外结果和已知失效情景。真实交易仍然可能偏离回测,但至少你知道自己尚未解决哪些问题。
DISCUSSION
评论与补充