跳到主要内容

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

直觉

光看「赚了多少」不够——同样赚 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{最大回撤}}

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

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

可运行案例:用 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. 卡玛比率的分母是?