跳过正文
  1. Posts/

夏普比率到底衡量了什么?

目录

上一篇《风险也不是一个数字》的结尾留了一句:收益和风险都拆成了一组指标,但一项投资还是没法只看其中一边,下一篇写夏普比率,以及"风险调整后收益"到底调整了什么。这篇来还这笔账。

夏普比率是我在量化行业做 ML Infra 这几年绕不开的一个词。晨会、月报、策略评审里都会出现,但我对它的把握一直是一句不知道从哪听来的话:收益除以风险。准备基金从业资格考试这段时间,我第一次把公式逐项拆开,才发现这句话省掉了两个关键选择——分子为什么要先减去无风险收益率,分母为什么是波动率。这两个选择决定了它能回答什么问题,也决定了它在什么地方会误导人。

收益更高,所以更好吗
#

先看两个简化到只剩数字的策略。为了把注意力放在比较上,先假设这段时间的无风险收益率近似为 0,收益和超额收益暂时是同一个数:

  • 策略 A:年化收益 10%,年化波动率 5%;
  • 策略 B:年化收益 15%,年化波动率 15%。

B 多赚了 5 个百分点,代价是波动率变成 A 的三倍。多出来的这部分收益,是策略本身更有效率,还是仅仅因为承担了更多风险?只看收益率,这个问题没有答案。

做系统监控时我遇到过一个结构一样的困惑。一个服务每秒处理 2000 个请求,但吃掉 8 个核;另一个每秒处理 1000 个请求,只吃 2 个核。只看吞吐量,第一个赢;如果关心的是每个核能产出多少请求,结论会反过来。投资也需要一个类似的"单位代价换多少产出"的度量,把收益和获取收益过程中的颠簸放进同一个比值。

类比到这里就停下。系统的资源消耗可测、可加,金融里的"风险"没有这么干净的定义。这个差别会影响后面每一节。

夏普比率的公式在做什么
#

夏普比率的标准定义是

$$ S = \frac{\mathbb{E}[R_p - R_f]}{\sigma(R_p - R_f)} $$

\( R_p \) 是策略或投资组合的收益率;\( R_f \) 是无风险收益率,必须和 \( R_p \) 处在同一个统计周期、同一种货币下;\( R_p - R_f \) 是超额收益;\( \mathbb{E}[\cdot] \) 是期望,回答"平均而言能拿到多少超额收益";\( \sigma(\cdot) \) 是标准差,衡量超额收益的波动。比值 \( S \) 就是每承担一单位波动,平均对应的超额收益。

更常见的写法是简化版:

$$ S = \frac{R_p - R_f}{\sigma_p} $$

它把期望换成了历史样本均值,又用收益本身的标准差 \( \sigma_p \) 代替超额收益的标准差。第二步成立的条件是无风险收益率在样本窗口里近似不变——常数减来减去不影响标准差。如果 \( R_f \) 本身也在变,两个标准差就不严格相等,这一点在日频数据里偶尔会冒出来。

这个公式里藏着两个选择,它们在写法上几乎看不见:

  • 分子用的是超额收益,不是全部收益;
  • 分母把波动率当成了风险的代理。

下面两节分别说这两个选择。它们决定了夏普比率是什么,也决定了它不是什么。

分子为什么不是全部收益
#

把总收益放进分子,等于把一份"不承担波动也能拿到"的回报,算成了策略的功劳。

一个粗略的类比:比较两份工作不能只看工资总额,如果其中一份包含大量额外工时和额外责任,真正该比较的是"超出正常工作量那部分换来的补偿"。投资里的无风险收益率就是那条基线——如果一个几乎不承担波动的方式也能拿到 2%,那么只有超过 2% 的部分,才是承担波动换来的回报。

用数字过一遍。一个策略年化收益 8%,年化波动率 5%,同期无风险收益率 2%:

  • 不扣基线:\( 8\% / 5\% = 1.6 \);
  • 扣掉基线:\( (8\% - 2\%) / 5\% = 1.2 \)。

差的 0.4 全部来自那 2 个百分点。换个无风险利率更高的环境,两种算法的距离还会拉大。

“无风险"这个词要打个引号。它是金融模型里的近似概念,不代表现实世界存在绝对没有风险的资产。短期国债、回购利率这些常被当作近似基准,它们也有再投资、流动性上的细节,只是相对股票、期货的波动小到可以当常数用。

