3、投资组合理论:马科维茨均值-方差模型;有效前沿与资本配置线

聊到量化投资,有个东西绕不过去——马科维茨的均值-方差模型。说实话,这玩意儿是现代投资组合理论的基石。我当年刚入行时,觉得它就是个数学公式,直到真拿真金白银去配仓位,才发现里面的门道深着呢。

3.1 核心思想:别把鸡蛋放一个篮子里

马科维茨在1952年提出了一个很朴素的想法:投资组合的风险,不是单个资产风险的简单相加。你想想看,如果两个资产走势相反,一个涨一个跌,组合起来是不是就平滑多了?

他用数学语言把这个直觉给量化了。核心就两个指标:

  • 期望收益率:说白了就是未来能赚多少
  • 方差(或标准差):衡量收益的波动,也就是风险

我习惯把方差理解成「心跳指数」。波动越大,你的心脏越受不了。嗯,这里要注意,高收益往往伴随着高波动,但通过组合,你可以在不降低收益的情况下,把波动降下来。

3.2 数学表达:其实没那么可怕

先看一个最简单的两资产组合。假设你有资产A和资产B,权重分别是 w₁ 和 w₂(加起来等于1)。那么:

组合收益率:R_p = w₁R₁ + w₂R₂
组合方差:σ²_p = w₁²σ²₁ + w₂²σ²₂ + 2w₁w₂σ₁σ₂ρ₁₂

这里 ρ₁₂ 是相关系数,取值范围在 -1 到 1 之间。我刚开始做策略时,总忽略这个相关系数,结果组合出来的效果跟单押一个资产差不多。后来学乖了——相关系数越低,分散化效果越好

关键洞察:当 ρ = -1 时,理论上可以构造出零风险的组合。但现实中,你几乎找不到完全负相关的资产。我做过A股和国债的相关性分析,大概在 -0.2 到 0.1 之间晃悠,已经算不错的对冲了。

3.3 有效前沿:那条漂亮的曲线

把不同权重的组合画在风险-收益图上,你会得到一堆点。这些点的外包络线,就是有效前沿

有效前沿上的每一个点,都代表一个「最优组合」——在给定风险下收益最高,或者在给定收益下风险最低。前沿下方的点,都是可以被优化的「垃圾组合」。

我曾经帮一个私募朋友调仓,发现他的组合就在有效前沿下面。我问他:「你这组合风险跟前沿上的差不多,但收益少了两个点,图啥?」他挠挠头说没算过。嗯,这就是理论指导实践的意义。

3.4 资本配置线:加入无风险资产

光有风险资产还不够。现实中,我们还有国债、银行存款这类无风险资产。把无风险资产和有效前沿上的某个组合搭配起来,就得到了资本配置线(CAL)

公式很简单:

R_p = R_f + ( (R_m - R_f) / σ_m ) * σ_p

其中 R_f 是无风险利率,R_m 和 σ_m 是市场组合的收益和风险。这条线的斜率,就是夏普比率——衡量每单位风险能换来多少超额收益。

我的习惯:做资产配置时,我一般先算出有效前沿,然后找那条与无风险利率相切的线。切点对应的组合,就是理论上最优的「市场组合」。剩下的,就是根据你的风险偏好,在无风险资产和这个组合之间分配资金。

3.5 一张图看懂全局

下面这张SVG图,把整个知识体系串起来了。你可以看到有效前沿、资本配置线、以及它们之间的关系。

马科维茨投资组合理论核心框架 风险(标准差 σ) 收益(期望 R) 可行集(所有可能组合) 有效前沿 R_f 资本配置线(CAL) M(最优市场组合) 斜率 = 夏普比率 有效前沿 资本配置线 市场组合

3.6 实战中的避坑指南

理论很丰满,现实很骨感。我踩过不少坑,分享几个给你:

我曾经犯过的错:

  • 过度依赖历史数据:用过去三年的收益率去算期望,结果市场风格一变,有效前沿直接漂移。我现在会结合宏观因子做情景分析。
  • 忽略交易成本:理论上最优组合可能要求你频繁调仓,但手续费和冲击成本会吃掉收益。我一般会加一个「调仓惩罚项」。
  • 相关系数不稳定:你以为两个资产是低相关的,结果危机一来,所有资产一起跌。这就是所谓的「相关性危机」。我习惯在压力测试场景下重新算一遍。

3.7 一个简单的Python示例

光说不练假把式。下面是我常用的一个计算有效前沿的代码片段,你可以拿去跑跑看:

import numpy as np
import matplotlib.pyplot as plt

# 假设三个资产的预期收益率和协方差矩阵
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]
])

# 生成随机权重
num_portfolios = 10000
results = np.zeros((3, num_portfolios))

for i in range(num_portfolios):
    weights = np.random.random(3)
    weights /= np.sum(weights)
    
    portfolio_return = np.dot(weights, returns)
    portfolio_std = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
    
    results[0,i] = portfolio_return
    results[1,i] = portfolio_std
    results[2,i] = portfolio_return / portfolio_std  # 夏普比率

# 找出有效前沿(这里简化处理,实际需用优化算法)
max_sharpe_idx = np.argmax(results[2])
print(f"最大夏普比率组合:收益={results[0,max_sharpe_idx]:.4f}, 风险={results[1,max_sharpe_idx]:.4f}")

我的建议:跑代码时,多试试不同的资产数量。3个资产和30个资产,有效前沿的形状差别很大。资产越多,前沿越往左上方移动——这就是分散化的力量。

3.8 小结

马科维茨的均值-方差模型,说白了就是帮你回答两个问题:「我能赚多少?」「我可能亏多少?」。有效前沿告诉你最优的资产配比,资本配置线帮你加入无风险资产做最终决策。

嗯,这套理论虽然有点年头了,但至今仍是量化投资组合的起点。我每次做策略,都会先跑一遍这个框架,心里才有底。至于更复杂的动态调整、因子模型,那都是在这个基础上的延伸了。


专注资料整理