3、投资组合理论基础:Markowitz均值-方差模型、有效前沿、风险与收益的权衡
说到量化投资,绕不开的一个名字就是哈里·马科维茨。他提出的均值-方差模型,可以说是现代投资组合理论的基石。我个人觉得,理解了这个模型,你才算真正入了投资的门。
说白了,这个模型解决了一个核心问题:鸡蛋到底该怎么放? 是放在一个篮子里,还是分散到多个篮子里?分散之后,收益和风险会怎么变?
3.1 均值-方差模型:收益与风险的数学刻画
马科维茨用两个统计量来刻画投资组合:
- 均值(Expected Return):代表组合的预期收益。说白了,就是你期望能赚多少钱。
- 方差(Variance):代表组合的风险。方差越大,收益的波动越剧烈,风险也就越高。
模型的核心假设是:投资者都是理性的,既追求高收益,又厌恶高风险。 所以,我们要在给定风险下最大化收益,或者在给定收益下最小化风险。
核心公式:
组合预期收益:E(Rp) = Σ wi * E(Ri)
组合方差:σp² = Σ Σ wi * wj * Cov(Ri, Rj)
其中,wi 是资产 i 的权重,E(Ri) 是资产 i 的预期收益,Cov(Ri, Rj) 是资产 i 和 j 的协方差。
嗯,这里要注意,协方差是个关键。它衡量的是两个资产之间的联动性。如果两个资产同涨同跌,协方差为正;如果一个涨一个跌,协方差为负。负相关的资产放在一起,能有效降低组合的整体风险。
我在项目中遇到过不少新手,上来就想着找高收益的资产,完全忽略了它们之间的相关性。结果组合里全是同涨同跌的股票,一遇到市场回调,回撤大得吓人。
3.2 有效前沿:最优组合的集合
有了均值-方差模型,我们就可以画出所有可能的投资组合。这些组合在风险-收益平面上,会形成一个类似子弹形状的区域。这个区域的边界,就是有效前沿(Efficient Frontier)。
有效前沿上的每一个点,都代表一个最优组合。什么意思?就是在给定风险水平下,收益最高的组合;或者在给定收益水平下,风险最低的组合。有效前沿以外的点,都是次优的。
避坑指南: 我曾经犯过一个错误,就是只盯着有效前沿上的一个点,以为那就是最好的。后来发现,不同的投资者风险偏好不同,适合的点也不同。保守的投资者应该选前沿左侧的点,激进的投资者可以选前沿右侧的点。没有绝对的最优,只有最适合自己的。
你想想看,有效前沿的形状是凸的,这说明了什么?说明随着风险的增加,收益的增加速度是递减的。也就是说,你想多赚一点收益,需要承担越来越多的风险。这就是风险与收益的权衡。
3.3 风险与收益的权衡:没有免费的午餐
有效前沿直观地告诉我们:天下没有免费的午餐。 想获得更高的收益,就必须承担更高的风险。但反过来,承担高风险,不一定能获得高收益。你可能会踩到地雷,血本无归。
所以,投资的关键不是追求最高的收益,而是找到风险与收益的平衡点。这个平衡点因人而异,取决于你的风险承受能力、投资目标和时间 horizon。
我个人习惯用夏普比率(Sharpe Ratio)来衡量这个平衡。夏普比率 = (组合收益 - 无风险收益) / 组合风险。它衡量的是每单位风险能带来多少超额收益。夏普比率越高,说明组合的性价比越高。
注意: 有效前沿是基于历史数据计算出来的。历史不代表未来。市场环境会变,资产的相关性也会变。所以,有效前沿只是一个参考,不能完全依赖它来做投资决策。我建议定期重新计算,动态调整组合。
3.4 知识体系与核心逻辑
下面这张图,我用 SVG 画了一下,帮你梳理本章的核心逻辑。从均值-方差模型出发,到有效前沿,再到风险收益权衡,最后落到实际应用。
3.5 实际应用:用 Python 计算有效前沿
光说不练假把式。下面我用 Python 演示一下,如何计算并画出有效前沿。代码很简单,但很实用。
import numpy as np
import matplotlib.pyplot as plt
# 假设有三只股票:A, B, C
returns = np.array([0.12, 0.15, 0.10]) # 预期收益
cov_matrix = np.array([
[0.10, 0.02, 0.01],
[0.02, 0.15, 0.03],
[0.01, 0.03, 0.08]
]) # 协方差矩阵
# 生成随机权重
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_risk = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
results[0, i] = portfolio_return
results[1, i] = portfolio_risk
results[2, i] = portfolio_return / portfolio_risk # 夏普比率
# 画出散点图
plt.figure(figsize=(10, 6))
plt.scatter(results[1, :], results[0, :], c=results[2, :], cmap='viridis', alpha=0.5)
plt.colorbar(label='Sharpe Ratio')
plt.xlabel('Risk (Standard Deviation)')
plt.ylabel('Return')
plt.title('Efficient Frontier')
plt.grid(True)
plt.show()
运行这段代码,你会看到一张散点图。图中颜色越亮的点,夏普比率越高。这些点形成的上边界,就是有效前沿。你可以看到,有效前沿上的点,确实是在相同风险下收益最高的。
小技巧: 在实际项目中,我一般不会只用历史数据算一次有效前沿。我会用滚动窗口的方式,比如每季度重新计算一次,然后动态调整权重。这样能更好地适应市场变化。
好了,这一章的内容就到这里。记住,投资组合理论的核心就是:分散投资,平衡风险与收益。 别想着靠一两只股票暴富,那跟赌博没什么区别。