匹配规则只有一条:无风险收益率必须和收益同期限、同币种。用日收益去减年化无风险收益率是错的,得先把无风险利率换算到日;人民币资产配美元利率也是错的。实际计算用哪个利率当 \( R_f \) 会改变夏普的绝对值,比较两份报告的数字之前,先确认它们减的是同一个东西。

分母为什么是波动率
#

上一篇《风险也不是一个数字》把波动率拆开过:它是收益偏离均值的程度,离差平方、平均、再开根号。金融里选它来当风险的分母,理由挺实际:

  • 定义干净,就是一个标准差,没有需要拍脑袋的参数;
  • 可以从历史收益序列直接估计;
  • 同一频率、同一窗口下,不同策略之间可以横向比较;
  • 和均值—方差框架天然衔接,组合方差能按权重和协方差分解,所以它也是组合优化里的常客。

但波动率在定义的时候就把两件事丢掉了。上涨和下跌在公式里没有区别,一期 +5% 和一期 -5% 对标准差的贡献一模一样。它也不看顺序和分布形状:慢慢阴跌两年和一次跳水,只要每期收益的离散程度相同,波动率就相同;尾部有多厚、最大回撤有多深、亏损的概率有多大,它都不回答。

这两个丢失是建模选择,不是疏忽。类似的取舍在模型指标里也常见:一个指标怎么解释,取决于它一开始选了什么 loss 或 proxy。波动率之于风险,和交叉熵之于"模型回答得好不好"是同一类操作——把一个不好直接度量的东西换成可以计算的代理。代理好用,不等于它等价于目标。

用波动率做分母是一个建模选择,不是数学上的必然。 换一个风险代理,就会得到另一个指标:比如只把低于目标的波动算作风险,分母变成下行偏差,得到的就是 Sortino Ratio。

2 和 1:这个数字怎么读
#

回到开头的两个策略,这次把数字列全:

策略年化超额收益年化波动率夏普比率
A10%5%2
B15%15%1

从表里能读出三句话:B 的收益更高;A 每承担一单位波动换来的超额收益更多,是 B 的两倍;按夏普的口径,A 的风险调整后收益效率更高。

但这三句话推导不出"A 一定比 B 好”。如果目标就是尽量高的绝对收益,而且能扛住 15% 的波动,B 完全可能是更合适的选择。夏普回答的是效率问题,不负责替你选。

还有一个经常被写错的地方:夏普比率没有单位,也没有百分号。分子分母都是收益率,单位约掉,剩下一个比值,写成"夏普 2%“是错的。

网上流传着"夏普大于 1 就好、大于 2 就优秀"之类的口诀。这些数字在我这里只能当量级参考:不同资产类别、不同策略类型、不同样本区间能出现的夏普范围差得很远;同一个策略,日频和月频、扣费和不扣费,数字也会变。抽掉这些前提,阈值就不剩什么了。

日频夏普为什么要乘 √N
#

用日频数据直接算出来的夏普通常很小,0.1 上下很常见,和月报里的数字对不上。原因不复杂:分子是单期超额收益,分母是单期波动,比值本身带着频率。行业习惯把它换算到一年,方便比较。

上一篇讲波动率年化时用过 \( \sigma_{ann} = \sigma_{period}\sqrt{T} \)。夏普的年化是同一件事换了个位置。如果各期收益近似独立同分布,N 期的平均超额收益大致按 N 倍累积,标准差按 \( \sqrt{N} \) 倍累积,两者相除:

$$ S_{ann} \approx S_{period}\sqrt{N} $$

日频 N 取 252 左右(一年的交易日数量),月频 N 取 12。比如月频夏普 0.5,年化约 \( 0.5 \times \sqrt{12} \approx 1.73 \)。这不是说未来一年一定能有 1.73 的夏普,只是把同一个数字换到"一年"这把尺子上。

换算成立需要几个假设:各期收益近似独立、分布相对稳定、没有明显自相关,而且无风险收益率的口径和频率一致。前面说过日收益不能直接减去年化无风险收益率,年化这一步同样不能混用频率。

真实数据会违反假设。高频策略的收益常有自相关,平滑估值出来的序列更明显;同一段业绩,日频年化、周频年化、直接用年度收益算,三个数可以都不一样。所以看到夏普,先问四件事:区间多长、什么频率、无风险利率用什么、年化方法是什么。这四件事没对齐,两个数字就没有可比性。

