← 返回教程库

强化学习在交易里到底放在哪一层

最后更新 2026-08-19
📚 量化与 AI 投研 📖 AI 交易与 Agent ⏱ 约 16 分钟 R2 · 注意风险
你将学到
  • 用零术语的话说清强化学习是怎么学的,以及它需要什么条件才学得动
  • 说清它在交易里最成熟的位置是订单执行而不是选股,并能自己复述这两处在反馈信号上的根本差别
  • 看懂一个公开框架里「状态、动作、奖励」分别装了什么,尤其是它刻意没装什么
  • 认出这条路的三层边界:执行省的不是收益、模拟器的成交是假设、接实盘就是自动下单

有个问题,只要你手里的钱多到一定程度,就绕不过去。

你已经想清楚了要买某个东西,也想清楚了要买一万股。剩下的问题不是「买不买」,而是**「怎么买」**——开盘一口气全打进去?还是摊到一整天慢慢买?摊的话,前重后轻还是前轻后重?中间遇上一波急涨要不要停一停?

这个问题很枯燥,枯燥到几乎没人在饭桌上聊它。但它是真金白银:同样一万股,两种买法之间的成本差,在不热闹的品种上能大到让你怀疑人生。而这件事,恰好是「让程序自己试错学决策」这套技术,目前在交易里站得最稳的一块地。

不是选股。是这个。

生活层:反复试错学决策,是怎么个学法

先把交易放一边。

想象你在玩一个通关游戏,规则你完全不知道。你只能按手柄,按完看屏幕变化,一局结束的时候屏幕给你一个分数。你不知道分数是怎么算的,只知道分高就是好。

于是你开始重开。第一百局你摸出「掉进那个坑会扣分」,第一千局你摸出「先绕左边再拿道具分更高」,第一万局你已经能稳定打出不错的成绩——但如果有人问你「你的策略是什么」,你多半说不清楚,你只是知道在什么局面下手该往哪按。

强化学习就是让程序这么玩:给它一个环境,让它反复动手,每次动完给一个反馈分数,它自己从几十万次试错里摸出「什么局面该做什么动作」。 它和「猜下一个词」那类模型不是一回事——那类模型学的是模仿人写过的东西,这类模型学的是在一个能反复重来的环境里拿高分。

这里有个前提,被绝大多数科普跳过了,但它是整篇文章的钥匙:这套学法要能跑起来,环境必须能反复重来,反馈必须密集、及时、而且能对得上是哪一步造成的。

游戏满足这三条。所以它在游戏上表现惊人。

那么问题就变成了:交易里,哪些事满足这三条?

投资层:为什么不是选股,是拆单

很多人第一反应是「拿它来学选股啊」——让程序自己试,赚钱就加分,亏钱就扣分,练个几百万局,不就练出一个会选股的程序了?

这个想法之所以行不通,卡在刚才那三条上,而且卡得很硬。

你没有那么多次可以重来。 假设你做的是持有一个月的判断,那么一年只有十二次真正独立的结果。二十年历史也就两百多次。一个游戏程序要练几十万局才摸出门道,而市场给你的独立样本,是三位数。这不是算力问题,是数据本身就不够。

反馈里噪声压倒了信号。 你这个月赚了钱,是因为你挑对了公司,还是因为整个板块都涨了、或者只是那几天恰好没出坏消息?分不清。而试错学习最怕这个——它会老老实实把「赚钱了」这件事和你当时做的所有动作绑在一起,包括那些纯属巧合的动作。样本一少、噪声一大,它学到的不是规律,是把巧合当规律。这个坑在 AI 能不能预测股价,先看清它到底在算什么 里从另一个角度也讲过:价格里能被利用的规律本来就稀薄,而且一旦被广泛发现就会自己消失。

你的动作会改变环境本身。 游戏里你怎么按手柄,游戏规则不变。市场里你买得多,价格就被你自己推上去了——这就是 冲击成本。练习环境和真实环境之间隔着一层,而且这层随着你的钱变多而变厚。

