9.2 关键指标:年化收益、波动率、夏普、最大回撤
课前导读
本节目标
学完能解决什么困惑:看到一份回测报告时,不再只盯着“赚了多少”,而能读懂收益、波动、夏普和最大回撤各自回答什么问题。
适合基础:已经理解最小回测模型、资金曲线、每日收益率和 pandas 基础计算的读者。
难度:intermediate
预计用时:约 40 分钟
如果说 9.1 的回测最小模型是一场模拟考试。
那么本节的关键指标就像体检报告。
体检报告不会只写一句“身体不错”。
它会分别检查体重、血压、心率、血糖和异常风险。
回测报告也不应该只写“年化 30%”。
因为一个策略可能赚得多,但路上颠簸很大。
也可能最终收益一般,却非常平稳。
还可能前半段很好,后半段突然掉进深坑。
所以我们需要一组指标,而不是一个数字。
本节只讲最核心的四个:年化收益、波动率、夏普、最大回撤。
请记住本节主线:每个指标都在回答一个具体问题。
知识正文
一、先把指标当成“体检项目”
新手容易把指标当成排名工具。
看到哪个数字高,就觉得哪个策略好。
这很危险。
体检里血压不是越低越好。
心率不是越高越好。
回测指标也是一样。
年化收益高,不代表容易执行。
波动率低,不代表一定赚钱。
夏普高,也可能来自样本太短或成本漏算。
最大回撤小,也可能因为交易次数太少、样本没有经历困难行情。
关键直觉
指标不是奖杯,而是问题清单。读指标时先问“它回答什么问题”,再问“这个答案可信吗”。
二、每日收益率:所有指标的积木
很多回测指标都从每日收益率开始。
每日收益率的直觉很简单。
今天账户资金相对昨天变化了多少。
公式可以写成:
如果昨天资金是 1.0000,今天是 1.0100。
每日收益率就是 1%。
如果今天变成 0.9800。
每日收益率就是 -2%。
资金曲线是一条路。
每日收益率就是路上每一步的坡度。
后面的年化收益、波动率和夏普,都离不开这一步。
三、年化收益:把不同长度的考试折成一年
年化收益回答的问题是:
如果把这段回测表现折算成一年,大约是什么收益水平?
它适合比较不同长度的回测。
例如策略 A 回测 6 个月赚 8%。
策略 B 回测 2 年赚 25%。
直接比较 8% 和 25% 不公平。
年化收益会把它们折成类似“一年成绩单”。
一个常见简化公式是:
这里的 252 是 A 股一年大致的交易日数量。
这个公式不是魔法。
它只是把一段资金增长按时间长度换算成年度口径。
但年化收益有一个明显缺点。
它不告诉你中间跌过多少。
从 1.00 到 1.20 可以很平稳。
也可以先跌到 0.65 再涨回来。
这两条路的心理压力完全不同。
四、波动率:持有路上有多颠
波动率回答的问题是:
资金曲线每天上下晃动得厉不厉害?
它像坐车时的颠簸程度。
同样从北京到上海,有的车一路平稳。
有的车一路急刹、急转、上下坡。
两者最终都到达目的地,但乘客体验完全不同。
回测里常用每日收益率的标准差来衡量波动。
再乘以一年交易日数量的平方根,得到年化波动率。
简化写法是:
如果一个策略年化收益 20%,年化波动率 40%。
它可能像一辆很快但很晃的车。
如果另一个策略年化收益 12%,年化波动率 10%。
它可能速度慢一些,但更稳。
新手阶段不要把低波动误解成无风险。
它只是说明历史样本里的日常颠簸较小。
黑天鹅、停牌、连续跌停等极端情况,未必能被普通波动率充分描述。
五、夏普:每承受一份颠簸换来多少收益
夏普回答的问题是:
这套规则的收益,和它承受的波动相比,划不划算?
你可以把它想成“单位颠簸换来的回报”。
入门阶段可以先用简化公式:
更正式的写法会减去无风险收益。
为了让新手先理解直觉,本节暂时把无风险收益简化为 0。
如果策略年化收益 15%,年化波动率 15%。
简化夏普约为 1。
如果策略年化收益 15%,年化波动率 30%。
简化夏普约为 0.5。
这说明同样收益下,后者的路更颠。
但夏普也不是万能指标。
它更擅长描述日常波动。
如果策略平时很稳,偶尔发生一次大亏,夏普可能在早期看起来很好。
所以读夏普时必须搭配最大回撤。
六、最大回撤:历史上最难熬的坑
最大回撤回答的问题是:
从历史高点往下掉,最深曾经掉到哪里?
它不是看股票价格从最高到最低。
而是看策略资金曲线从此前最高点下跌的幅度。
简化公式是:
最大回撤就是所有当前回撤中最小的那个数。
例如资金先从 1.00 涨到 1.20。
后来跌到 0.96。
相对 1.20 的回撤就是 -20%。
如果这是历史最深的一次,那么最大回撤就是 -20%。
最大回撤非常重要。
因为它接近投资者真实感受。
很多人不是被最终亏损打败。
而是在资金从高点持续下滑时失去信心。
风险提醒
只看年化收益不看最大回撤,就像只看工资不看负债。表面数字漂亮,实际压力可能很大。
七、四个指标放在同一张表里
一份入门回测报告至少应该这样读。
| 指标 | 回答的问题 | 新手常见误读 | 正确读法 |
|---|---|---|---|
| 年化收益 | 折成一年大概赚多少 | 越高越好 | 还要看样本长度和过程 |
| 波动率 | 日常资金有多颠 | 越低一定越好 | 要结合收益一起看 |
| 夏普 | 单位波动换来多少收益 | 高就一定能实盘 | 需检查样本、成本和回撤 |
| 最大回撤 | 最深一次从高点跌多少 | 只是一个历史数字 | 是执行压力和风险底线 |
这张表像体检报告的首页。
它不会替你做决定。
但会提示你哪里需要进一步检查。
八、A 股案例:两个策略谁更适合新手研究
假设你看到两份 A 股回测摘要。
策略甲:年化收益 28%,年化波动率 38%,夏普 0.74,最大回撤 -35%。
策略乙:年化收益 14%,年化波动率 12%,夏普 1.17,最大回撤 -10%。
如果只看年化收益,策略甲更诱人。
但如果你是新手投资者,策略甲中途可能出现三成以上回撤。
这意味着账户从历史高点 10 万跌到 6.5 万附近。
你能不能继续执行规则,是一个真实问题。
策略乙收益低一些。
但它用较小波动换来相对稳定的收益。
最大回撤也更容易承受。
这并不表示策略乙一定更好。
而是说明读回测报告时不能只看第一行。
你要像医生看体检一样,把多个指标放在一起判断。
九、pandas 计算示例
下面用一条假设资金曲线演示。
数据很短,所以结果只用于理解公式。
不要把短样本数字当成策略结论。
import pandas as pd
trading_days_per_year = 252
equity = pd.Series(
[1.00, 1.02, 1.01, 1.05, 1.03, 1.08, 1.04, 1.10],
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",
]
),
)
daily_return = equity.pct_change().dropna()
annual_return = (equity.iloc[-1] / equity.iloc[0]) ** (trading_days_per_year / len(daily_return)) - 1
annual_volatility = daily_return.std() * (trading_days_per_year ** 0.5)
sharpe = annual_return / annual_volatility if annual_volatility != 0 else None
running_high = equity.cummax()
drawdown = equity / running_high - 1
max_drawdown = drawdown.min()
print(annual_return, annual_volatility, sharpe, max_drawdown)这段代码有三个直觉点。
第一,pct_change 把资金曲线变成每日收益率。
第二,cummax 记录每一天之前见过的最高资金。
第三,drawdown 衡量当前资金离历史高点有多远。
十、指标也要检查可信度
指标漂亮,不等于回测可靠。
你至少要问五个问题。
第一,样本有多长?
只有几十个交易日的年化收益很容易夸张。
第二,交易成本是否扣除?
A 股卖出印花税、佣金、过户费和滑点都会侵蚀收益。
第三,是否避免偷看未来?
用未来信息生成过去信号,所有指标都会变漂亮。
第四,是否经历不同市场环境?
只经历单边上涨的样本,对风险判断不够。
第五,最大回撤发生在什么时候?
如果回撤集中在近期,说明规则可能正在经受压力。
交互实验室
练习:给一条资金曲线做“体检报告”
请阅读下面的假设资金曲线。
| 交易日 | 资金 |
|---|---|
| 第 1 天 | 1.0000 |
| 第 2 天 | 1.0200 |
| 第 3 天 | 1.0100 |
| 第 4 天 | 1.0600 |
| 第 5 天 | 1.0300 |
| 第 6 天 | 1.0800 |
| 第 7 天 | 1.0400 |
| 第 8 天 | 1.1000 |
请完成四个动作。
第一,计算每一天相对前一天的收益率。
第二,找出每一天之前的历史最高资金。
第三,计算每一天的当前回撤。
第四,用一句中文评价:这条曲线更像“平稳上坡”,还是“颠簸上坡”?
如果你会 pandas,可以把这张表录入 Series。
然后用本节代码算出四个指标。
最后把结果写成三句话。
第一句回答收益。
第二句回答颠簸。
第三句回答最难熬的下跌。
可执行小任务
找一份你之前做过的因子分层结果。
不要急着比较哪一层收益最高。
先给每一层补上年化收益、年化波动率、简化夏普和最大回撤。
如果高分层收益更高,但最大回撤也明显更深,请写下原因猜想。
这一步能帮助你从“看收益”升级到“看收益质量”。
核心复盘
知识清单:
- [ ] 我知道年化收益回答“折成一年大概赚多少”,但不回答中途压力。
- [ ] 我知道波动率回答“日常资金有多颠”,需要和收益一起看。
- [ ] 我知道夏普回答“单位波动换来多少收益”,但不能单独决定策略好坏。
- [ ] 我知道最大回撤回答“从历史高点最深跌多少”,最接近执行压力。
- [ ] 我会用 pandas 从资金曲线计算每日收益率、历史高点、回撤和核心指标。
金句总结
一份合格的回测报告,不是炫耀收益数字,而是同时交代速度、颠簸和最难熬的坑。