OptiNod 学院
滚动前推分析:检验优化流程本身的方法
对整个区间一次性优化得到的分数,相当于预先看过未来再去拟合。滚动前推只在下一段样本外评估样本内选出的设置,以此检验流程本身。
对整个区间一次性优化,得到的分数就像提前窥见未来、对着答案做出来的。滚动前推只用没见过的区间,检验优化流程本身是否有效。
滚动前推分析(Walk-Forward Analysis)是一种验证方法:把数据按时间顺序分成样本内(In-Sample)区间和样本外(Out-of-Sample)区间,在样本内优化参数,然后只在紧接着的样本外区间评估这组设置。把区间按时间顺序一格一格地往后移动,重复同样的流程,只把样本外的业绩拼接成一条曲线,作为实盘业绩的估计。
大众看回测很简单:对整个区间跑一遍,累计收益曲线向右上方走、最大回撤还能承受,就判断是好策略。把几十种参数组合全部跑一遍,从中挑出表现最好的设置,就是普通意义上的优化。
但对整个区间一次性优化,有一个根本缺陷:评估业绩用的,正是优化时用过的那份数据。如果把RSI周期定为17的理由是“2021年到2024年间17最好”,那么17在同一时期拿到高分是理所当然的。这和先看了答案再做试卷没有区别。滚动前推分析把思路倒过来:需要检验的对象,是“用之前的数据挑参数”这个优化流程本身。

对整个区间一次性优化,得到的是看过未来的分数
整个区间优化的分数被抬高,机制很简单。参数组合越多,其中总会有一个纯粹出于偶然、恰好适合那个特定时期。跑50个组合,这50个里的第一名可能反映了策略真正的优势,但更可能只是碰巧最贴合那段时期的噪声而拿到第一。这就是过拟合(Overfitting),而对整个区间一次性优化的方式,在结构上没有任何过滤过拟合的机制。
用真实数据看会更清楚。BTC在2022年从1月约46,000美元到12月约16,500美元,全年保持一致的下跌趋势。只用2022年的数据优化趋势跟踪策略,几乎所有参数都会收敛到“以做空为主,忽略反弹”。因为在那个时期,这种设置得分压倒性地高。但把同样的设置用到2023年,结果就不同了。BTC在2023年从1月的16,500美元,经10月的34,000美元,回升到12月的42,000美元。2022年最优的偏空设置,在2023年的回升行情中一直押注反方向,亏损不断累积。
对整个区间一次性优化,会把这两年混在一起取平均,把过度贴合其中一边的设置所带来的偶然高分,直接记录为“策略的实力”。分数越好,反而越应该怀疑。
样本外是只能看一次的数据
滚动前推的核心规则,是绝不把样本外区间用于决定参数。在样本内区间选好参数之后,带着这组设置,在一次都没见过的下一个区间模拟交易。无论结果好坏都照实记录,再把区间移动一格,进入下一组。
这个流程与实盘相似,是因为时间的方向相同。实盘中交易者用过去的数据确定设置,再用这组设置去交易尚未到来的未来,并且是在不知道未来如何发展的情况下入场。滚动前推的样本外区间,从样本内的时点看,恰好扮演那个“尚未到来的未来”。所以只把样本外业绩拼接起来的曲线,要接近实盘得多。对整个区间一次性优化的结果,则被相应地抬高了。
具体来说,设想对BTC日线采用2年样本内和6个月样本外。用2021年1月到2022年12月选参数,只在2023年1月到6月评估这组设置。接着把窗口滚动6个月,用2021年7月到2023年6月重新优化,在2023年7月到12月评估。这样滚动下去,每个样本外区间对它之前的样本内时点来说,都是一次没见过的未来。正因为这一点,样本外曲线才值得相信。
滚动窗口与锚定窗口的区别在于适应速度
样本内窗口的滚动方式分为两种。
- 滚动(Rolling)窗口:固定样本内的时长,把整个区间整体向前移动。始终只看最近2年这样的最新数据,旧数据被丢弃。
- 锚定(Anchored)窗口:样本内的起点固定在最初,只不断延长终点。第一段是2年,下一段是2年半,再下一段是3年,如此累积,所有过去的数据都一直用于学习。
两者的差异,体现在市场状态变化时的适应速度上。滚动窗口只看最近的数据,所以对新趋势适应得快,但曾经经历过的罕见事件很快就会漏出学习区间。2022年6月Celsius暂停提现与三箭资本(3AC)破产叠加,让BTC跌到17,600美元的暴跌,以及11月FTX破产让它跌到15,500美元的暴跌,在滚动窗口只看2年的情况下,不久就会被挤出学习区间。结果是对类似的剧变可能再次毫无防备。锚定窗口会把这类事件一直留在学习区间,但数据越积越多,遥远过去的比重变大,对最近的趋势转换反应迟钝。
选择标准取决于市场的性质。在市场状态频繁变化的加密货币中,滚动窗口适应得快,往往更有利;在结构变化缓慢的市场,或者重点在于扛过罕见危机的策略,锚定窗口更安全。无论用哪一种,不断换方式直到结果好看,这种做法会让验证变得毫无意义。

