Skip to content

投资组合优化中的RL

概述

投资组合优化 (Portfolio Optimization) 是金融学的核心问题之一。传统的 Markowitz 均值-方差模型 (Mean-Variance Model) 假设静态的单期决策,而强化学习 (RL) 将其拓展为动态的多期优化问题——在随时间变化的市场环境中,持续调整资产配置以最大化风险调整后的收益。本文探讨动态资产配置、风险约束、多目标 RL 以及 PPO/SAC 算法在投资组合管理中的应用。

动态资产配置 (Dynamic Asset Allocation)

MDP 建模

将投资组合管理形式化为 MDP:

状态空间

\[s_t = \left(w_t, r_{t-k:t}, \sigma_{t-k:t}, f_t\right)\]

其中 \(w_t \in \mathbb{R}^N\) 为当前资产权重,\(r\) 为历史收益率,\(\sigma\) 为波动率,\(f_t\) 为其他特征(如宏观指标、情感因子)。

动作空间

\[a_t = w_{t+1}^{\text{target}} \in \Delta^N = \left\{w \in \mathbb{R}^N : \sum_{i=1}^{N} w_i = 1, w_i \geq 0\right\}\]

即目标权重向量,约束在单纯形 (Simplex) 上。

奖励函数

\[r_t = \log\left(\frac{V_{t+1}}{V_t}\right) - \lambda \cdot \text{TC}_t\]

其中 \(V_t\) 为组合净值,\(\text{TC}_t\) 为交易成本:

\[\text{TC}_t = c \sum_{i=1}^{N} |w_{i,t+1}^{\text{target}} - w_{i,t}^{\text{actual}}|\]

奖励设计是核心

奖励函数的设计直接决定了 Agent 学到的策略风格。简单使用收益率作为奖励会导致高风险策略;加入波动率惩罚可引导 Agent 学习风险管理。

风险约束 (Risk Constraints)

约束 MDP (Constrained MDP, CMDP)

在标准 MDP 中加入风险约束:

\[\max_\pi \; \mathbb{E}\left[\sum_t \gamma^t r_t\right] \quad \text{s.t.} \; \mathbb{E}\left[\sum_t \gamma^t c_t\right] \leq d\]

其中 \(c_t\) 为风险代价函数(如最大回撤、VaR 违规),\(d\) 为风险预算。

常用风险约束

约束类型 形式化 经济含义
波动率约束 \(\sigma_p \leq \bar{\sigma}\) 限制组合波动率
VaR 约束 \(\text{VaR}_\alpha \leq L\) 限制尾部损失
最大回撤 \(\text{MDD} \leq D\) 限制最大回撤
集中度约束 \(\max_i w_i \leq \bar{w}\) 分散化要求
换手率约束 $\sum_i \Delta w_i

拉格朗日方法

通过拉格朗日乘子将约束融入目标函数:

\[\mathcal{L}(\pi, \lambda) = \mathbb{E}_\pi\left[\sum_t \gamma^t r_t\right] - \lambda \left(\mathbb{E}_\pi\left[\sum_t \gamma^t c_t\right] - d\right)\]

交替优化策略参数和拉格朗日乘子 \(\lambda\)

class ConstrainedPortfolioRL:
    def __init__(self, agent, risk_budget):
        self.agent = agent
        self.risk_budget = risk_budget
        self.lagrange_multiplier = 1.0
        self.lambda_lr = 0.01

    def compute_reward(self, portfolio_return, risk_metric):
        """带风险约束的奖励"""
        reward = portfolio_return
        # 拉格朗日惩罚
        constraint_violation = max(0, risk_metric - self.risk_budget)
        adjusted_reward = reward - self.lagrange_multiplier * constraint_violation
        return adjusted_reward

    def update_lagrange(self, avg_risk):
        """更新拉格朗日乘子"""
        constraint_violation = avg_risk - self.risk_budget
        self.lagrange_multiplier = max(
            0, self.lagrange_multiplier + self.lambda_lr * constraint_violation
        )

多目标 RL (Multi-Objective RL)

投资组合管理天然是多目标优化问题:收益最大化与风险最小化之间存在权衡。

Pareto 最优

多目标值函数:

\[\mathbf{V}^\pi(s) = \left[V_1^\pi(s), V_2^\pi(s), \ldots, V_k^\pi(s)\right]\]

策略 \(\pi\) Pareto 支配 \(\pi'\) 当且仅当 \(V_i^\pi(s) \geq V_i^{\pi'}(s) \; \forall i\) 且至少一个严格不等式成立。

偏好条件策略 (Preference-Conditioned Policy)

将风险偏好 \(\omega\) 作为策略的输入条件:

\[\pi_\theta(a|s, \omega), \quad \omega \in \Omega\]

这样单一模型即可适应不同的风险偏好,无需为每种偏好单独训练。

