跳到正文

López de Prado 的层次风险平价

HRP 的赌注是:协方差矩阵里最可信的不是数值而是拓扑。层次聚类、准对角化、递归二分,一条不需要对协方差求逆的配置路线。

第 12 篇 · 共 12 篇 约 12 分钟

均值-方差优化的病根只有一处:Σ−1\Sigma^{-1}。协方差矩阵的估计误差在求逆时被放大,最小的特征值被翻成最大的权重,于是你解出一个数学上最优、样本外一碰就碎的组合。这个诊断从 1980 年代起就写在文献里,处方一直是同一路:收缩、加约束、重采样——都是在设法让那个逆矩阵别那么疯。

Marcos López de Prado 2016 年那篇 “Building Diversified Portfolios that Outperform Out-of-Sample” 换了个方向:不求逆。层次风险平价(HRP)用层次聚类把资本一层层分下去,全程只读 Σ\Sigma,从不对它求逆。

理解 HRP 最省力的角度不是”它有三个步骤”,而是问一个贯穿全文的问题:协方差矩阵里哪部分信息值得信? HRP 对这个问题给了一个很吝啬的回答,三个步骤各信一点点。看清楚它每步信了什么、没信什么,它的长处和它的毛病就同时清楚了。

三条路的分岔口

设定是标准的:NN 个资产,TT 个观测估出的协方差矩阵 Σ^\hat{\Sigma},要构造权重 ww。

MVO 对 Σ^\hat{\Sigma} 求逆再解二次规划,等于宣称 Σ^\hat{\Sigma} 的每一个元素都可信到能进逆矩阵——T/NT/N 一小,这个宣称就是假的。风险平价退了一步,解等风险贡献方程组,不显式求逆,但解仍然依赖 Σij\Sigma_{ij} 的精确取值,且要迭代求根。HRP 退得最远:按相关性把资产聚类,在树上分配资本,稳定、快、无矩阵求逆。

它的哲学是相关性的结构告诉你怎么分散,哪怕协方差矩阵本身充满噪声。你不需要准确的 Σij\Sigma_{ij},你只需要一个大致靠谱的排序。

第一步:树聚类——只信排序

先把相关矩阵换成距离。标准选择是

dij=1−ρij2d_{ij} = \sqrt{\frac{1 - \rho_{ij}}{2}}

这是相关性上的一个合法度量(满足三角不等式):ρij=1\rho_{ij} = 1 映到 d=0d = 0,ρij=−1\rho_{ij} = -1 映到 d=2d = \sqrt{2}。有了距离矩阵就做层次聚类,HRP 的标准选择是单链接,其他链接方式也能跑:

from scipy.cluster.hierarchy import linkage, dendrogram
from scipy.spatial.distance import squareform

# Correlation matrix
corr = np.corrcoef(returns.T)

# Distance matrix
dist = np.sqrt((1 - corr) / 2)

# Single-linkage clustering
dist_condensed = squareform(dist)
linkage_matrix = linkage(dist_condensed, method='single')

输出是一棵树,展示随着距离阈值下降资产如何合并:强相关的先并,弱相关的最后并。注意这一步从 Σ^\hat{\Sigma} 里榨出来的东西有多少——只有一个顺序。ρij\rho_{ij} 是 0.62 还是 0.68 对结果几乎没有影响,只要它们的相对大小没颠倒。这就是 HRP 稳健性的来源,也是它的第一个可疑之处:谁来保证这个顺序对?

单链接这个选择本身不是显然的。它以”链式”(chaining)效应著称,产出长条形的聚类;Ward 链接给出的树平衡得多。经验上单链接对 HRP 好用,理由是它保留相关矩阵的拓扑:强相关的组黏在一起,弱相关的组彼此推开,即使数据里有离群点也是如此。Ward 链接在组内方差偏大时可能把一个本该整体对待的相关组切开,这对 HRP 是坏事。反过来,如果相关性估计噪声很大,平均链接或完全链接可能更稳——单链接对距离度量里的噪声是敏感的。这些都是经验判断,没有一条是定理,后面还要再算这笔账。

