量化交易
回测过拟合的识别:漂亮曲线为什么最危险
回测曲线越顺滑,越需要检查样本选择、参数自由度、交易成本、样本外表现和真实执行约束。
量化交易最容易让人误判的地方,是回测结果可以非常漂亮。只要参数足够多、筛选足够细、样本切分足够随意,几乎总能找到一条向右上方的资金曲线。但这类曲线往往不是策略能力,而是研究过程把历史噪声当成了规律。
过拟合危险,是因为它看起来很专业。曲线有年化收益,报告有夏普比率,参数有优化结果,甚至还有几十页图表。但如果研究流程允许反复试错、反复筛选、反复删除不满意的样本,最终得到的不是市场规律,而是历史数据的指纹。
回测越像完美答案,越要先问:这个答案是市场给的,还是研究者调出来的?
参数越多,自由度越高
过拟合的核心不是用了复杂模型,而是策略拥有太多自由度。入场指标、出场指标、止损比例、止盈比例、交易时段、过滤条件、标的选择、杠杆倍数,每增加一个可调项,策略就多了一次贴合历史的机会。
一个简单检查是看参数稳定性。把参数轻微上移或下移后,如果收益立即崩塌,策略大概率不是抓住了稳定结构,而是踩中了历史样本里的窄点。真实市场不会按照你优化出来的最佳参数继续运行。
参数稳定性不要求每个参数都一样赚钱,但相邻区域应该有合理表现。比如均线周期 48、50、52 都能接受,说明策略可能依赖某种趋势结构;如果只有 51 赚钱,50 和 52 都亏损,就要怀疑它只是命中了历史噪声。
样本选择也会制造幻觉
过拟合不只来自参数,也来自样本选择。只选择上涨阶段、只选择幸存标的、只选择流动性最好的交易对、只排除极端事件,都可能让策略看起来更稳健。尤其是标的池回测,如果只保留今天还存在且表现不错的资产,就已经引入了幸存者偏差。
时间切分也容易被滥用。如果研究者先看完整历史,再挑一段“代表性样本”做训练和验证,这个切分本身已经带有事后信息。更稳妥的做法,是在研究开始前定义样本范围和切分方法,并保留真正未被触碰的最终验证集。
- 幸存者偏差:失败、退市、流动性枯竭的标的被排除。
- 前视偏差:使用了当时还不知道的财报、成分股、资金费率或收盘数据。
- 数据窥探:反复查看样本外结果,再调整规则直到满意。
- 环境单一:训练和验证都来自同一种上涨、低波动或高流动性环境。
这些偏差的共同点,是它们不会在收益曲线上写明。研究者看到的是漂亮的结果,却看不到它背后少算了多少真实世界的失败路径。
样本外表现比样本内收益重要
样本内回测只能说明策略能解释过去,不能说明它能交易未来。更可靠的流程是先固定策略逻辑和参数,再用未参与研究的数据检验。如果样本内表现优秀、样本外表现明显衰减,就要假设过拟合存在,而不是继续微调到样本外也好看。
时间切分也要尊重市场环境。不能只用上涨行情训练,再用同样上涨行情验证;也不能把相邻时间段当成完全独立样本。策略至少要经历趋势、震荡、高波动、低波动、流动性变化等不同环境,才有讨论稳健性的基础。
样本外衰减并不一定意味着策略没价值。真实策略通常都会从研究环境到实盘环境出现折扣,问题是折扣是否可解释、是否在风险预算内、是否与假设一致。如果样本外亏损发生在策略本来就不擅长的环境,可以通过过滤器处理;如果所有环境都衰减,就说明核心假设可能不存在。
成本会吞掉边缘优势
很多高频率策略在不计成本时表现很好,一加入手续费、滑点、盘口深度和资金费率,优势就消失了。尤其是加密货币和衍生品市场,成交质量本身就是策略结果的一部分,不能在回测里用一个乐观固定值带过。
成本建模应该偏保守。市价单要考虑冲击成本,限价单要考虑不成交和逆向选择,止损单要考虑跳价,杠杆仓位要考虑强平边界。一个策略如果只能在极低成本假设下盈利,它的真实边际可能并不存在。
成本压力测试可以很直接:把手续费和滑点分别上调 25%、50%、100%,观察收益、回撤和交易次数的变化。如果策略从高收益迅速变成亏损,说明它的优势太薄。薄优势不是不能交易,但必须有极强的执行能力和严格容量控制。
看交易分布,不只看最终收益
过拟合策略常见特征是收益集中在少数交易,或者某一个短窗口贡献了大部分利润。资金曲线看起来顺滑,不代表交易分布健康。研究者应该检查单笔盈亏分布、连续亏损长度、不同月份收益、不同波动环境收益,以及最大盈利样本剔除后的表现。
如果去掉前 1% 的盈利交易后策略不再盈利,说明它可能依赖罕见事件。如果连续亏损长度远低于真实可能水平,说明样本可能太短。如果收益只来自某个特殊年份,说明策略未必有跨周期能力。
一个有用的反证方法,是把收益按来源拆开:哪些交易贡献利润,哪些月份亏损,哪些市场环境有效,哪些标的有效。越是只有单一来源支撑的策略,越应该降低仓位和预期。可交易的策略不一定每个阶段都赚钱,但它的亏损和赚钱都应该能被机制解释。
用压力测试拆掉漂亮曲线
压力测试的目的不是让策略通过所有极端条件,而是理解它会在哪里坏掉。你可以延迟信号一根 K 线,扩大滑点,减少可成交数量,随机丢失一部分订单,或者在高波动阶段限制开仓。一个策略如果对小扰动极度敏感,就不适合直接进入实盘。
还可以做交易顺序扰动。保持单笔交易收益分布不变,随机打乱顺序,观察可能出现的最大回撤范围。如果原始回测的最大回撤远低于扰动后的常见结果,说明历史顺序可能过于幸运。实盘不会保证亏损分布像回测一样温和。
压力测试报告应该输出动作,而不是只输出图表。例如:滑点翻倍后仍可接受,则保留;成交率低于 70% 后失效,则设置最低成交率监控;交易顺序扰动显示可能出现 25% 回撤,则原始 10% 回撤不能作为真实风险预算。
把反证流程固定下来
避免过拟合不能只靠经验感觉,需要固定反证流程。每个策略上线前都应该经过参数扰动、样本外验证、成本压力测试、信号延迟测试、标的替换测试和极端行情回放。通过这些测试不代表策略一定赚钱,但至少能过滤掉一批只会解释历史的方案。
- 先冻结假设和参数,再打开样本外数据。
- 先用保守成本验证,再讨论收益率。
- 先检查交易分布,再相信总收益。
- 先定义失效条件,再进入小资金实盘。
回测的目的不是证明自己聪明,而是尽快发现自己错在哪里。越早把漂亮曲线拆开,越少在实盘里为幻觉付费。