☰
做市策略核心:Avellaneda-Stoikov模型报价公式与实盘应用解析
2026/10/4 4:31:05 网站建设 项目流程

做市策略这个词,在量化交易圈里经常被当成一个高深概念聊,但说白了,它就是一个不断回答"现在挂买价还是卖价、挂多少、挂多久"的决策过程。Avellaneda和Stoikov在2008年发表的这篇论文,之所以能成为限价订单簿策略里的经典,是因为它第一次把做市商的两难困境——赚价差还是扛风险——用一个足够简洁又足够严谨的框架摊开来讲清楚了。

这篇内容我打算用通俗的视角把AS模型的思路拆开,不堆推导,重点讲清楚它到底在解决什么问题、报价公式里的每一项为什么长这样、以及拿到真实行情数据后怎么用起来。适合刚接触限价订单簿策略、想做市又不知道从哪下手的同学,也适合那些已经跑过简单挂单策略、但总觉得逻辑里有漏洞的人。第一篇文章先把模型的骨架和直觉讲透,后面再聊参数估计和实盘改造。

1. 做市商到底在赌什么:看懂AS模型之前的问题背景

1.1 赚的是价差,亏的是方向

我先用一个开便利店的例子来类比。你开了一家店,进货价是10块,你挂12块卖。每卖出去一瓶水,你赚2块差价。这个生意看起来稳赚不赔,前提是——你进的货真的能卖掉,且进的货没有过期风险。

交易所里的做市商干的事情一模一样。他们同时在买盘和卖盘两侧挂单,买一价和卖一价之间那个差,就是他们的毛利。但跟便利店老板不同的是,做市商手里的"货"是股票、期货、加密货币这类价格每秒都在波动的资产。你刚在100块买了一手,如果价格跌到99块,你的库存就浮亏了。这个亏损可能远远超过你赚到的价差。

所以做市商面对的核心矛盾就是:价格波动带来库存风险,库存风险限制了你想赚的价差收益。AS模型的所有公式,其实都在围绕这个矛盾做权衡。它不是一套固定的挂单规则,而是一套告诉你"该在什么价位上,承担多大的库存风险"的决策框架。

1.2 AS模型在量化策略里的位置

Avellaneda-Stoikov模型发表于2008年的论文《High-frequency trading in a limit order book》,从论文标题就能看出来,它针对的是高频交易场景下的限价订单簿。

它在量化体系里的位置,可以说是"库存风险管理的基石"。后来大量关于做市策略的研究,比如参考价调整、订单驱逐策略、多资产做市,很大程度上都是在AS模型框架上做的改良和扩展。理解了这个模型,你去看很多做市类的论文和开源项目,会顺畅很多。

但要注意的是,AS模型解决的只是"我应该报什么价格"这个问题,它不回答"我是谁、我应该在哪交易、我应该持有多久"。这些前置决策靠的是策略设计者的判断。模型是术,策略是道,先把这个边界搞清楚,后面才不容易乱套。

2. AS模型的报价规则,用大白话拆开

2.1 三个数决定一条报价:参考价、库存偏移、半价差

AS模型的报价逻辑可以浓缩成一个非常直观的公式结构:你的买价和卖价,分别是在某个"参考价"的基础上,减去一个偏移量、加上一个偏移量。

用数学语言写一下:

  • 最优买价 = 参考价 - 库存偏移 - 半价差
  • 最优卖价 = 参考价 - 库存偏移 + 半价差

这里的关键在于"库存偏移"。如果做市商手里没有任何库存,也就是持仓为零,那么最优买价和卖价应该对称地分布在参考价两侧。但一旦手里有了库存,比如你持有1000股,你就会比空仓状态更希望卖掉一部分减仓。怎么让市场帮你减仓?答案是把卖价调低一点、把买价也调低一点——注意是两侧同时调低。

为什么买价也要调低?因为如果买价太高,你会继续买入,库存越来越大,风险越扛越多。所以当你库存偏多时,整个报价中枢要往下移,相当于你向市场传递一个信号:我更愿意卖,不太愿意买。反之,如果你库存为空或负值,报价中枢往上移,你更愿意买入回补。

这个"报价中枢随库存移动"的直觉,是整个AS模型最核心的思想。很多新手做市策略失败,就是因为只会在参考价两侧对称挂单,手里库存方向跟行情反了以后,越亏越不敢挂,最终跑出巨大回撤。

2.2 库存偏移为什么是风险的"影子"

在AS模型里,库存偏移的精确表达式是:

  • 库存偏移 = (q / γ) × σ² × (T - t)

我来逐项拆解,不然这个公式对新手就是个咒语。

q是当前库存量,正数代表净多头,负数代表净空头。这个好理解。

