传统均值方差优化的困境#
哈里·马科维茨的现代投资组合理论(MPT)自1952年提出以来,一直是资产配置的基石。然而,实践中投资者发现,纯粹的均值方差优化存在严重缺陷:
1. 输入敏感性问题
- 预期收益率的微小变化导致权重剧烈波动
- 协方差矩阵估计误差被放大
- 优化结果往往集中在少数资产
2. 估计风险过高
- 历史收益率作为未来预期的代表性不足
- 高频噪声掩盖真实信号
- 参数不确定性未被充分考虑
3. 集中化倾向
- 优化器倾向于给出极端权重
- 缺乏稳健性,样本外表现差
- 与实际投资约束脱节

Black-Litterman模型流程#

Black-Litterman模型的革命性创新#
1992年,高盛的Fischer Black和Robert Litterman提出了一种全新的资产配置框架,巧妙地将市场均衡与投资者观点结合起来。
核心思想#
“市场组合是理性的起点”
Black-Litterman模型不要求投资者从零开始预测预期收益率,而是:
- 以市场均衡组合(如CAPM隐含组合)作为基准
- 允许投资者表达相对观点(看多/看空某些资产)
- 通过贝叶斯框架将观点融合到均衡预期中
数学框架#
模型的核心公式:
E[R] = [(τΣ)^(-1) + P'Ω^(-1)P]^(-1) * [(τΣ)^(-1)π + P'Ω^(-1)Q]plaintext其中:
- π: 市场均衡预期收益率(逆向优化得到)
- Q: 投资者观点向量
- P: 观点映射矩阵
- Ω: 观点不确定性矩阵
- τ: 缩放因子
- Σ: 资产收益率协方差矩阵
实战步骤:从理论到代码#
Step 1: 计算市场均衡组合#
使用逆向优化从市场权重推导隐含预期收益率:
import numpy as np
from scipy.optimize import minimize
def reverse_optimization(weights, cov_matrix, risk_aversion=2.5):
"""
逆向优化:从市场权重推导隐含预期收益率
Parameters:
-----------
weights : np.array, 市场组合权重
cov_matrix : np.array, 收益率协方差矩阵
risk_aversion : float, 风险厌恶系数
Returns:
--------
implied_returns : np.array, 隐含预期收益率
"""
implied_returns = risk_aversion * np.dot(cov_matrix, weights)
return implied_returns
# 示例:假设5个资产的市值权重
market_weights = np.array([0.4, 0.3, 0.15, 0.1, 0.05])
cov_matrix = np.array([
[0.04, 0.02, 0.01, 0.005, 0.002],
[0.02, 0.09, 0.03, 0.01, 0.005],
[0.01, 0.03, 0.16, 0.02, 0.01],
[0.005, 0.01, 0.02, 0.25, 0.03],
[0.002, 0.005, 0.01, 0.03, 0.36]
])
# 计算隐含预期收益率
pi = reverse_optimization(market_weights, cov_matrix, risk_aversion=2.5)
print("市场均衡隐含预期收益率:", pi)pythonStep 2: 构建投资者观点#
Black-Litterman模型支持绝对观点和相对观点:
# 示例观点设置
# 观点1:资产1的年化收益率将超出市场均衡3%
# 观点2:资产2的表现将比资产3好2%
Q = np.array([0.03, 0.02]) # 观点收益向量
# P矩阵:映射观点到资产
# 观点1:100% 资产1
# 观点2:资产2看多(+1),资产3看空(-1)
P = np.array([
[1, 0, 0, 0, 0],
[0, 1, -1, 0, 0]
])
# 观点不确定性矩阵(对角线为观点置信度)
tau = 0.05 # 缩放因子
omega = np.diag([0.1, 0.1]) # 观点方差(越小越自信)pythonStep 3: 融合观点与均衡#
def black_litterman_formula(pi, P, Q, Sigma, tau, omega):
"""
Black-Litterman公式:融合市场均衡与投资者观点
"""
# 计算后验预期收益率
M_inv = np.linalg.inv(tau * Sigma) + P.T @ np.linalg.inv(omega) @ P
M = np.linalg.inv(M_inv)
posterior_returns = M @ (np.linalg.inv(tau * Sigma) @ pi + P.T @ np.linalg.inv(omega) @ Q)
# 计算后验协方差
posterior_cov = M @ (P.T @ np.linalg.inv(omega) @ P + np.linalg.inv(tau * Sigma)) @ M
return posterior_returns, posterior_cov
# 计算后验预期收益率和协方差
posterior_returns, posterior_cov = black_litterman_formula(
pi, P, Q, cov_matrix, tau, omega
)
print("后验预期收益率:", posterior_returns)pythonStep 4: 重新优化投资组合#
使用新的后验预期收益率进行均值方差优化:
def portfolio_optimization(expected_returns, cov_matrix, risk_aversion=2.5):
"""
均值方差优化
"""
n_assets = len(expected_returns)
# 目标函数:最大化效用 = 预期收益 - 0.5 * 风险厌恶 * 方差
def objective(weights):
portfolio_return = np.dot(weights, expected_returns)
portfolio_risk = np.dot(weights, np.dot(cov_matrix, weights))
utility = portfolio_return - 0.5 * risk_aversion * portfolio_risk
return -utility # 最小化负效用
# 约束条件
constraints = [
{'type': 'eq', 'fun': lambda w: np.sum(w) - 1}, # 权重和为1
]
bounds = [(0, 1) for _ in range(n_assets)] # 不允许做空
# 优化
result = minimize(
objective,
x0=np.ones(n_assets) / n_assets,
method='SLSQP',
bounds=bounds,
constraints=constraints
)
return result.x
# 优化后验预期下的组合
optimal_weights = portfolio_optimization(posterior_returns, posterior_cov, risk_aversion=2.5)
print("优化后组合权重:", optimal_weights)python中国市场实战案例#
案例设定#
假设我们要在中国A股市场应用Black-Litterman模型,资产池包括:
- 沪深300指数
- 中证500指数
- 创业板指
- 国债指数
- 黄金ETF
数据准备#
import pandas as pd
import tushare as ts
# 获取历史数据(示例)
def get_historical_data():
# 使用tushare或其他数据源
# 返回收益率DataFrame
pass
# 计算协方差矩阵(使用Ledoit-Wolf收缩估计)
from sklearn.covariance import LedoitWolf
def estimate_covariance(returns):
"""
使用Ledoit-Wolf收缩估计协方差矩阵
比样本协方差更稳健
"""
lw = LedoitWolf()
lw.fit(returns)
return lw.covariance_
# 获取市场权重(以市值为代理)
market_caps = {
'沪深300': 450000, # 亿元
'中证500': 120000,
'创业板指': 80000,
'国债': 1000000,
'黄金ETF': 50000
}
total_market_cap = sum(market_caps.values())
market_weights = np.array([cap / total_market_cap for cap in market_caps.values()])python表达投资观点#
在中国市场,投资者可能有以下观点:
# 观点1:科技板块(创业板)未来6个月将跑赢大盘5%
# 观点2:价值股(沪深300)将比小盘股(中证500)表现好3%
# 观点3:国债收益率将下降,价格上涨2%
Q = np.array([0.05, 0.03, 0.02])
P = np.array([
[0, 0, 1, 0, 0], # 观点1:100% 创业板指
[1, -1, 0, 0, 0], # 观点2:沪深300看多,中证500看空
[0, 0, 0, 1, 0] # 观点3:100% 国债指数
])
# 设置观点置信度(基于研究员信心)
confidence_levels = [0.6, 0.7, 0.8] # 60%, 70%, 80%置信度
omega = np.diag([(1/c) - 1 for c in confidence_levels])python完整实现#
class BlackLittermanModel:
"""
Black-Litterman模型完整实现
"""
def __init__(self, returns_data, market_weights, risk_aversion=2.5, tau=0.05):
self.returns = returns_data
self.weights = market_weights
self.risk_aversion = risk_aversion
self.tau = tau
# 计算协方差矩阵
self.cov_matrix = estimate_covariance(returns_data)
# 计算市场均衡预期收益率
self.pi = reverse_optimization(market_weights, self.cov_matrix, risk_aversion)
def add_view(self, P, Q, confidence=None):
"""
添加投资者观点
Parameters:
-----------
P : np.array, 观点映射矩阵
Q : np.array, 观点收益向量
confidence : np.array, 观点置信度(0-1)
"""
self.P = P
self.Q = Q
if confidence is not None:
# 根据置信度计算观点不确定性
self.omega = np.diag([(1/c) - 1 for c in confidence])
else:
# 默认:观点不确定性正比于P * tau * Sigma * P'
self.omega = np.diag(np.diag(self.tau * P @ self.cov_matrix @ P.T))
def compute_posterior(self):
"""
计算后验预期收益率和协方差
"""
if not hasattr(self, 'P'):
raise ValueError("请先添加投资观点")
# Black-Litterman公式
M_inv = np.linalg.inv(self.tau * self.cov_matrix) + \
self.P.T @ np.linalg.inv(self.omega) @ self.P
M = np.linalg.inv(M_inv)
self.posterior_returns = M @ (
np.linalg.inv(self.tau * self.cov_matrix) @ self.pi +
self.P.T @ np.linalg.inv(self.omega) @ self.Q
)
self.posterior_cov = M @ (
self.P.T @ np.linalg.inv(self.omega) @ self.P +
np.linalg.inv(self.tau * self.cov_matrix)
) @ M
return self.posterior_returns, self.posterior_cov
def optimize_portfolio(self, risk_aversion=None):
"""
优化投资组合
"""
if not hasattr(self, 'posterior_returns'):
self.compute_posterior()
if risk_aversion is None:
risk_aversion = self.risk_aversion
optimal_weights = portfolio_optimization(
self.posterior_returns,
self.posterior_cov,
risk_aversion
)
return optimal_weights
# 使用示例
bl_model = BlackLittermanModel(returns_data, market_weights)
bl_model.add_view(P, Q, confidence_levels)
optimal_weights = bl_model.optimize_portfolio()
print("Black-Litterman优化权重:", optimal_weights)python模型优势与局限性#
优势#
1. 稳健性
- 以市场均衡为锚,避免极端权重
- 参数敏感性显著降低
- 样本外表现更稳定
2. 灵活性
- 支持绝对和相对观点
- 可表达不确定性
- 易于整合定性判断
3. 直观性
- 观点直接映射到预期收益率
- 权重变化可解释
- 便于与投委会沟通
局限性#
1. 参数选择主观性
- τ(缩放因子)的选择缺乏客观标准
- 观点置信度依赖主观判断
- 风险厌恶系数需要校准
2. 假设约束
- 假设收益率服从多元正态分布
- 市场均衡组合可能非有效
- 观点独立性假设可能不成立
3. 实施复杂度
- 需要估计高维协方差矩阵
- 观点构建需要领域知识
- 计算成本高于传统方法
实用建议#
1. 观点构建原则#
数量控制
- 建议不超过资产数的1/3
- 聚焦最重要、最有信心的判断
- 避免”观点过载”
置信度设定
- 基于历史准确率设定
- 区分”强观点”(高置信度)和”弱观点”
- 定期回顾校准
2. 参数调优#
τ的选择
- 经典值:0.05 ~ 0.10
- 观点信心强:减小τ
- 观点信心弱:增大τ
风险厌恶系数
- 年轻投资者:2 ~ 3
- 中老年投资者:3 ~ 5
- 机构投资者:1 ~ 2
3. 模型组合#
与风险平价结合
最终权重 = α * BL权重 + (1-α) * 风险平价权重plaintext与因子模型结合
- 用因子暴露约束组合
- 在BL框架下融入因子观点
- 多维优化
总结#
Black-Litterman模型是资产配置领域的重要创新,它巧妙地解决了传统均值方差优化的痛点。通过将市场均衡与投资者观点相结合,模型既保持了理论的严谨性,又兼顾了实践的灵活性。
关键要点:
- ✅ 以市场组合为基准,避免”从零开始”的预测困境
- ✅ 允许表达相对观点,降低预测难度
- ✅ 通过贝叶斯框架量化观点不确定性
- ✅ 输出稳健的资产配置方案
对于中国投资者,Black-Litterman模型尤其适合:
- 机构投资者(保险、养老金、FOF)
- 多资产配置策略
- 需要融合定性判断的量化框架
下一步学习:
- 探索He-Litterman(1999)的置信度设定方法
- 研究动态Black-Litterman(时变观点)
- 结合机器学习优化观点生成
推荐阅读:
- He, G., & Litterman, R. (1999). The Intuition Behind Black-Litterman Model Portfolios
- Idzorek, T. M. (2005). A Step-by-Step Guide to the Black-Litterman Model
- Satchell, S., & Scowcroft, A. (2000). A Demystification of the Black–Litterman Model
希望这篇文章帮助你理解Black-Litterman模型的原理与实战。如果有任何问题或想要深入讨论,欢迎在评论区留言!