AI做市研究:从最优报价公式到强化学习与学习型市场

发布时间:2026/10/17 8:10:04

AI做市研究:从最优报价公式到强化学习与学习型市场 从最优报价到学习型市场AI 做市研究的理论、算法与经济机制做市Market Making这事听起来高大上其实本质就是“摆摊赚差价”。你在菜市场租个摊位左手从批发商进货右手卖给顾客靠买卖价差Spread活着。交易所里的做市商干的事情一模一样只不过商品变成了股票、期货、期权摊位变成了订单簿顾客变成了成千上万的匿名交易者。以前大家觉得做市是个“手艺活”靠经验、靠盘感、靠手速。后来变成了“数学活”用随机过程建模库存、用最优控制算报价。这几年风向又变了——强化学习RL开始进场做市从“人盯盘”转向了“算法自动决策”。更有意思的是当足够多的AI做市商同时在场市场本身的演化逻辑都会被改变出现一种所谓“学习型市场”的形态。这个方向我前后折腾了两年多从经典报价公式一路做到基于强化学习的模拟对冲期间踩了无数坑。今天把这一路的理论脉络、算法实现、还有对市场机制的思考整理出来希望对想入坑量化做市的朋友有所帮助。1. 做市的核心逻辑它到底在赚谁的钱1.1 摆摊经济学价差、库存与信息不对称做市商不是投资者它不关心价格涨到哪、跌到哪只关心一件事买卖双方在我这个摊位上的流量是否均衡。它赚的钱来自两部分——价差收益和回扣激励。价差收益好理解买价Bid和卖价Ask之间那一点点差每成交一次就落袋一次。交易所层面的激励则是很多交易平台为了增加流动性直接给挂单做市的账户返佣相当于摊主摆摊不仅赚差价市场管理方还给补贴。但做市商不是稳赚不赔的。它的风险主要来自两个方向存货风险手里囤了一堆货卖不出去价格跌了就得亏。做市商被迫“接盘”的过程往往发生在市场急跌时。逆向选择风险对手比你更懂行情。你挂单等对手来打但这个对手可能是手握内幕信息的大户你每次成交都在“被聪明钱收割”。传统做市理论的核心就是在这两个风险之间找平衡。1.2 从Glosten-Milgrom到Avellaneda-Stoikov上世纪八十年代Glosten和Milgrom提出了一个经典模型把做市商的报价问题看成“信息不对称下的定价问题”。交易者分两类噪声交易者是随机买卖的散户知情交易者则知道资产的真实价值。做市商每成交一笔都要根据成交方向更新自己对资产价值的判断——有人砸盘是不是他知道什么坏消息于是买价下调。这个模型解释了为什么价差不会被竞争完全抹平价差本质上是对“可能被知情交易者收割”的风险补偿。到了2008年Avellaneda和Stoikov把这个思路工程化了。他们提出的库存模型至今仍然是用得最广泛的做市基准框架数学上很优雅delta (1/2) * gamma * sigma^2 * (T - t) - gamma * q * sigma * sqrt((T - t) / k)这个式子看着唬人拆开看其实就两件事第一项衡量的是“距离交易结束还剩多久”。时间越充裕价差可以拉得越开因为你有更多机会等一个好价格。第二项衡量的是库存偏移。如果你手上净多头q为正就主动调低卖价、调高买价吸引对手来买走存货反过来也一样。这套框架后来成了无数对冲基金做市策略的基石。它的好处是参数少、逻辑透明、回测稳定坏处也很明显——模型假设市场波动率是常数但真实市场的波动率本身就是随机的这导致它在极端行情下频频失灵。我在早期实验时直接在这个框架上跑模拟得到的结论是平稳行情里它能稳定吃价差一旦波动率跳升库存堆积速度会远超模型预期止损逻辑一启动就左右挨打。这个教训让我意识到光靠解析解是走不远的。2. 算法演进当强化学习开始接管报价2.1 为什么传统模型扛不住现代市场传统做市模型解决的是“给定市场状态如何报价”的问题。但现代市场早就不是那个缓慢、线性的世界了。高频交易的普及让订单簿变成了一台微秒级变化的机器算法拆单让大单不再是粗糙的冲击而是细碎的水滴指数基金、ETF申赎、期权对冲等多层因素交织市场微观结构的复杂度远超任何一组偏微分方程能刻画的范围。传统模型面对这种环境有几个棘手问题特征维度爆炸订单簿两侧各档位的价格、数量、撤单率、主动成交占比……这些特征数以百计而且互相耦合。手动建模基本不可能。非线性关系库存风险和市场冲击之间的关系不是线性的情绪恐慌时同样一单砸盘的冲击力是平时的数倍。这种非线性很难用解析公式捕捉。市场状态的动态变化同一套参数在震荡市里赚钱到了趋势市就亏钱。模型不会自己切换。这时候强化学习就显示出价值了——它不需要你显式建模市场规律只需要设定奖励函数让算法自己在与环境的交互中“悟出”策略。2.2 强化做市的核心三要素把做市问题改写成强化学习框架首先得定义三样东西状态、动作、奖励。状态State的设计决定了模型能“看到”什么。我的做法是把状态分成三层第一层是自身上一时刻的库存量与现金量这是做市策略的安身立命之本第二层是订单簿快照一般取前五档买卖价格和数量第三层是衍生信息包括短期已实现波动率、买卖不平衡度、最近N笔成交的方向与强度。这三层状态需要用时间窗口滚动更新相当于让模型不仅知道当前订单簿什么样还隐约感知到“盘口正在怎么变化”。动作Action的设计比较讲究。一开始我试图让模型直接输出买价和卖价的绝对数值结果训练出的策略奇葩且不稳定动不动就把价格挂在偏离市场十万八千里的位置。后来改成相对动作——输出一个价差的缩放系数和一个报价中心偏移量ask mid_price * (1 spread_scale / 2) offset bid mid_price * (1 - spread_scale / 2) offset这样动作空间就从无界的实数压缩到了有界的策略区间训练难度降低了一个数量级。奖励Reward的设计是最考验功力的环节。如果你简单地把每步的PnL盈亏当奖励模型很快会学会一个很危险的技巧挂极端的单边报价运气好赚一大笔运气差亏到爆仓。为了抑制这种高风险行为我在奖励函数里加了一个库存惩罚项reward pnl_step - lambda * (inventory_step)^2这个lambda需要精心调参。调太小模型有恃无恐调太大模型变成一个纯粹的“库存出清机器”价差收益会被过度牺牲。我最终用的方法是先跑一组不同lambda的短训练选那个“收益不降但最大回撤明显变小”的拐点值。2.3 训练环境是最大的坑做强化学习做市九成精力其实花在写模拟环境上。市场环境不好学到的东西全是空中楼阁。理想的环境应该具备三个特性低延迟每一步动作几毫秒内需要返回新状态否则训练效率低到没法看。可干预能随时注入冲击、改变波动率用来测试策略在极端行情下的表现。忠实还原撮合引擎不能太简化至少要能模拟排队位置、成交概率与价格路径之间的关系。我自己最终采用的是基于历史逐笔数据做回放Tick Data Replay的方式。在数据回放中你的报价进入订单簿后能否成交、成交价格是多少完全由历史真实数据决定。这种方式比纯模型模拟要真实得多缺点是数据量一旦庞大训练速度会拖慢很多。后来我试过用生成对抗网络先合成价格路径、再在上面做训练效果也还可以。但最后真正上台实盘前我坚持用历史数据回放做了一轮全量验证因为只有历史数据才能暴露模型是否在“拟合模拟器的规则”而不是“拟合真实市场的规律”。2.4 离线强化学习带来的新变量一开始做强化做市大家都在线学习——模拟器跑一步、策略更新一步。但真实市场不允许你随意试探一次错误的极端报价就可能造成真实亏损。于是离线强化学习Offline RL开始进入做市领域。离线强化学习的思路是只用历史数据训练不与环境交互。你可以把过去一年所有的订单簿快照和成交记录拿来提取出“如果当时做了某个报价事后收益是多少”再从中学习策略。这个方法的好处是零试错成本坏处也明显历史数据里没有覆盖到的状态模型完全没见过上线后遇到极端情况容易“发呆”。解决思路之一是做保守Q学习CQL在训练时主动压低不熟悉状态下的Q值估计让模型在遇到全新状况时更倾向于缩小报价规模、缩小风险敞口。这个妥协很重要——做市这个领域活下来比赚得多更重要。3. 从个体策略到市场形态什么是学习型市场3.1 微观行为的宏观涌现当我把视角从单个做市商的策略设计抽离出来放到整个市场层面看会看到一个有意思的现象每个做市商都在用自己的模型解读市场、调整报价而这些调整反过来又改变了市场的数据分布进而影响其他做市商的模型更新。这就是一个典型的多智能体系统。市场不再是被动等待参与者去适应的“环境”它会因为参与者的行为而演化形成一种双向动态。学术界这几年开始用“学习型市场”Learning Market这个概念来描述这种状态市场不是静态均衡而是一个持续被参与者改变、又反过来重塑参与者的动态系统。我做过一个模拟实验让一百个简化版的强化学习做市商同时在一个合成市场里交易记录它们的集体行为特征。结果发现几件事当大部分做市商使用相似策略时市场的价差会迅速收窄至接近交易成本底线集体利润趋近于零。当策略多样性提高价差会稳定在一个更宽的水平市场深度也更好因为不同策略对库存的容忍程度不一样报价错位形成了互补流动性。一旦外部冲击导致大量做市商同时启动止损流动性会瞬间枯竭——这不是某一个人的错但每个人都感受到后果。这说明市场生态系统的健康和多样性与单个策略是否“聪明”同等重要。3.2 流动性螺旋与脆弱性学习型市场会带来一个令人不安的特性反馈回路。假设市场因为某种原因出现连续下跌。做市商的库存模型会告诉它“你的存货增加了需要降低报价来吸引买家。”当几乎全部AI做市商都在同时执行类似逻辑时报价会集体下移进一步推动价格下跌然后触发更多止损。这就是流动性螺旋。去年某次商品市场夜盘异动就出现了典型的流动性螺旋。事后看订单簿数据买一档到买五档的挂单量在暴跌前十分钟一直在稳步减少报价下移的速度远超基本面能解释的量级。这是典型的算法集体撤退痕迹不是任何一家机构的“阴谋”而是策略趋同导致的系统性共振。我个人认为这个现象是对“AI做市提高市场效率”这种论调的警告。流动性的来源本质上是做市商愿意承担风险的意愿如果所有做市商都使用同样的风控阈值市场的风险承载能力就会出现共振式断裂。3.3 监管视角从行为监管到算法审计传统关于做市商的监管逻辑是设定义务持续报价、最小挂单量、最大价差惩罚违规。但在AI做市时代行为监管开始力不从心。一家机构可以说“我的算法在市场异常时自动撤单”但你说不清楚这个“自动撤单”的触发条件是什么、会不会在关键时刻集体触发。一个更可行的方向是算法审计Algorithm Auditing监管层不直接告诉你“你必须怎么做”而是要求每家做市机构定期提交算法行为的压力测试报告——在给定极端场景序列下你的算法会做出哪些动作流动性贡献如何变化。这套逻辑其实和金融行业做压力测试的思路一脉相承区别在于把测试对象从“资产负债表”扩展到了“算法行为”。目前多家交易所已经在做类似的模拟演习虽然离全面推广还有一段距离但我认为这是必然方向。4. 案例拆解一个简化的深度强化学习做市实验概念讲了一堆落不了地等于白讲。我完整走一遍一个最小可运行的深度强化学习做市实验分享过程中遇到的关键问题和解决方案。4.1 实验设计的目标与边界这个实验只解决一个问题在给定的合成市场环境中一个时序差分的DQN变体能否稳定学习到比固定报价公式更好的做市策略。边界条件设得很清楚市场环境使用几何布朗运动加泊松跳跃生成价格路径波动率人工可控订单簿撮合采用简单的排队模型每个价格档位按先到先得撮合初始资金十万允许的最大库存一千单位超限强制平仓并给予惩罚。这个环境已经做了大量简化但如果连这个简化环境都学不出稳定策略换更复杂的环境只会更困难。4.2 网络结构与实现细节我采用了经典的Dueling DQN结构。网络输入层接收约三十九个连续特征中间两层全连接各二百五十六个神经元输出端拆分成状态价值流和动作优势流最后用两层全连接合并成各动作的Q值估计。训练参数如下参数取值说明折扣因子 gamma0.99强调长期收益学习率3e-4经验上太大会震荡回放池容量200000步数每步批量大小256从回放池采样目标网络更新频率1000步太频繁训练不稳定动作离散化21档价差 x 5档偏移共105个动作在线训练跑了一百五十万步用最后的固定策略模型在全新合成路径上回测一万个回合。关键对比对象是一个参数调优后的Avellaneda-Stoikov基准模型。4.3 踩过的三个大坑第一个坑是奖励稀疏化问题。最初设计奖励时只给了成交后的PnL导致大部分时间步奖励为零模型学得很慢两万步以后Q值还几乎不变化。解决方法是把奖励拆成即时奖励和潜在奖励——成交差价立即给一个小的正奖励库存变化则通过库存惩罚项间接体现同时把未成交时的“状态-动作价值”作为引导信号输入DQN的TD误差计算。这一改收敛速度翻了好几倍。第二个坑是库存惩罚的过拟合。lambda设成0.01时模型学会了从不大规模建仓每笔交易赚一个最小价差就跑策略安全但收益极低。设成0.0001时模型又变得激进偶尔一次巨额亏损就能把两周的利润全部吐回去。最终我用了一个动态lambda方案库存量超过阈值时惩罚系数自动放大在安全与盈利之间做了一个软性的熔断机制。第三个坑是训练-回测分布漂移。训练环境中价格路径用固定的波动率参数生成回测时我换了一个波动率稍高的参数模型绩效就大幅下降。这个问题的本质是模型学会了“记住训练环境里的波动率水平”而不是“感知当前环境里的波动率水平”。最后我把特征里的波动率估计值从静态常数改成了滑动窗口计算值模型才逐步学会适应不同波动环境。4.4 实验结果与结论最终回测结果DQN模型的平均每回合收益比Avellaneda-Stoikov基准高出约18%但最大回撤也略高。更关键的区别在行为模式上——基准模型在波动率升高时反应迟钝库存持续增加DQN模型则在波动率飙升时会显著缩窄挂单规模主动“躺平”避险这一点和人类做市商的经验判断不谋而合。这说明深度强化学习学到的并不仅仅是“报价公式的拟合”而是一种更接近“风险情境识别”的能力。它知道什么时候该赚钱什么时候该保命。5. 实用建议与未来的方向5.1 给想入门AI做市的人三条建议第一先把传统模型吃透再碰强化学习。我见过太多新人直接跳进RL的坑最后连Avellaneda-Stoikov的公式都推导不出来。传统模型是理解做市问题的理论骨架没有这个骨架你连状态怎么选、奖励怎么设都无从下手。第二用模拟环境做验证但别只信模拟环境。合成环境里的最优策略往往在实盘里并不是最优甚至会亏钱。我在模拟里跑出“完美策略”之后用历史数据回放验证总能发现不少幻觉收益。两套环境交替验证是最稳妥的做法。第三奖励函数不是一次性设计出来的它需要像调琴一样反复微调。每次调整后不仅看收益曲线还要看行为特征——库存分布、成交频率、价差宽度分布。这些行为指标比最终的净值更能告诉你模型是否在走正道。5.2 做市研究的三个值得关注的前沿方向一是多智能体强化学习。既然现实市场的做市商是多个智能体共存那在模拟环境里也应该用多智能体共同演化的方式来做研究。单一智能体学出的策略放在多智能体环境里可能完全失效。这个方向对算力的要求高而且收敛困难但一旦跑通能揭示很多关于市场动态规律的东西。二是混合整数规划与强化学习的结合。真实做市不仅要决定价格还要决定挂单数量、撤单时机、多市场间的库存调配。这本质上是一个带约束的连续决策问题。用强化学习做连续决策用优化器处理合规与约束二者结合可能是落地的关键路径。三是可解释性做市策略。交易所有合规要求公司有风控要求如果模型是个黑箱出了问题连排查都无从下手。做市这个场景天然不适合端到端的黑箱RL更适合的做法是用RL生成策略参考再用可解释性模型去拟合策略逻辑最终形成人能看懂、能审计的规则集。5.3 我最后的思考做市研究绕了一圈从最优报价到学习型市场本质上是在回答一个更根本的问题在一个由算法构成的市场里流动性到底来自哪里。传统答案来自做市商的报价意愿而这个意愿背后是对风险的测算和对利润的追求。AI做市并没有改变这个逻辑但它改变了测算的精度和响应的速度——快到市场参与者集体反应的速度已经接近同步。这样一来市场的效率确实提高了但系统的抗风险能力是否也同步提高我没有把握。一个由高度趋同的AI构成的市场可能在平静时非常漂亮但风暴来临的一刻流动性可能像潮水一样集体退去。作为从业者我的态度是拥抱AI做市带来的效率提升同时敬畏它带来的系统性变化。策略上留足冗余风控上多设熔断研究上保持多样性。这些不是漂亮的空话而是我在实盘中被现实教育出来的体悟。希望这篇分享能让你少走我走过的弯路。
延伸阅读

