FinRL实战:用强化学习回测贵州茅台,胜率18.7%为何仍能盈利

一、问题引入:强化学习做交易——听起来很酷,跑起来多难?

FinRL 是金融强化学习领域最知名的开源框架之一。它的核心理念是让 AI 智能体(Agent)在模拟交易环境中通过不断试错自主学习交易策略——不是人写规则告诉它什么时候买卖,而是它自己从历史数据中发现规律。但 FinRL 的落地门槛不低:Gym 环境配置、状态空间定义、奖励函数设计、DRL 模型训练、回测评估——每个环节都有大量参数,从零到跑通一个完整回测,不熟悉 RL 的人可能要折腾好几天。

能不能把 FinRL 封装为一个 Skill——输入股票代码,自动完成环境搭建、模型训练、回测执行和完整报告输出?本文以贵州茅台(600519)的真实回测数据演示完整流程。

二、成果展示:贵州茅台 FinRL 强化学习回测的真实输出

image

 

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 图表说明

finrl_equity_curve

finrl_tear_sheet

 

文件面板内容
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,看它能否学到跨标的的通用交易策略

资源链接:

你觉得强化学习做交易的潜力大吗?是"AI 发现人看不到的规律",还是"过拟合历史的随机漫步"?欢迎在评论区分享你对 AI 交易的观点和实践经验。

posted @ 2026-07-24 16:55  PC修复电脑医生  阅读(14)  评论(0)    收藏  举报