回测与样本外:如何证伪一个“看起来能赚钱”的策略
内容持续修订,过时部分会及时剔除
一条漂亮的回测曲线,可能只是上千组参数里挑出来的“噪音冠军”。回测不是证据,是假设;真正专业的做法,是先设计好怎么证明自己错了,再决定要不要上线。
1. 回测是证伪工具,不是盈利承诺。
2. 样本外只测一次;反复偷看调参,样本外也会被污染。
3. 参数一换就亏、成本一加就亏的策略,不是策略,是拟合。
承接上文:上一篇用期望值给系统定了验收指标;这一篇检验这些指标是不是回测拟合出来的。指标好看、但一换参数就崩,说明好看的是曲线,不是优势。
一、回测的正确角色:证伪工具,不是盈利承诺
一个回测能说明的事情很有限:在特定数据、特定成本假设、特定执行规则下,这套逻辑曾经产生过某种收益路径。它不能说明未来一定有效,也不能说明你有能力执行。
把回测当成科学实验:先写假设(规则)、再写证伪条件(什么情况下算失败)、最后才看结果。顺序反了,你就会不自觉地挑参数、挑区间、挑品种,直到曲线好看为止。
二、六个最常见的回测陷阱
1. 前视偏差(Look-ahead Bias):用了当时还拿不到的数据,比如用收盘价信号在同一根 K 线收盘价成交、用后来修订过的宏观数据、用未来才知道的主力合约。
2. 幸存者偏差(Survivorship Bias):只回测今天还活着的品种/合约,忽略了退市、到期、流动性枯竭的样本。
3. 过拟合与数据窥探:参数组合试了几百上千组,挑出样本内最好的那组。它不是“发现规律”,而是“记住噪音”。
4. 成本与滑点低估:手续费、买卖价差、冲击成本、保证金占用都没算够,尤其在高频与低流动性品种上。
5. 成交假设不现实:假设限价单一定成交、止损一定在设定价成交、跳空时还能全身而退。
6. 市场结构变化:政策、参与者、合约规则、波动率 regime 变了,历史参数自然失效。
这六条里,最致命的是过拟合。你试的参数越多,样本内最优结果越可能是运气。一个粗略的直觉:试 1,000 组参数,哪怕全是随机噪音,也总能挑出一组“看起来很棒”的曲线。
三、样本内、样本外与滚动检验
正确的验证顺序不是“全样本回测→挑最好→上线”,而是:
- 样本内(In-sample):用来提出假设、粗调规则。不要在这里追求极致收益。
- 样本外(Out-of-sample):锁起来不用,最后只测一次。样本外崩掉,说明样本内是拟合。
- 滚动/前进分析(Walk-forward):用过去 N 年优化,紧接着用未来 M 个月检验,然后窗口向前滚动。它更接近真实交易中“只能利用历史”的处境。
- 参数稳定性:好策略不是“某一个参数点很赚钱”,而是参数在小范围内移动时,收益与回撤没有剧烈跳变。孤峰式的参数,通常是过拟合。
- 蒙特卡洛/自助法:对交易顺序、滑点、缺失数据做重采样,看最大回撤和破产概率的分布,而不是只看一条净值曲线。
如果参数一换、起点一换、品种一换,策略就从暴利变亏损,那它不是策略,是曲线拟合。
过拟合长什么样:一张参数表
拿双均线举例,测九组“快线 / 慢线”参数,样本内挑最好的上线,结果是(示例数据,仅作示意):
| 参数(快线/慢线) | 样本内年化 | 样本外年化 | 样本外最大回撤 |
|---|---|---|---|
| 8 / 24(样本内第一) | 28% | 3% | 35% |
| 10 / 30 | 22% | 9% | 22% |
| 20 / 60(样本内中游) | 18% | 12% | 16% |
样本内的冠军,样本外几乎归零;样本内只排中游的参数,样本外反而最稳。这不是运气差,而是样本内排名本来就被噪音主导:你测的组数越多,越容易挑到“刚好记住这段行情”的那一组。
所以选参数要看平台,不看尖峰:把参数往左、往右各挪一格,收益和回撤都只是平缓变化,说明这个区域有真实逻辑;只有某一个点特别亮,旁边立刻塌陷,那多半是拟合出来的孤峰。
一次 walk-forward 的具体做法
- 切窗口:比如用前 3 年做训练,紧接 6 个月做检验。
- 只在训练段调参:训练段之外的数据,一格都不许看。
- 冻结参数:进入检验段后,不许再改任何规则。
- 向前滚动:窗口整体后移,重复上述过程,记录每一段样本外结果。
- 看整体:多少段样本外为正?最差一段回撤多少?如果一半以上为负,直接淘汰。
这比“全样本回测一次”麻烦,但它更接近真实交易:你永远只能利用过去,不能偷看未来。
四、看哪些指标:别只盯年化收益
| 指标 | 看什么 | 容易掩盖什么 |
|---|---|---|
| 年化收益 / 几何平均 | 长期复利速度 | 路径中的深回撤与长恢复期 |
| 最大回撤 | 最坏情况下账户有多痛 | 回撤持续时间、恢复难度 |
| Calmar / MAR | 年化收益 ÷ 最大回撤 | 尾部风险与杠杆结构 |
| Sharpe / Sortino | 单位波动的超额收益 | 肥尾、偏度、非线性亏损 |
| 胜率 / 盈亏比 / 期望值 | 交易层面的优势来源 | 连亏序列与样本量不足 |
| 换手率 / 成本占比 | 策略对成本和容量的敏感度 | 规模放大后的冲击成本 |
| 暴露度 / 相关性 | 收益来自哪里、是否集中 | 隐藏的 beta、拥挤交易 |
本站的最终标尺仍是几何平均与最大回撤:年化 30%、最大回撤 60% 的策略,长期复利未必赢过年化 15%、最大回撤 15% 的策略。回撤越深,恢复需要的涨幅越非线性。
五、成本、容量与执行
回测里最容易“作弊”的地方是成本。真实交易至少有:
- 手续费与交易所费用;
- 买卖价差;
- 滑点与冲击成本(仓位越大越明显);
- 保证金占用与资金成本;
- 期权的时间价值、行权/指派成本;
- 极端行情下的流动性折价。
还要算容量:一个策略在 100 万资金上有效,不代表在 1 亿资金上有效。容量受合约流动性、持仓限额、冲击成本和市场深度约束。回测不写容量,等于假设自己是市场里唯一的人。
回测要跑多少笔、覆盖几段行情
“样本够不够”不是看年份,而是看两件事:
- 笔数:经验上,100 笔只能初步看期望值,300 笔以上再谈稳定;优势越小、波动越大,需要越多。只有 30 笔的回测,胜率差 5 个百分点都可能是运气。
- 行情类型:单边趋势、震荡、极端波动,至少要覆盖两种。三百笔全在一段单边行情里,样本再多也只证明“那段时间能做”。
一个实用的检查:把回测切成三段,分别看每段的期望值和最大回撤。如果只有一段赚钱,另外两段持平或亏损,那这套策略更像“行情适配器”,而不是稳定优势。
六、上线前的证伪清单
1. 规则是否在回测前就写清楚?有没有事后改参数?
2. 样本外结果是否独立?还是反复偷看、反复调参?
3. 参数在小范围内是否稳定?起点/终点换一换还成立吗?
4. 成本、滑点、保证金、容量是否按保守值计入?
5. 最大回撤与恢复期,按当前真实仓位能不能扛住?
6. 失效条件是什么:滚动几何平均转负、回撤超限、连续亏损超阈值?
7. 是否经过模拟盘/小资金实盘验证?执行偏差有多大?
三个常见问题
“样本外要留多长?”至少留一段完整的不同行情,比如 1–2 年或总样本的 20%–30%。只留三个月,可能刚好撞上同一种行情,测不出问题。
“试多少组参数算过度拟合?”没有绝对数字,但试得越多,挑到“噪音冠军”的概率越大。更稳的做法是看参数稳定性:参数在小范围内移动,收益和回撤不能剧烈跳变。
“回测赚钱、实盘亏钱,先查什么?”先查四件事:成本算够没有、成交假设现不现实、有没有前视偏差、市场结构是不是变了。四项都排除,再怀疑策略。
七、和本站体系怎么接上
- 证伪先行:回测的目的不是证明策略能赚,而是找出它在什么条件下会失效。
- 几何平均验收:不看单次暴利,看长期几何平均、最大回撤、恢复期。
- 刚性止损:回测必须包含止损与跳空假设;没有止损的回测,是在假设自己永远能扛。
- 仓位按最坏情况:回测的最大回撤只是样本内历史,真实仓位要按“更坏一次”来压。
- 优势会衰减:上线后持续监控滚动期望值与回撤,失效就停机,不把“长期会回来”当理由。
“回测的任务不是让你相信策略,而是让你知道它在什么情况下不值得相信。写不出这个条件,曲线越漂亮越危险。”