第二步:准对角化——只信块

树给出一个资产排序,第二步就是按这个排序重排协方差矩阵,把相似的资产挪到一起。记 PP 为树诱导的置换:

Σqd=P⊤ΣP\Sigma_{\text{qd}} = P^\top \Sigma P

这不是线性代数意义上的对角化。矩阵仍然有非对角项,只是它们被集中到对角线附近。名字里的”准”就是这个意思。

为什么要挪?直觉还是从 Markowitz 的不稳定性来。当 Σ\Sigma 呈”对角状”(资产近似独立)时逆矩阵良态、权重稳定;当 Σ\Sigma 有大的非对角块(资产聚成相关组)时逆矩阵病态、权重乱跳。重排不改变矩阵的谱,改变的是它的可读性——高相关的块浮到对角线上:

Original (random order):
Σ = | X X X . . . X |
    | X X X . . . X |
    | X X X . . . X |
    | . . . X X X . |
    | . . . X X X . |
    | . . . X X X . |
    | X X X . . . X |

Quasi-diagonalized (cluster order):
Σ_qd = | X X X X . . . |
        | X X X X . . . |
        | X X X X . . . |
        | X X X X . . . |
        | . . . X X X X |
        | . . . X X X X |
        | . . . X X X X |

把 Σqd\Sigma_{\text{qd}} 画成热图就能看见:块内高相关,块间低相关。这个结构才是下一步能成立的前提——递归二分每次切一刀,切的位置必须落在弱相关的地方,否则它就是在把一个整体劈成两半然后假装它们独立。准对角化的全部作用就是保证刀口落在该落的地方。

第三步:递归二分——只信对角线(几乎)

到这里才真正开始配资本。程序本身两行话说得完:所有资产先当一个聚类拿 100% 资本,把聚类劈成左右两个子聚类,按逆方差在两边分钱,然后对每个子聚类递归,直到叶节点。叶子的最终权重是从根到叶那条路径上所有分割系数的乘积。

关键在”按逆方差分”这一步。对方差分别为 VLV_L、VRV_R 的两个子聚类:

αL=1/VL1/VL+1/VR,αR=1/VR1/VL+1/VR\alpha_L = \frac{1/V_L}{1/V_L + 1/V_R}, \quad \alpha_R = \frac{1/V_R}{1/V_L + 1/V_R}

问题是 VLV_L 怎么算。一个聚类里有一堆相关资产,它的”方差”取决于你假设聚类内部怎么持有。至少有四种答案,而它们用到 ΣL\Sigma_L 的程度完全不同。

最省事的是把聚类当成一个单位暴露的资产,VL=1⊤ΣL1V_L = \mathbf{1}^\top \Sigma_L \mathbf{1},其中 ΣL\Sigma_L 是 Σ\Sigma 对应聚类 LL 的子矩阵。稍微规矩一点是用等权组合方差 VL=(1/nL)⊤ΣL(1/nL)=1⊤ΣL1/nL2V_L = (\mathbf{1}/n_L)^\top \Sigma_L (\mathbf{1}/n_L) = \mathbf{1}^\top \Sigma_L \mathbf{1} / n_L^2。另一端是聚类内的最小方差组合 VL=1/(1⊤ΣL−11)V_L = 1 / (\mathbf{1}^\top \Sigma_L^{-1} \mathbf{1})——这个要对子矩阵求逆,等于把 HRP 想避开的东西又请了回来。

López de Prado 取的是第三种:聚类内的逆方差组合(IVP)。权重

w~i=1/σii∑j∈L1/σjj,i∈L\tilde{w}_i = \frac{1/\sigma_{ii}}{\sum_{j \in L} 1/\sigma_{jj}}, \quad i \in L

即每个资产按自身方差的倒数配权再归一化,聚类方差就是这个 IVP 在聚类内持有时的方差:

VL=w~⊤ΣLw~V_L = \tilde{w}^\top \Sigma_L \tilde{w}

