Skip to content

9.2 关键指标:年化收益、波动率、夏普、最大回撤

课前导读

本节目标

学完能解决什么困惑:看到一份回测报告时,不再只盯着“赚了多少”,而能读懂收益、波动、夏普和最大回撤各自回答什么问题。

适合基础:已经理解最小回测模型、资金曲线、每日收益率和 pandas 基础计算的读者。

难度:intermediate

预计用时:约 40 分钟

如果说 9.1 的回测最小模型是一场模拟考试。

那么本节的关键指标就像体检报告。

体检报告不会只写一句“身体不错”。

它会分别检查体重、血压、心率、血糖和异常风险。

回测报告也不应该只写“年化 30%”。

因为一个策略可能赚得多,但路上颠簸很大。

也可能最终收益一般,却非常平稳。

还可能前半段很好,后半段突然掉进深坑。

所以我们需要一组指标,而不是一个数字。

本节只讲最核心的四个:年化收益、波动率、夏普、最大回撤。

请记住本节主线:每个指标都在回答一个具体问题。


知识正文

一、先把指标当成“体检项目”

新手容易把指标当成排名工具。

看到哪个数字高,就觉得哪个策略好。

这很危险。

体检里血压不是越低越好。

心率不是越高越好。

回测指标也是一样。

年化收益高,不代表容易执行。

波动率低,不代表一定赚钱。

夏普高,也可能来自样本太短或成本漏算。

最大回撤小,也可能因为交易次数太少、样本没有经历困难行情。

关键直觉

指标不是奖杯,而是问题清单。读指标时先问“它回答什么问题”,再问“这个答案可信吗”。

二、每日收益率:所有指标的积木

很多回测指标都从每日收益率开始。

每日收益率的直觉很简单。

今天账户资金相对昨天变化了多少。

公式可以写成:

=

如果昨天资金是 1.0000,今天是 1.0100。

每日收益率就是 1%。

如果今天变成 0.9800。

每日收益率就是 -2%。

资金曲线是一条路。

每日收益率就是路上每一步的坡度。

后面的年化收益、波动率和夏普,都离不开这一步。

三、年化收益:把不同长度的考试折成一年

年化收益回答的问题是:

如果把这段回测表现折算成一年,大约是什么收益水平?

它适合比较不同长度的回测。

例如策略 A 回测 6 个月赚 8%。

策略 B 回测 2 年赚 25%。

直接比较 8% 和 25% 不公平。

年化收益会把它们折成类似“一年成绩单”。

一个常见简化公式是:

()2521

这里的 252 是 A 股一年大致的交易日数量。

这个公式不是魔法。

它只是把一段资金增长按时间长度换算成年度口径。

但年化收益有一个明显缺点。

它不告诉你中间跌过多少。

从 1.00 到 1.20 可以很平稳。

也可以先跌到 0.65 再涨回来。

这两条路的心理压力完全不同。

四、波动率:持有路上有多颠

波动率回答的问题是:

资金曲线每天上下晃动得厉不厉害?

它像坐车时的颠簸程度。

同样从北京到上海,有的车一路平稳。

有的车一路急刹、急转、上下坡。

两者最终都到达目的地,但乘客体验完全不同。

回测里常用每日收益率的标准差来衡量波动。

再乘以一年交易日数量的平方根,得到年化波动率。

简化写法是:

×252

如果一个策略年化收益 20%,年化波动率 40%。

它可能像一辆很快但很晃的车。

如果另一个策略年化收益 12%,年化波动率 10%。

它可能速度慢一些,但更稳。

新手阶段不要把低波动误解成无风险。

它只是说明历史样本里的日常颠簸较小。

黑天鹅、停牌、连续跌停等极端情况,未必能被普通波动率充分描述。

五、夏普:每承受一份颠簸换来多少收益

夏普回答的问题是:

这套规则的收益,和它承受的波动相比,划不划算?

你可以把它想成“单位颠簸换来的回报”。

入门阶段可以先用简化公式:

更正式的写法会减去无风险收益。

为了让新手先理解直觉,本节暂时把无风险收益简化为 0。

如果策略年化收益 15%,年化波动率 15%。

简化夏普约为 1。

如果策略年化收益 15%,年化波动率 30%。

简化夏普约为 0.5。

这说明同样收益下,后者的路更颠。

但夏普也不是万能指标。

它更擅长描述日常波动。

如果策略平时很稳,偶尔发生一次大亏,夏普可能在早期看起来很好。

所以读夏普时必须搭配最大回撤。

六、最大回撤:历史上最难熬的坑

最大回撤回答的问题是:

从历史高点往下掉,最深曾经掉到哪里?

它不是看股票价格从最高到最低。

而是看策略资金曲线从此前最高点下跌的幅度。

简化公式是:

=1

最大回撤就是所有当前回撤中最小的那个数。

例如资金先从 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 计算示例

下面用一条假设资金曲线演示。

数据很短,所以结果只用于理解公式。

不要把短样本数字当成策略结论。

python
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 从资金曲线计算每日收益率、历史高点、回撤和核心指标。

金句总结

一份合格的回测报告,不是炫耀收益数字,而是同时交代速度、颠簸和最难熬的坑。

本文档仅供学习交流用途,不构成任何投资建议。股市有风险,入市需谨慎。