风险厌恶奖励函数

常用的风险调整奖励:

  • 夏普比率\(\text{SR} = \frac{\mathbb{E}[r_p - r_f]}{\sigma_p}\)
  • 效用函数\(U = \mathbb{E}[r_p] - \frac{\lambda}{2}\sigma_p^2\)
  • CVaR 惩罚\(r_t - \beta \cdot \text{CVaR}_\alpha(r_t)\)

PPO 用于投资组合管理

Proximal Policy Optimization (PPO) 是当前最稳定的策略梯度算法之一。

核心思想

限制策略更新的幅度,防止过大的策略变化导致性能崩溃:

\[L^{\text{CLIP}}(\theta) = \mathbb{E}\left[\min\left(\frac{\pi_\theta(a|s)}{\pi_{\theta_{\text{old}}}(a|s)} A^{\pi}(s,a), \; \text{clip}\left(\frac{\pi_\theta(a|s)}{\pi_{\theta_{\text{old}}}(a|s)}, 1-\epsilon, 1+\epsilon\right) A^{\pi}(s,a)\right)\right]\]
class PPOPortfolioAgent:
    def __init__(self, state_dim, num_assets, lr=3e-4, gamma=0.99,
                 clip_ratio=0.2, epochs=10):
        # Actor: 输出资产权重分布
        self.actor = nn.Sequential(
            nn.Linear(state_dim, 256),
            nn.ReLU(),
            nn.Linear(256, 128),
            nn.ReLU(),
            nn.Linear(128, num_assets),
            nn.Softmax(dim=-1)  # 权重和为1
        )
        # Critic: 估计状态值
        self.critic = nn.Sequential(
            nn.Linear(state_dim, 256),
            nn.ReLU(),
            nn.Linear(256, 128),
            nn.ReLU(),
            nn.Linear(128, 1)
        )
        self.optimizer = torch.optim.Adam(
            list(self.actor.parameters()) + list(self.critic.parameters()),
            lr=lr
        )
        self.gamma = gamma
        self.clip_ratio = clip_ratio
        self.epochs = epochs

    def get_action(self, state):
        weights = self.actor(torch.FloatTensor(state))
        # 使用 Dirichlet 分布添加探索噪声
        dist = torch.distributions.Dirichlet(weights * 10 + 1e-6)
        action = dist.sample()
        log_prob = dist.log_prob(action)
        return action.detach().numpy(), log_prob

    def update(self, trajectories):
        states, actions, old_log_probs, rewards, dones = trajectories
        # 计算 GAE (Generalized Advantage Estimation)
        advantages = self.compute_gae(states, rewards, dones)
        returns = advantages + self.critic(states).detach().squeeze()

        for _ in range(self.epochs):
            weights = self.actor(states)
            dist = torch.distributions.Dirichlet(weights * 10 + 1e-6)
            new_log_probs = dist.log_prob(actions)

            ratio = torch.exp(new_log_probs - old_log_probs)
            surr1 = ratio * advantages
            surr2 = torch.clamp(ratio, 1 - self.clip_ratio,
                                1 + self.clip_ratio) * advantages
            actor_loss = -torch.min(surr1, surr2).mean()

            value_pred = self.critic(states).squeeze()
            critic_loss = nn.MSELoss()(value_pred, returns)

            loss = actor_loss + 0.5 * critic_loss
            self.optimizer.zero_grad()
            loss.backward()
            nn.utils.clip_grad_norm_(self.actor.parameters(), 0.5)
            self.optimizer.step()

SAC 用于连续仓位控制

Soft Actor-Critic (SAC) 通过最大熵框架 (Maximum Entropy Framework) 鼓励策略的探索性:

\[J(\pi) = \sum_t \mathbb{E}\left[r_t + \alpha \mathcal{H}(\pi(\cdot|s_t))\right]\]

其中 \(\mathcal{H}\) 为策略的熵 (Entropy),\(\alpha\) 为温度参数 (Temperature)。

SAC 的优势在于连续动作空间的高效探索,适合投资组合的连续权重调整。

RL 投资组合管理的实践挑战

  1. 样本效率:金融数据有限,RL 通常需要大量交互数据
  2. 非平稳性:市场动态变化,训练好的策略可能快速失效
  3. 奖励稀疏:长期投资的奖励信号极其稀疏且延迟
  4. Sim-to-Real Gap:模拟环境与真实市场的差异

小结

RL 为投资组合优化提供了动态、自适应的决策框架。通过精心设计的状态表示、奖励函数和约束机制,PPO 和 SAC 等算法能够学习复杂的资产配置策略。然而,从模拟到实盘的迁移、市场非平稳性应对以及风险控制的可靠性仍是需要持续攻克的难题。在实际应用中,RL 策略通常作为传统量化策略的补充而非替代。