这里值得停一下。w~\tilde{w} 只用了 ΣL\Sigma_L 的对角线,不需要求逆;但 VLV_L 这个二次型用的是完整的 ΣL\Sigma_L,非对角项进来了。所以”HRP 只用相关性做聚类、不用它加权”的说法要打个折扣:聚类内部的协方差确实影响了这个聚类拿到多少钱,只是它以一个标量的形式进来,而不是以逆矩阵的形式。这是 HRP 唯一一处真正读取了对角线以外的数值,也是它相比纯 IVP 多出来的那点分散信息。

分割式于是写成

αL=1/VL1/VL+1/VR,αR=1−αL\alpha_L = \frac{1/V_L}{1/V_L + 1/V_R}, \quad \alpha_R = 1 - \alpha_L

这不是 50/50。聚类内方差更低的那一边拿更多资本,而”内方差更低”同时包含了两件事:这个聚类的成分波动率低,以及这个聚类内部本身分散得好。

四种选法在实践中给出的结果大体接近。第三种成为标准,一是因为它不求逆,二是因为它尊重聚类内各资产的相对波动率,三是因为它是 López de Prado 在 AFML 实现里用的那个,在他的样本外测试里压过等权。理论上没有哪一种是”对的”。

代码层面:

def hrp_allocate(cov, order):
    n = len(cov)
    weights = np.ones(n)
    
    def _bisect(items):
        if len(items) <= 1:
            return
        # Split items into two halves
        mid = len(items) // 2
        left, right = items[:mid], items[mid:]

        # Compute cluster variances via the inverse-variance portfolio (IVP)
        cov_l = cov[np.ix_(left, left)]
        cov_r = cov[np.ix_(right, right)]
        w_l = 1 / np.diag(cov_l)
        w_l = w_l / w_l.sum()
        w_r = 1 / np.diag(cov_r)
        w_r = w_r / w_r.sum()
        v_l = w_l @ cov_l @ w_l
        v_r = w_r @ cov_r @ w_r

        # Inverse-variance split between clusters
        alpha_l = 1 / v_l / (1 / v_l + 1 / v_r)
        alpha_r = 1 - alpha_l

        # Update weights
        weights[left] *= alpha_l
        weights[right] *= alpha_r

        # Recurse
        _bisect(left)
        _bisect(right)
    
    _bisect(order)
    return weights / weights.sum()

时间 O(Nlog⁡N)\mathcal{O}(N \log N),空间 O(N)\mathcal{O}(N)。MVO 那边的矩阵求逆是 O(N3)\mathcal{O}(N^3)。

逆方差分割不是随手写的

上面那个 αL∝1/VL\alpha_L \propto 1/V_L 看着像启发式,其实在一个明确的假设下它就是最优解。假设两个聚类 L 和 R 的协方差矩阵分别是 ΣL\Sigma_L、ΣR\Sigma_R,你要把 α\alpha 的资本给 L、(1−α)(1-\alpha) 给 R,让合并后的组合方差最小:

min⁡α[α1,(1−α)1][ΣL00ΣR][α1,(1−α)1]⊤\min_\alpha \quad [\alpha \mathbf{1}, (1-\alpha)\mathbf{1}] \begin{bmatrix} \Sigma_L & 0 \\ 0 & \Sigma_R \end{bmatrix} [\alpha \mathbf{1}, (1-\alpha)\mathbf{1}]^\top

分块对角这个写法就是关键假设:两个聚类互相独立。展开:

V(α)=α21⊤ΣL1+(1−α)21⊤ΣR1V(\alpha) = \alpha^2 \mathbf{1}^\top \Sigma_L \mathbf{1} + (1-\alpha)^2 \mathbf{1}^\top \Sigma_R \mathbf{1}

记 VL=1⊤ΣL1V_L = \mathbf{1}^\top \Sigma_L \mathbf{1}、VR=1⊤ΣR1V_R = \mathbf{1}^\top \Sigma_R \mathbf{1},求导置零:

dVdα=2αVL−2(1−α)VR=0\frac{dV}{d\alpha} = 2\alpha V_L - 2(1-\alpha) V_R = 0 α⋆=VRVL+VR\alpha^\star = \frac{V_R}{V_L + V_R}