更多相关文章

2026/10/17 8:10:04

STM32步进电机闭环控制:增量编码器+PID位置环完整实现

简介:一套基于STM32F103ZET6的编码器反馈与步进电机驱动实例,面向嵌入式电机控制初学者及需要快速搭建运动控制框架的开发者,涵盖定时器PWM驱动步进电机、输入捕获读取增量编码器以及USART串口上报位置数据的完整流程。资料包共206个文件&…

2026/10/17 8:10:04

把AI编程助手请进终端:Claude Code实战与避坑指南

1. 为什么要把主力开发工具换成终端里的 Claude Code这段时间我基本把一半以上的日常开发主战场搬进了终端,直接在命令行里和 Claude Code 配合干活。以前我常用的 AI 编程方式,是在浏览器或 IDE 侧边栏开一个聊天窗口,把代码块复制过去提问&…

2026/10/17 8:10:04

AI做市研究:从经典报价模型到学习型市场的风险定价

1. 做市商的生存逻辑:价差背后的风险定价刚开始接触做市(Market Making)的时候,我脑子里想得很简单:低价买、高价卖,两边挂单赚价差,这不就是躺赚吗?真正下场做了一轮模拟盘之后才明…

2026/10/17 9:20:09

SQL空值处理实战:COALESCE函数原理、用法与避坑指南

