投资组合优化中的RL
概述
投资组合优化 (Portfolio Optimization) 是金融学的核心问题之一。传统的 Markowitz 均值-方差模型 (Mean-Variance Model) 假设静态的单期决策,而强化学习 (RL) 将其拓展为动态的多期优化问题——在随时间变化的市场环境中,持续调整资产配置以最大化风险调整后的收益。本文探讨动态资产配置、风险约束、多目标 RL 以及 PPO/SAC 算法在投资组合管理中的应用。
动态资产配置 (Dynamic Asset Allocation)
MDP 建模
将投资组合管理形式化为 MDP:
状态空间:
其中 \(w_t \in \mathbb{R}^N\) 为当前资产权重,\(r\) 为历史收益率,\(\sigma\) 为波动率,\(f_t\) 为其他特征(如宏观指标、情感因子)。
动作空间:
即目标权重向量,约束在单纯形 (Simplex) 上。
奖励函数:
其中 \(V_t\) 为组合净值,\(\text{TC}_t\) 为交易成本:
奖励设计是核心
奖励函数的设计直接决定了 Agent 学到的策略风格。简单使用收益率作为奖励会导致高风险策略;加入波动率惩罚可引导 Agent 学习风险管理。
风险约束 (Risk Constraints)
约束 MDP (Constrained MDP, CMDP)
在标准 MDP 中加入风险约束:
其中 \(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 |
拉格朗日方法
通过拉格朗日乘子将约束融入目标函数:
交替优化策略参数和拉格朗日乘子 \(\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 最优
多目标值函数:
策略 \(\pi\) Pareto 支配 \(\pi'\) 当且仅当 \(V_i^\pi(s) \geq V_i^{\pi'}(s) \; \forall i\) 且至少一个严格不等式成立。
偏好条件策略 (Preference-Conditioned Policy)
将风险偏好 \(\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) 是当前最稳定的策略梯度算法之一。
核心思想
限制策略更新的幅度,防止过大的策略变化导致性能崩溃:
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) 鼓励策略的探索性:
其中 \(\mathcal{H}\) 为策略的熵 (Entropy),\(\alpha\) 为温度参数 (Temperature)。
SAC 的优势在于连续动作空间的高效探索,适合投资组合的连续权重调整。
RL 投资组合管理的实践挑战
- 样本效率:金融数据有限,RL 通常需要大量交互数据
- 非平稳性:市场动态变化,训练好的策略可能快速失效
- 奖励稀疏:长期投资的奖励信号极其稀疏且延迟
- Sim-to-Real Gap:模拟环境与真实市场的差异
小结
RL 为投资组合优化提供了动态、自适应的决策框架。通过精心设计的状态表示、奖励函数和约束机制,PPO 和 SAC 等算法能够学习复杂的资产配置策略。然而,从模拟到实盘的迁移、市场非平稳性应对以及风险控制的可靠性仍是需要持续攻克的难题。在实际应用中,RL 策略通常作为传统量化策略的补充而非替代。