最优分割与对方聚类的方差成正比,也就是与自己方差的倒数成正比。这就是逆方差分割。

推导里把每个聚类当作等权持有(那个 1\mathbf{1} 向量),但换成 HRP 实际用的聚类内 IVP,公式一字不改:把 1⊤ΣL1\mathbf{1}^\top \Sigma_L \mathbf{1} 换成 w~⊤ΣLw~\tilde{w}^\top \Sigma_L \tilde{w} 即可。分割规则对聚类内权重的选择是不变的——任何汇总聚类风险的标量 VLV_L 都给出同样的 αL∝1/VL\alpha_L \propto 1/V_L,聚类内部怎么分是后续递归的事。

于是准对角化那一步的意义又清楚了一层:它不是为了好看,它是在给”两个聚类独立”这个假设造条件。刀口落在弱相关处,分块对角就近似成立,这个推导就近似有效。整条链是自洽的。

论文的证据到底是什么

2016 年那篇论文给 HRP 挂了三个性质。前两个从算法本身就能看清:无矩阵求逆(直接使用协方差矩阵,从不对其求逆,绕开了折磨 MVO 的特征值放大),以及层次化分散(资本自上而下分配、尊重聚类结构,于是你同时拿到聚类之间和聚类之内的分散)。第三个是样本外表现,这是一条实证主张,需要单独看证据。

需要说清楚的是,论文的证据是蒙特卡洛实验,不是在一堆真实市场数据集上的横截面比较。做法是模拟带块状相关结构的收益序列,在样本内估协方差、构组合,在样本外量它们的表现,比较 HRP、CLA(均值-方差那条线)和 IVP。结论是 HRP 的样本外方差明显低于另外两者,量级上是”低几成”而不是几个百分点。具体数字请回原文核对,不要引用二手转述。

同一实验设计里最能说明问题的是 NN 大、TT 小那一端。想象 500 只股票、60 个月数据:Markowitz 要从 60 个观测估出的 500×500 矩阵里求逆,不稳定不是风险而是必然。HRP 在这个区间根本不做那件事,差距自然拉开。反过来,如果模拟的收益里压根没有聚类结构,树就是任意的,递归二分退化成近似等权——HRP 会收敛到等权,不会更好也不会更差。这是个健康的性质:它在没有结构可利用时不装作有。

跟风险平价的差别在哪

风险平价按等风险贡献分配,HRP 按逆聚类方差分配。两者相关,但吃进去的信息量差一个数量级。

风险平价需要一个被完整指定的协方差矩阵,解一个非线性方程组,解依赖 Σij\Sigma_{ij} 的精确取值。HRP 只要相关矩阵的结构,也就是树的拓扑,非对角相关性只用于聚类和聚类内的 VLV_L,不直接进权重公式。

后果是可以预测的:对 Σ^\hat{\Sigma} 做一个小扰动,HRP 的权重跟着小动,风险平价的权重可能大动。经验上 HRP 的换手率通常低于风险平价,因为树在 Σ\Sigma 的小扰动下是稳定的,而风险平价是在持续重新优化。这一条在扣完交易成本之后往往比样本外 Sharpe 那点差距更值钱。

与网络理论是同一件事的两种说法

基于相关的层次聚类和网络理论离得很近。把相关矩阵看成加权图(边权是资产对之间的相关性),图上的最小生成树(MST)用 N−1N-1 条边以最小总权重连接所有资产,直接给出一个层次结构。在 (1−ρ)/2\sqrt{(1-\rho)/2} 这类距离度量下,单链接聚类与 MST 给出的结构是对应的——HRP 用的是标准层次聚类而非 MST,但两者读出的拓扑是同一个。

这个联系解释了 HRP 为什么在金融网络上管用:相关性本来就有自然的聚类结构(行业、因子、地区),树捕捉的就是这个结构。它也提醒你 HRP 的适用边界——如果你的资产集合根本没有这种块状结构,树就是在拟合噪声。

