:root{--brand-1:#18794e;--brand-2:#3dd68c;--brand-3:#2bb673;--brand-soft:#3dd68c22;} .hero .kicker{color:var(--brand-2)} .nav .ep{color:var(--brand-2)} .sec h2 .num{color:var(--brand-2)} .quote::before{background:var(--brand-1)} .quote .q-text .em{color:var(--brand-2)} .quote .q-water .pg{color:var(--brand-2)} .widget .w-title{color:var(--brand-2)} .takeaway h3{color:var(--brand-2)} .takeaway ol li::marker{color:var(--brand-2)} .next .nx-label{color:var(--brand-2)} .formula .eq{color:var(--brand-2)} a{color:var(--brand-2)} .comp.c1 .tag{background:var(--brand-soft);color:var(--brand-2)} /* 优化vs过拟合 */ .hyperopt .controls{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin:12px 0;font-size:13px} .hyperopt .controls label{color:var(--t2)} .hyperopt .controls input[type=range]{flex:1;min-width:160px;accent-color:var(--brand-1)} .hyperopt .controls .val{font-family:var(--mono);color:var(--brand-2);font-weight:600;min-width:60px;text-align:right} .hyperopt .chart{width:100%;height:260px;display:block;margin:12px 0} .hyperopt .legend{display:flex;gap:16px;flex-wrap:wrap;font-size:12px;color:var(--t3);margin-top:6px} .hyperopt .legend i{display:inline-block;width:14px;height:3px;margin-right:5px;vertical-align:middle} .hyperopt .verdict{margin-top:14px;padding:14px;border-radius:8px;font-size:13.5px;text-align:center} .hyperopt .verdict.ok{background:var(--green-soft);color:var(--green-1);border:1px solid var(--green-1)} .hyperopt .verdict.bad{background:var(--red-soft);color:var(--red-1);border:1px solid var(--red-1)} .hyperopt .verdict.warn{background:var(--yellow-soft);color:var(--yellow-1);border:1px solid var(--yellow-1)} .hyperopt .split{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:12px} .hyperopt .split .sc{background:var(--bg-mute);border:1px solid var(--divider);border-radius:8px;padding:12px;text-align:center} .hyperopt .split .sc .sl{font-size:12px;color:var(--t3);margin-bottom:4px} .hyperopt .split .sc .sv{font-size:22px;font-weight:700;font-family:var(--mono)} .hyperopt .split .sc.train .sv{color:var(--green-1)} .hyperopt .split .sc.test .sv{color:var(--red-1)}
量化交易实战 · 第 12 期 · 第二季

Hyperopt 调参到天荒地老——回测夏普 3.0,实盘亏成狗

超参优化 vs 过拟合 · hyperparameter optimization vs overfitting

RSI 用 14 还是 7?阈值 30 还是 25?Hyperopt 帮你扫几千组参数找最优。但参数越优,过拟合越狠——你把历史噪声也"背"下来了,未来不再现。回测夏普 3.0 的策略,实盘常常亏成狗,因为最优参数是对过去的精确描述,不是对未来的预测。调参不是越优越好,是越稳越好。
⏱ 约 10 分钟 🎯 调过参、想知道为什么实盘不如回测的人 📦 源:freqtrade §7

01Hyperopt 在干什么

Hyperopt 是个超参优化器。你告诉它"RSI 周期在 7~21 之间、阈值在 20~40 之间",它用贝叶斯优化(TPE 算法)扫几百几千组组合,每组跑一次回测,找收益最高(或夏普最高)的那组参数。

听起来很美——但问题在于:回测收益高 ≠ 未来收益高。你扫的参数越多、范围越大,越容易"恰好"找到一组对历史完美但对未来无意义的参数。这就像考试前背了历年真题的答案——模考满分,真考砸了。

Hyperopt 的正确用法不是"找最优",是"找稳健":用 walk-forward(滚动训练测试),看参数在不同时段是否都稳定,而不是只在一个时段最优。一组在 2020 最优、2021 也好、2022 还行的参数,比一组只在 2020 完美的参数,实盘可靠得多。

最优参数是对过去的描述,
不是对未来的预测。
灏天文库 · 量化交易实战 P.36

02优化 vs 过拟合:调参越多,差距越大

下面模拟 Hyperopt 调参。横轴是"调参力度"(扫多少组参数),纵轴是夏普。绿线是训练集(历史)夏普——调参越多越高。红线是测试集(未来)夏普——先跟着涨,到某个点后开始崩。这就是过拟合的拐点。

🎛️ 优化 vs 过拟合对比
拖动"调参力度",看训练集夏普越调越高、测试集夏普先涨后崩。
50 组
训练集夏普(历史,越调越高) 测试集夏普(未来,先涨后崩) 过拟合拐点
训练集夏普(回测)
—
测试集夏普(实盘)
—
拖动滑块调参,看测试集什么时候崩。

03怎么知道有没有过拟合

判断过拟合的硬指标:训练集和测试集的表现差距。如果训练集夏普 3.0、测试集夏普 0.5,几乎肯定过拟合。健康的表现是两者接近——训练集略高(因为参数是在它上面调的),但不该差几倍。

三个实操方法:

记住:调参的目标不是找到那组最优,是找到一片都还行的参数区域。平台比山峰可靠,因为实盘的参数总会漂移。

要找平台不要找山峰,
实盘的参数总会漂移。
灏天文库 · 量化交易实战 P.37

04带走这套清单

✅ 防过拟合 6 条可执行规则

  1. 留样本外:30% 数据不参与调参,只在上面测,这才是真实预期。
  2. 用 walk-forward:滚动训练测试,看参数跨时段是否稳定。
  3. 看参数稳定性:找平台型参数,别找悬崖上的山峰。
  4. 限制参数空间:范围别开太大,扫的组数别太多,越扫越容易过拟合。
  5. 看训练/测试差距:差几倍几乎肯定过拟合,健康是两者接近。
  6. 实盘前小仓位试跑:再好的回测也要小仓位实盘验证,回测永远有盲区。
调参不是越优越好,
是越稳越好。
灏天文库 · 量化交易实战 P.38