市场风险识别:系统性风险与因子暴露分析

做量化策略这么多年,我越来越觉得市场风险识别是策略的「体检报告」。你想想看,策略赚不赚钱是一回事,但能不能扛住系统性冲击,那才是生死线。今天我们就聊聊怎么识别这些风险。

系统性风险的三大来源

系统性风险,说白了就是「你躲不开的风险」。它不是某只股票暴雷,而是整个市场都在跌。我个人习惯把系统性风险分成三类:利率、汇率、商品价格。

1. 利率风险

利率是资金的「价格」。央行一加息,债券价格就跌,股票估值也会被压缩。我在项目中遇到过这样的情况:2022年美联储连续加息,我们一个固收+策略的净值回撤超过5%。原因很简单——久期暴露太大了。

关键指标:久期(Duration)、凸性(Convexity)、利率期限结构斜率

怎么量化?我一般用DV01(基点价值)来衡量。举个例子:

# 计算组合的DV01
def calculate_dv01(portfolio, yield_shift=0.0001):
    """
    计算组合的基点价值
    yield_shift: 利率变动1bp
    """
    base_value = portfolio.current_value()
    shifted_value = portfolio.shift_yield(yield_shift)
    dv01 = (shifted_value - base_value) / yield_shift
    return dv01

2. 汇率风险

做跨境策略的朋友,这个必须盯紧。我记得有一次,我们做港股通策略,人民币突然升值2%,结果组合净值直接缩水。嗯,这里要注意:汇率风险不只是外汇交易员的事,任何涉及跨境资产的策略都有。

汇率场景 对策略的影响 应对方式
本币升值 外币资产缩水 远期锁汇
本币贬值 进口成本上升 期权对冲
波动率飙升 策略回撤加大 降低仓位

3. 商品价格风险

商品价格波动,影响的不仅是CTA策略。你想想看,原油涨了,航空股是不是要跌?铜价涨了,电力设备成本是不是要上升?这就是传导效应。

我的经验:商品价格风险往往被低估。建议至少跟踪原油、铜、黄金三个品种的波动率,它们能反映通胀预期和避险情绪。

因子暴露分析

因子暴露分析,说白了就是「你的策略到底在赚什么钱」。是赚了市场的贝塔,还是赚了选股的阿尔法?

我常用的因子暴露分析框架是这样的:

# 因子暴露分析示例
import pandas as pd
import statsmodels.api as sm

def factor_exposure_analysis(returns, factors):
    """
    returns: 策略收益率序列
    factors: 因子收益率矩阵(市场、规模、价值、动量等)
    """
    X = sm.add_constant(factors)
    model = sm.OLS(returns, X).fit()
    
    # 输出因子暴露系数
    exposures = model.params
    t_values = model.tvalues
    
    return exposures, t_values

为什么要做这个?我曾经遇到一个策略,回测年化收益20%,结果一分析,90%的收益来自小市值因子暴露。后来小市值因子反转,策略直接崩了。所以,因子暴露分析能帮你识别「伪阿尔法」。

宏观情景分类

宏观情景分类,是我个人觉得最有意思的部分。你不能等风暴来了才想对策,得提前想好各种场景。

我一般把宏观情景分成四类:

  1. 繁荣期:经济增长、通胀温和、利率稳定。适合做多权益、信用债。
  2. 衰退期:经济下滑、通缩风险。适合做多国债、避险资产。
  3. 滞胀期:经济停滞、通胀高企。最难受的阶段,股债双杀。
  4. 复苏期:经济触底反弹、政策宽松。适合做多周期股、商品。

避坑指南:我曾经犯过一个错误——把情景分类做得太细,搞了十几个场景。结果每个场景的概率都很低,根本没法用。后来我学乖了,就保留4-5个核心场景,每个场景的概率不低于10%。

怎么把情景分类落地?我建议用Markov状态转换模型:

# 宏观情景分类的Markov模型
import numpy as np
from hmmlearn import hmm

def regime_classification(data, n_regimes=4):
    """
    data: 宏观指标矩阵(GDP、CPI、利率等)
    n_regimes: 情景数量
    """
    model = hmm.GaussianHMM(n_components=n_regimes, 
                            covariance_type="full")
    model.fit(data)
    
    # 预测当前所处情景
    current_regime = model.predict(data[-1:])
    
    # 状态转移概率矩阵
    transition_matrix = model.transmat_
    
    return current_regime, transition_matrix

下面这张图,是我自己总结的市场风险识别框架,你可以参考:

市场风险识别框架 系统性风险 利率风险 汇率风险 商品价格风险 因子暴露分析 市场因子 规模因子 价值因子 动量因子 宏观情景分类

最后说一句:市场风险识别不是一次性工作。我每周都会跑一遍这个框架,看看因子暴露有没有漂移,宏观情景有没有切换。你想想看,市场在变,你的风险暴露也在变,不盯紧怎么行?

核心要点总结

  • 系统性风险三大来源:利率、汇率、商品价格
  • 因子暴露分析帮你识别「真阿尔法」还是「伪阿尔法」
  • 宏观情景分类保持4-5个核心场景即可,别贪多
  • 定期复盘,动态调整

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