γ是风险厌恶系数,它代表你有多不喜欢库存风险。γ越大,你越害怕库存压在手里,于是同样的库存量会带来更大的报价偏移。你可以把它理解成做市商的"胆子"参数。

σ²是标的资产的方差,也就是波动率的平方。波动越大,库存风险越大,所以偏移越大。

T - t是距离策略结束时刻的剩余时间。如果T和t的单位是天,那么T - t就代表距离收盘还剩几天。随着时间推移,剩余时间越来越短,库存偏移也越来越小。

这里的逻辑很有意思:AS模型假设做市商在一个固定时间点T必须清空库存。离这个清算时刻越远,你越有时间慢慢把库存出掉,所以对偏离报价中枢不那么敏感;离清算时刻越近,你调整库存的机会越少,反而要根据库存情况更加激进地调整报价。

这里扯一句题外话。很多人在实盘里做市,并没有一个明确的"T时刻必须清仓"的约束,但模型告诉你,你必须定义一个。哪怕你给自己定义的T是"每个交易日的收盘前5分钟强制平掉所有库存",这也是一个约束。没有这个约束,整个模型的数学框架就失去了锚点,参数也很难调。

2.3 最优价差公式为什么带 γσ²(T-t)

除了库存偏移,AS模型还给出了最优价差的表达式。简化后的核心版本是:

  • 最优半价差 = γσ²(T - t) + (1/γ) × ln(1 + γ/α)

这个公式看起来比库存偏移复杂,但拆开看其实就两件事。

第一项γσ²(T-t),是库存风险补偿。它说明你报出的价差至少要能覆盖持有库存期间承受的价格波动风险。如果波动率很大,或者剩余持仓时间很长,你就要把价差挂宽一点。否则你辛苦赚的价差,还不够一波反向波动亏的。

第二项(1/γ) × ln(1 + γ/α),是对"成交概率"的平衡。α代表订单到达强度,或者说市场上有多少人愿意跟你的挂单成交。如果α很大,说明市场流动性好,单子很快就能成交,你不需要靠缩小价差来吸引对手方;如果α很小,市场冷清,你就要适当缩小价差来增加成交概率。

所以最优价差不是固定不变的,它依赖于你对未来波动率的估计、你的风险偏好、以及市场的流动性状况。AS模型的精细之处就在于,它把这些因素全部量化进了报价决策里。

我个人的理解方式是:第一项是"风险预算",第二项是"成交补偿",两者相加才是你在当前环境下愿意承担的最优风险暴露。很多实盘做市策略就是把这两项拆开单独调,最后调出了扭曲的参数,问题就出在没有同时考虑两边。

3. 模型里的参数,每个都代表一种做市商的"性格"

3.1 风险厌恶系数γ:敢不敢压货

γ在AS模型里是最难拍脑袋定下来的参数。它是风险厌恶系数,在数学上来源于做市商对一个指数效用函数的优化。

通俗地说,γ决定了你在"赚价差"和"控风险"之间的偏好。γ小,代表你比较能扛,愿意手里持有较大库存去博更多的价差收益;γ大,代表你比较谨慎,稍微有一些库存就想办法减掉。

实盘中的γ怎么定?我见过的做法大致分三类:

一类是拍脑袋,根据自己的资金量和心理承受力设定一个区间,然后在回测里网格搜索。另一类是根据历史数据做估计,看历史上做市商在类似市场环境下的报价行为,反推出一个隐含的γ。还有一类是直接按固定风险预算算,比如"我最多能承受账户1%的浮亏",反推γ。

三种方法我实践下来,最有效的还是先拍脑袋定范围,再用实盘和回测数据去调。因为γ本质上是你的主观偏好,它跟策略的绩效表现之间的关系不是单调的,不存在一个"最优γ"可以直接解析地求出来。

3.2 波动率σ和持仓时限T-t:期限越短越敢做

波动率参数在AS模型里的作用被很多人低估了。模型推导时用的是σ²,也就是说它是平方项,对报价的影响是高度非线性的。当波动率翻倍时,库存偏移和风险补偿项都会变成原来的四倍,这会让报价区间变得非常宽。

所以实盘中,AS模型的参数必须跟波动率的估计方式强绑定。如果你用的是30分钟级别的已实现波动率,跟用日线收益率算的波动率,得出的报价完全不同。

持仓时限T-t在盘中是线性衰减的。这带来一个很有意思的行为模式:在策略刚开始的时候,库存偏移很大,价差也相对宽;越接近清算时间T,报价越激进,价差越收窄。这跟很多手工做市交易员盘中的体感是一致的——临近收盘,必须收窄价差快速把库存打掉。

3.3 订单到达强度λ:市场里到底有没有人陪你玩

