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 实践中的注意事项

理论讲完了。说说我在实战中踩过的坑:

  1. 参数估计误差——你算出来的协方差矩阵,只是历史的一个快照。未来可能完全不一样。我习惯用收缩估计或者贝叶斯方法来平滑参数。
  2. 权重过于集中——有时候模型会把90%的权重给一个资产。这合理吗?从数学上看可能合理,但从风控角度看,太危险了。我一般会加权重约束,比如单资产不超过30%。
  3. 再平衡频率——有效前沿是静态的。但市场是动态的。你算出来的最优权重,过一个月可能就不是最优了。我习惯季度再平衡,太频繁了交易成本高,太慢了偏离度大。

一个真实的教训:我曾经用马科维茨模型做全球资产配置。模型算出来,应该重仓新兴市场。结果那年新兴市场暴跌30%。为什么?因为模型用的是过去5年的数据,那5年新兴市场表现太好了。模型把高收益当成了常态。从那以后,我学会了对输入参数做压力测试

好了,这一章的内容就到这里。现代投资组合理论是量化投资的基石。它教会我们一件事:投资不是选最好的资产,而是选最好的组合


公众号:蓝海资料掘金营,微信deep3321