第二章:组合管理基础——现代投资组合理论(MPT)、均值-方差优化、有效前沿与资本市场线、组合风险度量(VaR、CVaR)

各位同学,欢迎来到组合对冲管理的第一堂硬核课。

今天我们要聊的,是整个量化对冲领域的“地基”——现代投资组合理论。说白了,就是解决一个最朴素的问题:钱该怎么配,才能在风险可控的前提下,赚得更多?

我当年刚入行时,觉得这东西就是一堆数学公式,没啥用。直到有一次,我帮一个私募朋友做归因分析,发现他重仓的几只股票相关性极高,市场一回调,净值直接腰斩。嗯,从那以后,我再也不敢小瞧MPT了。

核心观点:不要把所有鸡蛋放在一个篮子里,但更重要的是——你得知道哪些篮子会一起碎。

2.1 现代投资组合理论(MPT)——马科维茨的智慧

MPT是哈里·马科维茨在1952年提出的。他因此拿了诺贝尔奖。为什么?因为他用数学证明了“分散投资”的价值。

MPT的核心假设其实很简单:

  • 投资者是理性的,追求收益最大化,风险最小化。
  • 所有资产收益服从正态分布(嗯,现实中这假设经常被打破,后面会讲)。
  • 投资者只关心收益的均值和方差。

我个人习惯把MPT理解为“用数学语言描述直觉”。你想想看,如果你买了两只股票,一只涨一只跌,整体波动是不是就变小了?MPT就是量化了这个过程。

避坑指南:我曾经在实盘中过度依赖MPT,结果发现它忽略了尾部风险。2008年金融危机时,很多看似不相关的资产突然一起暴跌。所以,MPT是起点,不是终点。

2.2 均值-方差优化——数学之美与实战之痛

均值-方差优化,是MPT的核心工具。它的目标很简单:在给定风险水平下,最大化预期收益;或者在给定收益目标下,最小化风险。

数学上,我们这样表达:

目标函数:min σ² = wᵀ Σ w
约束条件:wᵀ μ = μ_target
          Σ w_i = 1
          w_i ≥ 0 (不允许做空)

其中,w是权重向量,Σ是协方差矩阵,μ是预期收益向量。

听起来很完美,对吧?但我在项目中遇到过一个大坑:协方差矩阵的估计极其不稳定。你用过去一年的数据算出来的协方差,和用过去三个月算出来的,结果可能天差地别。

注意:均值-方差优化对输入参数极其敏感。稍微改变一点预期收益,最优权重就会剧烈变化。这就是所谓的“误差放大”效应。我建议你至少做一下稳健性检验。

下面是一个简单的Python实现示例,帮你理解这个过程:

import numpy as np
import pandas as pd
from scipy.optimize import minimize

# 假设我们有3只资产
returns = np.array([0.12, 0.08, 0.15])  # 预期年化收益
cov_matrix = np.array([
    [0.10, 0.02, 0.04],
    [0.02, 0.08, 0.01],
    [0.04, 0.01, 0.12]
])  # 协方差矩阵

def portfolio_variance(weights):
    return weights.T @ cov_matrix @ weights

# 约束:权重和为1,且不做空
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bounds = tuple((0, 1) for _ in range(3))

# 初始猜测
init_guess = [1/3, 1/3, 1/3]

# 优化
result = minimize(portfolio_variance, init_guess, 
                  method='SLSQP', bounds=bounds, 
                  constraints=constraints)

print("最优权重:", result.x)
print("最小方差:", result.fun)

你看,代码本身并不复杂。但真正的难点在于:你输入的预期收益和协方差,到底靠不靠谱?

2.3 有效前沿与资本市场线——寻找最优解

有效前沿,是所有最优组合的集合。说白了,就是一条曲线,上面每个点都代表一个“在给定风险下收益最高”的组合。

资本市场线(CML),则是在引入无风险资产后,从无风险利率出发,与有效前沿相切的那条直线。切点就是“市场组合”。

我画了一张图,帮你直观理解:

