风险度量指标:量化投资的“体检报告”

做量化投资这些年,我越来越觉得,风险度量就像是给投资组合做体检。你光看收益高不高,就像只看体重秤上的数字——瘦不一定健康,胖也不一定有问题。真正重要的是那些藏在背后的指标。

今天咱们就来聊聊六个核心风险指标:波动率、最大回撤、夏普比率、索提诺比率、VaR和CVaR。嗯,这六个指标,基本覆盖了风险度量的方方面面。

核心观点:风险不是用来躲避的,而是用来理解和管理的。每个指标都像一面镜子,照出组合的不同侧面。

风险度量指标体系 波动率 最大回撤 夏普比率 索提诺比率 VaR CVaR 波动率 → 基础风险度量 最大回撤 → 极端风险度量 夏普/索提诺 → 风险调整收益 VaR/CVaR → 尾部风险度量

1. 波动率:最基础的风险度量

波动率,说白了就是资产价格上蹿下跳的幅度。我习惯用年化波动率来衡量,公式很简单:

年化波动率 = 日收益率标准差 × √252

为什么是252?因为一年大概有252个交易日。这个指标告诉你:你的组合一年下来,大概会波动多少。

我的经验:波动率不是越低越好。我在做CTA策略时发现,有些低波动率的品种,一旦爆发起来,回撤惊人。波动率更像是一个“温度计”,告诉你市场情绪有多热。

2. 最大回撤:投资者的“心理底线”

最大回撤,就是从最高点到最低点的跌幅。这个指标我特别看重,因为它直接关系到你能不能拿住仓位。

举个例子:

净值从1.0涨到1.5,然后跌到1.2
最大回撤 = (1.5 - 1.2) / 1.5 = 20%

我曾经见过一个策略,年化收益30%,但最大回撤达到40%。说实话,这种策略我一般不会实盘。为什么?因为回撤超过30%的时候,大部分投资者已经扛不住了。

避坑指南:我曾经犯过一个错误——只看最大回撤的数值,没看回撤持续的时间。一个20%的回撤如果持续半年,比一个30%但只持续两周的回撤更可怕。时间维度一定要考虑进去。

3. 夏普比率:收益与风险的“性价比”

夏普比率衡量的是:每承担一单位风险,能获得多少超额收益。公式:

夏普比率 = (组合收益率 - 无风险利率) / 波动率

我个人习惯用1.0作为分水岭。夏普比率大于1.0,说明策略不错;大于2.0,那就是顶级策略了。

但这里有个坑——夏普比率对正态分布假设很敏感。你想想看,如果收益分布是尖峰厚尾的,夏普比率就会失真。这也是为什么我们需要索提诺比率。

4. 索提诺比率:只惩罚“坏”波动

索提诺比率和夏普比率很像,但有一个关键区别:它只考虑下行波动率。

索提诺比率 = (组合收益率 - 无风险利率) / 下行波动率

说白了,上涨的波动是好事,为什么要惩罚它?索提诺比率只关注下跌时的波动,更符合实际投资心理。

实战建议:我在做多因子模型时,会同时看夏普和索提诺。如果两者差距很大,说明策略的收益主要来自“捡烟蒂”式的上涨,而不是稳健的复利增长。这时候就要小心了。

5. VaR:在险价值

VaR回答的问题是:在95%或99%的置信水平下,我的组合最多会亏多少钱?

举个例子:

95% VaR = -2.5%
含义:有95%的把握,组合日亏损不超过2.5%

计算VaR有三种常用方法:

  • 参数法:假设收益服从正态分布,直接用均值和标准差算
  • 历史模拟法:用过去的数据直接排序,取分位数
  • 蒙特卡洛模拟:随机生成大量路径,统计亏损分布

我个人最常用历史模拟法,因为它不需要假设分布形态。但要注意,历史不会简单重复——2008年金融危机之前,VaR模型基本都失效了。

6. CVaR:条件在险价值

CVaR是VaR的升级版。VaR只告诉你“最多亏多少”,但没告诉你“如果亏超了,平均亏多少”。CVaR补上了这个缺口。

CVaR = 超过VaR部分的平均亏损

举个例子:

95% VaR = -2.5%
95% CVaR = -3.8%
含义:在最坏的5%情况下,平均亏损是3.8%

我的习惯:做风控时,我主要看CVaR而不是VaR。因为VaR可能会低估尾部风险,而CVaR能更真实地反映极端情况下的损失。记得有一次,一个策略的VaR看起来没问题,但CVaR已经接近风控红线了——果断减仓,后来果然躲过一劫。

实战:用Python计算这些指标

说了这么多,咱们来点实际的。下面是我常用的计算代码:

import numpy as np
import pandas as pd

def calculate_risk_metrics(returns, risk_free_rate=0.03):
    """
    计算全套风险指标
    returns: 日收益率序列
    risk_free_rate: 年化无风险利率
    """
    # 年化波动率
    annual_vol = np.std(returns) * np.sqrt(252)
    
    # 最大回撤
    cum_returns = (1 + returns).cumprod()
    running_max = cum_returns.cummax()
    drawdown = (cum_returns - running_max) / running_max
    max_drawdown = drawdown.min()
    
    # 年化收益率
    annual_return = (1 + returns).prod() ** (252/len(returns)) - 1
    
    # 夏普比率
    sharpe = (annual_return - risk_free_rate) / annual_vol
    
    # 索提诺比率
    downside_returns = returns[returns < 0]
    downside_vol = np.std(downside_returns) * np.sqrt(252)
    sortino = (annual_return - risk_free_rate) / downside_vol if downside_vol != 0 else np.nan
    
    # VaR (95%置信水平)
    var_95 = np.percentile(returns, 5)
    
    # CVaR (95%置信水平)
    cvar_95 = returns[returns <= var_95].mean()
    
    return {
        '年化波动率': annual_vol,
        '最大回撤': max_drawdown,
        '夏普比率': sharpe,
        '索提诺比率': sortino,
        'VaR(95%)': var_95,
        'CVaR(95%)': cvar_95
    }

# 使用示例
# 假设你有日收益率数据
# metrics = calculate_risk_metrics(your_returns)
# print(metrics)

注意:这段代码假设收益率是日频数据。如果是周频或月频,记得调整年化因子(周频用52,月频用12)。

指标对比一览

指标 衡量什么 优点 缺点
波动率 整体波动幅度 计算简单,通用性强 不区分涨跌
最大回撤 极端下跌幅度 直观易懂 忽略回撤时长
夏普比率 风险调整后收益 标准化比较 假设正态分布
索提诺比率 下行风险调整收益 更符合实际 计算稍复杂
VaR 最大可能亏损 风险量化 忽略尾部风险
CVaR 尾部平均亏损 更全面 计算量较大

嗯,这六个指标,基本够用了。我个人习惯是:日常监控看波动率和最大回撤,策略评估看夏普和索提诺,风控红线看VaR和CVaR。每个指标都有自己的位置,组合起来用,才能看清风险的全貌。

专注资料整理