第四节:风险度量指标——夏普比率、索提诺比率、最大回撤、卡玛比率、收益风险比

各位同学,咱们今天聊点实在的。

做套利交易,光看收益率可不行。你赚了50%,但中间回撤了40%,这种策略你敢实盘吗?反正我是不敢。

风险度量指标,说白了就是给策略做“体检”。一套完整的体检报告,能告诉你这个策略到底健不健康,值不值得投钱进去。

4.1 夏普比率:最经典的“性价比”指标

夏普比率,我做了这么多年交易,几乎每个策略报告里都会看到它。它的核心思想很简单:每承担一单位风险,能换来多少超额收益

公式长这样:

Sharpe Ratio = (Rp - Rf) / σp

其中:

  • Rp:策略年化收益率
  • Rf:无风险利率(通常用国债收益率或SHIBOR)
  • σp:策略年化波动率

举个例子你就明白了。假设你的套利策略年化收益15%,无风险利率3%,年化波动率8%。那么夏普比率就是(15%-3%)/8% = 1.5。

经验之谈:

  • 夏普 > 1:策略还不错,值得关注
  • 夏普 > 2:相当优秀,我见过的实盘策略里不多
  • 夏普 > 3:要么是神,要么是数据造假

我的习惯:计算夏普比率时,我一般用日频数据算,再年化。直接用年化数据算容易失真,尤其是套利策略,日间波动和日内波动差别很大。

4.2 索提诺比率:只关心“坏”波动

夏普比率有个问题——它把上涨波动和下跌波动一视同仁。但做交易的人都知道,上涨波动是好事,下跌波动才是风险。

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

Sortino Ratio = (Rp - Rf) / σd

其中σd是下行标准差,只计算收益率低于目标收益率(通常设为0或无风险利率)的部分。

我在项目中遇到过这样的情况:一个策略夏普比率只有0.8,但索提诺比率高达2.5。为什么?因为它大部分时间都在涨,偶尔暴跌一下。这种策略,夏普比率低估了它的真实水平。

注意:索提诺比率越高越好,但也不是越高越安全。我曾经见过一个策略,索提诺比率3.8,结果是因为它几乎不交易,资金闲置了大半年。这种“假稳健”要警惕。

4.3 最大回撤:最让人睡不着觉的指标

最大回撤,英文叫Max Drawdown。说白了就是:从最高点跌到最低点,你最多亏了多少

公式:

Max Drawdown = max(1 - 净值 / 历史最高净值)

举个例子:你的策略净值从1.0涨到1.5,然后跌到1.2,再涨到1.8。那么最大回撤就是(1.5-1.2)/1.5 = 20%。

嗯,这里要注意:最大回撤只看历史,不代表未来。但它是衡量策略“抗揍能力”最直观的指标。

我的经验:

  • 套利策略,最大回撤控制在5%以内算合格
  • 超过10%就要反思策略逻辑了
  • 超过20%?建议直接放弃,别浪费时间

4.4 卡玛比率:收益与回撤的“性价比”

卡玛比率,Calmar Ratio,是夏普比率的“兄弟”。它用最大回撤代替了波动率:

Calmar Ratio = 年化收益率 / 最大回撤

为什么我喜欢用卡玛比率?因为它更直观。你想想看,夏普比率告诉你每单位波动能赚多少,但波动这东西太抽象了。卡玛比率直接告诉你:你冒了最大回撤的风险,能换来多少收益

比如年化收益20%,最大回撤5%,卡玛比率就是4。这个数字,你一眼就能看出策略的“性价比”。

避坑指南:我曾经用过一个策略,卡玛比率高达6,但实盘一个月就亏了8%。为什么?因为它的最大回撤是在回测早期发生的,后期策略参数变了,回撤数据已经过时了。所以,卡玛比率要结合回撤发生的时间段一起看

4.5 收益风险比:最朴素的衡量

收益风险比,也叫盈亏比。公式简单到不能再简单:

收益风险比 = 平均盈利 / 平均亏损

