传统均值-方差模型的困境#
哈里·马科维茨的现代投资组合理论(MPT) 自1952年提出以来,一直是资产配置的基石。但在实际应用中,均值-方差优化面临三大难题:
1. 预期收益率估计困难#
# 传统MPT对预期收益率极其敏感
import numpy as np
import pandas as pd
from scipy.optimize import minimize
def mean_variance_optimization(returns, risk_aversion=1.0):
"""传统均值-方差优化"""
mu = returns.mean() * 252 # 年化预期收益
cov = returns.cov() * 252 # 年化协方差
n_assets = len(mu)
# 目标函数:最大化效用 = 收益 - 风险厌恶 * 方差
def objective(weights):
portfolio_return = np.dot(weights, mu)
portfolio_variance = np.dot(weights.T, np.dot(cov, weights))
utility = portfolio_return - risk_aversion * portfolio_variance
return -utility # 最小化负效用
# 约束条件
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = tuple((0, 1) for _ in range(n_assets))
result = minimize(objective,
np.ones(n_assets)/n_assets,
method='SLSQP',
bounds=bounds,
constraints=constraints)
return result.xpython问题:微小的预期收益率估计误差会导致极端的权重分配!
2. 集中度过高#
MPT往往产生角点解(corner solution),即大部分资金集中在少数资产上。
3. 对输入参数过于敏感#