风险(标准差) 预期收益 Rf M 有效前沿 资本市场线 无风险利率

从图上你可以看到:有效前沿上的任何一点,都比内部的点更优。而引入无风险资产后,CML上的组合又比有效前沿上的组合更优——因为你可以用无风险利率借贷,调整风险暴露。

实战经验:我建议你在做资产配置时,不要只盯着有效前沿上的一个点。而是选一个“区域”——比如风险在10%-15%之间的所有组合,然后结合你的主观判断来定。这样更稳健。

2.4 组合风险度量——VaR与CVaR

均值-方差框架用标准差度量风险,但标准差有个问题:它假设收益是对称的。现实中,很多资产收益是左偏的(也就是暴跌的概率比暴涨大)。

这时候,VaR(在险价值)和CVaR(条件在险价值)就派上用场了。

2.4.1 VaR——最坏情况下的损失

VaR的定义很简单:在给定置信水平下,未来一段时间内的最大可能损失。比如,95%的VaR是100万,意思就是:有95%的把握,你的损失不会超过100万。

计算VaR有三种常用方法:

  • 参数法:假设收益服从正态分布,直接用均值和标准差算。
  • 历史模拟法:用过去的数据直接排序,取第5%的分位数。
  • 蒙特卡洛模拟法:随机生成大量路径,统计损失分布。

我个人最常用的是历史模拟法,因为它不需要假设分布。但要注意:历史不会简单重复。我曾在2015年股灾前用历史模拟法算VaR,结果严重低估了风险——因为过去10年都没出现过那么大的波动。

import numpy as np

# 假设我们有1000天的历史收益率数据
np.random.seed(42)
historical_returns = np.random.normal(0.001, 0.02, 1000)

# 计算95% VaR(参数法)
confidence_level = 0.95
z_score = 1.645  # 对应95%置信水平
var_param = np.mean(historical_returns) - z_score * np.std(historical_returns)

# 计算95% VaR(历史模拟法)
var_hist = np.percentile(historical_returns, (1 - confidence_level) * 100)

print(f"参数法VaR(95%): {var_param:.4f}")
print(f"历史模拟法VaR(95%): {var_hist:.4f}")

2.4.2 CVaR——比VaR更保守

VaR有个致命缺陷:它只告诉你“最坏情况下的损失上限”,但没告诉你“一旦突破这个上限,损失会有多大”。

CVaR(也叫Expected Shortfall)弥补了这个缺陷。它计算的是:在损失超过VaR的条件下,平均损失是多少

举个例子:95% VaR是100万,95% CVaR是150万。意思就是:如果那5%的极端情况发生了,你的平均损失是150万。

重要提醒:巴塞尔协议III已经要求银行用CVaR替代VaR作为核心风险指标。如果你在做合规相关的风控,一定要用CVaR。

CVaR的计算也很直接:

# 计算95% CVaR(历史模拟法)
var_threshold = np.percentile(historical_returns, 5)
cvar = np.mean(historical_returns[historical_returns <= var_threshold])

print(f"CVaR(95%): {cvar:.4f}")

你看,CVaR的值通常比VaR更“难看”,但它更真实地反映了尾部风险。

2.5 本章小结——把这些工具串起来

好了,我们来捋一捋今天的内容:

  • MPT给了我们一个理论框架:分散投资可以降低风险。
  • 均值-方差优化是具体实现工具,但要注意输入参数的敏感性。
  • 有效前沿和CML帮我们找到最优组合的位置。
  • VaR和CVaR是更实用的风险度量工具,尤其适合处理尾部风险。

我个人习惯在实战中这样用:先用均值-方差优化生成几个候选组合,然后用CVaR做压力测试,最后结合市场环境做主观调整。记住:模型是辅助,不是决策者

一句话总结:MPT教你如何分散,VaR/CVaR教你如何防范最坏情况。两者结合,才是完整的组合管理。

下一章,我们会深入讨论对冲策略的具体构建。但今天这些基础,是绕不开的。建议你动手跑一下上面的代码,感受一下协方差矩阵变化对最优权重的影响。


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