说实话,写这一章之前,我一直觉得量化金融就是"找规律、写策略、自动赚钱"。但当我真正把数据拉下来,看到那条从山顶一路跌到半山腰的曲线时,我才意识到------策略赚不赚钱是一回事,你能不能拿得住是另一回事。就像你写了一个很牛的算法,但线上挂了三天你都不敢部署,那再好的算法也是白搭。
一、今年以来兆易创新的最大回撤
1.1 数据概览
先用 AkShare 把数据拉下来:
python
import akshare as ak
df = ak.stock_zh_a_hist(
symbol="603986",
period="daily",
start_date="20260101",
end_date="20260726",
adjust="qfq" # 前复权,消除分红送股影响
)
拿到 134 个交易日 的数据。兆易创新今年从 235 元附近起步,最高冲到 846.66 元 ,然后最近跌回 457 元 。这走势,用我们程序员的话说就是------指数级增长之后接了段指数级回调。
1.2 最大回撤计算
最大回撤的公式很简单,但背后的含义很扎心:

对买入持有策略(首日净值归一化为 1)跑一遍:
表格
| 指标 | 数值 |
|---|---|
| 峰值日期 | 2026-06-29 |
| 峰值净值 | 3.5693 |
| 谷值日期 | 2026-07-20 |
| 谷值净值 | 1.8369 |
| 最大回撤 | -48.54% |
| 回撤持续天数 | 21 天 |
如果你在 6 月 29 日最高点买了 100 万,到 7 月 20 日只剩 51.5 万,三周亏掉将近一半。
二、水下曲线------ 回撤的可视化
2.1 什么是水下曲线
水下曲线就是把每一天的回撤画出来,0 轴以上表示"还在水面上"(没亏),0 轴以下表示"在水下"(亏了)。整个曲线始终 ≤ 0,最深的那一点就是最大回撤。
我画出来一看,好家伙------今年以来几乎有一半的时间都在水下 。最深的地方直接扎到了 -48.54%,而且截至最新数据(7 月 24 日),还在水下 45.6% 的位置,远没爬出来。
2.2 回撤信息
-
-15% 的线被反复击穿:如果你只能承受 -15% 的回撤,那今年以来你至少会被迫止损三次。
-
6 月底到 7 月的这波下杀极其陡峭:21 天从山顶到半山腰,斜率堪比瀑布。
-
水下曲线越宽,说明恢复时间越长:目前这个"水坑"又深又宽,短期内看不到上岸的希望。
💡 我的理解:水下曲线就像系统的内存泄漏图。平时小波动是正常 GC,但一旦出现深 V 且长时间不恢复,说明系统有结构性问题------要么策略失效,要么仓位太重扛不住波动。
三、仓位管理:同样的策略,不同的结果
3.1 双均线策略(MA5/MA20)
策略逻辑很简单,跟写个 if-else 差不多:
python
# 短均线上穿长均线 → 满仓做多
# 短均线下穿长均线 → 空仓观望
signal = 1 if ma5 > ma20 else 0
position = signal * 仓位比例 # 1.0=满仓, 0.5=半仓
我分别跑了 满仓(100%) 和 半仓(50%) 两种情况,同时用买入持有作为基准。
3.2 三条净值曲线对比
| 策略 | 总收益率 | 最大回撤 | 年化波动率 | 夏普比率 |
|---|---|---|---|---|
| 买入持有 | +45.35% | -48.54% | 83.97% | 1.40 |
| 双均线满仓 | +53.57% | -29.97% | 66.04% | 2.13 |
| 双均线半仓 | +27.08% | -16.15% | 33.02% | 2.13 |
对照三个问题读图:
谁涨得最高?(最终收益)
双均线满仓(53.57%)> 买入持有(45.35%)> 双均线半仓(27.08%)。
这很好理解------满仓吃到了最多的上涨。但注意,半仓虽然只有一半收益,夏普比率却和满仓一样,说明它用更小的波动换来了同等的单位风险收益。
谁跌得最惨?(最大回撤)
买入持有(-48.54%)>> 双均线满仓(-29.97%)> 双均线半仓(-16.15%)。
买入持有直接腰斩,双均线策略因为有止损机制,躲掉了部分下跌。半仓更是把回撤砍到了 -16%,不到买入持有的三分之一。
曲线是否更「平滑」?
半仓的绿色曲线像一条缓坡,满仓的红色曲线像过山车,买入持有的灰色曲线像跳楼机。半仓的波动率只有满仓的一半,持有体验好太多了。
3.3 我的思考
作为一个写过后端高并发系统的人,我把仓位管理类比成了流量削峰:
-
满仓 = 系统直接扛全部流量,峰值高但容易被打挂;
-
半仓 = 加了限流和熔断,峰值低了但稳定性强;
-
买入持有 = 完全不做限流,靠硬件硬扛,扛不住就宕机。
量化交易里,"宕机"的意思就是心态崩了割肉,或者被迫平仓。半仓虽然赚得少,但它让你能睡个好觉,而睡个好觉在长期投资里值多少钱?无法估量。
四、作业:换参数 MA10/30,满仓 vs 30% 仓位
4.1 实验设计
把均线参数从 MA5/20 改成 MA10/30(周期更长,信号更少,更"迟钝"),然后对比:
| 策略 | 总收益率 | 最大回撤 | 年化波动率 | 夏普比率 |
|---|---|---|---|---|
| MA10/30 满仓 | +50.50% | -38.74% | 72.91% | 1.58 |
| MA10/30 30%仓位 | +15.63% | -13.11% | 21.87% | 1.58 |
| 买入持有 | +45.35% | -48.54% | 83.97% | 1.40 |
4.2 观察结论
参数变了,半仓(30%仓位)是否仍然明显「减坑」?
答案是:非常明显,而且效果更好了。
-
MA10/30 满仓的回撤是 -38.74%,比 MA5/20 满仓的 -29.97% 还要大。这说明参数变迟钝后,策略反应慢了,躲下跌的能力反而下降了。
-
但 30% 仓位的回撤只有 -13.11% ,稳稳地守住了 -15% 的承受线。
-
夏普比率满仓和 30% 仓位一样(1.58),再次验证了降低仓位不改变单位风险收益,只改变绝对波动。
这就像是把系统的并发度从 100% 降到 30%。虽然总吞吐量(总收益)下降了,但系统的 P99 延迟(最大回撤)和错误率(爆仓风险)大幅改善。对于不能承受高抖动的业务(比如你的心态),这是必须的 trade-off。
五、算恢复时间:多久能爬出坑?
5.1 计算方法
找到最大回撤发生的日期,然后看之后 60 个交易日内,净值能不能回到前高。用代码说就是:
python
# 找到最大回撤的谷值索引
max_dd_idx = drawdown.idxmin()
peak_value = running_peak[max_dd_idx]
# 检查之后60个交易日
for i in range(1, 61):
if equity[max_dd_idx + i] >= peak_value:
recovery_days = i
break
5.2 结果
| 策略 | 最大回撤日 | 前高净值 | 截至最新 | 是否恢复 | 距离前高 |
|---|---|---|---|---|---|
| 买入持有 | 2026-07-20 | 3.5693 | 1.9419 | ❌ 未恢复 | 还差 45.6% |
| MA5/20 满仓 | 2026-03-23 | 1.9443 | 1.5357 | ❌ 未恢复 | 还差 21.0% |
| MA5/20 半仓 | 2026-03-23 | 1.4246 | 1.2708 | ❌ 未恢复 | 还差 10.8% |
残酷的现实 :截至最新数据(7 月 24 日),没有任何一个策略在 60 个交易日内恢复到前高。
-
买入持有最惨,最大回撤发生在 7 月 20 日,距今只有 4 个交易日,净值还在谷底附近徘徊。
-
双均线策略的最大回撤发生在 3 月 23 日,距今已经 84 个交易日,满仓还差 21%,半仓还差 10.8%。
5.3 从水下曲线宽度看恢复
水下曲线越宽,说明"在水下的时间"越长。买入持有的水下曲线在 7 月之后形成了一个巨大的深坑,宽度目测要 几个月甚至半年以上 才能填平。而半仓的水下曲线虽然也有坑,但深度和宽度都小得多,理论上恢复会更快。
写代码的时候,我们总说"快速失败、快速恢复"(Fail Fast, Recover Fast)。但在金融市场,失败可以很快,恢复却可能很慢。最大回撤不只是数字,它代表的是你需要用多长时间、多少涨幅才能回到原点。而时间,本身就是成本。
六、思考题:如果只能承受 -15% 回撤
6.1 本章实验里哪种仓位更合适?
| 策略 | 最大回撤 | 是否在 -15% 以内? |
|---|---|---|
| 买入持有 | -48.54% | ❌ 严重超标 |
| MA5/20 满仓 | -29.97% | ❌ 超标 |
| MA5/20 半仓 | -16.15% | ❌ 略超 |
| MA10/30 满仓 | -38.74% | ❌ 严重超标 |
| MA10/30 30%仓位 | -13.11% | ✅ 符合 |
结论 :在本章实验的所有组合中,只有 MA10/30 的 30% 仓位能把回撤控制在 -15% 以内。
6.2 若都不合适,你会怎么调整?
如果 MA5/20 半仓的 -16.15% 还是让你睡不着觉,我有两个调整方向:
方向一:继续降仓位
从半仓降到 30% 甚至 20%。根据实验结果,30% 仓位的回撤已经降到了 -13%(MA10/30)或更低。理论上,仓位和回撤近似线性关系------半仓的回撤大约是满仓的一半,所以降到 30% 应该能稳稳守住 -15%。
代价是收益也同比例下降。但记住:活着才有输出,爆仓了连输出的机会都没有。
方向二:换策略
如果降仓位导致收益低到无法接受,可以考虑:
-
加止损线:比如固定 -10% 强制平仓,不让回撤扩大到 -15% 以上。
-
多因子策略:不只看均线,加入波动率过滤(比如 VIX 太高就降仓)、趋势强度确认等。
-
分散标的:不把鸡蛋放一个篮子里。兆易创新是半导体龙头,波动天然大。如果组合里加入低波动的标的(比如红利股、债券),整体回撤会平滑很多。
-
择时+择仓结合:趋势强的时候满仓,趋势弱的时候自动降到 30%,而不是固定仓位。
如果是我,我会先降仓位到 30%,同时优化策略加入波动率过滤。就像做系统架构,先保证服务不挂(降仓位),再逐步优化性能(换策略)。你不能在一个随时会 OOM 的系统上谈性能优化。
七、本章小结
7.1 从代码视角理解回撤
最大回撤就是投资组合的 P99 错误率------它告诉你最坏情况下系统会崩成什么样。而仓位管理,就是限流和熔断。
-
满仓 = 不做限流,赌的就是不出峰值流量;
-
半仓 = 加了 Rate Limiter,峰值来了能扛住;
-
动态仓位 = 自适应限流,根据系统负载自动调节。
7.2 夏普比率的启示
本章最反直觉的发现是:满仓和半仓的夏普比率居然一样(MA5/20 都是 2.13,MA10/30 都是 1.58)。
这说明什么?说明降低仓位并没有降低"单位风险带来的收益",它只是把收益的绝对值和风险的绝对值同比例缩小了。就像你把一个系统的 QPS 和延迟同时除以 2,用户体验(夏普比率)不变,但服务器压力(心态压力)小了一半。
7.3 量化金融的本质
以前我觉得量化是用数学和代码"战胜市场"。现在我觉得,量化更像是在市场的不确定性中,用系统和纪律保护自己的人性弱点。
-
最大回撤让你知道"最坏情况",避免盲目乐观;
-
仓位管理让你"即使最坏情况发生,也能活下来";
-
回测让你"在历史数据上先死一遍",避免真金白银去交学费。
就像做单元测试------不是为了让代码不出 bug,而是为了在 bug 出现的时候,知道它会怎么炸、炸多严重、怎么兜底。
7.4 给同样初学者的建议
-
不要只看收益率,回撤和波动率才是决定你能不能拿住的关键;
-
仓位是你唯一能 100% 控制的东西,标的选择和入场时机都有运气成分,但仓位是你鼠标一点就能决定的;
-
夏普比率比收益率更重要,因为它衡量的是"睡得着觉的程度";
-
回测是历史,不是未来,但历史能帮你建立对"最坏情况"的体感;
-
永远给自己留后路,满仓梭哈不是勇气,是赌博
附图:
