风险预算模型数学原理:风险贡献的定义

好,咱们进入正题。风险预算模型,说白了就是解决一个问题:每个资产到底承担了多少风险?

我刚开始做组合管理时,总盯着权重看。觉得权重高的资产,风险肯定大。后来被市场狠狠教育了一回——有个资产权重只有5%,结果它一波动,整个组合都在抖。嗯,从那以后我才明白,权重不等于风险贡献

风险贡献的定义

先给个直观理解。假设你有一个组合,总风险是σ_p。那么每个资产i对总风险的贡献,我们记为RC_i。这个贡献要满足一个基本性质:

所有资产的风险贡献之和,等于组合的总风险。

用数学表达就是:

σ_p = Σ RC_i

那RC_i怎么算?我习惯用偏导数的思路。组合风险对资产权重的偏导数,再乘以权重本身:

RC_i = w_i * (∂σ_p / ∂w_i)

这里w_i是资产i的权重。你想想看,这个公式很直观——权重越大,风险贡献可能越大;但边际风险(偏导数)也很关键

对于最常见的组合方差形式:

σ_p² = w' Σ w

其中Σ是协方差矩阵。那么:

∂σ_p / ∂w_i = (Σ w)_i / σ_p

所以:

RC_i = w_i * (Σ w)_i / σ_p

这个公式我建议你记牢。我在做风险归因时,天天跟它打交道。

个人经验:实际项目中,我经常把RC_i画成饼图。一眼就能看出哪个资产是「风险大户」。有一次发现某个债券的RC占比超过40%,但权重只有15%——果断减仓,后来躲过了一波信用危机。

风险预算的优化目标函数

好,现在我们知道怎么算风险贡献了。那风险预算模型要干什么?

说白了就是:让每个资产的实际风险贡献,等于我们事先设定的目标风险预算

假设我们给每个资产设了一个目标风险预算b_i,满足:

Σ b_i = 1,  b_i > 0

那么优化目标就是让:

RC_i / σ_p = b_i

也就是每个资产的风险贡献占比,等于它的预算占比。

写成优化问题,常见的目标函数有两种:

1. 最小化平方误差

min  Σ (RC_i / σ_p - b_i)²

这个最直观。但有个问题——它没有考虑资产之间的相关性结构。我早期用过,效果一般。

2. 最小化风险贡献的差异

我个人更推荐这个:

min  Σ Σ ( (RC_i / b_i) - (RC_j / b_j) )²

这个目标函数的含义是:每个资产单位预算所承担的风险,应该尽可能相等

说白了,就是让所有资产的「风险效率」对齐。你预算多,就多承担风险;预算少,就少承担。但每单位预算的「风险产出」要一样。

KKT条件与解析解

嗯,这里要上点硬核数学了。不过别怕,我会用白话讲清楚。

对于风险预算模型,我们通常加两个约束:

  • 权重和为1:Σ w_i = 1
  • 权重非负:w_i ≥ 0(允许做空的话可以去掉)

那么优化问题的拉格朗日函数是:

L = f(w) + λ (Σ w_i - 1) + Σ μ_i (-w_i)

其中f(w)是目标函数,λ和μ_i是拉格朗日乘子。

KKT条件告诉我们,最优解必须满足:

  1. 梯度为零:∂L/∂w_i = 0
  2. 原始可行:Σ w_i = 1, w_i ≥ 0
  3. 对偶可行:μ_i ≥ 0
  4. 互补松弛:μ_i * w_i = 0

对于风险预算模型,如果所有资产都参与(w_i > 0),那么μ_i = 0。这时候KKT条件可以简化。

我推导一下关键结果。对于等风险预算(所有b_i相等)的情况,有解析解:

w_i = (1/σ_i²) / Σ (1/σ_j²)

这个结果很漂亮——权重与方差成反比。波动大的资产,权重自然小。

注意:这个解析解只在「所有资产风险贡献相等」且「资产间不相关」时才成立。实际中资产都有相关性,所以一般得用数值优化。

对于一般情况(b_i不相等,资产相关),没有闭式解。我通常用数值方法求解,比如:

import numpy as np
from scipy.optimize import minimize

def risk_budget_objective(w, cov, budgets):
    port_vol = np.sqrt(w @ cov @ w)
    rc = w * (cov @ w) / port_vol
    rc_ratio = rc / port_vol
    return np.sum((rc_ratio / budgets - 1)**2)

# 约束:权重和为1,非负
cons = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1})
bounds = [(0, 1) for _ in range(n_assets)]

result = minimize(risk_budget_objective, x0, args=(cov, budgets),
                  constraints=cons, bounds=bounds)

这段代码我用了很多年。你注意看目标函数——它让每个资产的风险贡献占比,尽量贴近预算比例。

避坑指南:我曾经直接用等权初始化,结果优化不收敛。后来改成用「逆方差加权」作为初始值,效果好多了。代码里的x0可以这样设:

x0 = (1/np.diag(cov)) / np.sum(1/np.diag(cov))

核心逻辑框架图

下面这张图,把整个风险预算模型的数学逻辑串起来了。我建议你多看几遍:

风险预算模型数学原理框架 输入数据 协方差矩阵 Σ | 风险预算 b_i | 权重约束 风险贡献定义 RC_i = w_i · (Σ w)_i / σ_p 核心思想:权重 × 边际风险 优化目标函数 min Σ (RC_i/σ_p - b_i)² 或 min Σ Σ (RC_i/b_i - RC_j/b_j)² 约束条件:Σ w_i = 1, w_i ≥ 0 KKT条件与求解方法 解析解(等预算、不相关)| 数值优化(一般情况) w_i = (1/σ_i²) / Σ (1/σ_j²) | SLSQP / 内点法 数学推导流程

这张图从左到右展示了风险预算模型的完整数学链条。我个人觉得,最核心的就是中间那两步——风险贡献的定义和优化目标。你把这个搞懂了,后面的数值求解就是技术活。

总结一下:风险预算模型不是看权重,而是看「每单位预算承担了多少风险」。KKT条件告诉我们,最优解一定在「所有参与资产的边际风险效率相等」的地方。这个思想,贯穿了整个量化风险管理。

好了,这一章的内容就到这儿。数学原理是基础,下一章我们会聊怎么在实际中调参、怎么处理约束条件——那些才是真正考验工程能力的地方。


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