:root{--brand-1:#18794e;--brand-2:#3dd68c;--brand-3:#2bb673;--brand-soft:#3dd68c22;} .hero .kicker{color:var(--brand-2)} .nav .ep{color:var(--brand-2)} .sec h2 .num{color:var(--brand-2)} .quote::before{background:var(--brand-1)} .quote .q-text .em{color:var(--brand-2)} .quote .q-water .pg{color:var(--brand-2)} .widget .w-title{color:var(--brand-2)} .takeaway h3{color:var(--brand-2)} .takeaway ol li::marker{color:var(--brand-2)} .next .nx-label{color:var(--brand-2)} .formula .eq{color:var(--brand-2)} a{color:var(--brand-2)} .comp.c1 .tag{background:var(--brand-soft);color:var(--brand-2)} /* RL陷阱清单 */ .rltraps .traps{display:flex;flex-direction:column;gap:8px;margin:12px 0} .rltraps .trap{display:flex;align-items:flex-start;gap:12px;padding:11px 12px;background:var(--bg-mute);border:1px solid var(--divider);border-radius:8px;cursor:pointer;transition:all .2s;font-size:13.5px} .rltraps .trap:hover{border-color:var(--brand-1)} .rltraps .trap .box{width:20px;height:20px;border:2px solid var(--divider);border-radius:5px;flex:none;margin-top:1px;display:grid;place-items:center;color:var(--brand-2);font-weight:700;font-size:13px} .rltraps .trap.checked{background:var(--red-soft);border-color:var(--red-1)} .rltraps .trap.checked .box{background:var(--red-1);border-color:var(--red-1);color:#fff} .rltraps .trap .body{flex:1} .rltraps .trap .tt{font-weight:700;color:var(--t1);font-size:14px;margin-bottom:3px} .rltraps .trap .td{color:var(--t3);font-size:12.5px;line-height:1.6} .rltraps .trap .sev{margin-left:8px;padding:1px 7px;border-radius:3px;font-size:10px;font-weight:700;font-family:var(--mono)} .rltraps .trap .sev.fatal{background:var(--red-soft);color:var(--red-1)} .rltraps .trap .sev.serious{background:var(--yellow-soft);color:var(--yellow-1)} .rltraps .trap .sev.minor{background:var(--cyan-soft);color:var(--cyan-1)} .rltraps .scorecard{margin-top:16px;padding:16px;border-radius:10px;text-align:center} .rltraps .scorecard .sl{font-size:12px;color:var(--t3);margin-bottom:6px} .rltraps .scorecard .sv{font-size:28px;font-weight:800;font-family:var(--mono)} .rltraps .scorecard .sdesc{font-size:13px;margin-top:8px} .rltraps .scorecard.dead{background:var(--red-soft);border:1px solid var(--red-1)} .rltraps .scorecard.dead .sv{color:var(--red-1)} .rltraps .scorecard.risky{background:var(--yellow-soft);border:1px solid var(--yellow-1)} .rltraps .scorecard.risky .sv{color:var(--yellow-1)} .rltraps .scorecard.ok{background:var(--green-soft);border:1px solid var(--green-1)} .rltraps .scorecard.ok .sv{color:var(--green-1)}
量化交易实战 · 第 14 期 · 第二季

用 RL 训个 agent 自动交易——多半亏

强化学习做交易的陷阱 · TradeMaster pitfalls

用强化学习训个 agent 自动交易,听起来很酷:agent 自己学,不用写规则。现实是多半亏。原因不是 RL 不行,是金融这个场景对 RL 极不友好:奖励稀疏且含噪声、样本效率低、市场非平稳、状态空间巨大、过拟合严重。TradeMaster 把这些坑都踩过。下面是 RL 做交易的 8 个陷阱清单——踩中 3 个以上,agent 基本没救。
⏱ 约 10 分钟 🎯 想用 RL 做交易、别重蹈覆辙的人 📦 源:quant-wiki §6

01为什么 RL 在金融里这么难

RL 在游戏(Atari、围棋)里大杀四方,因为游戏有明确规则、即时反馈、可无限重放。金融恰好相反:

游戏

规则固定

围棋规则几千年不变,agent 学一次管用。金融规则天天变,今天有效的明天失效。

金融

非平稳

市场是其他参与者博弈的结果,你学到了策略,别人也在学,策略一旦有效就被套利掉。

游戏

样本无限

Atari 可以模拟几亿次。金融只有一份历史,且每个时刻只有一个样本,不能重来。

金融

噪声极大

同一策略同一情境,结果随机性极大——盈亏里 90% 是噪声,agent 学到的是噪声不是信号。

所以 RL 在金融里要解决的核心问题不是"学得快",是"怎么在噪声里学到信号、且信号不会过期"。这比游戏难一个量级。

RL 在游戏里无敌,
在金融里抓瞎。
灏天文库 · 量化交易实战 P.42

02RL 交易陷阱清单:你踩了几个

下面 8 个陷阱,勾选你(或你的 agent)踩过的,看你的 agent 还有救吗。致命级踩中 1 个基本就完蛋。

⚠️ RL 交易陷阱清单
勾选踩过的坑,看 agent 存活概率。
Agent 存活概率
—
勾选上方陷阱查看评估

03奖励函数:RL 的灵魂,也是最容易错的地方

RL 的核心是奖励函数——它告诉 agent "什么好什么坏"。设计错了,agent 学到的不是你想要的。三个经典错误:

记住:agent 优化的是你给的奖励,不是你想要的利润。奖励函数和真实目标差一点,agent 就会找到那个差别的漏洞去钻。

agent 优化的是奖励,
不是你想要的利润。
灏天文库 · 量化交易实战 P.43

04带走这套清单

✅ RL 做交易 6 条可执行规则

  1. 奖励用风险调整收益:夏普/Calmar,不是裸累计收益,让 agent 怕回撤。
  2. 奖励必须扣成本:手续费、滑点、冲击成本全扣,否则 agent 学高频刷单。
  3. 用 walk-forward 防非平稳:滚动训练,别用全历史训一个固定 agent。
  4. 状态空间要小:别把全 orderbook 喂进去,用特征工程降到几十维。
  5. 样本外严格验证:留 30% 数据不参与训练,agent 在上面的表现才是真的。
  6. 别迷信 RL:先试监督学习(预测涨跌)+ 规则,RL 是最后一步,不是第一步。
RL 是最后一步,
不是第一步。
灏天文库 · 量化交易实战 P.44