跳到主要内容

收益评价指标:夏普、索提诺、卡玛

:::info 学习目标 你将能统一收益频率和无风险利率口径,说明三个比率各自的分母,并用置信区间而非单个点估计比较策略。 :::

直觉

光看「赚了多少」不够——同样赚 10%,平稳赚到坐过山车赚到完全是两回事。评价指标把「收益」和「风险」放在一起称量。本节用全站共用的 quant 引擎,一次性算出三个最常用的风险调整收益指标。

三个核心指标

夏普比率(Sharpe)

SR=E[R]RfσSR = \frac{E[R] - R_f}{\sigma}

收益减无风险利率,除以全部波动。波动越大分母越大、夏普越低。年化乘 252\sqrt{252}

索提诺比率(Sortino)

Sortino=E[R]Rfσ\text{Sortino} = \frac{E[R] - R_f}{\sigma_{\downarrow}}

分母只算下行波动(亏损那部分的波动)——因为上涨的波动是「好的」,不该惩罚。

卡玛比率(Calmar)

Calmar=年化收益(CAGR)最大回撤\text{Calmar} = \frac{\text{年化收益(CAGR)}}{\text{最大回撤}}

分母换成最大回撤,衡量「每承受一单位极端亏损,换来多少年化收益」。

「人话」解释:什么时候用哪个?
  • 夏普:通用基准,对称看待涨跌波动。
  • 索提诺:当收益分布偏斜(跌得猛、涨得缓)时更公道,只惩罚亏损侧。
  • 卡玛:最关注「最惨会亏多少」时用它——它直接用最大回撤当风险。 三者都「越高越好」,但各自的风险定义不同,别直接横比数值。

这些比率都依赖样本长度和收益分布。自相关会让简单的 252\sqrt{252} 年化夏普偏高,肥尾会让正态近似置信区间过窄;最大回撤则对样本起止点非常敏感。比较策略时应同时报告样本区间、频率、成本、无风险利率、置信区间和回撤持续时间。

可运行案例:用 quant 引擎一键算指标

读取 spy_daily.csv,构造「买入持有」的权益与收益序列,调用 quant 的指标函数与 performance_summary

import quant
import numpy as np
import pandas as pd

df = pd.read_csv('/data/spy_daily.csv', parse_dates=['date']).set_index('date')
price = df['adj_close']                 # 用前复权价算总收益
ret = price.pct_change().fillna(0.0)
equity = (1 + ret).cumprod()

print("—— 单项指标(年化) ——")
print(f"年化波动 : {quant.volatility(ret, freq=252):.4f}")
print(f"夏普     : {quant.sharpe(ret, freq=252):.3f}")
print(f"索提诺   : {quant.sortino(ret, freq=252):.3f}")
print(f"最大回撤 : {quant.max_drawdown(equity):.4f}")
print(f"卡玛     : {quant.calmar(equity, ret, freq=252):.3f}")

print("\n—— 一键汇总(performance_summary) ——")
summary = quant.performance_summary(equity, ret, freq=252)
print(summary.round(4))

动手改一改

把价格换成未复权 close(不含分红)再算一次——你会发现各项指标略低,体现「分红对长期总收益」的影响。

小结

  • 夏普 = 超额收益 / 全波动(对称惩罚);
  • 索提诺 = 超额收益 / 下行波动(只惩罚亏损);
  • 卡玛 = 年化收益 / 最大回撤(关注极端亏损);
  • 全站统一用 quant 引擎计算,保证可比较。

小测验

1. 夏普比率的分母是?

2. 索提诺比率相对夏普的区别是?

3. 卡玛比率的分母是?

实践与延伸

  1. 用区块 bootstrap 为夏普构造置信区间,判断两个相近夏普是否真有差异。
  2. 给收益加入自相关,比较普通夏普与自相关修正后的结果。

延伸阅读:Lo(2002)The Statistics of Sharpe Ratios;Bailey 与 López de Prado 的 Probabilistic Sharpe Ratio。