9.7 参数扫描与稳健性:别被某个参数骗了
课前导读
本节目标
学完能解决什么困惑:为什么回测里“最赚钱”的参数,不一定是最值得相信的参数。
适合谁学:已经知道年化收益、最大回撤、胜率、盈亏比和交易成本的新手。
难度:中级。
用时:约 40 分钟。
你已经会看回测指标,也知道成本和滑点会吃掉收益。
接下来要面对一个更隐蔽的问题:同一套策略,只要参数稍微一变,结果就可能完全不同。
比如均线策略里,短均线可以用 10 日、15 日、20 日。
止损线可以用 6%、8%、10%。
持有天数可以用 5 天、10 天、20 天。
如果你只挑出“历史收益最高”的那个组合,就像在考试后才把答案写进题目里。
本节要学的不是寻找神奇数字,而是检查策略有没有稳健的生存空间。
知识正文
1. 类比:温度旋钮不是只有一个神奇刻度
想象你买了一台电暖器。
如果它只有在 26.3 度时让房间舒服,26.2 度就冷,26.4 度就热,你会觉得它可靠吗?
大概率不会。
因为真实生活里,温度计有误差,房间大小会变,门窗开合也会影响体感。
可靠的电暖器,应该在 25 到 27 度之间都差不多舒服。
参数扫描也是这个道理。
一个策略如果只在“20 日均线 + 7% 止损 + 持有 13 天”这个精确组合上表现很好,周围组合都很差,就要非常警惕。
这可能不是策略真的强,而是它刚好贴合了历史样本里的某段巧合。
关键直觉
参数不是彩票号码,稳健策略不应该只靠一个“神奇刻度”存活。
2. 先把术语讲清楚
参数,就是策略规则里可以调节的数字。
均线天数、止损比例、持有天数、换仓频率、成交量放大倍数,都可以是参数。
参数扫描,就是提前设定一组合理范围,把不同参数组合逐一回测,并把结果放在一起比较。
它不是为了“扫到最高分”,而是为了看周围一片区域是否都能接受。
参数平台期,指一片相邻参数都表现相对稳定。
比如 15 日、20 日、25 日均线都能取得相近收益,回撤也没有突然恶化。
这种状态像一块平坦的台地,说明策略不太依赖某一个精确数字。
孤岛最优,指只有一个参数点特别好,旁边参数都明显变差。
它像海面上的小岛,看起来高,但四周都是深水。
孤岛最优经常提示过拟合风险。
过拟合,就是策略把历史数据里的偶然细节也“背下来”了。
它在过去样本里很漂亮,但换一段时间、换一批股票、换一点成本后就容易失灵。
稳健性,就是策略面对小变化时不至于立刻崩掉。
小变化包括参数变化、成本变化、样本时间变化、股票池变化和成交假设变化。
3. 参数扫描的基本流程
先确定策略规则,不要边扫边改规则。
再列出每个参数的合理范围。
然后用相同数据、相同成本、相同指标体系,对所有组合做回测。
最后观察结果表,而不是只看最高值。
graph TD
A["固定策略规则"] --> B["列出参数范围"]
B --> C["逐组运行回测"]
C --> D["记录收益与风险指标"]
D --> E["观察平台期或孤岛最优"]
E --> F["写出可执行结论"]这里最容易犯错的是第二步。
参数范围必须来自投资逻辑,而不是随便从 1 扫到 999。
例如日线均线策略可以观察 10 到 60 个交易日。
因为 A 股一个月大约 20 个交易日,一个季度大约 60 个交易日。
如果你把均线长度扫到 3 日,可能更像短线噪声。
如果扫到 250 日,则已经接近一年视角,策略含义也变了。
范围太宽,会把不同投资逻辑混在一起。
范围太窄,又可能看不到真实稳定区间。
4. A 股案例:一个简单均线过滤策略
假设我们研究一条入门规则。
当某只流动性较好的 A 股收盘价站上 N 日均线时,下一交易日按规则观察买入。
当收盘价跌破 N 日均线时,下一交易日按规则卖出。
每次交易都扣除佣金、印花税、过户费,并额外设置滑点。
这里的参数是 N,也就是均线天数。
我们先不要急着问“哪个 N 最好”。
更好的问题是:“N 在一段合理区域内,策略是否都还能活着?”
下面是一组教学用的虚拟结果,不代表任何真实收益承诺。
| N 日均线 | 年化收益 | 最大回撤 | 交易次数 | 观察结论 |
|---|---|---|---|---|
| 10 | 7.2% | 24.0% | 96 | 交易太频繁,成本压力较大 |
| 15 | 8.1% | 22.5% | 74 | 表现开始稳定 |
| 20 | 8.4% | 21.8% | 61 | 与邻近参数相近 |
| 25 | 8.0% | 22.1% | 54 | 仍在同一区间 |
| 30 | 7.6% | 23.0% | 49 | 略降但未崩掉 |
| 60 | 3.2% | 28.5% | 21 | 策略节奏明显改变 |
如果只看最高收益,20 日均线最好。
但真正重要的是 15、20、25、30 日之间没有剧烈断层。
这说明策略可能存在一个“中期趋势过滤”的平台期。
如果表格变成下面这样,就要谨慎得多。
| N 日均线 | 年化收益 | 最大回撤 | 交易次数 | 观察结论 |
|---|---|---|---|---|
| 18 | 2.0% | 30.0% | 70 | 表现较弱 |
| 19 | 1.5% | 31.2% | 68 | 表现较弱 |
| 20 | 18.0% | 12.0% | 66 | 单点特别亮眼 |
| 21 | 1.2% | 32.5% | 65 | 立刻变差 |
| 22 | 2.4% | 29.8% | 63 | 表现较弱 |
20 日看起来像“冠军参数”。
但它周围全部塌陷,更像孤岛最优。
这样的参数不能直接拿来实盘练习。
5. 扫描二维参数时,看“区域”而不是“冠军”
真实策略往往不止一个参数。
例如同时有均线天数和止损比例。
这时可以做二维扫描。
| 均线天数 | 止损 6% | 止损 8% | 止损 10% |
|---|---|---|---|
| 15 | 可接受 | 可接受 | 一般 |
| 20 | 可接受 | 较好 | 可接受 |
| 25 | 一般 | 可接受 | 可接受 |
| 30 | 较弱 | 一般 | 可接受 |
这张表的重点不是“20 日 + 8%”这一格。
重点是它附近有没有一片相对可接受的区域。
如果附近都是可接受,说明策略对参数不太敏感。
如果只有一个格子好,说明策略可能只是碰巧匹配历史。
常见误区
参数扫描不是把回测次数开到最大,然后选一个最漂亮的结果。扫描次数越多,越要警惕自己把噪声当规律。
6. 一个短小的 pandas 思路示例
下面的代码只展示思路,不要求你现在拿真实数据运行。
它的重点是:把每一次扫描结果都留下来,而不是只保存最优参数。
rows = []
for ma_days in [10, 15, 20, 25, 30, 40, 60]:
result = run_backtest(
data=sample_daily_data,
ma_days=ma_days,
commission=0.00025,
stamp_tax=0.0005,
slippage=0.001,
)
rows.append({
"ma_days": ma_days,
"annual_return": result["annual_return"],
"max_drawdown": result["max_drawdown"],
"trade_count": result["trade_count"],
})
scan_table = pd.DataFrame(rows)读这段伪代码时,不要被函数名吓到。
run_backtest 可以理解为一个“回测按钮”。
循环每次把均线天数换一下。
每次得到的年化收益、最大回撤和交易次数,都放进表格。
最后你要分析的是整张表,而不是表格里最大的一格。
7. 专业老师视角:参数要有解释
如果一个参数没有投资含义,就不应该被轻易接受。
20 日均线可以解释为约一个月的市场平均成本。
60 日均线可以解释为约一个季度的趋势背景。
8% 止损可以联系到单笔风险和 A 股波动特征。
但如果某个策略必须用 17.3 日均线或 6.7% 止损才有效,新手就要追问:为什么是这个数字?
能解释,不代表一定有效。
不能解释,却只因为历史收益高而采用,风险更大。
8. 投资者视角:稳健性决定你能否坚持
实盘里不会刚好复制历史。
下一次行情的波动节奏会不同。
成交可能遇到涨跌停、停牌、流动性不足。
成本也可能因为交易频率、佣金档位和滑点而变化。
如果策略对参数极度敏感,你执行时会非常痛苦。
今天回撤扩大,你会怀疑是不是参数错了。
明天少赚一点,你又想重新优化。
频繁换参数,最后就变成情绪交易。
稳健性检查的意义,是让你知道策略有没有足够宽的容错空间。
9. 量化开发视角:扫描要可复现
每次扫描都要记录数据版本。
每次扫描都要记录参数范围。
每次扫描都要记录成本假设。
每次扫描都要记录股票池和回测区间。
否则你今天看到的“最优参数”,明天可能连自己都复现不出来。
建议给每次实验一个编号。
例如 bt_2026_05_09_ma_scan_v01。
报告里写清楚:这次只测试了均线天数,没有同时优化止损、换仓和选股条件。
这样别人复查时,知道你做了什么,也知道你没做什么。
10. 可执行练习:三步判断参数是否靠谱
第一步,找最优点。
这一步只用于定位,不用于直接决策。
第二步,看最优点周围的邻居。
如果左右相邻、上下相邻都不差,记录为“可能存在平台期”。
第三步,加严条件再看。
把滑点提高一点,把样本拆成牛市、熊市、震荡市,再观察结果是否完全崩掉。
如果一加严就崩,说明策略安全垫不足。
如果收益下降但逻辑仍存在,才值得进入下一节的滚动验证。
风险提醒
参数扫描只能降低“被单个漂亮数字欺骗”的概率,不能证明策略未来一定赚钱。
交互实验室
请把下面的练习当成一张纸面工作表。
你不需要真实行情数据,也不需要新增组件。
目标是训练“看区域”的眼睛。
练习 A:识别平台期和孤岛最优
假设某策略扫描 5 个参数后得到结果。
| 参数 | 年化收益 | 最大回撤 | 交易次数 |
|---|---|---|---|
| 10 | 5.0% | 23.0% | 90 |
| 15 | 7.8% | 21.5% | 75 |
| 20 | 8.0% | 21.0% | 63 |
| 25 | 7.6% | 22.0% | 55 |
| 30 | 7.1% | 22.8% | 48 |
请回答:
最高收益参数是哪一个?
15 到 30 之间是否像平台期?
如果成本再提高 0.1%,你最担心哪一列先恶化?
你会把结论写成“20 最好”,还是“15 到 30 区间相对稳定”?
练习 B:给参数写理由
请任选一个你熟悉的规则,例如“收盘价站上均线后观察”。
把参数范围写成下面的表。
| 参数名称 | 准备扫描的范围 | 每个取值的间隔 | 投资含义 |
|---|---|---|---|
| 均线天数 | 10、20、30、60 | 约半月到一季度 | 趋势观察窗口 |
| 止损比例 | 6%、8%、10% | 每次增加 2% | 单笔风险护栏 |
| 持有天数 | 5、10、20 | 一周到一个月 | 信号有效观察期 |
如果某个参数写不出投资含义,先不要急着扫描。
这说明它可能只是为了追求历史漂亮结果而存在。
练习 C:写一句稳健性结论
请用下面模板完成一句话。
本次扫描中,参数 ______ 附近表现较稳定;但在 ______ 条件下结果明显变差,因此后续需要继续检查 ______。
一个合格答案可能是:
本次扫描中,均线 15 到 30 日附近表现较稳定;但在交易成本提高后交易次数较多的参数明显变差,因此后续需要继续检查成本敏感性和分年份表现。
核心复盘
知识清单:
[ ] 我知道参数扫描的目的不是寻找神奇数字,而是寻找稳定区域。
[ ] 我能区分参数平台期和孤岛最优。
[ ] 我知道最优参数周围的邻居同样重要。
[ ] 我能解释参数背后的投资含义,而不是只看收益排序。
[ ] 我知道扫描次数越多,越要警惕过拟合。
[ ] 我会记录数据版本、成本假设、参数范围和回测区间。
金句总结
真正值得信任的参数,不是站在历史最高点上,而是站在一片还能呼吸的平台上。