4. 现代投资组合理论:马科维茨模型、有效前沿、最小方差组合
这一章,我们来聊聊现代投资组合理论的核心。说白了,就是怎么把一堆资产组合在一起,让风险最小,收益最大。
我刚开始做量化的时候,觉得选股才是王道。后来踩过几次坑才明白——配置比选股更重要。你想想看,就算你选对了十只牛股,如果它们同涨同跌,一个黑天鹅就能把你打回原形。
4.1 马科维茨模型:一切从这里开始
1952年,一个叫哈里·马科维茨的小伙子发表了一篇论文。这篇论文后来让他拿了诺贝尔奖。核心思想其实很简单:不要把所有鸡蛋放在一个篮子里。
但马科维茨比这个朴素道理走得更远。他用数学证明了:组合的风险不是个股风险的简单加总。为什么?因为资产之间有相关性。
核心公式:组合方差
σ²p = w₁²σ₁² + w₂²σ₂² + 2w₁w₂Cov(r₁, r₂)
其中 w 是权重,σ² 是方差,Cov 是协方差。
这个公式看着有点吓人,其实道理很直白:
- 前两项是各自的风险贡献
- 最后一项是它们之间的互动
如果两只股票负相关,最后一项就是负的。组合风险反而变小了。这就是分散化的数学基础。
我的经验:我在做行业轮动策略时,发现一个常见误区——大家只盯着收益看,忽略了相关性。有一次我同时配了银行和地产,以为分散了。结果一查,两者相关系数0.85。嗯,这跟没分散差不多。
4.2 有效前沿:那条美丽的曲线
有了马科维茨模型,我们就可以做一件事:遍历所有可能的权重组合,画出风险和收益的关系图。
你会得到一堆点。这些点构成一个区域。区域的左上边界,就是有效前沿。
有效前沿的定义:
在给定风险水平下,能获得的最大收益;
或者在给定收益水平下,能承受的最小风险。
有效前沿上的每一个点,都是一个最优组合。前沿下方的点,都是次优的——要么收益不够高,要么风险太大。
我习惯用Python来画这条曲线。代码其实不复杂:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 假设我们有3个资产
returns = np.array([0.12, 0.08, 0.15]) # 年化收益
cov_matrix = np.array([
[0.04, 0.01, 0.02],
[0.01, 0.03, 0.005],
[0.02, 0.005, 0.06]
])
# 随机生成10000个组合
num_portfolios = 10000
results = np.zeros((3, num_portfolios))
for i in range(num_portfolios):
weights = np.random.random(3)
weights /= np.sum(weights)
port_return = np.dot(weights, returns)
port_vol = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
results[0, i] = port_return
results[1, i] = port_vol
results[2, i] = port_return / port_vol # 夏普比率
# 画图
plt.figure(figsize=(10, 6))
plt.scatter(results[1, :], results[0, :], c=results[2, :],
cmap='viridis', alpha=0.5)
plt.colorbar(label='夏普比率')
plt.xlabel('风险(标准差)')
plt.ylabel('预期收益')
plt.title('有效前沿')
plt.show()
跑完这段代码,你会看到一堆散点。左上边缘那条清晰的弧线,就是有效前沿。
注意:我曾经用历史数据回测,发现有效前沿在样本内很漂亮。但一到样本外,就完全变形了。为什么?因为协方差矩阵不稳定。所以,不要迷信历史数据算出来的前沿。它更多是提供一个思考框架,而不是精确的预测工具。
4.3 最小方差组合:最保守的选择
有效前沿上有一个特殊的点——最小方差组合。它是整条曲线上风险最小的那个点。
怎么找?很简单。在有效前沿上,最左边的那个点就是。它的数学表达是:
最小方差组合的权重:
w_min = (Σ⁻¹ · 1) / (1ᵀ · Σ⁻¹ · 1)
其中 Σ 是协方差矩阵,1 是全1向量。
这个公式看着复杂,但用代码实现就几行:
# 计算最小方差组合
inv_cov = np.linalg.inv(cov_matrix)
ones = np.ones(len(returns))
w_min = np.dot(inv_cov, ones) / np.dot(ones.T, np.dot(inv_cov, ones))
print("最小方差组合权重:", w_min)
print("组合收益:", np.dot(w_min, returns))
print("组合风险:", np.sqrt(np.dot(w_min.T, np.dot(cov_matrix, w_min))))
最小方差组合有什么特点?
- 风险最低——在所有可能的组合中,它的波动最小
- 收益也相对较低——风险和收益是孪生兄弟
- 对输入参数敏感——协方差矩阵稍微变一点,权重就大变样
避坑指南:我曾经在实盘里用最小方差组合做底仓。结果发现,它经常把大部分权重分配给低波动资产。比如债券、公用事业股。这本身没错。但问题是,当市场风格切换时,这种组合会跑输大盘很久。投资者容易拿不住。所以我的建议是:最小方差组合适合做核心配置,但别全仓。
4.4 知识体系总览
下面这张图,是我自己梳理的现代投资组合理论框架。你可以把它当作一个思维导图来看:
4.5 实践中的注意事项
理论讲完了。说说我在实战中踩过的坑:
- 参数估计误差——你算出来的协方差矩阵,只是历史的一个快照。未来可能完全不一样。我习惯用收缩估计或者贝叶斯方法来平滑参数。
- 权重过于集中——有时候模型会把90%的权重给一个资产。这合理吗?从数学上看可能合理,但从风控角度看,太危险了。我一般会加权重约束,比如单资产不超过30%。
- 再平衡频率——有效前沿是静态的。但市场是动态的。你算出来的最优权重,过一个月可能就不是最优了。我习惯季度再平衡,太频繁了交易成本高,太慢了偏离度大。
一个真实的教训:我曾经用马科维茨模型做全球资产配置。模型算出来,应该重仓新兴市场。结果那年新兴市场暴跌30%。为什么?因为模型用的是过去5年的数据,那5年新兴市场表现太好了。模型把高收益当成了常态。从那以后,我学会了对输入参数做压力测试。
好了,这一章的内容就到这里。现代投资组合理论是量化投资的基石。它教会我们一件事:投资不是选最好的资产,而是选最好的组合。
公众号:蓝海资料掘金营,微信deep3321