滚动验证、交叉验证到底是什么?普通人也能看懂吗?
交叉验证是在换考卷,滚动验证是在让时间往前走。看懂数据怎么切,就能发现回测有没有偷看答案。
直接答案:能,而且没那么玄乎。 交叉验证是换几张卷子考,滚动验证是严格按时间考试。你只要盯住一件事:策略有没有提前见过答案。
量化报告有个毛病。
你明明只问一句:“这策略到底靠不靠谱?”
它先给你扔过来四个英文缩写:K-Fold、Walk-Forward、Purged CV、Embargo。
别急着关页面。这几个词说到底,都在查同一件事:这套策略是真会做题,还是提前背过答案?
先留一张没见过的卷子
假设你手里有 2024 年到 2025 年的交易数据。
最简单的验证方法,是把最后几个月先藏起来。前面的数据拿去研究,入场条件、止损、参数全都定死。等什么都不能改了,再把最后几个月拿出来考一次。
前面那部分叫训练数据。最后藏起来的那部分叫测试数据。
这不难理解。难的是忍住不偷看。
很多回测嘴上说测试,实际流程是这样的:考一次,不赚钱,回去改参数;再考一次,还不赚钱,再加个过滤条件。改到曲线终于抬头,然后宣布策略“通过测试”。
这不是考试。这是拿着答案改卷子,改完还给自己批了个满分。
只留一张卷子也有问题。假如最后三个月刚好是大牛市,趋势策略可能闭着眼都赚钱。换到震荡市,裤衩子说没就没。
所以,不能只考一次。
交叉验证:换几张卷子再考
先别管术语,想象一下学校月考。
把数据分成几份。每一轮藏起其中一份,用剩下的数据准备,再去考被藏起来的那份。几轮都做完,看看好成绩是不是只靠某一张卷子撑着。
研究里把这种“轮流换卷子”的办法叫 交叉验证(Cross-Validation)。
普通机器学习里经常用 K 折交叉验证。数据分成 K 份,轮流拿一份测试。有时还会先把顺序打乱。
图片、用户表格这类数据,打乱可能没事。交易数据不行。交易数据有昨天、今天和明天。
你不能拿 2025 年的数据训练,再回头证明自己会预测 2024 年。那不叫预测。那叫穿越以后回来参加高考。
scikit-learn 的 TimeSeriesSplit 文档也专门提醒:普通交叉验证可能出现“用未来训练、拿过去测试”的问题。时间序列切分时,训练数据必须在测试数据之前。scikit-learn:TimeSeriesSplit
滚动验证:时间不许倒着走
交易数据既然不能乱洗,那就按时间往前考。
例如,先用过去 12 个月准备策略,拿接下来的 3 个月考试。考完以后,时间整体往前挪 3 个月,再考下一段。就这么一轮一轮走到最新数据。
每次考试时,策略只能看见当时已经发生的事。明天的答案,今天一眼都不许瞄。
研究里常把它叫 滚动起点时间序列交叉验证。交易圈更常说 滚动验证 或 Walk-Forward Validation。
名字听起来很高级,做法却不一定相同。
有人把旧数据一直留着,训练区越积越长;有人只看最近一段,太老的数据直接丢掉。有人每一轮允许重新调参数,也有人从头到尾不许改。
所以别看见 Walk-Forward 就自动放心。先问清楚它怎么滚。轮子装反了,滚得越勤,离谱得越远。
Forecasting: Principles and Practice 对这件事的解释也很清楚:每一个测试点,只能使用它之前发生的数据训练;然后评估起点继续往前移动。OTexts:时间序列交叉验证
一句话记住:交叉验证是在换卷子,滚动验证是在保证时间不倒流。
这几种验证,到底差在哪?
| 方法 | 怎么考 | 能回答什么 | 最容易藏住什么 |
|---|---|---|---|
| 留出一段 | 前面准备,最后考一次 | 最终版本能否过一张陌生卷子 | 只考一次,可能碰巧押中行情 |
| 普通 K 折 | 分成 K 份,轮流考试 | 模型换一批样本是否还稳定 | 交易数据一打乱,未来可能混进过去 |
| 滚动验证 | 用过去准备,考下一段,再往前走 | 换时间、换行情还能不能活 | 每轮偷偷改规则,照样能把卷子刷熟 |
| 带隔离的验证 | 切分边界留出空档 | 持仓跨期时能否挡住信息泄漏 | 空档太短,答案还会从墙缝里钻过去 |
表不用背。记住一句就够:考卷和答案挨得越近,成绩越值得怀疑。
为什么两段数据中间还要留空?
假设一笔交易周一开仓,周五才平仓。你却在周三把训练数据和测试数据一刀切开。
左半边嘴上说“我没见过未来”,右脚已经踩进周五了。
这就是边界上的信息泄漏。表面分成了两间考场,中间那堵墙却漏音。
研究里通常会把跨过分界线的样本清出去,这叫 Purging。有时还会在两边再空出一点距离,这段隔离期叫 Embargo。
普通人不用先学公式。拿到报告,只问一句就够:一笔交易如果跨过训练和测试的分界线,你们怎么处理?
对方要是开始东拉西扯,墙大概率不太隔音。
验证做得越复杂,就越靠谱吗?
不一定。
假设有人测了 500 组参数。第一轮亏钱,改止损;第二轮还亏,加个过滤条件;哪段翻车,就针对哪段补规则。最后总算找出一组历史收益特别漂亮的参数。
不容易。毕竟给历史行情 500 次机会,它总得配合一次。
测试数据本来是期末考试。每亏一次就回去改规则,它慢慢变成了练习册。再改几十次,这张卷子比自家族谱还熟。
研究里把这种问题叫 回测过拟合(Backtest Overfitting):试过的策略和参数太多,手里的数据却太少。最后选中的“冠军”,可能不是真会赚钱,只是最会背这段历史。
Bailey、Borwein、López de Prado 和 Zhu 的研究专门讨论了这个问题:从大量策略或参数里挑最好看的结果,很容易把运气当成能力。The Probability of Backtest Overfitting
所以,滚动验证不是免死金牌。它能让作弊更难,但拦不住有人把期末考试刷成五三题库。
普通人看报告,先问这六句
别急着看年化收益,也别先数夏普比率后面有几个零。先问:
- 数据按时间排好了吗? 训练必须在前,测试必须在后。
- 测试数据真的没被看过吗? 调参数、挑指标、改规则,都算看过。
- 每一轮成绩都给了吗? 只给平均数,可能是把几场惨败揉没了。
- 每轮都扣费用了吗? 手续费、点差、滑点和资金费率,一个都不能等上线再想。
- 一共试过多少个版本? 只展示冠军、不公布参赛人数,这比赛多少有点贴心。
- 最后还有一张完全没碰过的卷子吗? 所有选择结束后,再考一次,才算真考试。
一份报告要是连数据怎么切都不肯讲,却把收益曲线画得比心电图还激动,先别跟着激动。
什么样的结果更值得信?
不是每一轮都赚钱。
每一轮都赚钱,反而容易让人想看看答案藏在哪只袖子里。
更值得信的报告,会老老实实告诉你:哪段赚钱,哪段失灵;最差一轮亏了多少;利润是不是只靠一场大行情;成本稍微加一点,结果会不会当场翻脸。
最好再换一种切法。如果结论没怎么变,可信度才会上去一点。
注意,只是“一点”。历史切得再漂亮,还是历史。市场结构会变,真实成交可能更差,数据本身也可能有偏差。
验证不能保证未来赚钱。它只能先把那些靠偷看答案才成立的策略揪出来。
用 EdgePilot Research 把卷子摊开
把策略规则、历史数据、费用和切分方式放进 EdgePilot Research。不要只看一条总收益曲线,逐段看每一轮发生了什么。
哪一段开始亏?费用加上以后还剩多少?收益是不是只靠某一种行情?换个时间切法,结论还站得住吗?
这些问题摆出来,你自然会知道下一步该继续测、修改规则,还是趁早放弃。
工具负责把卷子摊开。它不负责替策略作弊,也不负责替你相信。

