探索现代投资组合理论的基石,掌握如何通过数学模型在复杂市场中寻找风险最低的资产配置方案。
在现代金融工程领域,最小方差组合(Minimum Variance Portfolio, MVP)是构建有效前沿(Efficient Frontier)的起点。哈里·马科维茨(Harry Markowitz)于 1952 年提出的这一理论,首次将“风险”量化为收益率的方差,奠定了定量投资的基石。其核心思想在于:通过分散化投资,利用资产间的相关性来降低非系统性风险。
在传统的单资产视角下,投资者往往只关注单一标的的预期收益率。然而,当我们将目光转向多资产组合时,关键在于理解资产间的协方差。如果两个资产的收益率走势完全正相关(相关系数为 1),那么无论怎么分配权重,都无法降低组合的整体波动;反之,若资产间存在负相关性,则能产生显著的“对冲效应”,使得组合的标准差低于单个资产标准差的加权平均值。
我们的目标是找到一个权重向量 w,使得组合的方差 σ²_p 达到全局最小值。这是一个典型的凸优化问题。
分散化的效果直接取决于资产间的相关系数 ρ。当 ρ < 1 时,分散化才能生效。这是最小方差组合能够存在的数学前提。
在这里,风险被严格定义为收益率围绕均值的离散程度(方差或标准差),而非本金亏损的可能性。这是一种统计意义上的风险度量。
要准确计算最小方差组合,我们需要建立严格的数学模型。假设市场中有 N 种风险资产,每种资产的权重向量为 w = [w₁, w₂, ..., wₙ]ᵀ,且满足权重之和为 1 的全投资约束。
组合的总方差并非各资产方差的简单加总,而是通过矩阵乘法表达:
| 符号 | 含义 | 维度 |
|---|---|---|
| σ²_p | 组合方差 | 标量 (1×1) |
| w | 权重向量 | N×1 |
| Σ | 协方差矩阵 | N×N |
组合方差的具体计算公式为:
σ²_p = wᵀ Σ w
其中,wᵀ 表示权重向量的转置。展开后即为所有两两资产协方差的加权和。
为了在约束条件 ∑w_i = 1 下最小化 σ²_p,我们引入拉格朗日乘数 λ。构建拉格朗日函数 L:
L(w, λ) = wᵀ Σ w - λ(wᵀ 1 - 1)
对 w 求导并令其为 0,得到一阶条件:
2Σw - λ1 = 0 ⇒ w = (λ/2) Σ⁻¹1
代入约束条件 1ᵀw = 1,可解出 λ 的值,最终得到最小方差组合的最优权重公式:
w_mvp = (Σ⁻¹ 1) / (1ᵀ Σ⁻¹ 1)
这个公式表明,最优权重与协方差矩阵的逆矩阵成正比。这意味着,资产之间的相关性结构决定了权重的分配方式。
上述公式假设允许卖空(权重可以为负)。如果在实际应用中禁止卖空(w_i ≥ 0),则必须使用二次规划(Quadratic Programming)算法进行数值求解,无法直接使用闭式解。
在实际操作中,Σ 是基于历史数据估算的。样本协方差矩阵可能存在噪声,因此常采用收缩估计(Shrinkage Estimation)等方法来提高预测精度。
理论公式虽然优美,但在处理大规模资产池时,手动计算几乎不可能。以下提供基于 Python 的完整实现逻辑,展示如何利用 NumPy 和 SciPy 库快速计算最小方差组合。
此方法适用于学术研究和简单的策略回测,直接套用上述推导公式。
import numpy as np
def calculate_min_variance_portfolio(cov_matrix):
"""
计算最小方差组合权重(允许卖空)
:param cov_matrix: N x N 协方差矩阵
:return: 权重向量 w
"""
n_assets = cov_matrix.shape[0]
ones_vector = np.ones(n_assets)
# 计算协方差矩阵的逆
inv_cov = np.linalg.inv(cov_matrix)
# 计算分母:1' Sigma^-1 1
denominator = np.dot(ones_vector.T, np.dot(inv_cov, ones_vector))
# 计算分子:Sigma^-1 1
numerator = np.dot(inv_cov, ones_vector)
# 得到权重
weights = numerator / denominator
return weights
示例数据模拟
np.random.seed(42)
assets = 5
生成一个随机对称正定矩阵作为协方差矩阵
A = np.random.rand(assets, assets)
cov_mat = np.dot(A, A.T) + np.eye(assets) 0.1
weights = calculate_min_variance_portfolio(cov_mat)
print("最优权重分布:", weights)
print("权重总和:", np.sum(weights))在现实基金管理中,通常不允许卖空。此时需要定义目标函数并使用 `minimize` 函数求解。
from scipy.optimize import minimize
def portfolio_variance(weights, cov_matrix):
return np.dot(weights.T, np.dot(cov_matrix, weights))
def min_variance_no_shorting(cov_matrix):
n_assets = cov_matrix.shape[0]
# 初始猜测:等权重
guess = np.array([1/n_assets] n_assets)
# 约束条件:权重之和为 1
constraints = {'type': 'eq', 'fun': lambda w: np.sum(w) - 1}
# 边界条件:每个权重在 0 到 1 之间(禁止卖空)
bounds = tuple((0, 1) for _ in range(n_assets))
# 执行优化
result = minimize(portfolio_variance, guess, args=(cov_matrix,),
method='SLSQP', bounds=bounds, constraints=constraints)
return result.x, result.fun
调用示例
opt_weights, opt_var = min_variance_no_shorting(cov_mat)
print("禁止卖空下的最优权重:", opt_weights)
print("对应的组合方差:", opt_var)尽管最小方差组合在数学上极其完美,但在实际投资中,它并非万能钥匙。以下是市场参与者普遍关注的几个关键问题。
马科维茨模型对输入参数(特别是预期收益率)极度敏感。微小的收益率预测偏差可能导致权重剧烈震荡(Error Maximization)。这也是为什么很多机构在使用该模型时,倾向于忽略预期收益率,仅依赖协方差矩阵来计算 MVP。
方差假设收益率服从正态分布,但在金融危机期间,资产往往呈现“肥尾”特征。最小方差组合可能在极端行情下失效,因为它没有考虑到偏度和峰度的影响。
最小方差点是有效前沿的最左端。对于保守型投资者,它是首选;但对于进取型投资者,他们更愿意承担略高的风险以换取更高的夏普比率。因此,MVP 只是整个资产配置图谱中的一个锚点。
当市场上存在无风险资产(如国债,收益率为 r_f)时,我们可以构建切点组合(Tangency Portfolio)。此时,最优组合不再是单纯的最小方差组合,而是由无风险资产和风险资产组成的资本配置线(CAL)上的某一点。此时的目标函数变为最大化夏普比率:
SHP = (E(R_p) - r_f) / σ_p
这标志着从单纯的风险最小化转向了风险调整后的收益最大化。