基于 Verl + Qlib 实现的金融 Agent-RL 训练工程,面向单日股票调仓任务构建可交互强化学习环境:模型读取市场状态,调用行情与因子工具,执行买入、卖出或停止操作,最后由交易环境根据后续价格表现给出奖励。
本项目是一个面向教学与复现实验的 Agent-RL 样例,并非严肃实盘交易系统。核心目标是展示当 LLM 不再只是回答问题,而是需要在真实数据环境里多轮调用工具、管理状态、承担决策后果时,训练闭环应该如何搭建。完整设计动机与教程说明见 DOCS.md。
Important
本项目基于 8 张 Ascend 910B 64G 设备完成开发与训练验证。默认训练脚本、上下文长度、rollout 并发和 batch 设置都围绕该硬件规格设计。低于 8 卡 Ascend 910B,或单卡显存低于 64GB 的环境,可能因显存、并行吞吐或长上下文 rollout 压力而难以成功运行;如需在更小设备上尝试,需要显著下调模型规模、rollout.n、batch size 和上下文长度,训练稳定性不作保证。
核心流程可以概括为四步:
- 构造交易场景:
scripts/gen_rl_dataset.py会为每个交易日生成 prompt,并把日期、股票池、初始现金和初始持仓写入extra_info.tools_kwargs。 - 生成多轮轨迹:
trader_agent_loop.py继承 Verl 的ToolAgentLoop,让模型在同一个 episode 里多次调用行情工具和交易工具。 - 执行交易动作:
trading_tools.py中的TakeActionTool维护单日账户状态,执行买入、卖出或停止。 - 计算训练奖励:
reward_fn.py::compute_score读取最终r_outcome,映射成离散奖励,交给 Verl 的 GRPO 训练流程。
本项目主要面向 8 卡 Ascend 910B 64G 大模型 Agent-RL 训练环境。开始训练前,请确认 Ascend 机器已经安装 NPU driver、CANN 8.5.0 和 Docker。低于该硬件规格的环境不建议直接运行默认训练脚本。
在训练环境中安装常用依赖:
pip install -U transformers
pip install numpy==1.26.4 pyqlib swanlab modelscope atomgit如果仓库中包含本地 Verl 源码,也可以按开发模式安装:
cd third-party/verl
pip install -e .
cd ../..下载训练使用的 Qlib 格式 A 股数据:
bash scripts/download_data.sh下载完成后,默认数据目录为:
data/qlib_data/cn_data
生成 Verl 训练数据:
python scripts/gen_rl_dataset.py \
--num-samples 500 \
--universe SH600519 SZ002156 SH600036输出文件:
data/rl_train.json
data/rl_val.json
每条样本对应一个单日交易 episode,并包含当天日期、股票池、初始资金和初始持仓。为了避免时间泄漏,训练集和验证集按交易日切分,而不是随机切分。
默认训练入口是:
bash run_grpo.sh MODEL_PATH=Qwen/Qwen3-4B也可以覆盖 Verl 配置参数:
bash run_grpo.sh \
MODEL_PATH=/path/to/Qwen3-4B \
trainer.total_epochs=3 \
data.train_batch_size=16run_grpo.sh 会完成几件关键配置:
- 使用
verl.trainer.main_ppo启动 GRPO 训练。 - 注册
tool_config.yaml中的四个原生工具。 - 注册
agent_loop_config.yaml中的trader_agent。 - 使用
reward_fn.py::compute_score作为自定义奖励函数。 - 将训练日志输出到 console 和 SwanLab。
训练产生的 checkpoint 默认保存在:
data/checkpoints/
Note
默认 GRPO 训练配置面向 8 卡 Ascend 910B 64G。若在更少卡数或更小显存环境中运行,需要先降低 trainer.n_gpus_per_node、data.train_batch_size、actor_rollout_ref.rollout.n、data.max_prompt_length 和 data.max_response_length 等参数,否则可能在 rollout 或训练阶段直接 OOM。
Verl 训练保存的 FSDP 权重需要先转换成 HuggingFace / vLLM 可加载格式:
python -m verl.model_merger merge \
--backend fsdp \
--local_dir ./data/checkpoints/<experiment>/global_step_40/actor \
--target_dir ./data/checkpoints/<experiment>/merged_model_step_40启动 vLLM OpenAI 兼容服务:
python -m vllm.entrypoints.openai.api_server \
--model ./data/checkpoints/<experiment>/merged_model_step_40 \
--served-model-name trader_agent \
--port 8001 \
--max-model-len 20480 \
--enable-auto-tool-choice \
--reasoning-parser qwen3 \
--tool-call-parser qwen3_coder \
--language-model-only运行命令行回测:
cd rollout_dashboard
uv run python backtest_cli.py \
--base-url http://localhost:8001/v1 \
--model trader_agent \
--start-date 2025-06-20 \
--num-days 60 \
--initial-cash 1000000 \
--temperature 0.7 \
--max-turns 10 \
--seed 42 \
-o ../logs/backtest_result.json启动回测看板:
cd rollout_dashboard
uv run streamlit run multi_compare.py浏览器打开:
http://127.0.0.1:8501
- 修改股票池、训练日期、初始资金:
scripts/train_data_config.py - 修改 Qlib 数据路径:
tool_config.yaml和scripts/gen_rl_dataset.py --qlib-data-dir - 修改工具描述和工具行为:
trading_tools.py - 修改 AgentLoop 终止逻辑:
trader_agent_loop.py - 修改奖励分桶:
reward_fn.py - 修改训练 batch、上下文长度、rollout 并发和日志:
run_grpo.sh
本项目是 Agent-RL 训练教程和工程样例,不构成任何投资建议,也不应直接用于实盘交易。为了让训练闭环更清晰,环境实现简化了真实交易里的撮合、盘口、涨跌停、成交量约束、滑点细节和风控流程,更适合作为理解 “LLM + 工具调用 + 强化学习 + 金融环境” 的最小完整案例。
若推进到更严肃的量化研究,需要进一步补充更严格的回测框架、数据清洗流程、风险控制、交易成本建模、样本外评估和多市场验证。
- 完整教程:
DOCS.md - Verl 项目:https://github.com/verl-project/verl
- Qlib 项目:https://github.com/microsoft/qlib


