第二章:金融基础回顾——投资组合理论、有效前沿、夏普比率、最大回撤
做量化投资,尤其是资产配置这一块,金融基础是绕不开的。很多人觉得这些理论太老,都是上世纪的东西了。但我个人习惯是,每次回看这些基础,都能发现新的感悟。说白了,现代投资组合理论就是整个量化配置的“地基”。地基不稳,上面盖的强化学习大楼再漂亮也得塌。
2.1 现代投资组合理论:别把鸡蛋放一个篮子里
这个道理其实很朴素。你想想看,如果你把所有钱都买一只股票,那这只股票跌停,你就直接“关灯吃面”了。马科维茨在1952年用数学把这件事说清楚了。他告诉我们:投资组合的收益是各资产收益的加权平均,但风险(方差)却不是简单的加权平均。
为什么?因为资产之间有相关性。有的资产同涨同跌,有的资产你涨我跌。利用这种相关性,我们可以在不降低预期收益的情况下,把风险降下来。
我记得刚入行时,有个老交易员跟我说:“小伙子,分散化是投资里唯一的‘免费午餐’。”我当时半信半疑。直到我在项目中遇到过一回,重仓了某行业的两只龙头股,结果行业政策一收紧,两只票一起腰斩。嗯,从那以后,我对“分散化”这三个字有了刻骨铭心的理解。
组合预期收益:E(Rp) = Σ wi × E(Ri)
组合方差:σp2 = ΣΣ wi wj σi σj ρij
其中 wi 是权重,σi 是标准差,ρij 是相关系数。
2.2 有效前沿:最优配置的“天花板”
有了上面的公式,我们就可以做一件事:在给定风险水平下,找收益最大的组合;或者在给定收益水平下,找风险最小的组合。把所有这样的“最优组合”连成一条线,就是有效前沿。
有效前沿是一条凸向原点的曲线。在这条曲线下方的点,都是“次优”的——你承担了同样的风险,却拿到了更低的收益。曲线右上方的点,对不起,在现有资产条件下你做不到。
我个人习惯用Python来画这条线。代码其实不复杂,核心就是蒙特卡洛模拟或者凸优化。
import numpy as np
import matplotlib.pyplot as plt
# 假设有3个资产,给定预期收益、标准差和相关系数矩阵
# 这里只展示核心逻辑
def simulate_portfolios(mean_returns, cov_matrix, num_portfolios=10000):
results = np.zeros((3, num_portfolios))
for i in range(num_portfolios):
weights = np.random.random(len(mean_returns))
weights /= np.sum(weights)
portfolio_return = np.dot(weights, mean_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 # 夏普比率
return results
画出来之后,你会看到一堆散点,有效前沿就是这些散点的上边界。我曾经用这个框架给一个客户做FOF配置,发现他现有的组合离有效前沿还有一段距离。调整之后,同样的风险,年化收益提升了将近2%。
2.3 夏普比率:收益与风险的“性价比”
有效前沿告诉我们哪些组合是“最优”的,但哪个组合“最好”?这时候就需要一个统一的评价指标。夏普比率就是干这个的。
夏普比率 = (组合收益 - 无风险利率) / 组合标准差
说白了,就是你每承担一单位风险,能拿到多少超额收益。这个值越高,说明这个投资“性价比”越好。
我建议大家在评估策略时,不要只看收益率。年化50%看起来很爽,但如果最大回撤是40%,夏普比率可能只有0.8,这其实是个很糟糕的策略。我个人习惯是,夏普比率低于1的策略,基本不会实盘跑。
| 夏普比率 | 评价 | 我的经验 |
|---|---|---|
| < 0.5 | 较差 | 基本不考虑,风险调整后收益太低 |
| 0.5 - 1.0 | 一般 | 可以观察,但需要进一步优化 |
| 1.0 - 2.0 | 良好 | 值得实盘,但要注意过拟合 |
| > 2.0 | 优秀 | 小心!可能是数据有误或者过拟合了 |
2.4 最大回撤:投资者的“心理底线”
最大回撤,就是从净值最高点跌到最低点的最大幅度。这个指标太重要了。为什么?因为回撤直接影响投资者的心态。
你想想看,一个策略年化收益30%,但最大回撤是50%。这意味着你投100万,最多的时候亏到只剩50万。这时候你还能淡定地持有吗?大部分人的答案是:不能。我见过太多人,在回撤最大的时候割肉离场,结果完美错过了后面的反弹。
最大回撤的计算很简单:
def max_drawdown(equity_curve):
# equity_curve 是净值序列
peak = np.maximum.accumulate(equity_curve)
drawdown = (equity_curve - peak) / peak
return np.min(drawdown)
在资产配置中,我习惯把最大回撤作为硬约束。比如,客户要求最大回撤不能超过15%,那我在做优化时,就会把回撤约束加进去。强化学习里的奖励函数,也可以把回撤惩罚写进去——这是后话了。
2.5 本章知识体系
下面这张图,是我自己梳理的本章知识结构。你可以把它当作一个“地图”,方便后续复习。
这四个概念,环环相扣。投资组合理论是基础,有效前沿是目标,夏普比率是评价标准,最大回撤是约束条件。后面我们用强化学习做资产配置,本质上就是在这些框架下,找到一个能动态适应市场变化的策略。
好了,金融基础就回顾到这里。这些东西看着简单,但真正用好并不容易。下一章,我们会正式进入强化学习的部分,看看怎么用智能体来帮我们做配置决策。