订单到达强度α的估计比较微妙,因为限价订单簿里的到达过程本质上是一个高频事件流。

简单理解,α是你的限价单在其他条件不变时,"每秒被成交的平均次数"。这个值可以从历史盘口中估计,也可以在线更新。但要注意,到达强度不是稳定的,盘中不同时段差异巨大。

早盘和尾盘流动性好,α大;午间清淡,α小。如果策略用一个固定的α跑全天,效果一定好不到哪去。实际上应该用滚动窗口实时估计α,或者至少分时段设置不同的α值。

下面这张表可以快速对照三个参数变化对报价的影响:

参数增大时库存偏移增大时价差做市商性格变化
γ(风险厌恶)缩小先增后减更怕库存
σ(波动率)增大增大更谨慎
α(订单到达强度)不变缩小更激进抢成交

注意γ对价差的影响不是单调的,公式第二项里有ln(1+γ/α)再除以γ,这个函数先增后减。实操中很多人在这个参数上一直调不对,就是因为没搞明白它的非单调特性。

4. 把模型接到真实行情上:实操路径与经验教训

4.1 从公式到代码:第一步是定义参考价

纸上谈兵讲完公式,落地才是真问题。AS模型在实际跑策略时,第一个绕不开的问题就是:参考价用哪个?

论文里假定参考价是股票的"真实价值",但真实环境中没人知道真实价值是多少。实践中常用的参考价有三类:

  • 最新成交价,这个最简单,但噪声大,容易被单笔异常成交带偏。
  • 买一卖一中间价,能反映当前盘口均衡位置,也是论文在数值实验里常用的代理。
  • 成交量加权平均价格(VWAP)或时间加权平均价格(TWAP),相对平滑,但滞后比较明显。

我自己的经验是,做高频做市用盘口中间价最合适,因为它最能及时反映订单簿状态的变化。但如果盘口价差经常出现瞬间拉宽的情况,建议加一层轻量级平滑,比如用指数移动平均处理一下。否则报价中枢会来回跳,导致频繁撤改单,被交易所的撤单限制卡喉咙。

参考价选完之后,接下来按公式算出理论报买价、报卖价,再结合订单簿档位规则做四舍五入。这里有个细节注意:如果算出来的买价高于当前卖一价,说明你实际上是在"交叉"报价,下单会直接吃掉对手盘,这在很多做市场景下是不允许的,代码里要加保护逻辑。

4.2 参数估计:波动率、订单强度、风险偏好的落地做法

参数估计这块,我踩过的坑比较多,这里分享一套相对靠谱的路径。

波动率估计建议走两条路线对照。一条是低频路线,用最近N根K线的对数收益率算标准差,再按策略持仓周期折算;另一条是高频率路线,用已实现波动率,把5分钟内的逐笔成交收益率平方累加。两种方法交叉验证,如果差异很大,说明行情结构不稳定,这时候宁可保守一点取较大的值。

订单到达强度α的估计,建议用最大似然估计做一个简单泊松过程拟合。具体做法是,在历史数据上统计"限价单从挂出到成交之间的时间间隔",然后求这些间隔的均值,它的倒数就是到达强度的估计值。因为代码逻辑不复杂,也可以用滑动窗口实时计算,每隔30秒更新一次α。

γ没有标准估计方法,我的建议是不要试图从历史数据中反推一个"最优点",而是设定一个合理区间后做稳健性检验。具体做法是,在回测中分别测试γ=0.01、0.05、0.1三档,看策略收益和最大回撤的变化。如果γ从0.01调到0.1,策略表现发生剧烈波动,说明策略逻辑本身对风险偏好太敏感,问题可能不在γ而在参考价或者订单管理逻辑上。

4.3 我踩过的三个坑

做AS模型实盘过程中,有三次教训记忆深刻。

第一个坑是直接用年化波动率套进公式,忘记做时间尺度换算。AS模型里的σ²必须跟持仓时限T-t的单位保持一致。策略持仓周期是分钟级,波动率却用了年化的,算出来的价差会大到离谱,挂出去的单子永远成交不了。解决方案很简单,先把年化波动率除以根号内的周期数折算成需要的频率,再平方。

第二个坑是忽略了撤单行为对到达强度的影响。我刚开始时直接用"成交次数"来估计α,但回测和实盘差异巨大。原因是策略本身就在不断挂单撤单,很多单子挂上去没几秒就被撤了,根本没有机会被成交。更合适的做法是,统计那些"挂单持续时间超过几秒"的单子的成交率,这样估计出来的α才更贴近策略实际面对的成交环境。

第三个坑是T时刻的选择。我在回测里假设T是收盘时间,但盘中策略如果中途因为风控被暂停重启,T的锚点就断了。后来我在代码里加了一个状态变量,每次策略重启时重新初始化T为当前时间加上固定时长,同时把库存偏移重置,防止旧状态污染新周期。

5. 常见误区与问题排查:做AS模型最容易搞错的地方

5.1 新手必看的四个理解误区

误区一:做市策略等于"双向挂单"。双向挂单只是表象,真正起作用的是报价跟随库存和风险的动态调整。如果只会在中间价两侧对称挂单,那不是做市,是裸卖期权,迟早被一波趋势行情打穿。

误区二:模型能预测方向。AS模型里没有任何价格预测成分。它做的一切决策,都是在给定参考价的前提下优化报价。所以实盘跑AS模型时,方向判断是另一个独立模块负责的,不要把两者混为一谈。

误区三:价差越窄越好。价差窄成交多,但单笔利润薄且库存建立速度快。如果行情波动一大,库存风险瞬间就超过价差利润。AS模型的价值恰恰在于它告诉你价差不能无限窄,窄到一定程度后风险补偿不够。

误区四:风险厌恶系数γ是风险控制参数。γ严格来说是效用函数里的曲率参数,它控制和的是"你愿意承受库存的意愿",而不是账户止损线。账户止损靠的是资金风控模块,跟报价模型的γ不是一回事。试着用γ去控制亏损,很容易报出极端离谱的价格。

5.2 实盘问题排查对照表

运行AS模型时,很多现象都能根据现象快速定位问题。整理一个速查表:

现象可能原因排查方向
挂单长期不成交价差过宽或参考价偏离市场检查σ是否被高估、参考价计算逻辑
成交频繁但账户亏损价差太窄,库存风险失控检查γ是否过小、库存上限约束
报价频繁跳动参考价噪声过大对参考价做平滑处理
临近收盘库存仍巨大T-t衰减不够激进检查剩余时间是否已趋近零,报价偏移是否还在起作用
撤单率极高到达强度估计失真用持续时间更长的单子重新估计α
回测很好实盘很差手续费/滑点未建模在回测中加入手续费和冲击成本

这里面的每一个问题,我在实盘里都遇到过不止一次。尤其是"回测很好实盘很差",通常不是策略模型本身的问题,而是回测环境里没有把订单执行成本算清楚。AS模型对价差极其敏感,手续费哪怕只差0.1个tick,都可能导致策略从盈利变成亏损。

5.3 边界与延伸:AS模型管不了的事

必须承认AS模型不是万能的。它的核心假设——订单到达过程是泊松的、市场冲击是线性的、价格过程是几何布朗运动——在真实市场里都不完全成立。

泊松过程的到达强度假设意味着成交事件是独立且均匀分布的,但真实盘口中的订单到达有明显的聚集效应,大单会引发跟风单。线性冲击假设意味着你的单子对市场价格没有持续影响,但如果你的单量足够大,这个假设就不成立了。

所以实盘中我一般把AS模型当作"基准框架"而不是"终版答案"。在这个框架上做三件事:

第一,给库存加硬约束。AS模型通过报价偏移软性调节库存,但遇到极端行情时软调节不够快,必须设置库存硬上限,越线直接停止挂单只做减仓。

第二,把泊松到达改成更丰富的点过程模型。有条件的团队会用Hawkes过程替代泊松过程,能捕捉订单到达的聚集效应,但算力开销大很多。单策略实盘阶段,用泊松加α的动态调整其实也够用。

第三,把参考价从中间价升级成带方向的参考价。比如叠加一个短周期动量信号,让参考价在中间价的基础上略微偏多或偏空。这样AS模型就从纯做市升级成了"方向性做市",收益来源更多元。

这些延伸已经接近实盘策略改造的范畴了,后面如果有机会,我打算在系列第二篇里专门聊聊怎么用AS模型做参数估计和实盘改造。

写在后面的一点体会

Avellaneda-Stoikov模型我前前后后读了三遍,每次理解都不一样。第一遍看公式觉得就是个加加减减的报价规则;第二遍看懂了它背后的效用函数优化;第三遍真正拿行情数据去拟合时才发现,模型好不好用,根本不在于推导多漂亮,而在于你对参数的口味跟真实市场匹不匹配。

我个人在做市策略里最深的体感是:AS模型真正的价值不在于直接给你一套能赚钱的挂单规则,而是逼着你想清楚每个决策背后的风险暴露。你手里库存多的时候敢不敢让价?波动起来之后敢不敢收窄价差?这些问题如果心里没有答案,任何模型都救不了你。参数估计、参考价选择、订单管理,这些看起来像脏活累活的细节,才决定策略最终能不能跑赢手续费。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询