: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夏普 */ .complexity .controls{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin:12px 0;font-size:13px} .complexity .controls label{color:var(--t2)} .complexity .controls input[type=range]{flex:1;min-width:160px;accent-color:var(--brand-1)} .complexity .controls .val{font-family:var(--mono);color:var(--brand-2);font-weight:600;min-width:70px;text-align:right} .complexity .chart{width:100%;height:280px;display:block;margin:12px 0} .complexity .legend{display:flex;gap:16px;flex-wrap:wrap;font-size:12px;color:var(--t3);margin-top:6px} .complexity .legend i{display:inline-block;width:14px;height:3px;margin-right:5px;vertical-align:middle} .complexity .split{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:12px} .complexity .split .sc{background:var(--bg-mute);border:1px solid var(--divider);border-radius:8px;padding:14px;text-align:center} .complexity .split .sc .sl{font-size:12px;color:var(--t3);margin-bottom:4px} .complexity .split .sc .sv{font-size:22px;font-weight:700;font-family:var(--mono)} .complexity .split .sc.bt .sv{color:var(--green-1)} .complexity .split .sc.live .sv{color:var(--red-1)} .complexity .verdict{margin-top:14px;padding:14px;border-radius:8px;font-size:13.5px;text-align:center} .complexity .verdict.ok{background:var(--green-soft);color:var(--green-1);border:1px solid var(--green-1)} .complexity .verdict.bad{background:var(--red-soft);color:var(--red-1);border:1px solid var(--red-1)} .complexity .verdict.warn{background:var(--yellow-soft);color:var(--yellow-1);border:1px solid var(--yellow-1)}
量化交易实战 · 第 20 期 · 第二季收官

复杂策略夏普 3.0,简单策略 1.5——五年后活的是哪个?

最好的策略是无聊的 · the best strategy is boring

回测里,复杂策略(多因子 + 机器学习 + 动态仓位)夏普 3.0,简单策略(单均线 + 固定仓位)夏普 1.5。但实盘五年后,活下来的常常是简单的。原因:复杂策略过拟合、成本高、维护难,简单策略稳健、便宜、活得久。最好的策略不是最聪明的,是最能活下来的——而能活下来的,往往很无聊。
⏱ 约 10 分钟 🎯 追求复杂、忘了稳健的人 📦 源:quant-wiki §5

01复杂策略的三个隐性代价

复杂策略回测好看,但有三个回测里看不到、实盘里致命的代价:

代价1

过拟合

参数越多,越容易拟合历史噪声。复杂策略 20 个参数,简单策略 2 个——前者过拟合概率高一个量级。

代价2

交易成本

复杂策略通常高换手,年换手 200 次 vs 简单 20 次。每次 0.1% 成本,年差 18%。

代价3

维护难度

复杂策略要持续调参、监控、修 bug。简单策略"设置好就忘"。维护成本是隐性人力成本。

代价4

黑天鹅脆弱

复杂策略假设多,假设一旦失效(如相关性飙升)就崩。简单策略假设少,反而抗造。

所以实盘里,复杂策略回测夏普 3.0 常常掉到 1.0 以下,简单策略 1.5 还能保持 1.2。回测夏普会骗人,实盘夏普不会——能稳定输出的才是真本事。

回测夏普会骗人,
实盘夏普不会。
灏天文库 · 量化交易实战 P.60

02策略复杂度 vs 夏普:回测虚高、实盘崩

下面模拟策略复杂度(参数数量、换手率)和夏普的关系。拖动复杂度,看回测夏普怎么随复杂度虚高、实盘夏普怎么先涨后崩。找到那个"实盘夏普最高"的甜点——通常在简单到中等之间。

📉 策略复杂度 vs 夏普对比
拖动复杂度,看回测夏普虚高、实盘夏普先涨后崩。
4
回测夏普(随复杂度虚高) 实盘夏普(先涨后崩) 甜点(实盘最优)
回测夏普
—
实盘夏普
—
拖动滑块查看评估。

03什么是"无聊"的好策略

"无聊"不是"差",是"简单到让你觉得没意思"。无聊策略有几个特征:

反面例子:过度工程。为了把回测夏普从 1.5 提到 3.0,加 5 个过滤器、3 个动态仓位、2 个市场状态判断——回测好看,实盘每个组件都可能失效。奥卡姆剃刀:能用简单解释的,别用复杂。策略也一样。

能用简单解释的,
别用复杂。
灏天文库 · 量化交易实战 P.61

04带走这套清单

✅ 简单策略 6 条可执行规则

  1. 逻辑一句话说清:解释不了的策略别上实盘,你拿不住。
  2. 参数少且不敏感:2-3 个,偏 20% 夏普只掉一点,悬崖参数不要。
  3. 低换手省成本:月换手几次,不是几天换一次,每次交易都付成本。
  4. 跨市场都还行:普适逻辑比单市场怪癖可靠,说明抓的是真规律。
  5. 别过度工程:为提夏普加一堆过滤器,实盘每个都可能失效。
  6. 追求"能活下来"而非"最聪明":五年后还在的,才是好策略。
最好的策略不是最聪明的,
是最能活下来的。
灏天文库 · 量化交易实战 P.62