9.3 回撤分析:回撤持续多久、恢复多久
课前导读
本节目标
学完能解决什么困惑:不只知道最大回撤是多少,还能拆出回撤从哪里开始、跌到哪里、持续多久、多久才修复。
适合基础:已经理解资金曲线、最大回撤、pandas 的 cummax 和简单表格记录的读者。
难度:intermediate
预计用时:约 40 分钟
上一节我们把最大回撤看作体检报告里的重要风险指标。
但最大回撤只有一个数字。
它告诉你最深的坑有多深。
却不告诉你这段下坡走了多久。
也不告诉你从谷底爬回山顶用了多久。
本节用“爬山下坡”的类比来理解回撤分析。
投资中的资金曲线像一条山路。
新高是新的山顶。
从山顶往下走,就是回撤。
走到最低点,是谷底。
重新回到原来的山顶,才算恢复。
真正折磨人的,往往不只是下跌深度。
还有下跌持续的时间和等待恢复的时间。
知识正文
一、用爬山下坡理解回撤
想象你和同学一起爬山。
海拔从 1000 米爬到 1200 米时,大家很兴奋。
随后山路下坡,海拔降到 1100 米。
你没有回到起点。
但你已经离刚才的山顶低了 100 米。
这就是回撤的直觉。
资金曲线也是一样。
账户从 1.00 涨到 1.20。
随后跌到 1.08。
它相对历史高点 1.20 下跌了 10%。
这个 10% 就是当前回撤。
如果之后资金回到 1.20 或更高,这段回撤才结束。
关键直觉
回撤不是“亏没亏本金”的问题,而是“离过去最高点有多远”的问题。
二、回撤的四个核心术语
回撤分析至少要拆成四个问题。
| 术语 | 通俗解释 | 回答的问题 |
|---|---|---|
| 回撤深度 | 从历史高点跌到低点的幅度 | 这次下坡最深有多深 |
| 回撤开始 | 资金离开历史高点后的日期 | 从哪天开始不再创新高 |
| 回撤持续时间 | 从离开高点到重新回到高点的时间 | 这段压力持续多久 |
| 恢复时间 | 从谷底到重新回到高点的时间 | 从最难受的位置爬回来多久 |
这四个词听起来接近。
但它们表达的投资体验不同。
深度回答“疼不疼”。
持续时间回答“疼了多久”。
恢复时间回答“最难之后多久才缓过来”。
如果只看最大回撤,容易低估后两个问题。
三、公式:先找到历史高点
回撤计算的第一步,是记录每一天之前见过的最高资金。
这个最高资金常被称为历史高点。
你可以把它理解成“到目前为止爬到过的最高海拔”。
公式很简单:
如果当前资金等于历史高点,当前回撤就是 0。
如果当前资金低于历史高点,当前回撤就是负数。
例如历史高点是 1.20,当前资金是 1.08。
当前回撤就是 1.08 / 1.20 - 1 = -10%。
最大回撤就是整条资金曲线里最负的那个当前回撤。
四、回撤是一段事件,不只是一个点
很多新手把最大回撤当作一个点。
例如“最大回撤 -18%”。
但对投资者来说,回撤更像一段事件。
它有起点。
它有谷底。
它有恢复日。
它还有持续天数。
一段 -15% 的回撤,如果 5 个交易日就恢复,体验可能还可以接受。
另一段 -15% 的回撤,如果 120 个交易日才恢复,心理压力完全不同。
所以专业读回测时,会把回撤事件列成表。
而不是只写一个最大回撤数字。
五、A 股案例:同样深度,不同难熬程度
假设有两条策略资金曲线。
策略甲最大回撤都是 -12%。
策略乙最大回撤也都是 -12%。
看起来它们风险一样。
但细看过程并不同。
策略甲从高点跌到谷底用了 4 个交易日,又用 6 个交易日恢复。
策略乙从高点跌到谷底用了 30 个交易日,又用 80 个交易日恢复。
对新手来说,策略乙更难坚持。
因为每天都看到账户没有创新高,会不断怀疑规则是否失效。
在 A 股里,涨跌停、停牌和 T+1 还可能拉长恢复过程。
如果卖出信号出现时遇到跌停,回撤可能继续扩大。
如果持仓股票停牌,资金曲线可能暂时无法通过交易修正。
这就是为什么回撤分析必须结合交易边界。
风险提醒
回撤持续时间过长时,投资者容易临时改规则、提前放弃或反向追涨。回测报告必须让这种压力提前暴露出来。
六、用表格拆一段回撤
看下面这条假设资金曲线。
| 日期 | 资金 | 历史高点 | 当前回撤 |
|---|---|---|---|
| 1 月 2 日 | 1.0000 | 1.0000 | 0.00% |
| 1 月 3 日 | 1.0400 | 1.0400 | 0.00% |
| 1 月 4 日 | 1.0300 | 1.0400 | -0.96% |
| 1 月 5 日 | 0.9800 | 1.0400 | -5.77% |
| 1 月 8 日 | 0.9500 | 1.0400 | -8.65% |
| 1 月 9 日 | 0.9700 | 1.0400 | -6.73% |
| 1 月 10 日 | 1.0400 | 1.0400 | 0.00% |
| 1 月 11 日 | 1.0600 | 1.0600 | 0.00% |
这段回撤从 1 月 4 日开始。
因为这一天资金低于此前高点 1.0400。
谷底出现在 1 月 8 日。
最大深度是 -8.65%。
恢复日是 1 月 10 日。
因为这一天资金重新回到 1.0400。
回撤持续时间可以记录为从 1 月 4 日到 1 月 10 日。
恢复时间可以记录为从 1 月 8 日到 1 月 10 日。
这比只写“-8.65%”更有教学价值。
七、pandas 计算当前回撤
先从最基础的当前回撤开始。
import pandas as pd
equity = pd.Series(
[1.00, 1.04, 1.03, 0.98, 0.95, 0.97, 1.04, 1.06],
index=pd.to_datetime(
[
"2024-01-02",
"2024-01-03",
"2024-01-04",
"2024-01-05",
"2024-01-08",
"2024-01-09",
"2024-01-10",
"2024-01-11",
]
),
)
high_water_mark = equity.cummax()
drawdown = equity / high_water_mark - 1
result = pd.DataFrame(
{
"equity": equity,
"high_water_mark": high_water_mark,
"drawdown": drawdown,
}
)
print(result)cummax 是这段代码的关键。
它每天记录“到今天为止见过的最高资金”。
只要当前资金低于这个最高资金,回撤就是负数。
当资金重新等于或超过历史高点,回撤回到 0。
八、如何记录回撤事件
当前回撤是一列数据。
回撤事件是一张表。
你可以按下面的逻辑手工记录。
如果今天回撤等于 0,说明资金在历史高点。
如果昨天回撤等于 0,今天回撤小于 0,说明新回撤开始。
在回撤过程中,持续更新最低资金和最深回撤。
如果回撤重新等于 0,说明这段回撤恢复,记录结束日期。这个伪代码比直接写复杂函数更适合新手。
因为它让你先理解“事件”的边界。
什么时候开始?
什么时候最深?
什么时候恢复?
每个问题都需要明确答案。
九、回撤记录表应该长什么样
一份合格的回撤记录表可以包含这些字段。
| 回撤编号 | 开始日期 | 前高资金 | 谷底日期 | 谷底资金 | 最大深度 | 恢复日期 | 持续交易日 | 恢复交易日 | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 2024-01-04 | 1.0400 | 2024-01-08 | 0.9500 | -8.65% | 2024-01-10 | 5 | 3 | 示例 |
“备注”列不要空着。
你可以写当时市场环境。
例如指数下跌、持仓遇到跌停、信号延迟、成本放大、样本股票停牌。
这些备注帮助你区分两类问题。
第一类是市场正常波动。
第二类是规则或数据存在缺陷。
如果很多回撤都来自同一类原因,就值得回到规则里检查。
十、回撤分析里的三个误区
第一个误区,是只看最大回撤。
最大回撤很重要。
但第二大、第三大回撤也可能频繁发生。
如果策略每隔一两个月就回撤 -8%,新手也可能很难坚持。
第二个误区,是忽略未恢复回撤。
如果回测结束时资金还没有回到前高,这段回撤仍在进行中。
它不应该被轻轻带过。
第三个误区,是把回撤全归咎于市场。
市场下跌当然会影响资金曲线。
但如果你的规则在跌停日假设能卖出,在停牌日假设能调仓,那就是回测设置问题。
回撤表能帮助你把这些原因写清楚。
十一、从三重角度读回撤
从老师角度,回撤是训练学生风险感知的材料。
它让你知道“赚钱路上也会有下坡”。
从投资者角度,回撤是最真实的心理压力测试。
你需要问自己:如果账户从高点跌 15%,并且 60 个交易日没有恢复,我还能按规则行动吗?
从量化开发角度,回撤是检查回测流程的报警器。
异常深或异常快的回撤,可能来自行情,也可能来自数据错位、成本漏算或成交假设过于理想。
这三个角度合起来,回撤分析就不再只是一个负数。
它变成了资金曲线的病历。
交互实验室
练习:制作你的回撤记录表
请使用下面这条假设资金曲线。
| 日期 | 资金 |
|---|---|
| 第 1 天 | 1.0000 |
| 第 2 天 | 1.0300 |
| 第 3 天 | 1.0200 |
| 第 4 天 | 0.9900 |
| 第 5 天 | 0.9700 |
| 第 6 天 | 1.0100 |
| 第 7 天 | 1.0300 |
| 第 8 天 | 1.0500 |
| 第 9 天 | 1.0200 |
| 第 10 天 | 1.0600 |
请完成三步。
第一步,为每一天计算历史高点和当前回撤。
第二步,找出所有回撤事件,不只找最大的一次。
第三步,填写下面的回撤记录表。
| 回撤编号 | 开始日期 | 前高资金 | 谷底日期 | 谷底资金 | 最大深度 | 恢复日期 | 持续交易日 | 恢复交易日 | 你会如何处理 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 |
| 2 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 |
最后一列“你会如何处理”很重要。
不要只写“继续观察”。
请写得具体一点。
例如:检查是否遇到跌停、确认信号是否延后一日、复核成本是否扣除、记录是否仍在规则允许范围内。
可执行小任务
把你在 9.2 中使用的资金曲线拿出来。
不要重新写策略。
只做回撤分析。
输出一张回撤记录表。
如果回测结束时还有一段回撤没有恢复,请在恢复日期写“未恢复”。
这能训练你承认风险尚未结束,而不是用漂亮结论盖过去。
核心复盘
知识清单:
- [ ] 我知道当前回撤是当前资金相对历史高点的下跌幅度。
- [ ] 我知道最大回撤只是最深的一次,不等于完整回撤分析。
- [ ] 我能区分回撤深度、持续时间和恢复时间。
- [ ] 我会用
cummax计算历史高点,并用表格记录回撤事件。 - [ ] 我会在 A 股语境下检查涨跌停、停牌、T+1 和滑点是否放大了回撤。
金句总结
回撤不是资金曲线上的一个负数,而是一段从山顶下坡、谷底等待、再爬回山顶的真实经历。