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