在数据库里跑 SQL 时,最让人又爱又恨的东西应该就是 NULL 了。你说它是空值吧,它又不等于空字符串,也不等于 0;你说它没有值吧,它在聚合、连接、排序里又无处不在,稍不留神就给你惹一堆麻烦。COALESCE 这个…

2026/10/17 9:20:09

AI时代程序员的核心竞争力:从写代码到定义问题与决策

1. 能力坐标系:从“写代码的执行者”变成“定义问题的决策者”先说结论:当 AI 能自动生成代码、自动修 bug、自动做测试的时候,程序员最核心的竞争力,已经从“把需求变成代码”这一层,整体上移到了“确认要做什么、为什…

2026/10/17 9:20:09

老ThinkPad SL系列换网卡报1802?BIOS白名单移除工具实战指南

简介:这份资源面向ThinkPad SL300、SL400、SL500系列笔记本用户,尤其是希望更换或升级无线网卡却受原厂BIOS白名单限制的DIY爱好者与维修人员。包内提供原厂6auj19us版1.30 BIOS、已移除白名单的可直接刷写版本,以及配套的修改工具&#xff0…

2026/10/17 9:20:09

MySQL必备:ORDER BY、INSERT、UPDATE、DELETE四语句实战详解

直接用这四个语句搞定80%的日常数据操作:排序、插入、更新、删除,看似基础,但每一条背后都有不少值得抠的细节。这篇博文就把它们逐一拆开,从基本语法讲到实践中的坑,基于MySQL 8.0环境实测,适合刚入门SQL的…