还有一个容易混的地方:这里的平均是各期超额收益的算术平均,不是复合增长率。第一篇算过,波动越大,几何平均和算术平均的距离越大;夏普的分子站在算术平均这边,所以它和投资者实际拿到的复合收益之间还隔着波动拖累。

加杠杆改变不了的事情
#

做一个理想实验:假设可以按无风险利率借到钱,把某个策略的风险头寸整体放大 k 倍。组合变成 k 份风险资产加 \( 1-k \) 份无风险资产,超额收益放大为原来的 k 倍,波动率也放大为原来的 k 倍。代入夏普:

$$ \frac{k(R_p - R_f)}{k\sigma_p} = \frac{R_p - R_f}{\sigma_p} $$

分子分母同时乘以 k,比值不变。用数字看:一个超额收益 6%、波动率 4% 的策略,夏普 1.5;两倍杠杆之后超额收益 12%、波动率 8%,夏普还是 1.5。

杠杆放大的是收益和风险的量级,不是单位风险对应的收益效率。 想提高夏普,只能去改分子分母里"效率"本身,借钱做不到。

现实里要补几句。融资利率通常高于无风险利率,借钱这件事本身就压低收入;杠杆放大波动之后,保证金追缴和强制平仓会先于最终收益出现,路径上的爆仓风险和最终收益不是等比例缩放的;交易成本、滑点、市场冲击不会按头寸规模老实线性增长,仓位越大越差;容量和流动性也有限制,很多策略能装下的资金远小于理论值。这些是把公式搬进现实时被拿掉的部分,不是杠杆操作建议。

高夏普里的隐藏损失
#

前面默认了收益分布比较"正常”。换一个不正常的:一个策略的月度收益序列,前 11 个月每个月 +0.5%,第 12 个月 -20%。

只看前 11 个月,每月收益完全一样,波动率是 0。夏普比率的分母不存在——它在这里不是很高,而是没有定义。现实中收益不会精确地每月相同,只要在 +0.4% 到 +0.6% 之间小幅波动,波动率就是一个很小的数,年化夏普轻松被抬到两位数。在尾部事件发生之前,基于历史数据的夏普看不出任何危险。

把第 12 个月补上,整段 12 个月算下来:

  • 期末净值 84.51,累计收益 -15.49%;
  • 月均收益 -1.208%,年化 -14.5%;
  • 月度样本标准差 5.918%(除以 n-1),按 \( \sqrt{12} \) 年化约 20.5%;换成总体标准差口径是年化 19.6%,夏普从 -0.71 变成 -0.74,不改变结论;
  • 夏普比率约 -0.71。

同一段业绩,窗口截在崩盘前是一个没有定义的高夏普,截满 12 个月是负夏普加两位数的年化波动。结论由窗口的位置决定。

这种"平时赚小钱、偶尔赔大钱"的收益形状,统计上叫负偏度和厚尾。它赚的其实是卖保险的钱——大部分时间收保费,小概率赔付一次大的。“在压路机前捡硬币"是对这类策略的常见描述,硬币是真的,只是赔付发生在尾部。波动率看不见尾部:它只度量离差的大小和频率,不看方向,也不看极端程度。夏普比率继承了这一点。

三个策略的净值路径:A、B 按各自年化均值和波动率构造,C 为前 11 个月 +0.5%、最后一个月 -20% 的月度序列

图里 A、B 两条路径由各自的年化均值和波动率构造,C 就是上面那组月度收益。构造序列的累计收益和算术平均会差一点,第一篇算过的波动拖累在这里同样存在。三条线放在一起:C 在前 11 个月最平,最后一个月把前面的积累一次抹掉还倒亏;A 的终点低于 B,但路径平缓得多。最终收益、收益路径、波动率、尾部损失,四个东西并不等价。

历史夏普被抬高,通常不是有人故意作假,而是这些情况:

  • 样本窗口太短,还没覆盖完整市场环境,比如一条没经历过熊市的净值曲线;
  • 低流动性资产用滞后或平滑的估值,账面波动被抹平,真卖的时候不是这个价;
  • 收益序列存在自相关(平滑估值也会带来),年化时被 \( \sqrt{N} \) 放大;
  • 策略的尾部风险还没发生过;
  • 回测没扣交易成本、滑点和市场冲击;
  • 展示时只挑了表现最好的时间窗口。

