DataWhale—量化金融(task8 最大回撤 和 仓位管理)

说实话,写这一章之前,我一直觉得量化金融就是"找规律、写策略、自动赚钱"。但当我真正把数据拉下来,看到那条从山顶一路跌到半山腰的曲线时,我才意识到------策略赚不赚钱是一回事,你能不能拿得住是另一回事。就像你写了一个很牛的算法,但线上挂了三天你都不敢部署,那再好的算法也是白搭。


一、今年以来兆易创新的最大回撤

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 回撤信息

  1. -15% 的线被反复击穿:如果你只能承受 -15% 的回撤,那今年以来你至少会被迫止损三次。

  2. 6 月底到 7 月的这波下杀极其陡峭:21 天从山顶到半山腰,斜率堪比瀑布。

  3. 水下曲线越宽,说明恢复时间越长:目前这个"水坑"又深又宽,短期内看不到上岸的希望。

💡 我的理解:水下曲线就像系统的内存泄漏图。平时小波动是正常 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%。

代价是收益也同比例下降。但记住:活着才有输出,爆仓了连输出的机会都没有。

方向二:换策略

如果降仓位导致收益低到无法接受,可以考虑:

  1. 加止损线:比如固定 -10% 强制平仓,不让回撤扩大到 -15% 以上。

  2. 多因子策略:不只看均线,加入波动率过滤(比如 VIX 太高就降仓)、趋势强度确认等。

  3. 分散标的:不把鸡蛋放一个篮子里。兆易创新是半导体龙头,波动天然大。如果组合里加入低波动的标的(比如红利股、债券),整体回撤会平滑很多。

  4. 择时+择仓结合:趋势强的时候满仓,趋势弱的时候自动降到 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 给同样初学者的建议

  1. 不要只看收益率,回撤和波动率才是决定你能不能拿住的关键;

  2. 仓位是你唯一能 100% 控制的东西,标的选择和入场时机都有运气成分,但仓位是你鼠标一点就能决定的;

  3. 夏普比率比收益率更重要,因为它衡量的是"睡得着觉的程度";

  4. 回测是历史,不是未来,但历史能帮你建立对"最坏情况"的体感;

  5. 永远给自己留后路,满仓梭哈不是勇气,是赌博

附图:

相关推荐
Black_Rock_br1 小时前
打通 PyTorch Monarch 与 ROCm:单 Controller 架构的异构算力实战
人工智能·pytorch·python·开源
其实防守也摸鱼2 小时前
Kimi K3深度测评:长文本之外的真实力
运维·开发语言·网络·人工智能·python·学习·安全
weixin_BYSJ19872 小时前
springboot3家政平台小程序--附源码00904
java·javascript·spring boot·python·django·flask·php
风痕天际2 小时前
Pytorch开发教程1——CUDA安装
人工智能·pytorch·python
geovindu2 小时前
python: Breadth First Search Algorithm and Depth First Search Algorithm
开发语言·后端·python·算法·搜索算法
程序员果子2 小时前
CrewAI :当 Agent 学会团队协作
人工智能·git·python·多智能体·agent框架
玉鸯2 小时前
向量检索不是记忆:Agent 记忆的三层进化
python·agent
大模型码小白2 小时前
Java 部署:Jenkins Pipeline 构建 Java 项目(自动化)
java·人工智能·python·机器学习
runafterhit3 小时前
python基础语法命令(C程序员刷leetcode)
c语言·python·leetcode