风险预算模型数学原理:风险贡献的定义
好,咱们进入正题。风险预算模型,说白了就是解决一个问题:每个资产到底承担了多少风险?
我刚开始做组合管理时,总盯着权重看。觉得权重高的资产,风险肯定大。后来被市场狠狠教育了一回——有个资产权重只有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条件告诉我们,最优解必须满足:
- 梯度为零:∂L/∂w_i = 0
- 原始可行:Σ w_i = 1, w_i ≥ 0
- 对偶可行:μ_i ≥ 0
- 互补松弛:μ_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))
核心逻辑框架图
下面这张图,把整个风险预算模型的数学逻辑串起来了。我建议你多看几遍:
这张图从左到右展示了风险预算模型的完整数学链条。我个人觉得,最核心的就是中间那两步——风险贡献的定义和优化目标。你把这个搞懂了,后面的数值求解就是技术活。
总结一下:风险预算模型不是看权重,而是看「每单位预算承担了多少风险」。KKT条件告诉我们,最优解一定在「所有参与资产的边际风险效率相等」的地方。这个思想,贯穿了整个量化风险管理。
好了,这一章的内容就到这儿。数学原理是基础,下一章我们会聊怎么在实际中调参、怎么处理约束条件——那些才是真正考验工程能力的地方。
公众号:蓝海资料掘金营,微信deep3321