3、投资组合理论回顾:马科维茨均值-方差模型,有效前沿,夏普比率,最大回撤,这些指标在RL中怎么用?
说实话,很多做强化学习交易的朋友,一上来就撸PPO、DDPG,结果策略跑出来收益曲线跟过山车似的。我见过不少团队,模型在回测里赚得飞起,一上实盘就崩了。为什么?因为连最基础的投资组合理论都没吃透。
今天咱们就把马科维茨那套老古董翻出来,看看它跟强化学习到底怎么结合。别觉得过时,这些指标在RL里用好了,能帮你少踩很多坑。
3.1 均值-方差模型:RL的“风险预算”
马科维茨的核心思想其实很简单:别把所有鸡蛋放一个篮子里。但怎么放?他给出了数学框架——用均值代表收益,用方差代表风险。
公式长这样:
最大化: μ_p - λ * σ_p²
其中:
μ_p = w^T * μ (组合预期收益)
σ_p² = w^T * Σ * w (组合方差)
w = 权重向量
λ = 风险厌恶系数
在RL里怎么用?我个人习惯把方差项直接塞进奖励函数。比如你训练一个DQN做仓位管理,奖励不能只看收益率,得把波动率也惩罚进去。
核心思路:RL的奖励函数 = 预期收益 - λ * 组合方差
λ越大,策略越保守。我一般从0.5开始调,效果不好再往上加。
举个例子。我之前做过一个A股日频调仓的RL项目,一开始奖励函数只设了收益率,结果模型学会了全仓追涨停板——回测收益漂亮,但最大回撤直接干到40%。后来我把组合方差加进去,λ设成1.0,策略立马老实了,回撤控制在15%以内。
3.2 有效前沿:RL的“帕累托边界”
有效前沿就是那条曲线——给定风险水平下,能拿到的最高收益。说白了,你不可能既要高收益又要低风险,得做个取舍。
在RL里,有效前沿帮我们解决一个关键问题:策略的“风险偏好”怎么定?
我建议的做法是:
- 先离线计算有效前沿:用历史数据算出不同风险水平下的最优组合
- 把前沿作为基准:RL策略的收益-风险点,应该落在前沿附近或上方
- 动态调整λ:市场波动大时,提高λ让策略更保守
避坑指南:我曾经犯过一个错——直接用有效前沿的权重作为RL的初始动作。结果模型学了半天,发现最优解跟前沿差很远。后来才明白,有效前沿是静态的,而RL面对的是动态市场。正确做法是把前沿作为约束条件,而不是目标。
下面这张图展示了有效前沿与RL策略的关系:
3.3 夏普比率:RL的“性价比指标”
夏普比率 = (组合收益 - 无风险利率) / 组合标准差。说白了就是每承担一单位风险,能多赚多少钱。
这个指标在RL里太好用了。我通常把它作为训练过程中的监控指标,而不是直接放进奖励函数。为什么?因为夏普比率是比率值,直接优化容易导致数值不稳定。
| 指标 | RL中的用法 | 我的经验 |
|---|---|---|
| 夏普比率 | 监控指标,评估策略质量 | 夏普 > 1.5 才算合格 |
| 最大回撤 | 奖励函数惩罚项 | 回撤 > 20% 直接终止训练 |
| 卡玛比率 | 替代夏普,更关注回撤 | 适合保守型策略 |
注意:夏普比率有个坑——它假设收益是正态分布的。但金融数据经常有肥尾效应。我见过一个策略夏普高达2.8,结果一次黑天鹅事件直接爆仓。所以别只看夏普,得结合最大回撤一起看。
3.4 最大回撤:RL的“止损线”
最大回撤 = (峰值 - 谷值) / 峰值。它衡量的是从最高点跌到最低点的最大幅度。
在RL里,我强烈建议把最大回撤作为硬约束。具体做法:
- 奖励函数里加回撤惩罚:当前回撤超过阈值,奖励直接扣分
- 训练过程中监控:回撤超过20%,自动降低学习率或暂停训练
- 回测时做压力测试:模拟极端行情,看策略回撤能否控制在目标范围内
我记得有个项目,训练一个多资产配置的RL模型。一开始没管回撤,模型学会了在牛市中满仓,熊市中空仓——听起来很完美对吧?但问题是,模型判断牛熊有延迟,每次切换都会造成10%以上的回撤。后来我把回撤惩罚加进奖励函数,模型才学会平滑过渡。
3.5 这些指标在RL中的整合框架
说了这么多,到底怎么把这些指标整合进RL框架?我给出一个通用模板:
class PortfolioRLEnv:
def __init__(self, lambda_risk=1.0, max_drawdown_limit=0.2):
self.lambda_risk = lambda_risk
self.max_drawdown_limit = max_drawdown_limit
self.peak_value = 1.0
def get_reward(self, portfolio_return, portfolio_vol):
# 1. 基础收益
reward = portfolio_return
# 2. 风险惩罚(均值-方差)
reward -= self.lambda_risk * portfolio_vol ** 2
# 3. 回撤惩罚
current_drawdown = self._calc_drawdown()
if current_drawdown > self.max_drawdown_limit:
reward -= 10.0 # 硬惩罚
# 4. 夏普比率监控(不参与梯度计算)
self.sharpe_ratio = portfolio_return / portfolio_vol
return reward
我的建议:别一上来就搞复杂。先只用均值-方差做奖励函数,跑通后再加回撤惩罚。夏普比率先当监控指标,等策略稳定了再考虑优化它。一步一步来,比什么都强。
最后说一句,这些传统指标不是用来替代RL的,而是给RL提供先验知识。你想想看,一个啥都不懂的RL智能体,要从零开始学会风险管理,得花多少时间?但如果你把马科维茨的框架作为初始指导,模型学起来就快多了。
嗯,今天就聊到这儿。下一节咱们会把这些理论落地到代码里,手撸一个完整的RL投资组合环境。