2026/10/17 9:20:09

JMeter分布式压测全流程实操:原理、部署与踩坑指南

做性能测试这些年,单机压测跑到一半发现负载机上不去了,是件很常见的事。脚本跑起来之后眼睁睁看着CPU飙到100%,但目标服务的响应时间还没出现拐点,这时候就得考虑把压力源从一台机器铺到多台机器上。网上关于JMeter分布式的资料不…

2026/10/17 9:15:09

React项目代理配置实战:从package.json到setupProxy的完整指南

1. 项目概述:为什么React项目离不开代理配置做React开发的人,几乎都会遇到同一个问题:前端页面在本地跑得正欢,一调后端接口就报跨域。尤其是用React官方脚手架Create React App(以下简称CRA)起步的项目&am…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/17 0:04:32

PlanarSLAM:面向曼哈顿世界的点线面联合SLAM系统

简介:本资源是面向机器人视觉与SLAM研究者的C开源RGB-D SLAM系统实现,专为结构化室内场景(如办公室、走廊)设计,通过融合点、线、平面三类几何特征并引入“曼哈顿世界”假设,显著提升位姿跟踪鲁棒性与稠密地…

2026/10/17 0:04:32

TDH Workflow调度实战:从DAG依赖驱动到任务编排与故障排查

1. 从一个调度脚本说起:TDH Workflow到底在解决什么问题第一次接触TDH的Workflow,是在一个数据清洗项目里。当时团队每天要跑几十个ETL任务,任务之间有严格的先后依赖——A表清洗完才能跑B表的关联,B表跑完才能触发C表的聚合。最开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