常见问题
交叉验证轮数越多越好吗?
不是。轮数越多,计算越重,每一段测试数据也可能越少。样本太少,单轮成绩会晃得厉害。怎么分,要看数据长度、持仓周期和你想检查的行情,不能拿轮数当勋章。
滚动窗口和扩展窗口有什么区别?
滚动窗口只保留最近一段数据,老数据会被丢掉。扩展窗口则把过去的数据一直攒着。前者更看重近期市场,后者利用的历史更多。策略容易过时,滚动窗口可能更合适;规律比较稳定,扩展窗口可能更有用。
做了滚动验证,还需要模拟盘吗?
需要。滚动验证考的是历史卷子。模拟盘还要查数据延迟、下单错误、滑点和程序掉链子。笔试过了,不等于真到考场就不会出岔子。
不会写代码,也能判断报告吗?
能。你不必亲手实现算法,但必须问清楚:数据怎么切,时间有没有打乱,测试集看过几次,每轮成绩给没给,费用扣没扣。
检查费用时,可以继续算一遍手续费会吃掉多少净利润,再测试加入真实滑点后回测还剩多少。
这几句都答不明白,代码写一万行也只是把问题藏得更深。
最后的判断
交叉验证是在换卷子。滚动验证是在保证时间只能往前走。Purging 和 Embargo,是不让答案从考场边界漏进来。
名字可以一个比一个高级,问题一直没变:这套策略是真会做题,还是把同一张卷子背熟了?
所以,下次再看到“已通过严格滚动验证”,先别鼓掌。
问问卷子怎么出的,考了几次,改过几回,最后那张有没有提前见过。
真本事不怕换卷子。只会背答案的,最怕你问考试过程。
研究与风险说明:本文为量化研究教育内容,不构成投资建议、收益承诺或交易指令。文中的时间切分仅用于解释机制;实际方案应根据数据频率、持仓周期、标签重叠和策略用途设计。


