FinRL 组合优化智能体实战:Policy Gradient 算法与 EIIE/EI3 架构全解析
【免费下载链接】FinRLFinRL®: Financial Reinforcement Learning. 🔥项目地址: https://gitcode.com/gh_mirrors/fi/FinRL-Library
导读
本文聚焦 FinRL 仓库中的组合优化(Portfolio Optimization)智能体模块(finrl/agents/portfolio_optimization),系统讲解其核心的 Policy Gradient(策略梯度)训练算法、EIIE / EI3 / GPM 三种策略网络架构,以及它们与PortfolioOptimizationEnv环境的对接方式。读完本文,你将掌握如何用DRLAgent一行式实例化 PG 模型、通过model_kwargs与policy_kwargs精确控制算法与网络参数、完成多 episode 训练与在线学习验证,并理解该算法与 DDPG 的本质差异及其损失函数的源码实现。
一、模块定位:组合优化智能体的目录结构
finrl/agents/portfolio_optimization/目录存放了 FinRL 中用于组合优化任务的强化学习智能体实现,包含四个核心文件:
| 文件 | 职责 |
|---|---|
| models.py | 高层入口DRLAgent,负责按名称实例化算法并驱动训练/验证 |
| algorithms.py | PolicyGradient算法实现,即智能体的"学习大脑" |
| architectures.py | 策略网络架构:EIIE、EI3、GPM三种 PyTorch 网络 |
| utils.py | 配套工具:ReplayBuffer、PVM(组合向量记忆)、apply_portfolio_noise等 |
从 models.py 可以看到,该模块目前注册的模型映射只有一项:
MODELS = {"pg": PolicyGradient}也就是说,DRLAgent目前对外提供的是名为"pg"的 Policy Gradient 算法;但策略网络本身可以自由替换为EIIE、EI3或GPM(详见第五节)。
该智能体被设计为与
PortfolioOptimizationEnv(POE)配合使用,相关说明见 finrl/agents/portfolio_optimization/models.py 与环境的 README。
二、快速上手:用 DRLAgent 实例化并训练 PG 模型
2.1 实例化模型
要实例化模型,必须先准备一个PortfolioOptimizationEnv实例。下面这段来自原文档的示例展示了完整用法:用DRLAgent实例化一个策略梯度("pg")模型,用字典model_kwargs设置PolicyGradient算法的参数,用字典policy_kwargs修改所选架构的参数:
from finrl.agents.portfolio_optimization.models import DRLAgent from finrl.agents.portfolio_optimization.architectures import EIIE # set PolicyGradient algorithm arguments model_kwargs = { "lr": 0.01, "policy": EIIE, } # set EIIE architecture arguments policy_kwargs = { "k_size": 4 } model = DRLAgent(train_env).get_model("pg", model_kwargs, policy_kwargs)其底层调用链在 models.py 的get_model中:先校验model_name是否存在于MODELS,再把device同时注入model_kwargs与policy_kwargs,并将policy_kwargs作为model_kwargs["policy_kwargs"]一并传给PolicyGradient构造函数。因此你无需关心参数如何分发,只需保证字典键名与类构造参数名一致即可(例如model_kwargs的键可以是lr、policy,见 models.py 的注释示例)。
2.2 训练模型
下面的示例将模型训练 5 个 episode(这里把一个 episode 定义为所用环境的一个完整周期):
DRLAgent.train_model(model, episodes=5)train_model是一个静态方法(models.py),内部只是调用model.train(episodes)并返回训练后的模型实例。PolicyGradient.train的默认episodes=100(algorithms.py),训练过程通过tqdm展示进度条,每个 episode 会执行env.reset()并清空组合向量记忆,然后循环step直到done。
2.3 关键参数速查表
PolicyGradient.__init__的完整签名见 algorithms.py,对应model_kwargs可配置项如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
env | 必填 | 训练环境(PortfolioOptimizationEnv实例) |
policy | EIIE | 策略网络架构类,可换成EI3、GPM |
policy_kwargs | None | 传递给策略网络构造函数的参数字典 |
validation_env | None | 验证环境;非空时每个 episode 结束后自动执行一次验证 |
batch_size | 100 | 神经网络训练批量大小,也是累积梯度上升的触发周期 |
lr | 1e-3 | 策略网络学习率 |
action_noise | 0 | 训练时施加到动作上的噪声(0~1),用于探索 |
optimizer | AdamW | 神经网络优化器(torch.optim) |
device | "cpu" | 神经网络运行设备 |
此外,DRLAgent.DRL_validation(model, test_env, ...)(models.py)可用于离线验证:默认online_training_period=10,即在测试过程中每 10 步用测试数据做一次在线梯度上升;若想关闭在线学习,把学习率设为 0 或把online_training_period设为极大值即可。
2.4 完整可运行的 Notebook 示例
仓库提供了两个可直接运行的 Notebook 作为端到端参考:
- examples/FinRL_PortfolioOptimizationEnv_Demo.ipynb:组合优化环境 +
EIIE策略的完整演示(包含PortfolioOptimizationEnv构造、DRLAgent(...).get_model("pg", ...)、train_model与多次DRL_validation调用); - examples/FinRL_GPM_Demo.ipynb:基于图神经网络的
GPM架构演示。
三、时间窗口(time_window)的一致性要求
原文档特别强调:策略架构与环境必须定义相同的time_window。默认情况下,两者都使用 50 个时间步作为time_window。
这一约束的根源在于输入张量的形状耦合:
- 环境侧:
PortfolioOptimizationEnv用time_window决定观测(state)的形状为(f, n, t),其中t即时间窗口(env_portfolio_optimization.py),同时episode_length = len(时间序列) - time_window + 1(env_portfolio_optimization.py)。 - 网络侧:
EIIE的第一层卷积核大小为(1, k_size),经time_window - k_size + 1计算第二层卷积核大小,最终输出特征维度严格依赖time_window(architectures.py)。
因此,若环境用time_window=50而策略用time_window=30,前向传播会因维度不匹配而报错。修改任何一侧时,务必同步修改另一侧。
四、Policy Gradient 算法深度解析
PolicyGradient类实现了Jiang et al.论文中使用的策略梯度算法,其灵感来自 DDPG(Deep Deterministic Policy Gradient),但两者存在若干关键差异(原文要点,逐条继承如下):
- 无 Critic 网络:DDPG 是 Actor-Critic 算法,同时拥有 Actor 与 Critic 两个神经网络;而本算法没有 Critic 网络,直接把**组合价值(portfolio value)**当作价值函数,策略的更新目标是最大化组合价值。
- 全利用(full-exploit)策略:DDPG 通常在训练时为动作加入噪声参数以制造探索行为;而本 PG 算法采用全利用方式,不依赖动作噪声进行探索(注意:源码中仍保留
action_noise参数供可选配置,见 utils.py 的apply_portfolio_noise,默认关闭)。 - 时序批量采样:DDPG 从回放缓冲区随机采样经验;而本算法按时间顺序采样一批连续的经验,以便计算该批内组合价值的变化并将其作为价值函数。
4.1 算法实现步骤(原文档流程)
该算法按如下方式实现:
- 初始化策略网络与回放缓冲区(replay buffer);
- 对每个 episode 执行以下流程:
- 对每段长度为
batch_size个时间步的周期,执行:- 在每个时间步上:确定要执行的动作,模拟该时间步并把经验存入回放缓冲区;
- 当
batch_size个时间步模拟完成后,采样回放缓冲区; - 计算价值函数 $V = \sum_{t=1}^{batch_size} \ln(\mu_{t}(W_{t} \cdot P_{t}))$,其中 $W_{t}$ 是第 $t$ 步执行的动作(组合权重向量),$P_{t}$ 是第 $t$ 步的价格变化向量,$\mu_{t}$ 是第 $t$ 步的交易剩余因子(transaction remainder factor)——详见Jiang et al.论文;
- 对策略网络执行梯度上升(gradient ascent);
- 若 episode 结束时回放缓冲区中还有剩余经验序列,则用剩余经验重复上述步骤 1 至 5。
- 对每段长度为
4.2 源码级验证:损失函数与训练循环
上述流程在 algorithms.py 中可逐一对号入座:
- 经验四元组:每个时间步存入缓冲区的经验为
(obs, last_action, info["price_variation"], info["trf_mu"])(algorithms.py),其中price_variation即 $P_t$,trf_mu即 $\mu_t$,两者均由环境在info字典中提供(env_portfolio_optimization.py 计算trf_mu,env_portfolio_optimization.py 填充price_variation)。 - 批量梯度上升触发:当缓冲区长度达到
batch_size时立即执行_gradient_ascent()(algorithms.py);episode 结束后再用剩余经验补一次梯度上升(algorithms.py),与文档步骤 2.2 完全对应。 - 损失函数:
_gradient_ascent中policy_loss = -torch.mean(torch.log(torch.sum(mu * price_variations * trf_mu, dim=1)))(algorithms.py),对均值取负号即实现"梯度上升最大化组合价值"的目标,正是文档公式 $\sum \ln(\mu_t (W_t \cdot P_t))$ 的向量化实现。mu由策略网络的mu(obs, last_actions)方法输出(softmax 归一化后的权重向量)。
4.3 测试阶段的在线学习
test()方法(algorithms.py)通过copy.deepcopy复制训练策略得到test_policy,在测试环境中每online_training_period(默认 10)步用测试经验做一次在线梯度上升,即"边测边学"。如注释所述,这是有意设计:若想完全禁用在线学习,把lr设为 0 或把周期设得极大即可。
五、策略网络架构:EIIE / EI3 / GPM
architectures.py提供三种策略网络,全部继承自torch.nn.Module,统一约定:forward(observation, last_action)返回 numpy 动作数组,mu(observation, last_action)返回概率权重张量;输入先经_process_last_action拆分为"上一期股票权重"与"现金偏置"两部分(architectures.py)。
5.1 EIIE:Ensemble of Identical Independent Evaluators
EIIE(architectures.py)源自A Deep Reinforcement Learning Framework for the Financial Portfolio Management Problem(Jiang et al., 2017),核心思想是对每只股票用同一套独立评估器打分。其构造参数(对应policy_kwargs):
| 参数 | 默认值 | 说明 |
|---|---|---|
initial_features | 3 | 输入特征数(如 close、high、low) |
k_size | 3 | 第一个卷积核尺寸 |
conv_mid_features | 2 | 中间卷积层通道数 |
conv_final_features | 20 | 最终卷积层通道数 |
time_window | 50 | 时间窗口(须与环境一致) |
device | "cpu" | 运行设备 |
网络主体是两级Conv2d + ReLU,随后把"上一期股票权重"拼接到卷积特征上,经final_convolution与 softmax 输出长度为PORTFOLIO_SIZE + 1的权重向量(第 0 位为现金权重)。原文档示例中的policy_kwargs = {"k_size": 4}即调整此处的第一个卷积核大小。
5.2 EI3:Ensemble of Identical Independent Inception
EI3(architectures.py)源于A Multi-Scale Temporal Feature Aggregation Convolutional Neural Network for Portfolio Management(Shi et al., CIKM'19)。与 EIIE 的单尺度卷积不同,它使用short / medium / long 三条并行的时序特征提取分支:
| 参数 | 默认值 | 说明 |
|---|---|---|
initial_features | 3 | 输入特征数 |
k_short | 3 | 短周期卷积核 |
k_medium | 21 | 中周期卷积核 |
conv_mid_features | 3 | 中间卷积层通道数 |
conv_final_features | 20 | 最终卷积层通道数 |
time_window | 50 | 时间窗口 |
device | "cpu" | 运行设备 |
短、中分支为Conv2d + ReLU堆叠,长分支为MaxPool2d,三路特征与上一期股票权重拼接后经 1×1 卷积输出权重向量,从而同时捕捉多尺度时序模式。
5.3 GPM:Graph-based Portfolio Management
GPM(architectures.py)是基于图神经网络的组合管理架构,在 EI3 的多尺度时序特征之上,用RGCNConv(关系图卷积)在股票关系图中聚合信息,再通过nodes_to_select选出目标股票构建组合,softmax 前还可通过softmax_temperature调节权重分布的锐利程度。其特有参数包括:
edge_index:COO 格式的图连接;edge_type:每条边的类型(关系数由np.unique(edge_type)推导,见 architectures.py);nodes_to_select:入选组合的节点 ID;graph_layers:图卷积层数(默认 1);softmax_temperature:softmax 温度参数(默认 1)。
GPM 依赖torch_geometric库,使用方式参见 examples/FinRL_GPM_Demo.ipynb。
六、配套基础设施:回放缓冲区、组合向量记忆与动作噪声
utils.py 为训练循环提供了三类基础组件:
ReplayBuffer(utils.py):基于deque(maxlen=capacity)的定容缓冲区,满时自动弹出最旧经验;sample()一次性取空全部数据并清空,配合RLDataset(继承 PyTorchIterableDataset)供DataLoader按序迭代,从而保证"按时间顺序采样连续经验"的算法语义。PVM(Portfolio Vector Memory)(utils.py):以环状索引记忆最近一次动作;初始动作为"全现金"([1, 0, ..., 0]),这与环境_reset_memory中的初始权重定义完全一致(env_portfolio_optimization.py)。每次retrieve()取出上一步动作供策略网络作为last_action输入,add()存入新动作。apply_portfolio_noise(utils.py):在满足"权重非负且总和为 1"的约束下,把epsilon * random()的差值在两只资产间搬移,为训练提供可选的探索噪声(默认epsilon=0即关闭)。
七、与 PortfolioOptimizationEnv 的契约
理解智能体必须理解它交互的环境。PortfolioOptimizationEnv的完整定义见 finrl/meta/env_portfolio_optimization/env_portfolio_optimization.py,其接口契约如下:
- 输入数据:含
time列(时间戳)、tic列(代码)及用户定义的特征列(如close、high、low)的 DataFrame,环境会在预处理阶段按normalize_df(如by_previous_time)归一化数据(env_portfolio_optimization.py)。 - 动作空间:形状为
(n+1,)的一维Box,即组合权重向量 $W_t$,第 0 位是现金占比,其余是各股票占比;若权重之和不为 1,环境会自动做 softmax 归一化(env_portfolio_optimization.py)。 - 观测空间:默认是形状
(f, n, t)的三维Box;当return_last_action=True时变为包含"state"与"last_action"两个键的Dict(env_portfolio_optimization.py)。 - 奖励:$r_t = \ln(V_t / V_{t-1})$,组合价值因再平衡而下降时为负、上涨时为正(env_portfolio_optimization.py),并支持
reward_scaling缩放因子。 - 交易费用:支持
"trf"(交易剩余因子)与"wvm"(权重向量修正)两种佣金模型,trf_mu即由此计算并放入info(env_portfolio_optimization.py)——这正是 PG 算法价值函数中 $\mu_t$ 的数据来源。
环境的更多设计细节(如各 normalize 模式、tics_in_portfolio选股、get_sb_env与 Stable Baselines 3 的兼容)可阅读 finrl/meta/env_portfolio_optimization/README.md 及 examples/FinRL_PortfolioOptimizationEnv_Demo.ipynb。
八、参考文献
若你的研究使用了以下方法,可按对应条目引用。
EIIE 架构与 Policy Gradient 算法
A Deep Reinforcement Learning Framework for the Financial Portfolio Management Problem(Zhengyao Jiang, Dixing Xu, Jinjun Liang, 2017,arXiv:1706.10059)
@misc{jiang2017deep, title={A Deep Reinforcement Learning Framework for the Financial Portfolio Management Problem}, author={Zhengyao Jiang and Dixing Xu and Jinjun Liang}, year={2017}, eprint={1706.10059}, archivePrefix={arXiv}, primaryClass={q-fin.CP} }EI3 架构
A Multi-Scale Temporal Feature Aggregation Convolutional Neural Network for Portfolio Management(Si Shi, Jianjun Li, Guohui Li, Peng Pan, CIKM '19,ACM 9781450369763)
@inproceedings{shi2018multiscale, author = {Shi, Si and Li, Jianjun and Li, Guohui and Pan, Peng}, title = {A Multi-Scale Temporal Feature Aggregation Convolutional Neural Network for Portfolio Management}, year = {2019}, isbn = {9781450369763}, publisher = {Association for Computing Machinery}, address = {New York, NY, USA}, booktitle = {Proceedings of the 28th ACM International Conference on Information and Knowledge Management}, pages = {1613–1622}, numpages = {10}, keywords = {portfolio management, reinforcement learning, inception network, convolution neural network}, location = {Beijing, China}, series = {CIKM '19} }结语
本文以 finrl/agents/portfolio_optimization/README.md 为骨架,结合models.py、algorithms.py、architectures.py、utils.py与PortfolioOptimizationEnv的源码,完整还原了 FinRL 组合优化智能体的使用路径与实现原理:DRLAgent.get_model完成"算法 × 架构"的解耦式装配,PolicyGradient以时序批量采样与组合价值作为目标完成梯度上升,EIIE/EI3/GPM提供从卷积到图神经网络的多样化特征提取方案。上手时只需记住两条铁律:model_kwargs控制算法、policy_kwargs控制网络、time_window两侧必须一致。
【免费下载链接】FinRLFinRL®: Financial Reinforcement Learning. 🔥项目地址: https://gitcode.com/gh_mirrors/fi/FinRL-Library
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考