4. 最小方差组合:马科维茨均值-方差模型,最小方差组合的构建与优化
聊到低波动策略,有个概念绕不开——最小方差组合。
说白了,就是在所有可能的资产组合里,找到那个风险最低的点。你不需要预测市场涨跌,也不需要判断哪只股票会爆发。你只需要做一件事:让组合的波动尽可能小。
我刚开始做量化那会儿,总觉得这玩意儿太简单。不就是算个协方差矩阵,然后解个优化问题吗?后来真上了实盘才发现,坑比想象的多。嗯,咱们今天就把这块掰开揉碎讲清楚。
4.1 马科维茨均值-方差模型的核心思想
马科维茨老爷子在1952年提出了这个模型,拿了诺贝尔奖。核心逻辑其实就一句话:不要把所有鸡蛋放在一个篮子里。
但怎么放?他给出了数学框架:
- 用期望收益率衡量收益
- 用方差(或标准差)衡量风险
- 通过资产之间的协方差描述相关性
你想想看,如果两个资产涨跌完全相反,同时持有它们,整体波动就会被对冲掉。这就是分散化的力量。
核心公式:
组合方差 σ²p = wT Σ w
其中 w 是权重向量,Σ 是协方差矩阵。
最小方差组合,就是找到一组 w,让 σ²p 最小。
4.2 最小方差组合的构建步骤
构建过程其实不复杂,但每一步都有讲究。我习惯分四步走:
4.2.1 第一步:收集数据
你需要历史收益率数据。一般用日收益率,时间窗口我建议至少3年。太短了估计不准,太长了市场结构可能已经变了。
我在项目中遇到过一个问题:用5年数据回测效果很好,但实盘时发现协方差矩阵已经失效了。后来我改成滚动3年窗口,每季度更新一次,效果稳定很多。
4.2.2 第二步:估计协方差矩阵
这是最关键的步骤。直接用样本协方差矩阵?我劝你小心。
样本协方差矩阵有个毛病:当资产数量接近时间长度时,估计误差会爆炸。比如你有100只股票,只用120天的数据,那矩阵基本是噪声。
我的经验:
如果资产数量超过时间长度的一半,建议用收缩估计(Shrinkage)或者因子模型来降噪。我常用Ledoit-Wolf收缩法,简单有效。
4.2.3 第三步:求解优化问题
目标函数很简单:
min w' Σ w
s.t. sum(w) = 1
w_i ≥ 0 (如果限制做空)
这是个二次规划问题,Python里用scipy.optimize.minimize或者cvxopt都能解。
给你看段代码,我平时就是这么写的:
import numpy as np
from scipy.optimize import minimize
def min_variance_portfolio(cov_matrix):
n = cov_matrix.shape[0]
def objective(w):
return w.T @ cov_matrix @ w
constraints = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1})
bounds = [(0, 1) for _ in range(n)] # 限制做空
result = minimize(objective,
x0=np.ones(n)/n,
bounds=bounds,
constraints=constraints,
method='SLSQP')
return result.x
嗯,这里要注意:初始权重用等权,收敛会快很多。
4.2.4 第四步:验证与调整
算出来权重后,别急着用。先做几个检查:
- 最大权重是否超过20%?如果某只股票占比过高,说明协方差矩阵可能有问题
- 组合波动率是否明显低于各成分的加权平均波动率?如果没低多少,分散化效果不好
- 回测一下样本外表现,看看稳定性
4.3 最小方差组合的优化技巧
基础版本够用,但实战中我会加一些优化:
4.3.1 加入约束条件
纯数学解出来的权重,有时候很极端。比如某只股票权重99%,其他都是0。这在实际中没法用。
我一般加两个约束:
- 个股权重上限:比如不超过10%
- 行业权重上限:比如不超过30%
这样做出来的组合,既低波动,又足够分散。
4.3.2 使用稳健协方差估计
样本协方差对异常值非常敏感。2008年金融危机那会儿的数据,如果直接拿来用,估计出来的最小方差组合会过度配置在危机中跌幅小的资产上,但之后市场反弹时就会跑输。
我建议用MCD(Minimum Covariance Determinant)或者Huber估计,它们对异常值更鲁棒。
避坑指南:
我曾经用样本协方差矩阵做最小方差组合,回测漂亮得不行。结果实盘第一周就亏了2%。后来发现是因为协方差矩阵里有个极端值没处理,导致权重分配完全偏了。从那以后,我每次都会先做异常值检测。
4.3.3 考虑交易成本
最小方差组合的权重对协方差矩阵的变化很敏感。今天算出来一个权重,明天数据更新一点,权重可能就大变样。
频繁调仓会吃掉收益。我一般会加一个换手率惩罚项:
目标函数 = w' Σ w + λ * ||w - w_prev||_1
λ是惩罚系数,我习惯设0.001到0.01之间,具体看你的交易成本。
4.4 知识体系总览
下面这张图,是我梳理的最小方差组合核心逻辑。你看一眼就能明白整个框架:
4.5 实战中的注意事项
最后聊几个我踩过的坑:
| 问题 | 表现 | 我的解决方案 |
|---|---|---|
| 协方差矩阵不稳定 | 权重频繁大幅变动 | 使用收缩估计 + 滚动窗口 |
| 权重过于集中 | 某只股票占比超过30% | 加个股权重上限约束 |
| 样本外表现差 | 回测好,实盘差 | 做交叉验证,用不同时间段测试 |
| 忽略交易成本 | 频繁调仓吃掉收益 | 目标函数中加入换手率惩罚 |
说实话,最小方差组合是我个人最喜欢的策略之一。它不依赖预测,纯粹靠数学优化来降低风险。在震荡市里,它往往能跑赢大多数主动策略。
但记住一点:模型是死的,市场是活的。再好的模型,也需要结合你对市场的理解来调整。别迷信数学,也别忽视数学。
一个小建议:
刚开始做最小方差组合时,先用10-20只股票试水。等跑通了,再慢慢扩展到50只、100只。步子迈太大,容易扯着蛋。
公众号:蓝海资料掘金营,微信deep3321