它们的共同点:损失真实存在,但没有进入历史收益序列,或者进入的方式被处理得很温和。夏普比率只能看到进入分子和分母的信息,被波动率遗漏的风险,也会被夏普比率遗漏。

历史夏普也只是一个估计值
#

前面一直在用的"年化超额收益"和"年化波动率”,在现实里都不是已知常数,而是从一段历史样本里估出来的两个统计量。分子分母都带估计误差,比值自然带。

样本越短、收益噪声越大,估计越不稳。一年的日频数据只有 252 个左右的观测,用它估出来的夏普和"策略真实的夏普"之间的差距可能不小;两份报告上 2.1 和 1.9 的差别,很可能只是抽样波动,而不是策略质量差了 10%。样本拉长到几年会稳一些,但前提是策略本身没有变化。

这件事和机器学习里的验证很像。一个模型在有限验证集上算出的指标,是对真实性能的估计,不是真实性能本身;验证集上 0.1 的提升,换个随机种子可能就消失了。历史夏普也是同一回事:计算过程可以精确到小数点后很多位,但精度属于算术,准确度属于估计。

对历史夏普,合适的用法是把它当证据之一,而不是结论。

换一个分母,就换了一种风险定义
#

夏普比率不是孤立的。把它的零件换掉,能得到一串亲戚,它们之间的差别主要不在计算技巧,而在"把什么当成代价":

  • Sortino Ratio:分母换成下行偏差,只惩罚低于目标的那部分波动。上一篇提过它的动机——不想把上涨也算成成本。
  • Information Ratio:分子换成相对基准的主动收益,分母换成跟踪误差,也就是主动收益的标准差。它衡量"主动偏离基准"的效率,评价指数增强或相对收益产品时比夏普更贴切。
  • 最大回撤:不是比率,描述一段历史里从高点跌下去最惨的一截,和波动率回答的问题完全不同。
  • Calmar Ratio:用收益除以最大回撤,把"赚了多少"和"路径上最痛的跌幅"放进同一个数。

这些指标谁也替代不了谁。选哪个分母,取决于更怕哪种失败方式:怕过程颠簸用波动率,怕跌下去回不来用回撤,怕跑输基准用跟踪误差。换一个分母,就换了一种对风险的定义。

真正值得记住的几件事
#

  • 夏普比率衡量的是每承担一单位波动换来的超额收益,是一个风险调整后的效率指标,不是策略质量的总分。
  • 分子减去无风险收益率,扣掉的是"不承担这些波动也能拿到的基线回报";无风险收益率必须和收益同期限、同币种。
  • 分母用波动率是一个建模选择:上涨和下跌在公式里没有区别,方向、尾部、回撤都在它视野之外;换一个风险代理,就得到另一个指标。
  • 统一口径是夏普可比性的来源,也是它压缩信息的地方;比较之前先确认时间区间、频率、无风险利率和年化方法一致。
  • 理想条件下,把策略整体加 k 倍杠杆,超额收益和波动率同时变成 k 倍,夏普不变;杠杆放大的是量级,不是单位风险的效率。
  • 高历史夏普可以和尾部风险共存:平时收小钱、偶尔赔大钱的策略,在赔付发生之前,波动率和夏普都看不出危险。
  • 历史夏普是有限样本上的估计值,样本越短越不稳;两个数字的细微差别未必有实际意义。
  • 计算精度不等于估计精度:一个精确算出来的历史夏普,仍然只是对策略能力的一个带误差的估计。

夏普比率和这些风险调整指标,都是沿着收益路径评价一个策略。下一篇换一个视角,从公司本身出发,聊股票估值里最常见、也最容易被误解的指标:市盈率。

参考资料
#

  • William F. Sharpe, “Mutual Fund Performance”, The Journal of Business, 1966
  • William F. Sharpe, “The Sharpe Ratio”, The Journal of Portfolio Management, 1994
  • Andrew W. Lo, “The Statistics of Sharpe Ratios”, Financial Analysts Journal, 2002
  • David H. Bailey, Marcos López de Prado, “The Deflated Sharpe Ratio”, The Journal of Portfolio Management, 2014

相关文章