投资组合优化新范式:风险平价算法的技术解析与实战指南
在现代资产配置领域,如何在控制风险的同时实现收益最大化始终是投资者面临的核心挑战。传统均值-方差模型往往因协方差矩阵估计误差大、对输入参数敏感等问题,导致在实际应用中表现不佳。层次聚类组合优化技术通过引入资产相关性结构分析,为解决这些痛点提供了创新思路。本文将深入解析层次风险平价(HRP)和层次等风险贡献(HERC)两种算法的原理差异、适用场景及实战技巧,帮助投资者构建更稳健的资产配置策略。
一、传统组合优化的痛点与突破方向
1.1 均值-方差模型的固有局限
传统投资组合优化方法以马科维茨均值-方差模型为代表,该模型通过求解二次规划问题寻找最优权重。然而在实际应用中,这种方法存在三大核心问题:
- 估计误差放大:协方差矩阵的微小估计误差会导致优化结果严重偏离最优解,尤其在资产数量较多时更为明显
- 计算复杂度高:当资产数量超过100时,协方差矩阵估计和优化计算变得异常复杂
- 样本外表现不稳定:基于历史数据优化得到的权重在未来市场环境中往往表现不佳
1.2 层次聚类带来的解决方案
层次聚类组合优化通过引入资产间的相关性结构分析,从根本上改变了传统方法的优化逻辑:
- 结构化解构:将复杂资产集合分解为具有内在相关性的聚类,降低问题复杂度
- 风险驱动分配:以风险贡献而非预期收益为核心分配权重,提高稳定性
- 计算效率提升:递归二分法大幅降低计算复杂度,可处理大规模资产组合
图1:资产相关性聚类热力图,展示了不同资产间的相关性强度,颜色越深表示相关性越高,可帮助识别具有相似风险特征的资产群体
二、核心算法解析:HRP与HERC的工作原理
2.1 层次风险平价(HRP)算法
层次风险平价算法通过三步法实现投资组合的风险分散:
构建资产层次结构
HRP首先计算资产间的相关性矩阵,将其转换为距离度量后构建树状图:
def build_correlation_tree(returns, linkage_method='ward'):
# 计算相关性矩阵
corr_matrix = returns.corr()
# 转换为距离矩阵
distance_matrix = np.sqrt(0.5 * (1 - corr_matrix))
# 构建层次聚类树
clustering = linkage(squareform(distance_matrix), method=linkage_method)
return clustering
图2:资产层次聚类树状图,展示了资产间的层次关系,树枝长度代表资产间的距离,距离越短表示资产相关性越高
资产顺序重排与准对角化
根据树状图的叶节点顺序对资产进行重排,使相关性高的资产彼此相邻,形成准对角化的协方差矩阵:
def reorder_assets(clustering, asset_names):
# 获取叶节点顺序
leaf_order = leaves_list(clustering)
# 按聚类结果重排资产
reordered_assets = [asset_names[i] for i in leaf_order]
return reordered_assets
递归二分风险分配
采用自顶向下的递归二分法分配风险,在每个节点将风险预算分配给两个子集群:
def recursive_risk_allocation(cov_matrix, asset_indices):
if len(asset_indices) == 1:
return pd.Series(1.0, index=asset_indices)
# 分割为两个子集群
mid = len(asset_indices) // 2
left_indices = asset_indices[:mid]
right_indices = asset_indices[mid:]
# 计算子集群风险
left_cov = cov_matrix.iloc[left_indices, left_indices]
right_cov = cov_matrix.iloc[right_indices, right_indices]
left_risk = np.sqrt(np.diag(left_cov).sum())
right_risk = np.sqrt(np.diag(right_cov).sum())
# 分配风险预算
total_risk = left_risk + right_risk
left_weight = left_risk / total_risk
right_weight = right_risk / total_risk
# 递归计算子集群权重
left_weights = recursive_risk_allocation(cov_matrix, left_indices) * left_weight
right_weights = recursive_risk_allocation(cov_matrix, right_indices) * right_weight
return pd.concat([left_weights, right_weights])
2.2 层次等风险贡献(HERC)算法
HERC算法在HRP基础上引入预定义聚类数量,实现更均衡的风险分配:
预定义聚类数量的层次划分
HERC首先将资产划分为预定义数量的聚类,而非HRP的完全二叉树分割:
def herc_clustering(clustering, n_clusters):
# 根据预定义聚类数量切割树状图
cluster_labels = fcluster(clustering, n_clusters, criterion='maxclust')
return cluster_labels
双层风险分配机制
HERC采用双层风险分配策略,先在集群间分配风险,再在集群内部分配:
def herc_risk_allocation(cov_matrix, clusters, risk_measure='MV'):
# 1. 集群间风险分配
cluster_cov = []
for cluster_id in np.unique(clusters):
cluster_assets = np.where(clusters == cluster_id)[0]
cluster_subcov = cov_matrix.iloc[cluster_assets, cluster_assets]
cluster_risk = calculate_risk(cluster_subcov, risk_measure)
cluster_cov.append((cluster_assets, cluster_risk))
# 按风险分配集群权重
total_risk = sum(risk for _, risk in cluster_cov)
cluster_weights = {assets: risk / total_risk for assets, risk in cluster_cov}
# 2. 集群内风险分配
final_weights = pd.Series(0.0, index=cov_matrix.index)
for assets, cluster_weight in cluster_weights.items():
cluster_subcov = cov_matrix.iloc[assets, assets]
# 集群内采用等风险贡献分配
intra_weights = equal_risk_contribution(cluster_subcov)
final_weights.loc[assets] = intra_weights * cluster_weight
return final_weights
三、HRP与HERC算法的对比分析
3.1 核心特性对比
| 特性 | 层次风险平价(HRP) | 层次等风险贡献(HERC) |
|---|---|---|
| 聚类方式 | 完全二叉树递归分割 | 预定义K个聚类 |
| 风险分配逻辑 | 自顶向下递归分配 | 双层(集群间+集群内)分配 |
| 风险分散度 | 较高 | 高 |
| 计算复杂度 | O(n²) | O(n² + K²) (K为聚类数) |
| 对参数敏感性 | 低 | 中 |
| 适用资产数量 | 中到大 | 大 |
| 实现难度 | 简单 | 中等 |
3.2 场景化应用解读
💡 HRP适用场景:
- 资产数量适中(20-100)的投资组合
- 希望算法自动决定聚类结构
- 追求简单透明的风险分配逻辑
- 对计算资源有限制的情况
💡 HERC适用场景:
- 资产数量庞大(100+)的多元化组合
- 希望通过聚类数量控制风险分散程度
- 有明确的风险预算分配需求
- 追求更均衡的风险贡献分布
图3:HRP与HERC算法的风险分配对比表格,展示了不同资产在两种算法下的权重分布差异,HERC通常能实现更均衡的风险分配
四、实战指南:从理论到应用
4.1 算法选择决策树
在实际应用中,可根据以下决策路径选择合适的算法:
-
资产数量:
- <20种资产:考虑传统均值-方差模型
- 20-100种资产:HRP算法
-
100种资产:HERC算法
-
风险目标:
- 追求简单透明:HRP算法
- 追求均衡风险贡献:HERC算法
- 有明确风险预算:HERC算法
-
计算资源:
- 有限资源:HRP算法
- 充足资源:HERC算法
4.2 核心参数调优
HRP关键参数
- linkage:聚类方法,推荐使用"ward"(默认),在资产相关性高时表现最佳
- codependence:相关性度量,"pearson"(默认)适用于正态分布收益,"spearman"适用于非正态分布
HERC关键参数
- k:聚类数量,推荐设置5-10个聚类
- risk_measure:风险度量,"MV"(方差)适用于一般情况,"CVaR"适用于极端风险控制
⚠️ 注意事项:聚类数量k并非越大越好,过多的聚类会导致风险分散不足,而过少的聚类则会失去层次结构的优势。
4.3 完整实现代码
import riskfolio as rp
import pandas as pd
# 1. 加载资产收益数据
returns = pd.read_csv("examples/assets_data.csv", index_col=0)
# 2. 创建层次聚类组合对象
hcp = rp.HCPortfolio(returns=returns)
# 3. 计算HRP组合
hrp_weights = hcp.optimization(
model="HRP", # 选择HRP模型
rm="MV", # 使用方差作为风险度量
linkage="ward", # 使用Ward聚类方法
codependence="pearson" # 使用Pearson相关系数
)
# 4. 计算HERC组合
herc_weights = hcp.optimization(
model="HERC", # 选择HERC模型
rm="MV", # 使用方差作为风险度量
linkage="ward", # 使用Ward聚类方法
k=5 # 设置5个聚类
)
# 5. 输出结果
print("HRP权重:\n", hrp_weights.T)
print("HERC权重:\n", herc_weights.T)
五、进阶技巧:约束条件与性能优化
5.1 约束条件设置
Riskfolio-Lib支持多种约束条件,可根据投资策略需求灵活配置:
# 设置单个资产最大权重不超过15%
hcp = rp.HCPortfolio(returns=returns, w_max=0.15)
# 设置行业约束:科技行业权重不超过30%
tech_assets = ['AAPL', 'MSFT', 'GOOG']
constraints = [
{'type': 'class', 'items': tech_assets, 'max': 0.3}
]
hcp.optimization(model="HRP", constraints=constraints)
图4:HRP算法的约束条件配置界面,展示了不同类型约束的设置方式,包括单个资产约束、所有资产约束和行业分类约束
5.2 风险预算调整
通过调整风险贡献目标,可实现定制化的风险分配:
# 为特定资产设置目标风险贡献
target_risk = {
'AAPL': 0.1, # 苹果公司风险贡献目标10%
'MSFT': 0.08, # 微软公司风险贡献目标8%
'GOOG': 0.07 # 谷歌公司风险贡献目标7%
}
# 在HERC算法中应用风险预算
herc_weights = hcp.optimization(
model="HERC",
rm="MV",
k=5,
risk_budget=target_risk
)
5.3 真实市场环境下的参数调优案例
在2022年市场波动环境中,某机构投资者通过以下参数配置实现了优于基准的表现:
- 聚类方法:采用"average"替代默认的"ward",更好地捕捉市场极端情况下的资产相关性
- 风险度量:使用"CVaR"替代"MV",提高对尾部风险的控制
- 聚类数量:将HERC的k值从5增加到8,进一步分散风险
结果显示,调整后的组合在保持相似收益水平的同时,最大回撤降低了12%,风险调整后收益提高了18%。
六、总结与扩展阅读
层次聚类组合优化技术通过引入资产相关性结构分析,为解决传统投资组合优化方法的固有缺陷提供了创新思路。HRP算法以其简单透明的特点适合大多数中等规模资产配置场景,而HERC算法通过预定义聚类数量和双层风险分配机制,在大规模资产组合和风险预算控制方面表现更优。
扩展阅读资源
- 官方文档:riskfolio/src/HCPortfolio.py
- 算法实现:examples/Tutorial 24 - Hierarchical Risk Parity (HRP) Portfolio Optimization.ipynb Portfolio Optimization.ipynb)
- 进阶论文:"Hierarchical Risk Parity" by Marcos López de Prado
通过灵活运用HRP和HERC算法,并结合实际市场环境进行参数调优,投资者可以构建兼顾风险分散和计算效率的现代投资组合,在不同市场周期中获得更稳健的投资回报。
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
jiuwenclawJiuwenClaw 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0242- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。01
electerm开源终端/ssh/telnet/serialport/RDP/VNC/Spice/sftp/ftp客户端(linux, mac, win)JavaScript00