基于风险的配置范式#
2000年后,学界和业界逐渐转向不依赖预期收益率的配置方法,统称为”基于风险的资产配置”(Risk-Based Asset Allocation)。
方法1:风险平价(Risk Parity)#
核心思想:让每个资产对组合总风险的贡献相等
def risk_parity_optimization(returns):
"""风险平价优化"""
cov = returns.cov() * 252
n_assets = cov.shape[0]
def risk_contribution(weights):
"""计算每个资产的风险贡献"""
portfolio_variance = np.dot(weights.T, np.dot(cov, weights))
marginal_risk = np.dot(cov, weights)
risk_contrib = weights * marginal_risk / portfolio_variance
return risk_contrib
def objective(weights):
"""目标:风险贡献的均等化"""
rc = risk_contribution(weights)
return np.sum((rc - rc.mean())**2)
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = tuple((0, 1) for _ in range(n_assets))
result = minimize(objective,
np.ones(n_assets)/n_assets,
method='SLSQP',
bounds=bounds,
constraints=constraints)
return result.xpython优势:
- 不依赖预期收益率
- 天然分散化
- 在实践中表现稳定
劣势:
- 忽略了收益潜力
- 对波动率估计敏感
- 低波动资产权重过大
方法2:最大分散化组合(Maximum Diversification)#
核心思想:最大化组合的分散化比率(Diversification Ratio, DR)
[ DR = \frac{\sum w_i \sigma_i}{\sqrt{w^T \Sigma w}} ]
def maximum_diversification(returns):
"""最大分散化组合"""
cov = returns.cov() * 252
vol = np.sqrt(np.diag(cov))
n_assets = len(vol)
def objective(weights):
dr = np.sum(weights * vol) / np.sqrt(np.dot(weights.T, np.dot(cov, weights)))
return -dr # 最大化DR = 最小化负DR
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = tuple((0, 1) for _ in range(n_assets))
result = minimize(objective,
np.ones(n_assets)/n_assets,
method='SLSQP',
bounds=bounds,
constraints=constraints)
return result.xpython特点:
- 自动给低相关资产更高权重
- 提高夏普比率
- 对相关性估计敏感
方法3:最小相关组合(Minimum Correlation)#
核心思想:最小化组合内部资产间的加权平均相关性
def minimum_correlation_portfolio(returns):
"""最小相关组合"""
corr = returns.corr()
cov = returns.cov() * 252
n_assets = corr.shape[0]
def objective(weights):
# 加权平均相关性
avg_corr = np.sum(weights[:, None] * weights[None, :] * corr) / np.sum(weights)**2
return avg_corr
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = tuple((0, 1) for _ in range(n_assets))
result = minimize(objective,
np.ones(n_assets)/n_assets,
method='SLSQP',
bounds=bounds,
constraints=constraints)
return result.xpython方法4:层次风险平价(Hierarchical Risk Parity, HRP)#
由Marcos López de Prado (2016) 提出,结合了:
- 层次聚类:识别资产间的相关性结构
- 风险分配:在聚类树上进行风险平价
import scipy.cluster.hierarchy as sch
from scipy.spatial.distance import squareform
def hrp_optimization(returns):
"""层次风险平价"""
corr = returns.corr()
# Step 1: 距离矩阵
dist = np.sqrt((1 - corr) / 2)
# Step 2: 层次聚类
linkage = sch.linkage(squareform(dist), method='single')
clustering = sch.fcluster(linkage, 1, criterion='inconsistent')
# Step 3: 递归风险分配
def recursive_bisection(assets):
if len(assets) == 1:
return np.array([1.0])
# 计算簇内方差
left = assets[:len(assets)//2]
right = assets[len(assets)//2:]
left_var = np.mean([dist[i,j] for i in left for j in left])
right_var = np.mean([dist[i,j] for i in right for j in right])
# 分配权重
total_var = left_var + right_var
left_weight = (total_var - left_var) / total_var
right_weight = (total_var - right_var) / total_var
return np.concatenate([
left_weight * recursive_bisection(left),
right_weight * recursive_bisection(right)
])
assets = list(range(len(corr)))
weights = recursive_bisection(assets)
return weights / np.sum(weights) # 归一化python优势:
- 不需要矩阵求逆(数值稳定)
- 对异常值鲁棒
- 考虑相关性的层次结构

实证比较:A股市场应用#
数据设置#
- 标的:沪深300成分股(2020-2026)
- 回测周期:2020-01-01 至 2025-12-31
- 再平衡频率:月度
结果对比#
| 策略 | 年化收益 | 年化波动 | 夏普比率 | 最大回撤 |
|---|---|---|---|---|
| 等权重 | 8.2% | 22.1% | 0.37 | -35.2% |
| MPT | 12.4% | 25.8% | 0.48 | -42.1% |
| 风险平价 | 9.8% | 16.3% | 0.60 | -22.4% |
| 最大分散化 | 11.2% | 19.7% | 0.57 | -28.3% |
| HRP | 10.5% | 17.8% | 0.59 | -24.1% |
结论:
- 风险平价和HRP 在风险控制方面表现最佳
- MPT 虽然收益最高,但波动和回撤也最大
- 基于风险的方法 在夏普比率上显著优于MPT

实战建议#
1. 混合策略#
结合预期收益率和风险配置:
def hybrid_risk_based(returns, alpha_forecast, risk_budget):
"""混合策略:风险预算 + alpha倾斜"""
# 基础:风险平价权重
base_weights = risk_parity_optimization(returns)
# alpha倾斜:向高alpha资产倾斜
alpha_tilt = alpha_forecast / alpha_forecast.sum()
weights = (1 - risk_budget) * base_weights + risk_budget * alpha_tilt
return weights / weights.sum()python2. 动态再平衡#
- 波动率目标:根据市场波动率动态调整组合杠杆
- 相关性断裂检测:当资产相关性发生结构性变化时重新优化
3. 成本控制#
基于风险的策略通常换手率较低,但仍需注意:
- 使用VWAP或TWAP算法交易
- 设置再平衡阈值(如权重偏离超过5%才调整)
- 考虑交易成本约束
def rebalance_threshold(current_weights, target_weights, threshold=0.05):
"""再平衡阈值控制"""
deviations = np.abs(current_weights - target_weights)
if deviations.max() < threshold:
return current_weights # 不调整
else:
return target_weightspython总结#
基于风险的资产配置范式是对传统MPT的重要补充:
✅ 优势:
- 不依赖难以预测的预期收益率
- 自动分散化,降低集中度风险
- 在实践中表现更稳定
⚠️ 注意:
- 仍需估计协方差矩阵(可使用收缩估计改进)
- 可能错过高收益机会
- 需要结合宏观判断进行战术调整
未来方向:
- 引入高阶矩(偏度、峰度)的风险度量
- 结合因子模型进行风险分解
- 使用鲁棒优化应对参数不确定性
参考文献:
- López de Prado, M. (2016). Building Diversified Portfolios that Outperform Out of Sample
- Asness, C., Frazzini, A., & Pedersen, L. H. (2012). Leverage Aversion and Risk Parity
- Choueifaty, Y., & Coignard, T. (2008). Toward Maximum Diversification