参数扫描(网格搜索)

参数扫描(parameter sweep),也叫网格搜索(grid search),是把同一套策略在一组声明好的参数取值的每一种组合上各跑一次,并记录每次运行的结果。它画出的是规则在各种设置下的行为地图;地图本身很有价值,而在不对格子数量做任何修正的情况下直接挑出最好的那一格,正是选择偏差混进回测的方式。

Senzoukria · 术语表 · 更新于 2026 年 9 月


搭建网格

每个参数拿到一串候选取值;网格就是这些列表的笛卡尔积,每一格就是一次完整回测。一条规则如果回看长度有五个取值、阈值有六个取值,就是三十次运行;再加一个有四个取值的参数,就变成一百二十次。数量是乘起来增长的,所以一次同时扫描多少个参数,比任何单个维度上有多少取值都更要紧。

取值应当在扫描之前确定,并落在对该参数有意义的尺度上(回看以 K 线根数计,阈值以跳数或比率计),而且这串取值里应当包含你预期会表现不佳的值。一个只由「看起来已经不错」的取值拼出来的网格,是披着测试外衣的第二轮挑选。

读地图,而不是读冠军

  • 去找一片相邻格子普遍表现尚可的区域;这片高原才是一条有结构的规则该有的样子。
  • 一格远高于四周邻居的格子,更可能是这段样本的巧合,而不是一项发现。
  • 看看成本提高之后地图会怎么变;一片能扛住更高滑点的高原,比一座扛不住的尖峰值钱得多。
  • 记录整张网格,而不是排行榜首行。格子的数量是之后做任何选择性修正时的输入。

把扫描放进前推分析里

在前推分析中,网格会在每一片训练数据上跑一遍,选择规则为每一片挑出一格;随后的测试片再使用那一格。这才是扫描的诚实用法:冠军是在「它将被评判的数据」之前的数据上选出来的。反过来,在全时期上跑网格并报告最好的那一格,是另一回事——这对画地图和计算过拟合统计量有用,但它不是可实现表现的度量。

在 Senzoukria 里

「回放」界面的自动回测面板在前推开关内部有一个「待扫描参数」控件。策略暴露出来的每一个参数都可以被赋予一组取值;面板会把结果数量显示为「组合数 × 切片数」并附上预计耗时,当网格超过上限时则直接拒绝,提示「组合太多」,要求你删掉一些取值。旁边的说明写清了原因:每多一种组合,就是在同一批数据里多抽一次签,越过某个点之后,你量的是过拟合的运气,而不是一套策略。

跑完之后,稳定性图会把选中的配置和网格上紧邻它的配置(某一个维度上挪一步)画在一起,并提示「高原才是真优势的样子」。「闯关」一节则会在全部 K 线上重跑整张网格,搭出回测过拟合概率背后的那个矩阵,并把试过的配置数量和紧缩夏普比率一并报出来。

常见错误

  • 在一段很短的历史上一次同时扫描很多参数。
  • 用肉眼已经挑过一遍的取值来搭网格。
  • 把全时期上最好的那一格当成策略的成绩报出来。
  • 结果不理想就换一张更大的网格重扫,却不把之前那些运行计入次数。

其他语言版本

常见问题

多少种组合算太多?
这取决于样本能提供多少笔独立交易,以及有没有施加选择性修正。格子数相对于交易笔数越多,最优格子是一次幸运抽签的可能性就越大。实用做法是:收窄取值范围,或一次少扫几个参数,把总数量记录下来,并读那个紧缩之后的统计量而不是原始值。
网格搜索和优化是一回事吗?
网格搜索是优化的一种做法:在一组声明好的取值上穷举。其他方法则是自适应地搜索。网格的优点是能产出一张完整的邻域地图——参数稳定性正是从这张图上读出来的;缺点是每加一个参数,成本就成倍增加。
扫描出来最好的那一格该拿去实盘吗?
光凭这次扫描不行。全段历史上最好的那一格,是在产生它成绩的同一批数据上被挑出来的。请把扫描放进前推分析里,让挑选发生在评估之前;确认选中的格子坐落在一片高原上;提高成本看它是否还站得住;并把格子数量留在记录里。

继续阅读