Skip to content

SwanHubX/Trade-Agent-RL

Repository files navigation

Trade Agent RL

基于 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 和上下文长度,训练稳定性不作保证。

Agent 设计

系统如何工作

核心流程可以概括为四步:

  1. 构造交易场景scripts/gen_rl_dataset.py 会为每个交易日生成 prompt,并把日期、股票池、初始现金和初始持仓写入 extra_info.tools_kwargs
  2. 生成多轮轨迹trader_agent_loop.py 继承 Verl 的 ToolAgentLoop,让模型在同一个 episode 里多次调用行情工具和交易工具。
  3. 执行交易动作trading_tools.py 中的 TakeActionTool 维护单日账户状态,执行买入、卖出或停止。
  4. 计算训练奖励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=16

run_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_nodedata.train_batch_sizeactor_rollout_ref.rollout.ndata.max_prompt_lengthdata.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.yamlscripts/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 + 工具调用 + 强化学习 + 金融环境” 的最小完整案例。

若推进到更严肃的量化研究,需要进一步补充更严格的回测框架、数据清洗流程、风险控制、交易成本建模、样本外评估和多市场验证。

参考

About

基于 Verl + Qlib 实现的金融 Agent-RL 训练工程,面向单日股票调仓任务构建可交互强化学习环境:模型读取市场状态,调用行情与因子工具,执行买入、卖出或停止操作,最后由交易环境根据后续价格表现给出奖励

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors