FinRL实战:用强化学习回测贵州茅台,胜率18.7%为何仍能盈利
一、问题引入:强化学习做交易——听起来很酷,跑起来多难?
FinRL 是金融强化学习领域最知名的开源框架之一。它的核心理念是让 AI 智能体(Agent)在模拟交易环境中通过不断试错自主学习交易策略——不是人写规则告诉它什么时候买卖,而是它自己从历史数据中发现规律。但 FinRL 的落地门槛不低:Gym 环境配置、状态空间定义、奖励函数设计、DRL 模型训练、回测评估——每个环节都有大量参数,从零到跑通一个完整回测,不熟悉 RL 的人可能要折腾好几天。
能不能把 FinRL 封装为一个 Skill——输入股票代码,自动完成环境搭建、模型训练、回测执行和完整报告输出?本文以贵州茅台(600519)的真实回测数据演示完整流程。
二、成果展示:贵州茅台 FinRL 强化学习回测的真实输出

2.1 回测概览
| 项目 | 值 |
|---|---|
| 标的 | 600519(贵州茅台) |
| 策略类型 | 深度强化学习(DRL Agent 自主学习交易) |
| 初始资金 | ¥1,000,000 |
2.2 核心绩效(finrl_backtest_result.json)
| 类别 | 指标 | 值 | 说明 |
|---|---|---|---|
| 收益 | 累计收益 | +11.54% | 绝对收益 |
| 年化收益(CAGR) | 5.95% | 年化后收益水平 | |
| 超额收益(vs 沪深300) | +40.70% | 同期沪深300跌29.17%,Agent逆势跑赢 | |
| 风险 | 最大回撤 | -14.93% | 策略最大亏损幅度 |
| 年化波动率 | 12.57% | 波动水平适中 | |
| 风险调整 | 夏普比率 | 0.522 | 单位风险的超额回报 |
| 卡玛比率 | 0.398 | 收益/最大回撤 | |
| 索提诺比率 | 0.852 | 只考虑下行风险的调整收益 | |
| Omega 比率 | 1.159 | 盈亏概率加权比(>1即为正期望) | |
| 交易特征 | 胜率 | 18.7% | 极低胜率——RL Agent 的特征 |
| 盈利因子 | 1.16 | 总盈利/总亏损 | |
| 偏度 / 峰度 | 1.218 / 9.400 | 正偏+高尖峰——收益分布右偏,偶有大赚 |
2.3 RL Agent 的交易特征
胜率仅 18.7%,但策略仍然盈利——这是 RL Agent 和传统规则策略最本质的区别。Agent 不追求胜率,它学习到的策略是"大多数交易小亏,少数交易大赚"。偏度 1.218(正偏)说明收益分布右侧有一条"肥尾"——赢的时候比输的时候赚得多。峰度 9.400(高尖峰)说明极端收益事件比正态分布预期的更频繁。
| 特征 | RL Agent(FinRL) | 规则策略(如双均线) |
|---|---|---|
| 胜率 | 18.7%(极低) | 通常 40-50% |
| 盈利模式 | 小亏多次 + 少数大赚 | 赚赔交替,依赖盈亏比 > 1 |
| 偏度 | 1.218(正偏) | 通常接近 0(对称) |
| 学习方式 | 自主从数据中发现规律 | 人预设规则 |
2.3 输出文件结构
finrl_backtest_output/
├── finrl_equity_curve.png ← 净值曲线对比(策略黑/基准红)
├── finrl_tear_sheet.png ← Pyfolio 5面板 Tear Sheet
├── finrl_episode_total_assets.csv ← 逐日账户价值序列
├── finrl_backtest_result.json ← 结构化回测结果
└── finrl_backtest_600519.py ← 自动生成的回测脚本(可复现)
2.4 图表说明


| 文件 | 面板 | 内容 |
|---|---|---|
| equity_curve.png | 单面板 | 策略净值(黑)vs 基准沪深300(红),超额收益一目了然 |
| tear_sheet.png | 面板一:累计收益 | 策略 vs 基准累计收益双线 |
| 面板二:回撤曲线 | 策略回撤随时间演变 | |
| 面板三:月度热力图 | 各月收益红绿热力图 | |
| 面板四:收益分布 | 日收益直方图 + 正态拟合 | |
| 面板五:滚动夏普 | 滚动窗口夏普比率走势 |
三、Step 1:环境准备
从 EasyClaw 官网下载并安装最新版。本文所有操作均通过自然语言对话完成,不需要手动安装 Gym、PyTorch、FinRL 依赖或配置 RL 训练参数。
打开 EasyClaw → 左侧面板 →「Skill」→「Skill Creator」。如看不到该入口,在「设置 → 通用」中启用「开发者模式」后重启。
| 问题 | 解决方法 |
|---|---|
| Skill Creator 灰显 | 「设置 → 通用 → 启用开发者模式」,重启 EasyClaw |
| 网络连接失败 | 「设置 → 网络 → 检查代理设置」 |
四、Step 2:项目架构分析
在 Skill Creator 中输入:
从 GitHub 拉取 FinRL 项目(https://github.com/AI4Finance-Foundation/FinRL),先展示目录结构,标注出环境配置、DRL Agent 训练和回测评估模块的位置和职责。
EasyClaw 自动扫描后输出关键模块:
FinRL/
├── finrl/
│ ├── meta/env_stock_trading/ ← ★ Gym 交易环境(状态/动作/奖励定义)
│ ├── agents/ ← ★ DRL Agent(PPO/DDPG/SAC/TD3等)
│ ├── train.py ← 模型训练入口
│ ├── test.py ← 回测+评估入口
│ └── plot.py ← 图表渲染
└── tutorials/ ← 示例 Notebook
| 模块 | 职责 | Skill 中的角色 |
|---|---|---|
| env_stock_trading/ | Gym 环境:定义状态空间(K线/指标)、动作空间(买/卖/持)、奖励函数(夏普/收益/回撤惩罚) | Skill 自动配置交易环境 |
| agents/ | DRL 模型库(PPO/SAC/TD3/A2C等),管理训练和推理 | Skill 默认使用PPO |
| train.py | 模型训练循环:Agent 在环境中试错学习 | Skill 自动触发训练 |
| test.py | 加载训练好的模型、运行回测、调用 Pyfolio 生成 Tear Sheet | Skill 输出完整评估报告 |
这是 EasyClaw 自动识别出的结果,不需要你手动翻目录、读源码。
五、Step 3:核心参数配置与 Skill 创建
3.1 参数一览
| 参数名 | 所属模块 | 含义 | 默认值 | 推荐值 | 说明 |
|---|---|---|---|---|---|
| symbol | 环境 | 交易标的代码 | — | — | 必填 |
| start_date | 环境 | 训练+回测起始日期 | — | — | 至少2年数据 |
| end_date | 环境 | 回测结束日期 | — | — | 格式 YYYY-MM-DD |
| initial_capital | 环境 | 初始资金 | 100000 | 100000-1000000 | — |
| agent_type | Agent | DRL 算法类型 | ppo | — | 可选:ppo/sac/td3/a2c |
| timesteps | 训练 | 训练总步数 | 50000 | 20000-100000 | 步数越多训练越充分,但耗时长 |
| reward_type | 环境 | 奖励函数类型 | sharpe | — | 可选:sharpe/returns/calmar |
3.2 用自然语言创建 Skill
在 Skill Creator 中粘贴以下内容。
从 GitHub 拉取 FinRL 项目(https://github.com/AI4Finance-Foundation/FinRL),自动分析项目架构。
重点关注:
- env_stock_trading/:Gym 交易环境(状态空间/动作空间/奖励函数)
- agents/:DRL Agent 库(PPO/SAC/TD3/A2C)
- train.py:模型训练入口
- test.py:回测+Pyfolio Tear Sheet 生成
额外加入能力:
- 自动拉取 symbol 对应的历史K线并构建 Gym 环境
- 训练完成后自动运行回测并生成 backtest_result.json
- 使用 Pyfolio 生成完整的 Tear Sheet(5面板)
- 生成净值曲线对比图(策略 vs 基准)
- 输出可独立运行的回测脚本(finrl_backtest_*.py)
封装为 EasyClaw Skill:
- 名称:FinRL回测
- 输入:symbol、start_date、end_date、initial_capital(默认100000)、agent_type(默认ppo)、timesteps(默认50000)、reward_type(默认sharpe)
- 输出:finrl_equity_curve.png + finrl_tear_sheet.png + finrl_backtest_result.json + finrl_episode_total_assets.csv + finrl_backtest_*.py
点击「创建 Skill」,等待完成。
六、Step 4:运行回测与结果解读
4.1 启动回测
@FinRL回测 symbol=600519 start_date=2022-01-01 end_date=2023-12-31 initial_capital=1000000
使用默认 PPO Agent,训练50000步后自动运行回测。
4.2 真实结果的关键发现
RL Agent 在贵州茅台上跑出了与传统策略截然不同的绩效特征:
- 胜率 18.7% 但策略盈利:100次交易中只有约19次赚钱,但每次赚钱的幅度远超亏损幅度。这是 RL Agent 自主学到的策略——不追求胜率,追求"少赢大赢"
- 偏度 1.218:收益分布明显右偏——正的极端值多于负的。Agent 学会了"让利润奔跑"
- 峰度 9.400:远高于正态分布的3.0——极端收益事件比预期频繁得多。RL Agent 的策略天然带有"肥尾"特征,这既是超额收益的来源,也是需要警惕的风险
- 超额收益 +40.70%:与之前多个工具的回测一致——在沪深300跌29.17%的同期,基于贵州茅台的策略都能跑出显著超额。这说明超额的核心来源是标的本身的Alpha,而非策略的择时能力
4.3 效率对比
| 环节 | 手动搭建 FinRL + 手动回测 | EasyClaw Skill |
|---|---|---|
| 环境搭建 | Python + PyTorch + Gym + FinRL 依赖,约1-2小时 | 0 分钟(EasyClaw 内置环境) |
| Gym 环境定义 | 手写状态空间/动作空间/奖励函数代码,约30-60分钟 | Skill 自动配置,0 分钟 |
| 模型训练 | 调参+等待训练完成,约10-30分钟 | Skill 自动训练,— |
| 回测+报告 | 跑 test.py + 手动调 Pyfolio 参数,约15分钟 | 自动输出5文件,0 分钟 |
| 总计 | 约2-4小时 | — |
[注:本文方式的具体耗时取决于网络环境和硬件配置,实际测试后填写]
七、Step 5:进阶用法与常见问题
5.1 切换 DRL 算法
@FinRL回测 symbol=600519 agent_type=sac ← SAC(擅长连续动作空间)
@FinRL回测 symbol=600519 agent_type=td3 ← TD3(双Q网络,更稳定)
5.2 调整训练强度
@FinRL回测 symbol=600519 timesteps=100000 ← 加倍训练,可能学到更优策略
@FinRL回测 symbol=600519 reward_type=calmar ← 用卡玛比率作为优化目标
5.3 常见问题排查
| 错误信息 | 原因 | 解决方法 |
|---|---|---|
| 训练后回测无交易 | Agent 学到了"永远不交易"的保守策略 | 增加 timesteps 或切换 reward_type 为更激进的回报函数 |
| 回测结果每次不同 | RL 训练具有随机性 | 设置随机种子(Skill默认已设定seed=42),或多次训练取平均 |
| Tear Sheet 中文字体异常 | Pyfolio/Matplotlib 中文字体缺失 | EasyClaw 已内置处理,如有问题在设置中指定字体路径 |
八、总结
FinRL 代表了量化交易的一个不同范式——不是人告诉机器怎么做,而是机器自己从数据中学。贵州茅台的 RL 回测显示了这种范式的典型特征:胜率极低(18.7%)、收益分布右偏(偏度1.218)、极端事件频繁(峰度9.400)。这不是缺陷,而是 RL Agent 主动选择的策略——"大多数时候小亏,偶尔一次大赚"。和传统规则策略(双均线胜率40-50%)相比,RL Agent 走了一条完全不同的盈利路径。
下一步可以尝试:
- 多 Agent 对比:同一标的上分别跑 PPO/SAC/TD3,横向对比哪种算法更适合该标的
- 自定义奖励函数:根据你的交易偏好设计奖励函数(偏重回撤控制 or 偏重绝对收益)
- 多标的 RL 训练:在多个股票上同时训练一个 Agent,看它能否学到跨标的的通用交易策略
资源链接:
- EasyClaw 下载:https://easyclaw.cn/?f=707
- FinRL GitHub:https://github.com/AI4Finance-Foundation/FinRL
你觉得强化学习做交易的潜力大吗?是"AI 发现人看不到的规律",还是"过拟合历史的随机漫步"?欢迎在评论区分享你对 AI 交易的观点和实践经验。

浙公网安备 33010602011771号