现在把这三条拿去量另一件事:订单执行

订单执行说的是,在「买什么、买多少」已经定了的前提下,把这笔单子实际送进市场的那个过程——什么时候下、每次下多少、分几次下完。行话叫拆单。

这件事的画风完全不同:

一天之内,一笔单子可能被拆成几十上百步,每一步都有一个可观察的结果;同一段历史行情可以反复重放,想跑多少遍跑多少遍;而且最关键的一点——它的好坏有一个近在眼前的比较对象。你不需要知道明天涨不涨,你只需要知道:我这么拆,比「傻乎乎平均摊开」这种最笨的拆法,便宜了还是贵了。

反馈密集、可重放、能归因。三条全中。

所以这条技术路线在交易里最成熟的落点,是「已经决定要买之后,怎么少付一点」,而不是「该不该买」。 这个区别不是技术细节,它决定了你该对这件事抱多大期待。

机制层:拆开一个公开框架,看它到底装了什么

开源量化平台 qlib 里有一块专门做这件事的模块,路径就叫 qlib/rl/,底下最核心的子目录叫 order_execution——订单执行。配套的示例目录名字更直白,叫 rl_order_execution

目录名就是定位声明。 这套东西从设计之初就没打算去学选股。

试错学习要跑起来,得先定义三样东西:它看得见什么(状态)、它能做什么(动作)、它做完之后给多少分(奖励)。这三样在 qlib 里都是明明白白写在代码里的,一个一个看。

一、它看得见什么:注意它刻意没装的那一项

这套系统里描述「当前局面」的那个数据结构,装了这些东西:手上这笔单子是买还是卖、当前是几点几分、走到了第几步、这笔单子还剩多少量没执行完、以及前面每一步的成交历史(成交了多少、均价多少、同期市场总成交量多少)。

请注意它没有装什么:没有「这家公司好不好」,没有「该不该持有」,没有「目标价是多少」。

买什么、买多少、什么时候清仓——这些全部在这套系统之外已经决定好了,是它的输入,不是它的输出。它接到手里的是一句命令:「今天之内把这一万股买完」。它唯一被允许决定的,是这一万股怎么分配到今天的每一分钟里。

这道边界是靠数据结构划的,不是靠约定俗成。 它看不见的东西,它就想不到要去动——和另一个项目里把「授权动真钱」这个函数刻意做成模型碰不到的结构,是同一种工程哲学:真正靠得住的约束长在结构上,不长在嘱咐里。

二、它能做什么:只有一个旋钮

动作也简单得让人意外。它每一步只输出一件事:这一步执行多少量。

框架里给了两种描述这个动作的方式。一种是把可选量限定在一小组固定比例上,程序只能从这几档里挑一档;另一种更有意思——动作被定义为「相对那个最笨基准的倍数」。

那个最笨的基准叫 TWAP,意思是把总量平均摊到每个时间段上,机械执行,不看行情。比如一万股摊到四个小时,每小时两千五,雷打不动。

把动作定义成「相对 TWAP 的倍数」,等于一开始就把野心框死了。 输出 1 就是老老实实照笨办法执行,输出大于 1 就是这一步比笨办法多买点,小于 1 就是少买点。它不是在从零发明一套买法,它是在一个已知的、保守的基准上做小幅偏离。

这个设计选择本身就是一句话:这套东西的目标是「比笨办法好一点」,不是「找到最优解」。

三、它拿多少分:奖励函数的形状最说明问题

奖励是整件事的灵魂——你奖励什么,它就会学着去做什么,包括你没想到的歪路。

qlib 里默认那个奖励函数,长成两部分:

加分项是「价格优势」,也就是这一步的实际成交均价,相对基准成交价便宜了多少,按这一步的成交量加权。单位用的是基点,一个基点等于万分之一。

