强化学习相关的论文层出不穷,但真正能部署到实盘交易中的案例却屈指可数。这在量化投资领域几乎是一个公开的秘密。
过去几年,深度强化学习在最优执行领域的研究越来越多,神经网络的层数越来越深,对市场状态空间的挖掘也越来越精细。然而现实是,许多投入不菲的强化学习交易执行引擎,在实盘运行数周后,往往被悄悄替换成了仅有几个参数的简单线性模型,或者干脆退回到VWAP(成交量加权平均价格)这类基准策略。
问题并非出在强化学习本身,而是那种试图“端到端”学习一切的模式,在瞬息万变的市场中难以走通。
不过,也有少数团队的系统一直运行得相当稳健。仔细观察会发现,他们采用的并非那种企图学习全部市场规律和决策的“黑箱”策略,而是一种更为克制的思路:让强化学习仅负责调整理论模型中几个关键的动态参数。简而言之,用金融数学搭建稳健的“骨架”,再用机器学习填充适应市场的“血肉”。
这种思路并不新颖,但实践证明它更加可靠。那么,为何同样的工具,有人翻车有人却能稳步前行?那一小部分成功的实践者,究竟做对了什么?
两种截然不同的学习路径
让我们先思考一个类比:如何教会一个孩子射箭?通常有两种方法。
第一种是直接给他弓箭,让他自己对着靶子反复练习,射上十万支箭,总归能摸索出一些门道。第二种则是先传授他物理学原理:重力加速度是9.8m/s²,风速会影响箭矢轨迹,瞄准点需要根据距离调整抛物线,然后再让他上场实践,自己去感受并校准当下具体的风向。
第一种“自学成才”的教法,对应的是端到端强化学习的路子——从原始的市场数据输入到最终的下单动作输出,全部交由模型自主学习。第二种“理论指导实践”的方法,则是先用物理学搭建好瞄准的理论框架,再让学习者在实践中去调整那几个关键的变量(如风力修正系数)。我们可以称后者为 “骨架+血肉” 的思路。

端到端方法的核心问题在于,它隐含了一个强假设:十万支箭的练习场景足以覆盖未来所有可能的风向变化。但金融市场的“风向”是会改变的。在历史回测中完美拟合价格波动的深度网络,一旦在实盘中遇到未曾见过的微观结构变化,表现往往失常。因为它实际上同时在完成两项艰巨任务:理解市场的基本规律,以及学会在这些规律下做出最优决策。这两者被紧密耦合在一起,一旦底层市场规律发生变化,模型就难以分辨:是该调整决策策略,还是需要重新理解这个新市场?
而“骨架+血肉”的思路则完全不同。它首先承认,市场中存在一些相对稳定、普适的底层逻辑。例如,交易执行的核心矛盾,始终是在 “时间风险” 和 “冲击风险” 之间进行权衡。你拖得越久,市场价格朝着不利方向变动的风险越大;你交易得越急切,吃掉市场流动性所造成的冲击成本就越高。这个基本矛盾,任何时代的交易员都无法回避,它也构成了最优执行问题的理论“骨架”。
有趣的是,这个“骨架”数学家们早已为我们搭建好了。
理论骨架:HJB方程与Almgren-Chriss框架
处理时间风险与冲击风险的权衡,金融数学中有一套成熟的框架:随机最优控制。其核心由HJB方程给出,这是一个基于动态规划原理的偏微分方程。
HJB方程的核心思想极具美感:将整个交易时段切分成无数个无限小的时间片段,在每个片段上只做局部最优的决策,然后让这些局部最优在时间趋于无穷小的极限下,收敛到全局最优解。HJB方程描述的是 “价值函数” 的演变规律。对于最优执行问题,价值函数就是从当前时刻到交易结束的期望执行成本与风险的加权和。求解这个方程,理论上就能得到任意时刻的最优持仓量。
然而,通用的HJB方程通常没有解析解,必须附加具体的市场假设才能进行数值求解。在2000年前后,Robert Almgren 和 Neil Chriss 在《Journal of Risk》上发表了一套后来被广泛引用的经典框架。他们做出了两个关键假设:
- 价格动态:不受本次交易影响的“自然”市场价格服从算术布朗运动。
- 市场冲击:交易行为带来的瞬时冲击成本与交易速率呈线性关系。

在这两个假设下,复杂的HJB方程退化为一组可解的常微分方程,并导出了一个极其简洁的解析解——最优持仓路径是时间的线性函数,持仓量从初始头寸开始,随时间均匀递减至零。这条直线的斜率,由两个核心参数决定:风险厌恶系数(λ) 和 市场的流动性参数(η)。你的风险厌恶程度越高(λ越大),你就会更倾向于快速交易以规避价格风险;市场流动性越好(η越小),你就可以更从容地等待更好的价格,减少冲击成本。
这意味着,最优执行策略的基本形态是已知的——它不是一个需要神经网络从零开始拟合的神秘黑箱,而是一个结构清晰、仅由少数几个参数决定的线性函数。这为我们的“骨架”提供了坚实的数学基础。
但Almgren-Chriss框架也留下了一个关键缺口:它假定那两个核心参数(λ和η)是已知且恒定不变的。而现实是,市场的流动性每秒都在波动,交易员的风险偏好也可能随着当日盈亏情况而浮动。如果死板地使用去年的流动性参数来解今天的方程,无异于拿着去年的天气预报来决定今天的穿着。
RL的新角色:从探索者转变为校准器
理论“骨架”是正确的,但“血肉”——即那些动态变化的参数——需要实时更新。这正是前文提到的那一小部分成功实践者在做的事情:让强化学习放弃端到端的宏大目标,只专注于校准那几个关键参数。
具体而言,这个流程可以分为三步:
- 接受理论骨架:直接采用Almgren-Chriss框架给出的最优持仓路径形态(那条随时间线性递减的曲线)作为策略基础,这部分无需学习。
- 识别动态参数:明确这个骨架中哪些部分是时变的、需要动态调整的。核心就是那两个参数:风险厌恶系数(λ)和流动性参数(η)。前者反映了你对价格风险的实时容忍度,后者刻画了市场当前的深度。
- 限定RL任务:强化学习的任务被大大简化——根据当前的市场状态(如瞬时波动率、剩余时间、买卖价差等几个简单特征),输出这两个参数的最新估值。然后,Almgren-Chriss框架会拿着这两个新参数,实时生成接下来几分钟的具体执行计划。
如此一来,强化学习需要学习的映射关系,从一个天文数字般的复杂度骤降至个位数。端到端的RL可能需要处理过去几十秒的每笔成交数据(几百维特征),并输出下一个瞬间是挂单还是吃单的复杂动作,其网络参数动辄百万级。而在新框架下,RL只需要学习市场状态到两三个参数的映射,甚至不需要深度网络,一个简单的线性模型配合策略梯度算法就可能胜任。过拟合的风险被这个清晰的结构从根本上压缩了。
这种做法之所以更稳健,正是因为它用理论来管理复杂性,而不是试图用另一个复杂模型去匹配复杂的市场。
那么,当我们一味地用复杂模型去拟合复杂市场时,理论上到底面临着什么困境?
为何不能“以复杂对复杂”?
控制论中有一条著名的Ashby必要多样性定律。其核心观点是:只有多样性才能消除多样性。用更直白的话说,一个控制器要想有效控制系统,它自身必须具备与被控系统相当甚至更高的状态多样性。
将这个定律置于量化交易的语境下,可以得到一个直接的推论:市场是一个复杂度近乎无限的动态系统(包含无数参与者、持续进化的策略、突发的宏观冲击等)。因此,任何试图用有限复杂度的模型去完全控制或预测它,在理论上就是不可能的。你越是堆叠模型的复杂度去追赶市场的复杂性,就越是在逼近一条永远无法触及的渐近线。在这个过程中,模型极易捕捉大量历史的、偶然的“噪音”,从而导致严重的过拟合。
不过,Ashby定律也为我们指明了另一条出路:既然无法匹配无限,那就聚焦于有限。放弃控制所有细节的野心,转而控制那些真正驱动系统行为的关键维度。理论骨架的作用,正是帮助我们识别出这些关键维度。在交易执行中,关键维度就是“时间与冲击的权衡”,而这恰恰由少数几个参数主导。我们应该放弃对每一个tick价格的预测,只专注于动态调整这几个核心杠杆。
这种对市场复杂性的“敬畏”,并非保守,而是最务实的工程智慧。
当然,这套“骨架+血肉”方案的稳健性,建立在一个重要前提之上:理论骨架的假设在大多数市场情况下近似成立。Almgren-Chriss框架假设价格连续运动、冲击成本线性,这在正常、流动的市场中是合理的近似。但当市场进入极端状态,如闪电崩盘、流动性瞬间枯竭或涨跌停时,这些基本假设可能完全失效。此时,若仍基于正常市场逻辑输出的参数进行交易,反而可能有害。
对此,一个实用的工程方案是设置 “安全阀”机制。当监测到波动率超过历史阈值、买卖价差急剧扩大、订单簿深度消失等极端信号时,系统可以自动暂停RL调参模块,切换至更保守的基准策略(如时间加权平均价格TWAP)或触发人工干预。同时,在模型训练阶段,可以在数据中注入模拟的压力场景(例如使用蒙特卡洛方法生成极端行情切片),让模型不仅见过“好市场”,也见识过“坏市场”,从而增强其鲁棒性。
从思路到落地:几个关键的工程化角度
有了清晰的顶层设计,如何将其稳健地落地?以下几个角度值得深入琢磨:
-
让RL学习“偏差”,而非“交易”本身。一个稳妥的实践是,先设定一个简单的基准策略(如TWAP、VWAP或Almgren-Chriss的某个固定参数解)。然后,让RL只负责输出一个相对于基准的执行速率偏移系数(例如,比基准快10%或慢15%)。这样做的好处是,偏移量有明确的物理意义和边界,模型不易做出极端决策。即使某天RL表现异常,系统退一步也仍有可靠的基准策略在运行。
-
将交易直觉量化为模型特征。模型需要的是数字,而非模糊的感觉。我们需要找到并构造那些与核心决策真正相关的信号。实盘经验表明,往往真正管用的特征就那么几个:基于tick数据计算的已实现波动率、当前买卖价差的宽度、订单簿前几档的累积深度、剩余时间占总交易时长的比例等。特征越精炼,模型越稳定,问题也越容易定位。
-
为模型能力划定清晰的边界。必须明确区分什么可以调、什么不能动。例如,“必须在规定时间内完成交易”是任务本身的硬性约束,属于结构性规则,不应让RL去学习“是否要完成交易”。而“你有多害怕价格跑偏”则是参数化的偏好,可以动态调整。因此,可以将系统设计为两层:底层是一个参数化的数学函数(如Almgren-Chriss求解器),参数对外暴露;上层RL仅负责更新这几个暴露的参数,无权改动底层函数的结构。这样清晰的权责划分,极大便利了系统的调试与监控。
-
采用事件驱动的参数更新。市场大多数时候处于平稳状态,并不需要每秒都调整策略。我们可以为RL调参模块设置触发机制:仅当市场状态变化超过预设阈值,或策略执行的累积误差达到一定水平时,才触发一次参数更新。其余时间则沿用上一次的有效参数集。这不仅能节省大量计算资源,也能避免策略因市场微小波动而产生不必要的频繁抖动。
-
精心设计奖励函数,明确优化目标。强化学习输出参数的质量,最终取决于你用什么标准评价它。如果奖励函数仅仅定义为“已实现成本越低越好”,模型很可能会学会过度冒险——例如在流动性差的时候依然激进交易,赌价格不会反向波动。赌对了则成本极低,赌错了则损失惨重,但长期看奖励函数的平均值可能依然“漂亮”。因此,必须在奖励中加入风险惩罚项。例如,除了负的执行成本,再减去成本方差的某个倍数。这个倍数反映了你对不确定性的厌恶程度。这样,RL在优化时就会自动在“追求低成本”和“控制风险”之间寻找平衡。这实际上正是Almgren-Chriss框架中价值函数“期望成本 + λ × 风险”思想的动态化延伸。
总结:划定边界,方能行稳致远
归根结底,“骨架+血肉”的思路成功地将一个复杂问题拆解为两个层次清晰、各司其职的子问题。
底层是普适的数学框架,如Almgren-Chriss模型。它封装了我们对交易执行最基本、最稳定的理解——时间与冲击的永恒权衡。这个矛盾十年前存在,十年后也不会改变。
上层是自适应的学习模块,即强化学习。它无需重新发明轮子去理解“什么是交易”,只需要像一个敏锐的观察者,感知当下市场的具体环境:波动率是高是低?流动性是紧是松?然后,据此去动态调整那两个关键参数:我们今天应该更担忧时间风险,还是更忌惮冲击成本?
经过这样的拆解,强化学习面对的问题性质彻底改变了。它从一个需要学习“市场状态→下单量”这个无限复杂映射的探索者,转变为一个只需学习“市场状态→少数参数”这个有限、明确映射的校准器。
这样做的最大好处是,即使学习模块偶尔犯错,底层的数学骨架依然能提供最基本的保障。参数调得激进一些,无非是执行比基准策略快一点或慢一点,几乎不可能做出完全违背金融常识的、灾难性的决策。
那些在实盘中取得成功的少数派,或许只是在众人仍沉迷于“用复杂征服复杂”的竞赛时,清醒地认识到自己能力的边界,并为强大的学习工具划定了清晰、安全的作用域。在技术的世界里,有时候,“有所不为”比“无所不能”需要更多的智慧和勇气,也往往能带来更持久、更稳定的回报。对于对这类结合了经典理论与前沿AI的实战话题感兴趣的开发者,欢迎到 云栈社区 的 人工智能 或 算法/数据结构 板块交流探讨,那里有更多关于模型实现与算法优化的深度讨论。