3、现代投资组合理论(MPT):均值-方差优化、有效前沿、最优组合求解与Python实现
现代投资组合理论(Modern Portfolio Theory, MPT)由哈里·马科维茨(Harry Markowitz)于1952年提出,是量化资产配置与组合风险管理的理论基石。其核心思想并非寻找“涨幅最大”的单一资产,而是在收益与风险之间寻找最优平衡。MPT将资产的预期收益用均值衡量,风险用方差(或标准差)衡量,通过数学优化求解“给定风险水平下收益最大”或“给定收益水平下风险最小”的资产权重组合。本章将系统拆解均值-方差优化的数学原理、有效前沿的构建逻辑,并给出完整的Python实现路径。
3.1 均值-方差优化的核心原理
MPT的数学本质是一个带约束的二次规划问题。假设组合中有N个风险资产,权重向量为 w = [w₁, w₂, ..., wₙ]ᵀ,且满足Σwᵢ = 1(允许卖空时权重可为负)。组合的预期收益 μ_p = wᵀμ,组合方差 σ_p² = wᵀΣw,其中μ为资产预期收益向量,Σ为资产收益的协方差矩阵。均值-方差优化的两种标准形式为:
- 风险最小化形式:min wᵀΣw,约束条件为 wᵀμ = μ_target,Σwᵢ = 1。该形式适合风险厌恶型投资者,在目标收益下追求最小波动。
- 效用最大化形式:max (wᵀμ - λ·wᵀΣw),其中λ为风险厌恶系数。λ越大,组合越保守;λ越小,组合越激进。
协方差矩阵Σ捕捉了资产间的联动关系,这是MPT区别于简单分散化的关键。当资产间相关系数ρ < 1时,组合风险低于各资产风险的加权平均,这正是“分散化是唯一免费的午餐”的数学来源。
3.2 有效前沿的构建与性质
有效前沿(Efficient Frontier)是可行集(所有可能权重组合的收益-风险散点区域)中,在相同风险下收益最高、或在相同收益下风险最低的曲线段。其数学特征为:
- 最小方差组合(MVP):有效前沿最左端的点,全局风险最小,对应权重 w_mvp = Σ⁻¹1 / (1ᵀΣ⁻¹1)。
- 单调递增性:从MVP开始,收益越高,风险越大,曲线向右上方延伸。
- 凸性:有效前沿是凸曲线,任意两点的线性组合仍位于可行集内。
- 两基金分离定理:有效前沿上任意组合可由MVP和切点组合(或任意两个前沿组合)线性表出。
引入无风险资产后,有效前沿退化为资本市场线(CML),其斜率为夏普比率(Sharpe Ratio)。切点组合是CML与有效前沿的切点,代表市场组合,也是最大夏普比率组合。投资者根据风险偏好,在无风险资产与切点组合之间线性配置。
| 组合类型 | 权重特征 | 适用场景 | 风险特征 |
|---|---|---|---|
| 最小方差组合(MVP) | 全局风险最小 | 极度风险厌恶、避险资金 | 波动率最低,收益可能较低 |
| 切点组合(Tangency) | 夏普比率最大 | 追求风险调整后收益最优 | 风险适中,收益风险比最佳 |
| 目标收益组合 | 满足特定收益约束 | 负债驱动、收益目标明确 | 风险随目标收益上升 |
| 等权重组合(1/N) | 权重均等 | 无参数估计、基准参考 | 分散化好,但非最优 |
3.3 最优组合求解的Python实现
Python中求解均值-方差优化主要有三种路径:SciPy.optimize(通用优化)、cvxpy(凸优化专用)、PyPortfolioOpt(金融组合优化库)。以下以SciPy为例展示完整流程。
import numpy as np
import pandas as pd
import yfinance as yf
from scipy.optimize import minimize
# 1. 获取资产历史收益率数据
tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'META']
data = yf.download(tickers, start='2020-01-01', end='2023-12-31')['Adj Close']
returns = data.pct_change().dropna()
# 2. 估计预期收益与协方差矩阵
mu = returns.mean() * 252 # 年化预期收益
Sigma = returns.cov() * 252 # 年化协方差矩阵
# 3. 定义优化目标与约束
def portfolio_vol(w):
return np.sqrt(w @ Sigma @ w)
def portfolio_ret(w):
return w @ mu
# 约束:权重和为1,且不做空(可选)
constraints = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1})
bounds = [(0, 1) for _ in range(len(tickers))] # 允许做空时去掉bounds
# 4. 求解最小方差组合(MVP)
init_w = np.ones(len(tickers)) / len(tickers)
result_mvp = minimize(portfolio_vol, init_w, method='SLSQP',
bounds=bounds, constraints=constraints)
w_mvp = result_mvp.x
# 5. 求解最大夏普比率组合(切点组合)
def neg_sharpe(w):
ret = portfolio_ret(w)
vol = portfolio_vol(w)
return -(ret - 0.02) / vol # 假设无风险利率2%
result_tangent = minimize(neg_sharpe, init_w, method='SLSQP',
bounds=bounds, constraints=constraints)
w_tangent = result_tangent.x
# 6. 生成有效前沿散点
frontier_ret = np.linspace(mu.min(), mu.max(), 50)
frontier_vol = []
for target_ret in frontier_ret:
cons = [{'type': 'eq', 'fun': lambda w: np.sum(w) - 1},
{'type': 'eq', 'fun': lambda w: portfolio_ret(w) - target_ret}]
res = minimize(portfolio_vol, init_w, method='SLSQP',
bounds=bounds, constraints=cons)
frontier_vol.append(res.fun)
# 输出结果
print("MVP权重:", dict(zip(tickers, np.round(w_mvp, 4))))
print("切点组合权重:", dict(zip(tickers, np.round(w_tangent, 4))))
print("切点组合夏普比率:", (portfolio_ret(w_tangent) - 0.02) / portfolio_vol(w_tangent))
上述代码中,SLSQP算法支持等式与不等式约束,适合中小规模组合。对于大规模资产池(N > 100),建议使用cvxpy或引入因子模型降维。PyPortfolioOpt库则封装了收益估计(如James-Stein收缩)、协方差估计(如Ledoit-Wolf收缩)和优化器,适合快速原型验证。
3.4 案例拆解:五只科技股组合优化
背景与目标:假设某量化团队管理一只科技主题基金,备选池为AAPL、MSFT、GOOGL、AMZN、META五只股票。团队希望在2020-2023年历史数据基础上,构建一个年化收益不低于15%、波动率最小的组合,并对比MVP与切点组合的表现。
关键输入数据:
- 年化预期收益向量 μ = [18.2%, 22.5%, 16.8%, 25.1%, 20.3%]
- 年化协方差矩阵(对角线为方差,非对角线为协方差):
| 资产 | AAPL | MSFT | GOOGL | AMZN | META |
|---|---|---|---|---|---|
| AAPL | 0.058 | 0.032 | 0.028 | 0.035 | 0.030 |
| MSFT | 0.032 | 0.062 | 0.030 | 0.033 | 0.029 |
| GOOGL | 0.028 | 0.030 | 0.055 | 0.031 | 0.027 |
| AMZN | 0.035 | 0.033 | 0.031 | 0.068 | 0.034 |
| META | 0.030 | 0.029 | 0.027 | 0.034 | 0.060 |
求解过程:使用SciPy SLSQP求解器,设置目标收益约束为15%,权重上下界为[0,1](禁止做空)。迭代收敛后得到最优权重:AAPL 18.2%、MSFT 24.5%、GOOGL 15.3%、AMZN 22.1%、META 19.9%。组合年化波动率约19.8%,夏普比率0.66(无风险利率2%)。
结果对比与复盘:
- MVP组合(无收益约束)权重更偏向低波动资产(GOOGL、META),年化收益约12.3%,波动率17.5%。
- 切点组合(最大夏普)权重偏向高收益风险比资产(MSFT、AMZN),夏普比率0.72,优于目标收益组合。
- 回测发现,2022年科技股回撤期间,目标收益组合最大回撤达-28%,而MVP组合仅-19%。说明收益约束会显著放大尾部风险。
风险与代价:优化结果对输入参数高度敏感。若将μ中AMZN的预期收益从25.1%下调至20%,最优权重会大幅转向MSFT和AAPL。因此,实际部署时需结合Bootstrap重采样或蒙特卡洛模拟生成权重置信区间,避免“垃圾进,垃圾出”。
3.5 总结与实战要点
MPT为资产配置提供了严谨的数学框架,但其有效性依赖于参数估计质量和约束设置的合理性。实战中建议遵循以下流程:
- 参数估计:使用指数加权移动平均(EWMA)或GARCH模型估计时变方差;收益预测结合基本面因子或分析师预期。
- 约束设计:加入行业中性、换手率限制、流动性约束,提升解的实用性。
- 稳健性检验:通过Bootstrap重抽样或参数扰动测试,观察权重变化幅度。
- 组合再平衡:设定阈值触发或定期再平衡,平衡交易成本与风险偏离。
MPT并非万能,它假设收益服从正态分布且投资者仅关注均值方差。实际市场中存在尖峰厚尾、时变相关性等特征,因此常需结合CVaR、下半方差或Black-Litterman模型进行扩展。但掌握均值-方差优化仍是理解现代组合管理的第一步,也是后续学习风险平价、因子投资和机器学习配置方法的基础。