2019年,某量化团队用历史数据跑出一套年化收益340%的策略。实盘上线3个月,净值回撤62%。复盘时发现,他们调了47组参数,选最优那组——而那组恰好完美拟合了2015年股灾后的反弹节奏。这不是策略牛,是运气。
这种悲剧有个专业名字:过拟合。更隐蔽的是,大多数人根本没意识到自己正在制造它。
传统回测的幻觉:用同一套数据训练和验证
常规优化流程像开卷考试:拿10年历史数据,穷举所有参数组合,挑表现最好的,再用这10年数据"验证"它。逻辑漏洞很明显——你允许策略在历史里翻找直到找到最顺手的答案,最后的"成绩"里掺了多少水分?
这不一定意味着策略无用。但它确实意味着,纸面收益往往远高于实盘能拿到的。
Walk-Forward Optimisation(递进式优化,简称WFO)换了个问法。不问"哪组参数对这整段数据最好",而是问"如果我真的在交易,每隔一段时间用新数据重新调参,实际会是什么结果?"
WFO的核心机制:滚动窗口,持续自证
具体操作上,WFO把时间切成连续的片段。假设总数据是2010-2024年:
第一步:用2010-2012年训练,找出最优参数,测试2013年表现。第二步:用2010-2013年重新训练,更新最优参数,测试2014年。第三步:重复直到数据用完。
每轮测试用的都是"没见过"的数据。策略没法作弊,只能持续证明自己适应新环境的能力。
市场不会静止。2020年疫情冲击的波动率、2021年散户抱团的趋势强度、2022年加息周期的相关性崩溃——同一组参数不可能通吃所有 regime(市场状态)。静态回测把这一切压缩成单一历史练习,WFO则逼策略反复交卷。
代价是数字变难看了。WFO的结果通常比全样本优化弱得多。但弱不代表差,很多时候只是更诚实。
实战搭建:从数据获取到完整流水线
我们用Python和FMP API,以苹果(AAPL)2010年至今的数据为例,搭一套可复用的WFO框架。
数据层用Financial Modeling Prep的API拉取日线,包括开高低收和成交量。策略层选最简单的双均线交叉:短期SMA(简单移动平均)上穿长期SMA时做多,下穿时平仓或做空。
参数空间设定为短期均线5-50日,长期均线20-200日,步长5日。传统优化会在这二维网格里找全局最优,然后宣布"发现"了某组黄金参数。
WFO的做法是设定滚动窗口。比如用3年数据做in-sample(样本内)优化,接下来1年做out-of-sample(样本外)验证。窗口每次向前滚动1年,直到耗尽数据。
关键代码结构分三块:数据处理器(处理缺失值、调整复权)、优化引擎(网格搜索或更高效的贝叶斯优化)、回测执行器(跟踪持仓、计算收益、记录滑点和手续费)。
一个容易踩的坑:窗口长度选择。太短,优化不稳定,参数抖动剧烈;太长,市场regime已经切换,样本内最优参数在样本外失效。3-5年的训练窗对股票策略是常见起点,但需根据标的波动特性调整。
结果解读:为什么"更差"的数字更值得信任
假设全样本优化给出年化35%、夏普1.8的漂亮曲线。WFO跑完可能是年化12%、夏普0.6。落差巨大,但后者更接近真实交易体验。
更细颗粒度的分析是看参数稳定性。如果每轮滚动选出的最优参数跳跃剧烈——这轮是(10,30),下轮变成(40,120)——说明策略对市场结构高度敏感,实盘部署风险极高。反之,若参数在合理范围内小幅波动,策略的鲁棒性更有保障。
WFO还能暴露另一个问题:优化频率。如果每月重调参数比每年重调收益更高,但交易成本吞噬了超额,这个权衡需要用实际手续费和滑点模拟来量化。
最后一步是把WFO结果和纯样本外测试对比。2010-2020年训练、2020-2024年验证,完全不滚动。如果WFO表现显著优于这种"一次性"切分,说明策略确实受益于定期再优化,而非仅仅靠运气。
你现在用的回测框架,是让你看到想看到的数字,还是逼你看到该看到的数字?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.