比如你的策略平均每笔盈利5000元,平均每笔亏损2000元,那么收益风险比就是2.5。

这个指标,我建议和胜率一起看。胜率高但收益风险比低,说明你赚的都是小钱,亏一次就回到解放前。胜率低但收益风险比高,说明你靠几次大赚覆盖多次小亏。

我的建议:套利交易,收益风险比至少要做到2以上。低于1.5的策略,长期来看很难赚钱。

4.6 实战:用Python计算这些指标

光说不练假把式。下面我写一段代码,把这些指标一次性算出来:

import numpy as np
import pandas as pd

def calculate_risk_metrics(returns, rf=0.03, periods_per_year=252):
    """
    计算风险度量指标
    returns: 日收益率序列
    rf: 无风险利率(年化)
    periods_per_year: 年化周期数,日频用252
    """
    # 年化收益率
    annual_return = np.mean(returns) * periods_per_year
    
    # 年化波动率
    annual_vol = np.std(returns) * np.sqrt(periods_per_year)
    
    # 夏普比率
    sharpe = (annual_return - rf) / annual_vol
    
    # 索提诺比率
    downside_returns = returns[returns < 0]
    downside_vol = np.std(downside_returns) * np.sqrt(periods_per_year)
    sortino = (annual_return - rf) / downside_vol if downside_vol != 0 else np.nan
    
    # 最大回撤
    cumulative = (1 + returns).cumprod()
    running_max = cumulative.cummax()
    drawdown = (cumulative - running_max) / running_max
    max_drawdown = drawdown.min()
    
    # 卡玛比率
    calmar = annual_return / abs(max_drawdown) if max_drawdown != 0 else np.nan
    
    # 收益风险比
    avg_gain = returns[returns > 0].mean()
    avg_loss = abs(returns[returns < 0].mean())
    profit_loss_ratio = avg_gain / avg_loss if avg_loss != 0 else np.nan
    
    return {
        '年化收益率': f'{annual_return:.2%}',
        '年化波动率': f'{annual_vol:.2%}',
        '夏普比率': f'{sharpe:.2f}',
        '索提诺比率': f'{sortino:.2f}',
        '最大回撤': f'{max_drawdown:.2%}',
        '卡玛比率': f'{calmar:.2f}',
        '收益风险比': f'{profit_loss_ratio:.2f}'
    }

# 示例用法
np.random.seed(42)
sample_returns = np.random.normal(0.001, 0.02, 500)  # 模拟500个交易日
metrics = calculate_risk_metrics(sample_returns)
for k, v in metrics.items():
    print(f'{k}: {v}')

这段代码我用了好几年,基本没改过。你直接复制到自己的策略回测框架里就能用。

4.7 指标解读:别只看数字

指标算出来了,怎么解读?我总结了几条经验:

指标 优秀 合格 危险
夏普比率 > 2.0 1.0 - 2.0 < 1.0
索提诺比率 > 3.0 1.5 - 3.0 < 1.5
最大回撤 < 5% 5% - 10% > 15%
卡玛比率 > 3.0 1.5 - 3.0 < 1.5
收益风险比 > 3.0 2.0 - 3.0 < 2.0

重要提醒:这些阈值不是绝对的。不同品种、不同频率的策略,标准差别很大。比如高频套利,最大回撤控制在1%以内都很正常。而跨品种套利,回撤5%可能已经算优秀了。

4.8 知识体系图

下面这张图,把今天讲的内容串起来了:

风险度量指标体系 风险度量指标 夏普比率 收益/总波动 索提诺比率 收益/下行波动 最大回撤 最大亏损幅度 卡玛比率 收益/最大回撤 收益风险比 平均盈利/平均亏损

这张图你看懂了吗?四个核心指标从不同角度衡量风险,收益风险比则是最终的“体检结论”。

最后说一句:指标只是工具,不是真理。我见过夏普比率1.2的策略实盘赚了大钱,也见过夏普比率2.5的策略亏得底朝天。关键还是看你对策略逻辑的理解有多深。


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