滚动前推效率明显偏离1时,要怀疑过拟合
如果只停留在用眼睛看样本外曲线的阶段,判断会变得模糊。把它压缩成一个数字的指标,就是滚动前推效率(Walk-Forward Efficiency,WFE)。定义很简单:样本外各区间的业绩除以样本内各区间的业绩。按收益计算,样本内年化40%的设置在样本外年化32%,效率就是0.8。
解读这个值有几条基准线。
- 0.8到1.0之间:偏稳健。说明通过优化选出的设置,在没见过的区间也保住了业绩的大部分。
- 0.5到0.8之间:需要注意。样本内业绩的相当一部分,可能只是仅在那段时期有效的偶然。
- 低于0.5:强烈怀疑过拟合。如果样本内分数连一半都没有在样本外重现,就很难认为这组设置抓住了市场中的真实优势,更接近是贴合过去噪声的结果。
效率也有超过1的情况,就是样本外区间碰巧比样本内对策略更有利的市场。像2023年下半年低波动回升行情那样,趋势平滑延续的区间落在样本外位置,效率会升到1.2。但不能把超过1的值当成策略的实力。下一个窗口波动率变大,它会同样快地回到1以下。把多个窗口的效率汇总,同时看平均值和分布,才值得信赖。单个区间的一个值很容易被偶然左右。

窗口时长与步长以交易样本数为准
窗口设置里最常见的错误,是把样本内时长定得太短。越短看起来越贴近最近的市场,但如果这段短区间里只有寥寥几笔交易,优化本身就失去意义。样本内只有20笔交易时,其中一两笔大额盈利就会左右参数的选择,这样选出的设置到了样本外就没有力量。
标准要从交易频率倒推。平均持仓周期为一周的波段策略,每月交易四五笔,要在样本内确保100笔以上,至少需要一年半到两年。像日线趋势跟踪这样交易稀少的策略,需要更长的样本内。2024年BTC在3月以73,777美元超过2021年的高点之后,到11月一直在58,000美元到72,000美元之间震荡。在这8个月里,趋势跟踪策略几乎没有入场的位置。如果这样的震荡行情整段落入样本内,交易样本就是空的,优化无法正常进行。
样本外时长和步长通常取相同。样本外为6个月,就每次滚动6个月。样本外定得过短,每个区间只有几笔交易,效率值会忽高忽低;定得过长,重新优化的周期被拉长,无法检验对市场转换的适应。交易样本少的策略,最好先承认滚动前推的结果本身就难以信赖。样本不足时,任何验证方法都分不清偶然和实力。
- 样本内交易数:确定时长,使每个样本内区间至少包含100笔交易。交易不足50笔时,就延长样本内,或降到更短的周期。
- 样本外交易数:确认每个样本外区间是否包含20笔以上交易。不足时,不要信任每一个效率值,只看多个区间的平均。
- 窗口数量:确定步长,使整份数据中至少能得到5组以上的样本内与样本外组合。只有2~3组时,平均值会被偶然左右。
看过样本外之后再去调整,验证就失去意义
最频繁让滚动前推失效的做法,是看到样本外结果之后,再去改参数或窗口。样本外效率出来是0.4,就缩小样本内的优化范围重新跑,或者把窗口时长从2年改成3年,找到让效率升到0.7的组合,那一刻样本外实际上就和样本内没有区别了。哪怕只有一次,看了结果再去调整设置,这段样本外就不能再说是一次没见过的未来。它变成了用来挑参数的数据。
这种污染很难察觉,所以危险。从代码上看,样本内和样本外依然是分开的,流程看起来也很严谨。但是在交易者的脑子里,样本外结果影响了下一次设置选择的那一刻,统计上的独立性就崩塌了。滚动前推窗口按资产、按策略不断更换,直到结果好看,这样选出的效率,是把与整个区间一次性优化相同的过拟合,放大了一个量级重复了一遍。
防御的方法是先把流程定死。样本内时长、样本外时长、步长、优化对象参数的搜索范围、评估指标,都在跑数据之前全部确定,此后即使样本外结果很差,也不改设置。结果差,就认定这个策略不成立并放弃,这才是诚实的处理。为了让效率好看而让流程迁就结果,验证本身就被毁掉了。滚动前推是检验由流程产生的分数在实盘中是否还能延续的工具。
再检验滚动前推结果的两件事
滚动前推效率超过0.8,也不要马上投入实盘,还要再看两件事。
第一是各区间效率的一致性。五组的平均效率即使是0.85,如果其中混有1.4和0.3,这个平均值就只是错觉。在某个区间侥幸做到1.4、在另一个区间崩到0.3的策略,无法知道下一个实盘区间更接近哪一边,所以有风险。效率的标准差小、所有区间都均匀地在0.6以上时,才可以认为流程是稳定的。
第二是市场状态转换区间的业绩。滚动前推真正受考验的地方,是市场状态从强转弱、从低波动转到高波动的位置。2021年11月在约69,000美元的高点趋势转折、进入2022年下跌行情的转折点,以及2022年11月FTX暴跌这样的波动率爆发区间,落在样本外位置的窗口,其效率如何,要单独确认。只在平滑的趋势行情区间效率高、在转换区间崩溃的策略,是恰恰在最关键的时刻崩溃的流程。包括转换区间在内的所有区间,效率都能撑住时,滚动前推分析才算给出了依据,可以相信这个策略的优化流程在未来也有效。