
每个做量化的人,都曾对自己的回测曲线心动过。年化 35%、夏普 3.0、最大回撤不到 8%,曲线平滑得像被熨过。可一旦真金白银上实盘,三个月亏掉 20%,心态崩了,策略也跟着停了。
这不是你一个人的故事。在量化圈有个半开玩笑的说法:回测是策略的「美颜相机」,实盘才是素颜的镜子。 问题不在于回测工具本身,而在于我们在回测中不知不觉地、系统性地「作弊」——有的是无意的技术疏忽,有的则是潜意识里为了一个好看的数字而自我欺骗。
本文不打算再重复一遍教科书定义,而是结合我这几年挖因子、做回测、踩坑实盘的经验,把七类最常见、也最致命的陷阱掰开讲透,并给出真正能落地的应对方案。如果你正在从「做因子」走向「管实盘」,这篇可能值得你花二十分钟。

一、过拟合:量化领域的「原罪」#
过拟合是被谈论最多、却最难根治的问题。它的本质一句话就能说清:你的策略不只学到了市场的规律,还把历史数据里的随机噪声当成了规律。
我见过最典型的案例:一个同学用 60 日、120 日、250 日均线交叉做择时,把三条均线的参数从 5 到 500 全网格搜了一遍,选出「历史表现最好」的一组。问题来了——假设你有 5 个参数,每个 10 种选择,那是 10 万种组合。在 10 万次随机尝试里,闭着眼也必然能「撞」出一个曲线极漂亮的参数,这是数学上的必然,不是你发现了 alpha。
更隐蔽的是结构过拟合:你不是调参数,而是反复改策略逻辑——「这里加个止损」「那里换个因子」「月初不交易」,每次回测不好看就再改一版,直到曲线满意为止。每改一版,你就消耗了一份「自由度」,即便你显式参数没变,但你的「研究者自由度」已经爆表了。
我的经验法则:如果一个策略,参数稍微动一动收益就塌方,那它从一开始就不该上线。稳健的策略,绩效随参数应该是「平缓的高原」,而不是「尖锐的山峰」。
二、前视偏差(Look-ahead Bias):最隐蔽的技术性作弊#
前视偏差说的是:你在回测里,用到了「当时根本不可能知道」的信息。它往往不是故意的,而是数据处理的细节疏漏。
最常见的几个坑:
- 财报/宏观数据用了发布日而非生效日。比如 4 月 15 日发布的年报,净利润同比增长 30%。如果你在 4 月 1 日就用上了这个 30% 去调仓,那就是完美的前视——现实中你 4 月 15 日才知道。
- 复权价处理。用「后复权」价回测看着没问题,但 dividend/corporate action 的除权日是未来的,用后复权价算历史信号本质上也偷看了未来。
- 技术指标用了当日收盘价。你在 14:50 决定调仓,却用当天 15:00 的收盘价算信号——盘中根本拿不到。
应对前视偏差没有捷径,只有一条笨办法:把每一笔信号、每一笔成交,都严格绑定到「那个时点真正可见」的数据快照上。 我在工程上强制要求所有因子计算打上 as_of_date 时间戳,并在回测引擎里断言「信号日期 ≤ 成交日期 ≤ 数据可用日期」,任何违反直接报错。别相信自己的记忆力,要用代码把它挡在门外。
三、幸存者偏差(Survivorship Bias):被「消失」的股票#
幸存者偏差在 A 股尤其致命。你如果直接用「当前还在上市的所有股票」去做十年回测,等于默认了「十年前那些退市的、ST 的、被借壳的公司从来不存在」。而恰恰是这些公司的失败,才衬托出好公司的收益——你人为抬高了回测基准。
更阴险的是流动性幸存者偏差:小市值策略回测暴利,往往是因为回测里包含了后来被资金发现、市值做大的那批票,却没包含那些一直跌成仙股、甚至退市的。一旦实盘,你买的「下一个小市值牛股」大概率是下一批评不上的。
解决方案很明确但成本高:必须用「point-in-time」的全样本股票池,包含已退市股票,用上市日的原始代码。Wind、聚源、CRSP(美股)都有退市数据,别嫌贵,这是基本功。我早期就因为用错股票池,把一个「年化 40%」的小市值策略打回原形到「和沪深 300 差不多」。
四、数据窥探(Data Snooping):多重检验的沉默杀手#
数据窥探和过拟合是孪生兄弟,但更难察觉。过拟合针对单个策略的参数,数据窥探针对你在整个研究过程中测试过的所有策略。
白话说:你测了 100 个因子,挑出 p 值最显著的那 5 个组合成策略。但这 5 个「显著」里,本来就有一定比例(按显著性水平)是纯粹运气显著。你用同一段数据既「探索」又「确认」,等于自己给自己发了张假证书。
学术上有个经典修正——Bonferroni 校正和 Deflated Sharpe Ratio(压缩夏普比率,由 Bailey 与 López de Prado 提出),专门用来惩罚「你测试过多少假设」这件事。我现在的做法是:在回测报告里强制登记「本研究共测试过 N 个因子、M 组参数」,并用 deflated Sharpe 重新给夏普打折扣。一个原始夏普 3.0、但测试过 500 个因子的策略,真实夏普可能只有 1.2——这个数字反而更可信。
五、交易成本:被低估的「隐形税收」#
很多回测默认手续费万二、滑点忽略不计,结果实盘被成本吃掉一大半。A 股的隐形成本远超新手想象:
- 印花税:卖出千一,单边,红利策略高频轮动时这是硬伤。
- 冲击成本:你一个千万级产品,买一只日成交两千万的小票,自己的单就能把价格推上去 1%~2%。
- 买卖价差与滑点:尤其开盘、收盘、涨跌停附近,滑点可能达到 0.5% 以上。
我的做法是**「悲观假设」回测**:在回测里把成本设得比真实情况再高一点——比如真实佣金万三,我回测用万五;真实滑点估计 0.1%,我回测用 0.2%~0.3%。如果这样一个「被虐待」的回测还能赚钱,实盘我才放心。反之,一个在「理想成本」下勉强打平的策略,实盘必死。
还有一个常被忽略的点:换手率本身就是风险。年化换手 50 倍的高频因子,哪怕单次成本只多算 0.05%,全年累积就能吞掉 2.5% 的 alpha。因子好不好,不能只看 IC,要看「信息比率 / 换手率」的性价比。
六、市场状态切换(Market Regime Change):好策略也会「过期」#
这是最让人无奈的一类陷阱。一个 2019-2021 年表现优异的动量因子,在 2022 年的反转市里可能亏到怀疑人生。不是因子错了,是市场状态变了,因子的「适用环境」消失了。
我越来越倾向于把因子理解为「条件有效的」而非「永远有效的」。比如:
- 低波因子在恐慌后、估值修复期有效;
- 反转因子在震荡市有效,在单边趋势市里是毒药;
- 价值因子在利率上行周期跑赢,在流动性泛滥时跑输。
所以我现在的框架里,几乎每个策略都配一个状态识别器(用 HMM 或简单的波动率/相关性 regime 划分),只在「适配的状态」里给仓位,其余时间降权或空仓。这会让回测的「漂亮程度」下降,但实盘的「存活概率」大幅上升。
七、执行滑点(Execution Slippage):从「信号」到「成交」的最后一公里#
即便回测里你把成本算得很全,实盘还有一个 gap:信号生成价 ≠ 你真正成交的价。
- 你用 14:50 的快照算信号,15:00 下单,但 14:50 到 15:00 之间价格可能已经动了;
- 大单拆单(VWAP/TWAP)在流动性差的时段根本吃不饱,尾盘被迫市价扫单;
- 极端行情下,你算好的「限价单」根本没成交,等成交时价格已远去。
这块的教训是:回测里要对「成交假设」保持极度保守。我习惯用「下一根 K 线开盘价成交」而不是「信号当根收盘价成交」,并对流动性差的标的额外加滑点。更重要的是,上实盘先用小资金跑 1~2 个月「影子账户」,把回测假设和真实成交逐笔比对,算出真实的「实现滑点」,再回头校回测模型。这一步没人能替你省。
真正能落地的三个解法#
讲了七宗罪,不给药方是耍流氓。下面三个方法,是我认为性价比最高、也最该成为流程标配的。
1. 样本外测试(Out-of-sample Testing)——守住最后的「干净数据」#
把所有历史切成训练集、验证集、测试集。在训练集开发,验证集调参(只能看有限次),测试集从头到尾一次都不碰,直到你确信策略定型,才打开看一眼。测试集就是你的「高考」,考完不能复读。任何「在测试集上不好看,回去改一版再看」的动作,都让测试集退化成了验证集,自由度又泄露了。
2. 滚动窗口前向分析(Walk-forward Analysis)——让时间替你验证#
比一次性切分更严谨的是 walk-forward:用 2015-2019 训练、2020 测试;再 2016-2020 训练、2021 测试…… 滚动向前,看策略在每一个「当时未知的未来」上是否稳定盈利。如果十个窗口里有七个赚钱、三个小亏但都不伤筋动骨,那比「整段历史一个漂亮数字」可靠得多。walk-forward 的本质是用多个独立的样本外片段,替代一个被反复窥探的整体。
3. 蒙特卡洛模拟(Monte Carlo Simulation)——给你的信心加个误差条#
回测给你一个「点估计」:年化 20%。但真实未来是随机的,你该问的是:在 1000 次随机重排/重抽样的未来里,这个策略有多少次是赚钱的?最坏的那 5% 有多惨?
具体可以:把日收益序列做 bootstrap 重抽样,生成 1000 条可能的净值曲线,看分位数。如果 1000 次里有 900 次年化 > 0、但最差的 5% 回撤能到 40%,你就知道「20% 年化」背后藏着多大的尾部风险——这比单看一条回测曲线清醒太多。蒙特卡洛不会让策略变好,但能阻止你过度自信。
写在最后:回测不是证明,是证伪#
做了这么多年量化,我最大的体会是:回测的目的不是「证明策略能赚钱」,而是「用尽一切办法去证伪它」。
一个好策略,不是回测曲线最漂亮的那个,而是你在它身上使尽浑身解数去挑刺——加成本、换数据、切状态、做样本外、跑蒙特卡洛——它依然活下来的那个。回测赚的钱是虚的,实盘活下来才是真的。
所以下次看到一条美到不真实的曲线,先别心动,问自己三句话:这组数据我碰过几次?这些成本我算够了吗?这个市场状态未来还会在吗? 答得上来,再考虑上钱。
量化这条路,慢就是快。与各位共勉。
本文基于作者多年因子挖掘与实盘经验写成,案例与数据均为示意性说明,不构成任何投资建议。