
Trade Agent RL Dataset 是 Trade Agent RL 项目配套的金融 Agent-RL 数据集。
在这个项目里,我们希望构建一只会看行情、查指标、算因子、再执行交易动作的“量化龙虾”。它每天面对一个固定的股票池、初始持仓和现金余额,需要通过多轮工具调用完成一次单日调仓,最后由交易环境根据后续价格表现给出奖励。
所以这份数据并不是传统意义上“给模型背答案”的监督数据。它更像是一个可复现的训练场:Qlib 行情数据提供真实的市场观察,JSONL 样本把每个交易日包装成 Verl 可以读取的 episode 起点,模型则在这些起点上采样自己的交易轨迹。
这份数据集主要服务于教学与复现实验,帮助开发者跑通 “LLM + 工具调用 + 强化学习 + 金融环境” 的完整闭环。它不构成投资建议,也不应直接用于实盘交易。
为了让项目拿到数据后就能直接训练,我们把数据拆成了两层:一层是 Qlib 可以读取的原始行情环境,另一层是已经构造好的 Agent-RL 训练入口。
| 数据 | 说明 |
|---|---|
qlib_data.zip | Qlib bin 格式的中国 A 股日频行情数据包。它是交易环境的“市场事实”,用于行情查询、因子计算、环境结算和回测。 |
rl_train.json / rl_val.json | Verl 可读取的原始 Agent-RL JSONL 样本文件。下载数据中已经包含这两个文件,可以直接用于训练;如果希望自定义股票池、样本数量或切分方式,也可以基于行情数据重新生成。 |
第一部分是 Qlib 行情数据。对于我们的交易 Agent 来说,行情数据不直接塞进 prompt,而是放在 Qlib 数据目录里,由工具在 rollout 过程中按需查询。这样做的好处是模型不会一次性面对一大张难读的股票表格,而是像真实交易员一样,在需要的时候再去看某只股票、某段时间或某个因子。
解压后的默认路径为:
data/qlib_data/cn_data典型目录结构如下:
data/qlib_data/cn_data/
├── calendars/
│ └── day.txt
├── instruments/
│ └── all.txt
└── features/
└── <symbol>/
├── open.day.bin
├── high.day.bin
├── low.day.bin
├── close.day.bin
├── volume.day.bin
├── amount.day.bin
├── factor.day.bin
├── vwap.day.bin
├── change.day.bin
└── adjclose.day.bin项目中的数据工具主要会读取这些字段:
| 字段 | 含义 |
|---|---|
date | 交易日期,由 Qlib 交易日历提供。 |
symbol | 股票或指数代码,例如 SH600519、SZ002156、SH000300。 |
open / high / low / close | 开盘价、最高价、最低价、收盘价。 |
volume / amount | 成交量和成交额。 |
factor / adjclose | 复权与调整价格相关字段。 |
vwap / change | 成交均价和日收益变化等派生字段。 |
教程实验使用了开源项目 chenditc/investment_data 提供的 A 股 Qlib 数据,并在项目脚本中补充了指数和 ETF 数据。在这里再次感谢上游数据项目的整理工作。重新分发或二次使用前,请确认并遵守上游数据来源的许可证和使用条款。
第二部分是已经构造好的 Agent-RL 样本,也就是 rl_train.json 和 rl_val.json。
这里有一个容易误解的点:JSONL 文件里并没有“正确买哪只股票”的标准答案。每一行只是一个单日交易 episode 的起点,里面记录了当天日期、股票池、初始资金、初始持仓,以及四个工具共享的环境初始化参数。真正的策略好坏,要等模型完成多轮工具调用和交易动作后,再由奖励函数根据组合表现来判断。
示例结构:
{
"prompt": [
{
"role": "system",
"content": "你是一个专业的量化交易分析师..."
},
{
"role": "user",
"content": "当前交易日:2025-01-02。\n初始持仓:..."
}
],
"data_source": "a_stock_single_day",
"agent_name": "trader_agent",
"reward_model": {
"ground_truth": ""
},
"extra_info": {
"date": "2025-01-02",
"env_id": "3f7a2c9b0d1e4f6a",
"sample_idx": 0,
"need_tools_kwargs": true,
"tools_kwargs": {
"get_price_data": {
"create_kwargs": {
"env_id": "3f7a2c9b0d1e4f6a",
"scenario": {
"start_date": "2025-01-02",
"end_date": "2025-01-02",
"initial_cash": 1000000.0,
"universe": ["SH600519", "SZ002156", "SH600036"],
"initial_positions": []
}
}
}
}
}
}完整样本会为以下工具写入同一个 scenario。也就是说,同一次 rollout 里的行情查询、因子计算和交易动作,看到的是同一个交易日、同一个股票池和同一组初始持仓。
| 工具 | 用途 |
|---|---|
get_price_data | 查询单个标的的历史行情和技术指标。 |
get_macro_indicators | 查询沪深 300 等市场指数行情和大盘状态。 |
compute_alpha_factor | 使用 Qlib 表达式计算自定义 Alpha 因子。 |
TakeAction | 执行买入、卖出或停止交易,并在 episode 结束时产生奖励依据。 |
默认生成配置见 scripts/train_data_config.py:
| 配置项 | 默认值 |
|---|---|
| 交易日期范围 | 2025-01-01 至 2025-06-30 |
| 初始总资产 | 1,000,000 |
| 默认股票池 | SH600519、SZ002156、SH600036 |
| 训练/验证切分 | 按交易日时间切分,默认最后 10% 交易日作为验证集 |
我们按交易日切分训练集和验证集,而不是随机打散。这样做是为了尽量避免时间泄漏,让验证集更接近“未来行情”的评估方式。模型在一个 episode 中只能基于当前交易日及历史市场数据调用工具,最终奖励来自交易结束后的组合表现评估。
为了避免不同平台下载命令造成目录结构不一致,本数据集只通过 Trade Agent RL 项目中的 bash 脚本下载。请先进入项目根目录,然后运行:
bash scripts/download_data.sh脚本会下载数据包并完成解压整理。下载完成后,项目目录下应该能看到:
data/qlib_data/cn_data
data/rl_train.json
data/rl_val.json通常情况下不需要重新生成训练样本,因为下载数据中已经包含可直接训练的原始 JSONL 文件:data/rl_train.json 和 data/rl_val.json。
如果开发者想做自己的实验,例如换一组股票池、增加样本数量、调整初始资金,或者改变训练集和验证集的时间切分,可以基于同一份 Qlib 行情数据重新生成 JSONL:
python scripts/gen_rl_dataset.py \
--output-dir data \
--num-samples 500 \
--universe SH600519 SZ002156 SH600036脚本会重新写出:
data/rl_train.json
data/rl_val.json一些常用参数如下:
python scripts/gen_rl_dataset.py \
--initial-cash 1000000 \
--max-position-value 400000 \
--val-ratio 0.1 \
--qlib-data-dir data/qlib_data/cn_data \
--seed 42拿到 rl_train.json、rl_val.json 和 Qlib 行情目录后,就可以回到 Trade Agent RL 项目里启动 Verl GRPO 训练:
DATA_DIR=./data \
MODEL_PATH=./models/Qwen3.5-4B \
bash run_grpo-qwen35.sh训练脚本默认读取:
data/rl_train.json
data/rl_val.json
data/qlib_data/cn_data需要注意的是,工具的数据路径也要与 tool_config.yaml 中的 qlib_data_dir 保持一致。否则模型在 rollout 时虽然能读到 JSONL 样本,但工具会找不到对应的行情数据。
⚠️注意:数据集和项目环境仅用于教学与研究样例,无法直接进行实盘交易!
为了让 Agent-RL 训练闭环更容易被理解和复现,我们简化了真实交易里的撮合、盘口、涨跌停、成交量约束、滑点细节和风控流程。模型输出也可能产生错误判断、无效交易或过拟合行为。
请勿将本数据集、模型训练结果或回测结果直接作为投资建议或实盘交易依据。