3、风险预算的数学公式:从风险贡献到风险预算的等式推导,目标函数与约束条件

好,咱们直接进入正题。

上一节我们聊了风险预算的直觉——说白了就是「谁的风险大,谁就少配点」。但直觉归直觉,真要落地到代码里,你得有精确的数学公式。我当年第一次在实盘里跑风险预算模型时,就栽在公式推导上——嗯,当时把边际风险贡献和绝对风险贡献搞混了,回测曲线看着挺美,一上实盘就崩。后来花了整整两天重新梳理公式,才把坑填上。

3.1 从组合风险说起

先定义清楚:我们说的「风险」,通常指组合收益率的波动率(标准差)。

假设组合有 n 个资产,权重向量为 w = [w₁, w₂, ..., wₙ]ᵀ,协方差矩阵为 Σ。那么组合方差是:

σ²_p = wᵀ Σ w

组合波动率就是:

σ_p = √(wᵀ Σ w)

这个大家应该都熟。但风险预算的关键,不在于组合总风险,而在于 每个资产对总风险的贡献度

核心思想:风险预算不是直接控制权重,而是控制「每个资产承担了多少风险份额」。

3.2 边际风险贡献(Marginal Risk Contribution)

先引入一个概念:边际风险贡献。它衡量的是:如果某资产权重增加一点点,组合风险会变化多少

数学上,资产 i 的边际风险贡献是组合波动率对权重 wᵢ 的偏导数:

MRCᵢ = ∂σ_p / ∂wᵢ = (Σ w)ᵢ / σ_p

其中 (Σ w)ᵢ 表示协方差矩阵乘以权重向量后的第 i 个分量。

这个公式怎么来的?我简单推一下:

σ_p = (wᵀ Σ w)^(1/2)
∂σ_p/∂wᵢ = (1/2) * (wᵀ Σ w)^(-1/2) * 2 * (Σ w)ᵢ
          = (Σ w)ᵢ / σ_p

嗯,其实就是链式法则。我在项目中见过有人直接用数值差分去算,其实没必要,解析解就在这儿。

3.3 绝对风险贡献(Absolute Risk Contribution)

边际风险贡献是「微调」的概念。但实际中我们更关心:每个资产到底承担了多少风险绝对值

资产 i 的绝对风险贡献定义为:

ARCᵢ = wᵢ * MRCᵢ = wᵢ * (Σ w)ᵢ / σ_p

这里有个漂亮的性质:所有资产的绝对风险贡献之和,恰好等于组合总风险。

∑ ARCᵢ = ∑ wᵢ * (Σ w)ᵢ / σ_p
        = (wᵀ Σ w) / σ_p
        = σ_p

你看,风险被完美分解了。这个性质是风险预算的基石。

个人习惯:我每次建模型前,都会先验证一下这个等式是否成立。如果数值对不上,八成是协方差矩阵估计出了问题——我在一个CTA策略里就吃过这个亏,协方差矩阵非正定,导致风险贡献加起来不等于总风险,排查了整整一个下午。

3.4 风险预算的等式推导

好,现在进入核心。风险预算的思想是:我们希望每个资产的风险贡献,占总风险的比例等于预设的预算比例

设预算向量为 b = [b₁, b₂, ..., bₙ]ᵀ,其中 bᵢ > 0 且 ∑ bᵢ = 1。

那么风险预算条件就是:

ARCᵢ / σ_p = bᵢ   (对每个 i 成立)

代入 ARCᵢ 的表达式:

wᵢ * (Σ w)ᵢ / σ_p² = bᵢ

或者写成更紧凑的形式:

wᵢ * (Σ w)ᵢ = bᵢ * wᵀ Σ w   (对每个 i 成立)

这就是风险预算的核心等式。它是一个关于权重 w 的非线性方程组。

注意:这个方程组没有解析解,必须用数值方法求解。我曾经试过用Excel规划求解去算5个资产,结果迭代了200次还不收敛——后来改用Python的scipy.optimize才搞定。

3.5 目标函数与约束条件

既然没有解析解,我们就把它转化成优化问题。

常见的做法是:最小化实际风险贡献比例与目标预算比例的差异

目标函数可以写成:

min  ∑ ( wᵢ * (Σ w)ᵢ / (wᵀ Σ w) - bᵢ )²

或者用更稳健的形式(我推荐这种):

min  ∑ ( wᵢ * (Σ w)ᵢ - bᵢ * wᵀ Σ w )²

约束条件通常包括:

  • 权重和为1: ∑ wᵢ = 1
  • 非负约束: wᵢ ≥ 0(不允许做空)
  • 可选约束: 单个资产权重上限、行业集中度限制等

完整的优化问题就是:

目标函数:min  f(w) = ∑ ( wᵢ * (Σ w)ᵢ - bᵢ * wᵀ Σ w )²
约束条件:∑ wᵢ = 1
          wᵢ ≥ 0,  i = 1,...,n

3.6 求解方法简述

这个优化问题是非凸的,但好在维度不高(通常n≤50),用梯度类方法就能搞定。

我个人常用的求解流程:

  1. 初始化: 用等权重或预算比例作为初始解
  2. 迭代优化: 使用SLSQP或L-BFGS-B算法
  3. 收敛判断: 当目标函数值变化小于1e-8时停止

避坑指南:我曾经直接用随机权重初始化,结果陷入了局部最优。后来改成先用等权重算一遍,再用预算比例算一遍,取目标函数值较小的那个作为初始点——效果好很多。

3.7 一个完整的推导示例

假设只有两个资产,协方差矩阵为:

Σ = [[0.04, 0.01],
     [0.01, 0.09]]

预算比例设为 b = [0.6, 0.4](资产1承担60%风险,资产2承担40%)。

那么核心等式为:

w₁ * (0.04*w₁ + 0.01*w₂) = 0.6 * (0.04*w₁² + 0.02*w₁*w₂ + 0.09*w₂²)
w₂ * (0.01*w₁ + 0.09*w₂) = 0.4 * (0.04*w₁² + 0.02*w₁*w₂ + 0.09*w₂²)

加上 w₁ + w₂ = 1,解这个方程组得到:

w₁ ≈ 0.73,  w₂ ≈ 0.27

你看,资产1的预算风险比例是60%,但实际权重是73%——因为资产1波动率低(方差0.04),需要多配才能达到目标风险贡献。

这就是风险预算的精髓:权重和风险预算不是一回事。低波动资产需要更高的权重才能「扛起」预算的风险份额。

3.8 本章小结

来,我们捋一下核心脉络:

  • 边际风险贡献: 权重微调对风险的影响,∂σ_p/∂wᵢ
  • 绝对风险贡献: 每个资产实际承担的风险,wᵢ * MRCᵢ
  • 风险预算等式: ARCᵢ / σ_p = bᵢ,即风险贡献比例等于预算比例
  • 优化框架: 最小化实际比例与目标比例的平方差,加上权重约束

这些公式看着有点枯燥,但它们是所有风险预算模型的基石。下一章我们会把这些公式写成Python代码,到时候你就知道——嗯,原来数学推导和工程实现之间,还隔着好几个坑呢。


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