它的三个毛病

单链接的选择是任意的。 不同链接方法给出不同的树,不同的树给出不同的权重。经验上单链接效果不错,但没有任何理论理由说它应该优于 Ward、完全或平均链接。Raffinot (2018) 显示链接方式的选择对样本外表现有显著影响。回到开头那个问题:HRP 把全部信任押在”排序”上,而排序这一步的算法选择是拍出来的。

HRP 不使用预期收益。 它是纯粹基于风险的配置。如果你强烈看多某个资产相对另一个,HRP 不给你表达的地方。你可以通过加入一个带期望相关结构的合成”观点资产”来变通,但很别扭;更干净的做法是照常算树和准对角化,再用 Black-Litterman 后验收益对最终权重做倾斜。

逆方差分割是启发式的。 上一节那个推导只在聚类间独立时成立,而准对角化只能让这个假设”近似”成立。没有理论证明逆聚类方差是最优分割——它是受单资产均值-方差启发的一个合理选择,不是第一性原理的产物。更有原则的做法是在聚类层面按等风险贡献分割,那会给出另一组权重。Raffinot 的后续工作正是这么干的,叫层次等风险贡献(HERC):递归二分每一层都用 ERC 分割替代逆方差分割。HERC 理论上更干净,代价是更慢(每次分割要解一个 ERC 系统),而经验上两者的样本外表现相近。

除 HERC 之外还有几种变体值得知道。聚类内不做等权而是解一个小规模 MVO,等于在聚类层面加回一点基于风险的优化;在递归二分过程中直接加入禁止做空、头寸上限、行业约束,数学更麻烦但结果尊重现实约束。都是站得住脚的扩展。

带着这些毛病,HRP 仍然是严肃工具。它已被若干量化机构采用,mlfinlab 里有干净的实现。对 N>TN > T 或协方差估计噪声很大的组合,它是一个站得住脚的默认选择。

什么时候值得动用它

粗略的分界是这样:NN 不到 20,任何方法都行,等权就够了,不必费心 HRP;NN 在 20 到 100 之间,HRP 和 Ledoit-Wolf 收缩后的 MVO 都能用,两个都试试看哪个合适;NN 超过 100,HRP 开始占优,因为协方差矩阵对 MVO 而言已经太吵,而等权虽然也能用,却不提供任何分散结构。

有个容易踩的误会:如果各资产波动率差异很大(比如股债混合),HRP 给你的不是”等风险贡献”而是”等聚类方差”。想要真正的 ERC,得加一步后处理,把权重调到满足 ERC 约束。一种常见的混合方案是让 HRP 只负责聚类层面的配置,每个聚类内部跑约束版 ERC——拓扑的稳健性从 HRP 来,分散的性质从 ERC 来。

参考文献

  • López de Prado (2016). “Building Diversified Portfolios that Outperform Out-of-Sample.” Journal of Portfolio Management 42(4): 59-69. HRP 论文。
  • López de Prado (2018). Advances in Financial Machine Learning. Wiley. 第 16 章有实现细节。ISBN: 978-1-119-48208-6.
  • Raffinot (2018). “Hierarchical Clustering-Based Asset Allocation.” Journal of Portfolio Management 44(2): 89-99. 批评与扩展;HERC 出自作者同期的后续工作。
  • Tola, Lillo, Gallegati & Mantegna (2008). “Cluster Analysis for Portfolio Optimization.” Journal of Economic Dynamics and Control 32(1): 235-258. 早期关于聚类配置的工作。
  • DeMiguel, Garlappi & Uppal (2009). “Optimal Versus Naive Diversification: How Inefficient Is the 1/N Portfolio Strategy?” Review of Financial Studies 22(5): 1915-1953. 等权基准为什么这么难打败。
  • Bruder, Gaussel, Richard & Roncalli (2013). “Regularization of Portfolio Allocation.” SSRN Working Paper. 基于风险的配置方法比较。

下一篇文章:最小方差组合。最简单的基于风险的 MVO,以及为什么它比基于预期收益的 MVO 更稳健。