4. 风险调整收益指标(上):夏普比率、信息比率、索提诺比率

做量化投资,最怕什么?

怕赚了指数不赚钱,更怕赚了钱却承担了不该承担的风险。

我刚开始做因子策略那会儿,看着回测曲线漂亮得不行,年化收益30%+,心里美滋滋。结果一算夏普比率,才0.6。嗯,说白了就是拿命在换收益。后来我养成了一个习惯——先看风险调整收益,再看绝对收益。今天咱们就来聊聊这三个最常用的指标。

核心逻辑一句话:收益是表象,风险是本质。风险调整收益,就是帮你把「收益」和「风险」放在同一杆秤上称一称。

4.1 夏普比率:最经典的「性价比」指标

夏普比率,量化圈里没人不知道它。它的公式很简单:

夏普比率 = (策略年化收益率 - 无风险利率) / 年化波动率

说白了,就是每承担一单位风险,能换来多少超额收益。

我个人习惯把夏普比率理解成「投资的性价比」。 你想想看,两个策略年化收益都是20%,一个波动率10%,一个波动率30%,你会选哪个?当然是前者。夏普比率帮你把这个直觉量化了。

实际应用中的几个坑

  • 无风险利率怎么选? 国内一般用一年期国债收益率,或者SHIBOR 3M。我见过有人用0,那算出来的夏普比率虚高,没啥参考价值。
  • 年化波动率怎么算? 日度数据的话,先算日波动率,再乘以根号252。注意,这里用的是对数收益率,不是简单收益率。
  • 夏普比率多高算好? 我个人经验:大于1算及格,大于2算优秀,大于3……嗯,你要小心是不是过拟合了。

避坑指南: 我曾经遇到一个策略,夏普比率高达2.8,结果仔细一看,它大部分收益来自某一个月的大行情。去掉那个月,夏普直接掉到0.6。所以,一定要看滚动夏普比率,别被整体数字骗了。

4.2 信息比率:衡量「主动管理」能力的标尺

信息比率和夏普比率长得很像,但有个关键区别——它衡量的是相对于基准的超额收益

信息比率 = (策略收益率 - 基准收益率) / 跟踪误差

这里的「跟踪误差」,就是策略与基准之间收益率差值的标准差。

信息比率告诉你:你跑赢基准的那部分收益,是不是靠运气? 如果信息比率高,说明你确实有选股/择时的能力;如果低,那可能只是随波逐流。

信息比率 vs 夏普比率

维度 夏普比率 信息比率
分母 总风险(波动率) 主动风险(跟踪误差)
分子 超额收益(相对无风险) 超额收益(相对基准)
适用场景 绝对收益策略 相对收益策略(如指数增强)
理想值 > 1 > 0.5

我在做多因子选股策略时,特别喜欢用信息比率。因为我们的目标是跑赢沪深300,不是追求绝对收益。信息比率能告诉我:我构建的因子组合,到底有没有真正的alpha能力。

注意: 信息比率对基准选择非常敏感。你换个基准,结果可能天差地别。我建议同时用多个基准做敏感性分析,别只盯着一个数字。

4.3 索提诺比率:只惩罚「坏」波动

夏普比率有个天然缺陷——它把上行波动和下行波动一视同仁。但你想啊,涨得多难道不是好事吗?为什么要惩罚它?

索提诺比率就是来解决这个问题的。它只考虑下行波动(即亏损时的波动),公式如下:

索提诺比率 = (策略年化收益率 - 无风险利率) / 下行标准差

下行标准差怎么算?只取收益率低于某个目标值(通常是0或无风险利率)的数据,计算它们的标准差。

说白了,索提诺比率更符合人性。 投资者怕亏钱,不怕赚钱。你波动大但都是往上涨,那没问题;你波动大但经常暴跌,那才是真风险。

一个真实案例

我记得有个CTA策略,夏普比率只有0.8,看起来一般。但它的索提诺比率高达2.1。为什么?因为这个策略大部分时间在横盘或小亏,但一旦趋势来了就猛赚。下行波动很小,上行波动很大。这种策略,用夏普比率衡量就吃亏了。

所以我的建议是:两个指标一起看。如果夏普和索提诺差距很大,说明策略的收益分布不对称,可能藏着一些尾部风险。

总结一下三个指标的关系:

  • 夏普比率:全面衡量「收益/总风险」
  • 信息比率:衡量「主动收益/主动风险」
  • 索提诺比率:衡量「收益/下行风险」

三者互补,缺一不可。

4.4 知识体系图:风险调整收益指标全景

下面这张图帮你理清这三个指标的核心逻辑:

风险调整收益指标全景图 风险调整收益 夏普比率 收益 / 总波动 信息比率 主动收益 / 跟踪误差 索提诺比率 收益 / 下行波动 如何选择? • 绝对收益策略 → 优先看夏普比率 • 指数增强/相对收益 → 优先看信息比率 • 尾部风险敏感/非对称收益 → 优先看索提诺比率

4.5 实战代码:一键计算三个指标

光说不练假把式。下面这段Python代码,输入策略收益率序列和基准收益率序列,就能同时算出三个指标:

import numpy as np
import pandas as pd

def risk_adjusted_metrics(strategy_returns, benchmark_returns=None, rf=0.03, periods_per_year=252):
    """
    计算夏普比率、信息比率、索提诺比率
    
    参数:
        strategy_returns: 策略日收益率序列
        benchmark_returns: 基准日收益率序列(计算信息比率时需要)
        rf: 无风险利率(年化)
        periods_per_year: 年化周期数(日度数据用252)
    """
    # 年化收益率
    ann_return = (1 + strategy_returns.mean()) ** periods_per_year - 1
    
    # 年化波动率
    ann_vol = strategy_returns.std() * np.sqrt(periods_per_year)
    
    # 夏普比率
    sharpe = (ann_return - rf) / ann_vol
    
    # 索提诺比率
    downside_returns = strategy_returns[strategy_returns < 0]
    downside_std = downside_returns.std() * np.sqrt(periods_per_year)
    sortino = (ann_return - rf) / downside_std if downside_std != 0 else np.nan
    
    # 信息比率(需要基准数据)
    if benchmark_returns is not None:
        excess_returns = strategy_returns - benchmark_returns
        ann_excess = (1 + excess_returns.mean()) ** periods_per_year - 1
        tracking_error = excess_returns.std() * np.sqrt(periods_per_year)
        info_ratio = ann_excess / tracking_error if tracking_error != 0 else np.nan
    else:
        info_ratio = np.nan
    
    return {
        '夏普比率': round(sharpe, 4),
        '索提诺比率': round(sortino, 4),
        '信息比率': round(info_ratio, 4)
    }

# 示例用法
# metrics = risk_adjusted_metrics(strat_ret, bench_ret)
# print(metrics)

使用建议: 我习惯在回测报告中同时展示这三个指标,并加上滚动窗口(比如60天滚动)的时序图。这样既能看整体水平,又能看稳定性。如果一个策略的夏普比率忽高忽低,那它的可靠性就要打个问号。

好了,这一章的内容就到这儿。三个指标各有侧重,结合起来用才能全面评估一个策略的真实水平。下一章咱们继续聊剩下的风险调整指标——卡玛比率、斯特林比率,还有那个让人又爱又恨的最大回撤。


公众号:蓝海资料掘金营,微信deep3321