扣分项是「别把量堆在极短时间里」。它对短时间内的成交量做平方惩罚——量集中在一瞬间,扣分涨得比量本身快得多。惩罚力度是一个可配置的系数(框架给了默认值,可以改)。

停下来品一下这个形状。

它奖励的不是赚钱。是「比一个笨基准便宜了几个万分之一」。

它惩罚的是急。你想一口气买完?那你必然把价格推上去,而这个惩罚项就是在代码层面提前把这条歪路堵死——不用等模拟器算出冲击成本,直接在打分环节就扣你。

一个「学交易」的系统,奖励函数里连收益率的影子都没有。这件事本身,比任何宣传口径都更能说明这条路的真实位置。

四、代码作者自己标注的边界

最值得敬重的一处细节,在描述「价格优势」这个指标的文档串里。作者写完这个指标的定义之后,自己加了一句提醒——原文是括号里的一句 "there could be data leak here",意思是这里可能存在数据泄漏。

为什么?因为这个「基准成交价」是按 TWAP 执行算出来的,而算它要用到当天全天的行情。也就是说,你在给某一步打分的时候,用到了那一步当时还不知道的信息。

这是前视偏差的一种:拿事后才有的信息去评价当时的动作。作者没有藏着,直接写在文档里。

同一个数据结构里还有另一处诚实:它把「策略打算成交的量」和「实际成交掉的量」记成两个不同的字段,并明确后者必须小于等于前者。你想买,不代表买得到。 那一刻市场上有没有对手盘、够不够量,是 流动性 说了算的,不是你说了算。

三层边界,一层比一层硬

看完机制,该说这条路真正的边界在哪了。这一段比上面所有内容都重要。

第一层:执行优化省下来的,不是收益,是成本的一部分。

拆单拆得好,省的是 滑点 和冲击成本里的一部分。这个数字在大资金上确实可观,但它有个天花板——你最多把成本降到接近零,不可能降成负的。标的选错了,执行得再优雅也还是亏。 把这套东西理解成「收益来源」是彻底的误读,它是「漏损修补」。而且能修的漏,正比于你原本漏得有多凶:钱少、交易不频繁的人,这块本来就没什么可省的。

第二层:训练环境里的成交,是假设。

它反复重放的那些历史行情,是一个模拟器。模拟器要回答「我这一刻挂这么多量,能成交多少、按什么价成交」——而这个回答是靠假设算出来的,不是真的发生过。假设有多接近现实,决定了训练出来的东西有多大用。在模拟器里学到的漂亮成绩,和在真实市场里的成绩之间,隔着模拟器所有假设的总和。

更麻烦的是,模拟器通常假设「你的单子不影响市场」,或者用一个简化公式估计影响。而拆单这件事的全部意义,恰恰就在于对抗你自己对市场的影响。你在一个把核心难题简化掉了的环境里,练习解决那个核心难题。

第三层,也是最硬的一层:这东西一旦接上真实账户,就是在自动下单。

前两层是「有没有用」的问题,这一层是「出事了怎么办」的问题。

一个执行程序不需要有任何「意图」就能造成实质损失:参数写错一位、行情源断了一分钟、遇上一个训练时从没见过的极端局面,它照样会按学到的模式往外发单。它不会像人一样愣一下、觉得「不太对劲」。

所以任何走到这一步的做法,都必须先把这几件事在结构上做实,而不是靠事后盯盘:

  • 授权边界:它被允许动的资金、被允许触及的标的范围,得是外部写死的白名单,不是它自己能扩的。
  • 额度上限:单笔多大、单日累计多大、单个标的最多多少,全部要有硬上限,触到就停,不是发个提醒。
  • 可随时中断:必须有一个不依赖程序自身逻辑的开关——它自己出问题的时候,恰恰是最不能指望它响应「停止」指令的时候。
  • 可审计:每一步为什么这么执行、当时看到的是什么、发出去的是什么,全部留痕。事后查不清的系统,等于没法改进,也没法追责。
⚠️ 风险提示

这一节讲的是机制和边界,不是操作步骤,更不是说这条路能带来收益。把下单权交给一个程序,风险的性质会变:它从「判断可能错」变成「判断可能错、并且错误会被自动放大和快速执行」。真实交易账户涉及资金安全与合规要求,请以你所在市场的监管规定和券商的正式约定为准。相关的自查清单在 把下单权交给 AI 之前,先问自己这几个问题 那节里单独展开。本站为投资教育内容,不构成任何投资建议,完整边界见 免责声明

🚧 避坑

坑:看到「强化学习交易」几个字,就默认它学的是买卖判断。 怎么避:拿到任何一份这类材料,直接找三个东西——它的状态里装了什么、动作是什么、奖励怎么算。如果奖励算的是收益率,而独立样本只有几百个,那它大概率是在把噪声学成规律;如果奖励算的是「相对某个基准的执行价差」,那它做的是执行优化,是另一件事。这三个问题问下去,宣传语和实际做的事之间的缝,一眼就能看见。

那这对你意味着什么

如果你的资金量还没大到「一笔单子自己能推动价格」的程度,说实话,这一整块技术跟你的实际操作暂时没什么关系——你省不出多少,因为你本来也没漏多少。

但它值得你知道,理由有两个。

一个是判别力。以后再看到任何「AI 自动交易」的说法,你知道该问哪三个问题(状态、动作、奖励),也知道一个诚实的答案长什么样。真做事的人会告诉你他的基准是什么、他相对基准好了多少个万分之一;讲故事的人会跟你说收益率。

另一个是这个案例本身的示范意义。一个公开框架,把最先进的技术用在最枯燥的那一层,还在文档里主动标出自己的数据泄漏隐患——这套做事的姿态,比任何具体技术都更值得抄。把工具用在它真正站得稳的地方,并且诚实地写下它站不稳的地方,这件事在投资里的价值,远大于用了什么工具。

小结

  • 试错学习要跑得动,需要三个条件:环境可反复重来、反馈密集及时、结果能归因到具体动作。游戏全满足,选股一条都不满足(样本三位数、噪声压倒信号、你的动作还会改变环境)。
  • 订单执行三条全满足:一天几十上百步反馈、历史行情可反复重放、好坏有一个近在眼前的笨基准可比。所以这才是这条路目前站得最稳的位置。
  • 公开框架里的定位写在目录名上:状态里刻意不装「该不该买」,动作只有「这一步执行多少量」一个旋钮,而且被定义成相对笨基准的偏离倍数。
  • 奖励函数的形状最说明问题:加分项是「比笨基准便宜了几个万分之一」,扣分项是「别急」,全程没有收益率的影子。
  • 代码作者自己在文档里标注了基准指标可能存在数据泄漏,还把「打算成交的量」和「实际成交的量」分成两个字段——这两处诚实,比功能列表更有信息量。
  • 三层边界:执行省的是成本不是收益(有天花板);模拟器的成交是假设(而且常把核心难题简化掉了);接实盘就是自动下单,必须有白名单授权、硬额度上限、外部中断开关、全程留痕。

一句话记住这篇:它学的不是「买什么」,是「已经决定要买之后,怎么慢慢买才少花点冤枉钱」——这两件事的差别,比它们听起来大得多。

本文所引源码与文档均来自上述快照版本,是阅读代码与文档得出的机制说明,不是运行结果,也不代表任何做法的实际效果。本文不评价任何工具或方法的盈利能力。回 量化与 AI 投研概念库 看相关概念各自在说什么。

内容有错、看不懂、或想看下一篇?告诉我们 →

本文为投资教育整理,不构成任何投资建议;不荐个股/基金、不预测点位、不承诺收益。关键数据与结论请结合权威来源自行验证,并见风险免责声明