做期货策略的人,早晚都会撞上同一个问题:参数到底怎么调才算调好?前几年大家习惯拿历史数据跑一遍回测,挑一组收益最高的参数上线,开始几天意气风发,过两周就开始怀疑人生。2026年了,这种“肉眼调参+全样本最优”的打法早就行不通了,不是行情变了,而是我们对参数优化的理解必须升级。
这篇文章我想好好聊聊参数优化的科学方法,核心就两件事:怎么把参数选出来,以及怎么确保选出来的参数不是过拟合的产物。我会把网格搜索、随机搜索、贝叶斯优化、Walk-Forward分析、参数敏感性分析这些东西讲透,也会把自己实际踩过的坑、走过的弯路一并说清楚。无论你是刚接触程序化交易的入门者,还是已经写了几年策略的老手,这篇应该都能给你一些可以立刻入手尝试的思路。
1. 为什么参数优化总要面对过拟合这道坎
1.1 过拟合的本质:策略在“背答案”而不是“学方法”
很多朋友对过拟合的理解停留在“样本外表现差”这个层面,但真正要解决它,得先明白它到底是怎么发生的。我用一个很简单的类比来解释:一个学生如果只刷题不学方法,把历年考题的标准答案全部背下来,考试时碰到原题能拿满分,但只要题目稍微换个说法、改个数字,马上就露馅。策略的过拟合同理——它记住的是历史行情中那些偶然的、不重复的噪声模式,而不是真正反复出现的市场规律。
举个例子可能更直观。假设某策略使用一条均线做趋势跟踪,均线参数从5到60逐个扫描,发现当参数取20的时候,历史回测收益最高、回撤也小。这个结果看起来很好,但问题是,为什么是20而不是25或者30?很可能是因为过去某段特定行情里,价格正好以20日均线的节奏走出了几波大行情,策略“碰巧”抓住了这几波而已。如果换个时间段,这种节奏可能完全不存在。策略并不知道自己为什么赚钱,只知道在这组参数下历史曲线很漂亮——这就是背答案。
1.2 过拟合的三个典型症状
在实操中,过拟合的策略通常有几个非常明显的特征。第一个特征是样本内绩效极其漂亮,样本外衰减剧烈,这是最直白的信号。你拿着同一段历史数据反复优化,绩效曲线当然越做越好看,但一旦把参数放到没见过的新数据上跑,收益和回撤都会原形毕露。
第二个特征是参数高原非常窄、敏感性极高。什么意思呢?就是最优参数稍微偏离一点点,比如从20变成19或者21,绩效就断崖式下跌,甚至从盈利变成亏损。真正稳健的参数通常落在一段“高原”上,参数值的微小变化对绩效影响很小,整体表现是平滑的。如果参数像一根针一样尖,十有八九是过拟合。
第三个特征比较隐蔽,就是参数组数量多、自由度大,但收益高度依赖少数几笔极端交易。假如某个策略在三年里总共做了300笔交易,赚的钱里有一半以上来自3笔“神级行情”,那你得警惕了,这不是策略强,而是运气好。参数优化很容易沦陷在这种所谓的最佳参数组合里,因为优化算法天然会去追逐那些极端盈利点。
2. 参数优化的三条主路:网格搜索、随机搜索与贝叶斯优化
2.1 网格搜索:简单直观但容易“参数爆炸”
网格搜索大概是所有做量化的人最早接触的参数优化方法。思路很简单,就是把每个参数的取值范围按一定步长划分,然后对所有参数组合全部枚举一遍,找出绩效最优的那一组。比如一个策略有三个参数,每个参数取50个候选值,组合下来就是125000种组合,每次组合还要跑一遍完整回测,计算量会非常夸张。
这个方法的优点是直观、结果可复现、不会漏掉搜索空间里表现最好的那组参数——只要你的步长够细。但缺点也很致命:第一是“维数灾难”,参数越多、取值越细,组合数呈指数级膨胀,普通电脑根本跑不完。第二是容易把搜索步长设得太细,导致过度关注局部最优而忽视全局稳健性。第三是从方法本质上讲,网格搜索就是在最大化样本内绩效,如果你只跑网格、不做任何防过拟合处理,那基本等于在为过拟合铺路。
所以我给它的定位是“粗筛工具”,不是“一步到位工具”。实操时我习惯用两步走的策略:第一轮网格搜索用较大的步长快速锁定优良区域,比如均线参数先从5到100每隔5取一个值;第二轮再在优良区域附近加密步长,比如每隔1去搜索。这样可以在控制计算量的前提下,找到相对精细的最优区间。
2.2 随机搜索:用概率思维代替穷举
随机搜索的思路跟网格搜索完全不一样,它不枚举所有组合,而是在参数空间中随机抽取一定数量的样本点进行评估。比如参数空间里有100万种组合,你随机抽取5000个点分别跑回测,然后看哪些区域表现好,再到这些区域里继续随机采样。
这个方法的优势在于,对于高维参数空间,实际有效的“好参数”往往只占搜索空间的一小部分。网格搜索会把大量计算浪费在不毛之地,而随机搜索因为采样点分布随机,反而更容易“撞上”那些藏在角落里的好区域。
我自己的体验是,当参数超过两个、总组合数超过几万的时候,随机搜索的效率会明显高于网格搜索。它更适合用来画全局地图:先撒一批点,看绩效在参数空间里的分布情况,哪些区域值得深入研究,哪些区域可以直接放弃。但要注意,随机搜索本质上也还是在最大化样本内绩效,同样的过拟合风险一点都没少。
2.3 贝叶斯优化:让机器学会“试错”
如果参数维度比较高、单次回测耗时比较长,我建议试试贝叶斯优化。这个方法的核心思想是用一个代理模型(通常是高斯过程或者树结构模型)去拟合“参数组合到绩效指标”之间的映射关系,然后根据代理模型的预测结果,自动选择下一个“最有潜力的点”去评估。每评估完一个点,就更新代理模型,再选择下一个点。
用大白话说,贝叶斯优化不是在盲人摸象,它在不断学习参数空间的“地形”,知道哪里是高地、哪里是洼地,然后优先去高地上进行细致探索。它天然兼顾了“探索”(去没去过的地方看看)和“利用”(在已知的好区域周围深挖)两个方向,所以往往能用远少于网格搜索的次数找到比较好的参数区域。
我在使用中最深的感受是:贝叶斯优化省下的时间非常可观,但前提是你得有一个清晰的绩效评价函数,比如综合了收益、回撤、夏普比率的加权指标。如果你只是拿“总收益率”当作评价目标,它照样会快速找到一组样本内收益最高但过拟合得很厉害的参数。所以贝叶斯优化只是优化工具,不是防过拟合工具,这一点必须牢记。
为了讲得更清楚,我用一个表格把三种方法放在一起对比:
| 方法 | 核心思路 | 计算成本 | 适用场景 | 主要风险 |
|---|---|---|---|---|
| 网格搜索 | 枚举全部组合 | 高,随参数维度指数级膨胀 | 参数少、取值少、维度低 | 局部最优、过拟合、计算浪费 |
| 随机搜索 | 随机采样并迭代 | 中等,采样数可控 | 参数多、空间大,快速摸底 | 可能漏掉细窄最优区、过拟合 |
| 贝叶斯优化 | 代理模型引导搜索 | 低,效率最高 | 维度适中、单次回测耗时高 | 对评价函数敏感、易追逐噪声 |
3. 防止过拟合的第一道防线:数据划分与样本外验证
3.1 训练集、验证集、测试集三段式划分
不管用什么方法做参数优化,都要先把数据切分明白。最常见也最实用的做法,是把历史数据按时间顺序划分为训练集、验证集和测试集三段。训练集用来做参数搜索,验证集用来从候选中做进一步的筛选和参数微调,测试集用来做最后的“一锤定音”式检验。
具体比例上,有人喜欢70%训练、15%验证、15%测试,也有人喜欢80%/10%/10%。其实比例没有绝对标准,核心是保证三段数据都要足够长,至少要包含几轮完整的行情周期。比如你在做某个商品期货的中长线趋势策略,训练集最好要覆盖牛熊转换的过程,如果训练集只有一段单边大涨行情,那优化出来的参数大概率只认识这一种行情。
这里有一个很多新手最容易犯的错误:把数据打乱后随机划分。时序数据跟横截面数据不一样,价格、波动率、成交量都有明显的自相关性和状态持续性。如果把2019年的数据和2023年的数据混在一起随机切分,等于告诉模型“你不需要尊重时间顺序”,这样训练出来的参数在真实未来数据面前根本站不住脚。正确的做法是严格按时间顺序切分,保证训练集的数据永远在测试集之前。
3.2 Walk-Forward Analysis:滚动前进分析
单纯把数据切成三段用一次,其实还不够。因为市场是不断变化的,2019年有效的参数可能在2024年就失效了,而三段式划分只能验证“一个历史切片”,无法验证参数在“多个不同历史阶段”的表现。所以真正核心的防过拟合手段是Walk-Forward Analysis,也就是滚动前进分析。
做法拆开来看是这样:把一个较长的时间窗口切成很多段,设定一个“训练窗口长度”和一个“测试窗口长度”。先在第一个训练窗口里做参数优化,选出一组最优参数,然后把这组参数放到紧接着的训练窗口之后的测试窗口里去跑样本外绩效。跑完之后,把训练窗口和测试窗口同时向前滚动一段,比如训练窗口推进3个月,测试窗口也跟着推进3个月,重复上述过程。
这样一来,你得到的就不是一条孤立的回测曲线,而是很多段连续拼接起来的“样本外绩效曲线”。这段曲线的可靠性比单一训练集的回测高得多,因为它模拟了真实交易中“优化参数—投入部署—验证效果—再次优化”的完整循环。如果策略在滚动样本外也表现稳定,那么它大概率具备一定的泛化能力,而不是单纯背下了某一段历史行情。
3.3 K折交叉验证在时序数据上的坑
很多人接触过机器学习,会想到用K折交叉验证来评估模型稳定性,但直接套用到时序数据上是有问题的。标准的K折交叉验证会把数据随机打乱后分成K份,轮流拿一份做验证、其余做训练。这在独立同分布的数据上是合理的,但在期货行情数据上,这种随机打乱把时间顺序彻底破坏了,等于让未来的数据“穿越”到了训练集里,结果就是高估策略的稳定性,拿到实盘马上现原形。
时序数据场景下,如果要使用交叉验证的思路,必须用扩展窗口交叉验证或者滚动窗口交叉验证。扩展窗口的做法是:第一轮用前60%的数据训练、后40%验证;第二轮用前70%训练、后30%验证;以此类推,训练集始终包含所有历史数据,验证集始终在训练集之后。滚动窗口的做法则更接近前面说的Walk-Forward,训练窗口长度固定,不断向前滑动。两种方式都尊重了时间顺序,不会导致信息泄露。
我个人的建议是,如果只是想快速评估一个策略的稳定性,做Walk-Forward就够了,不需要搞复杂的交叉验证。如果一定要用交叉验证,请务必把时间顺序放在第一位,任何破坏了时间顺序的验证方法,结果都可以直接弃用。
4. 有效参数与垃圾参数:敏感性分析一测便知
4.1 参数敏感性分析:看参数是“高原”还是“针尖”
做完参数优化、拿到一组最优参数之后,先别急着上线,花点时间做一次参数敏感性分析,这是判断参数稳健与否最直接的方法。具体做法是:以最优参数为中心,将每个参数在正负一定范围内逐一变化,其他参数保持不变,记录下每组参数对应的绩效指标,然后把结果画成绩效热力图。
看到热力图之后,你的注意力要放在“形态”上而不是“数值”上。如果最优参数周围是一片平坦的高原,参数从20变化到25,绩效虽然有小幅波动但整体稳定在一个不错的水平,那说明这组参数是稳健的。如果最优参数像一根细针一样立在坐标里,参数只要偏离1个点,绩效就从天堂跌到地狱,那就得小心,这组参数大概率是在追逐历史噪声。
用一个通俗的比喻:稳健的参数像平原上的高地,从哪个方向走上去都是缓坡,站得稳;过拟合的参数像一根独木桥,从哪个方向偏离都会掉下去,根本站不稳。市场稍微变化一点,独木桥就没了,而高地还在。
4.2 参数正交性与相关性检查
参数敏感性分析还可以顺带做一件事:检查参数之间是否存在强耦合。当两个参数联合起来画热力图时,如果最优区域呈现一条斜向的对角线结构,说明这两个参数之间存在很强的相关性。什么意思呢?就是A参数增大时,B参数必须同步减小,策略才能保持良好表现,两个参数并不是独立支配策略行为。
这种情况其实是“参数冗余”的信号。理论上,如果两个参数高度耦合,一个参数的效果很大程度上被另一个替代了,那么优化过程就会在斜线上来回跳跃,最终选出的组合很可能是噪声驱动的结果,稳定性会很差。遇到这种耦合热力图,我通常会主动砍掉一个参数,或者考虑把两个参数合并为一个复合参数。参数越独立,越接近“每个参数管一件事”的清晰逻辑,策略的稳健性往往越好。
4.3 稳健性硬指标:参数个数与样本量法则
谈一些硬性约束。参数优化有一条非常朴素但经常被无视的规律:参数数量越多,过拟合的风险越大。每增加一个自由参数,其实就是给优化算法多了一根可以“弯曲”的触手,它会更努力地贴合历史数据中的每一点噪声。所以一个要求是,能用2个参数解决的问题,不要加到5个。
样本量同样重要。一个策略的参数个数,跟样本内的交易次数之间应该有一个适当的比例,交易次数太少、参数太多,样本量根本不够支撑参数的选择。行业内一个粗放但实用的经验是:样本内的交易次数至少应该是参数个数的50到100倍。比如你的策略有3个参数,那样本内至少要有150到300笔以上的交易,否则优化出的参数组合在统计上就不太可信。这里推荐两个简单指标:参数风险比、样本外绩效衰减率。参数风险比反映的是“每增加一个参数,样本外绩效的损失幅度”,衰减率则是直接比较样本外和样本内的绩效差异。如果样本外绩效衰减超过30%,哪怕样本内数据再漂亮,我个人都不会实盘启用。
5. 一套可以“抄作业”的调参全流程
5.1 六步走通科学调参
讲了这么多理论和方法,最终还得落到一套可以照着走的流程上。下面是我在实践中总结出来的一套相对完整的调参流程,不敢说放之四海皆准,但至少能帮大家少走弯路。
第一步是明确策略逻辑与可选参数集。先写清楚你的交易逻辑是什么,每一个参数对应逻辑中的哪个环节。如果某个参数你自己都说不清楚它到底在控制什么,那这个参数从一开始就应该删掉。参数不是越多越好,每个参数都应该是有意义的。
第二步是确定数据切分方案。把历史数据按时间切成训练集、验证集、测试集,比例和窗口长度要结合策略的交易频率来定。日内高频策略需要的样本量比日线策略大得多,别拿几千根K线去优化一个高频策略,那纯粹是浪费时间和运气。
第三步是选定优化方法。我一般推荐的组合拳是:先用随机搜索做全局快扫,快速定位绩效较好的参数区间;再用贝叶斯优化在好区间里做精细搜索;最后用网格搜索在最终确定的几个候选组合附近做小范围的完整枚举,确认没有漏掉细节。三种方法各司其职,效率和效果都能兼顾。
第四步是敏感性分析与高原检验。对选出来的候选参数逐一做敏感性分析,看参数高原是否平坦、是否存在明显耦合,剔除那些“针尖式”的参数组合。这一步是防过拟合最关键的一环,不能省略。
第五步是Walk-Forward样本外验证。把候选参数放到滚动样本外框架里跑一遍,观察策略在多个历史切片上的真实样本外表现。如果策略在滚动测试中表现稳定、衰减率可控,就可以进入下一阶段;如果绩效波动剧烈或者持续走低,说明这组参数并没有真正抓住规律,淘汰重来。
第六步是确定最终参数并部署监控。上线之后不是万事大吉,必须建立参数监控机制,定期记录策略在实盘环境中的表现与回测预期的偏差,一旦偏差超过阈值,就要启动再优化流程。策略不是一成不变的,参数也应该是动态维护的。
5.2 新手最容易跑偏的三个地方
第一是总想“既要收益高又要回撤小”,在优化目标函数里同时塞进一堆指标,最后得到的是一个看似综合很好、实际什么也没做好的折中结果。我的做法是分主次,主目标是年化收益或风险调整收益,次目标是最大回撤和夏普比率。先把主目标优化到位,再在这些候选组合中按次目标做二次筛选,而不是把所有目标都揉在一起。
第二是急于上线。拿到一组回测漂亮的参数,恨不得明天就满仓干。我建议至少要留出几个月的样本外验证期,让参数在没有经过任何人工干预的“冷启动”条件下经历一段真实行情的检验。因为样本外验证的时间越长、跨越的行情状态越多,你对这组参数的信心就越足。
第三是忽略交易成本、滑点和资金容量。回测绩效再好,如果扣掉手续费、滑点之后变成亏损,那这组参数根本就没有实用价值。很多初学者喜欢用很低的成本假设去优化参数,结果选出的是“极度高频交易”型参数,实盘能亏到怀疑人生。优化时一定要使用与实际账户水平相符的成本参数,这种数据偏差甚至比过拟合更致命。
6. 我在实战中踩过的坑与排查记录
6.1 全样本优化后看样本外,逻辑上就错了
我早年刚开始写策略的时候,干过一件非常愚蠢的事:把全部历史数据都跑一遍优化,选出最优参数后,再把这批数据的前80%当训练集、后20%当测试集去验证。当时还觉得这个验证流程很正规,后来才意识到,参数本身已经在全样本上优化过了,它已经“见过”后20%的行情了,再拿后20%去验证,那根本不叫样本外验证,只能算“重复确认”。
这个坑想明白之后,我把数据切分的顺序彻底改了。永远在优化之前就先切好训练集、验证集、测试集,优化过程只接触训练集和验证集,测试集必须隔离到最后才能碰。任何一次优化迭代都不允许使用测试集的数据,哪怕看一眼都不行。
6.2 交易成本参数不当,优化结果失真
还有一个让我印象很深的教训来自手续费和滑点设置。当时做一个中低频策略,回测时手续费设得很低,滑点假设为零。优化出来的参数,明显偏向于交易次数多的方向,因为在没有成本约束的虚拟世界里,交易越多、捕捉到的短期波动越多,收益自然越高。但实盘一跑,手续费和滑点把利润空间咬得干干净净,绩效从正收益直接翻成负收益。
从那以后,我所有回测的成本参数都按“保守偏高”来设置。手续费比交易所标准水平上浮10%到20%,滑点按品种平均价差的50%到100%来估算,这样优化出来的参数才不会被虚高的交易频率带偏。
6.3 单一品种优化参数直接用到多品种上
我犯过的另一个典型的错误是:在某一个商品上优化出了完美的参数组合,然后就把它套用到所有相关品种上,觉得逻辑相似应该通用。现实很快打了脸,不同品种的波动率水平、趋势延续性、持仓结构完全不同,同一组参数在甲品种上表现优秀,在乙品种上可能就是一个纯手续费消耗机。
现在的做法是:先在一两个主攻品种上做深度优化和参数稳健性分析,确定参数区间的合理范围,再在其他品种上做快速的参数适配测试。多品种策略要追求的是“参数区间的一致性”,即不同品种最终采用的参数落在一个共同区间内,而不是各自的最优值南辕北辙。这样,整体策略对单品种噪声的依赖度会更低。
6.4 只看收益率,忽视风险调整指标
早期优化策略时,我的目标函数里只有年化收益率,从没把回撤和风险调整后收益当回事。于是经常出现这样的结果:一组参数年化收益达到60%,但期间最大回撤也高达55%,资金曲线跟过山车一样。另一组参数年化收益只有35%,但最大回撤控制在15%以内。如果单独拿收益率去衡量,前者明显更“优秀”,但实盘里,那种回撤的体验绝大多数人根本扛不住。
后来我把评价指标换成了卡玛比率(年化收益除以最大回撤)或者夏普比率。在金融领域,收益指标要放在风险指标之上来看才有意义。稳健的策略不是收益最高的那个,而是风险调整后收益最可持续的那个。
6.5 幸存者偏差与未来函数的隐形陷阱
最后讲两个比较隐蔽、不容易察觉的坑。一个是幸存者偏差:回测时使用的品种列表里,掺入了一堆现在还在市场上交易、且历史表现本来就好的品种,而已经退市、上市后暴跌的品种被排除了。这样回测出来的结果是“幸存者”的结果,真实可交易的绩效会比回测差不少。解决方法是,数据准备阶段就要特别注意品种上市时间,保持品种池从历史到现在的完备性。
另一个是未来函数,也就是在计算某些指标时,无意中使用了“未来才能知道”的数据。比如用当天的最高价去计算当天的止损价位,这在逻辑上就是悖论,因为你不可能在开盘前就知道当天最高价。这种问题往往藏在指标计算或信号生成的细节里,最好是请别人帮忙审代码,因为自己写的代码很容易眼盲看不出来。多花一天做数据审查,比上线后发现坑要省一万倍的时间。
写到这里,我其实最想分享的心得只有一条:参数优化的目的从来不是找到那个“历史最优参数”,而是找到一组在多种行情状态下都能保持合理表现的“稳健参数区间”。我在实际操作中的体会是,学会接受“次优解”反而更容易赚到钱,因为这个次优解意味着你不去追那些只存在于历史里的完美行情,而是更愿意用策略的普适性去应对未知的行情变化。最后再提一个小建议:每次调参的时候,把优化过程、验证结果、最终决策的原因都记录下来。几个月后回头看这些记录,你会清楚地看到自己当时是如何被某几条漂亮曲线迷惑的,这种复盘价值,比多赚几个百分点的回测收益重要得多。