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里,有效前沿帮我们解决一个关键问题:策略的“风险偏好”怎么定?

我建议的做法是:

  1. 先离线计算有效前沿:用历史数据算出不同风险水平下的最优组合
  2. 把前沿作为基准:RL策略的收益-风险点,应该落在前沿附近或上方
  3. 动态调整λ:市场波动大时,提高λ让策略更保守

避坑指南:我曾经犯过一个错——直接用有效前沿的权重作为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投资组合环境。


专注资料整理