网格讲义的续篇 · 会上点名的两篇库存论文

货堆起来之后,那排格子该怎么办

后面要用到的词——定单簿、挂单、库存、中间价——单拎出来好像都认识。一放进讲义,它们却撑不起下一步。所以这篇不从论文开,也不从你们的盘开,从一笔买卖开。每个词都从它要解决的那个问题长出来,长出来之后才拿去当零件。

从一笔买卖讲起

后面每一节都默认你会这些词,不只是认得。所以先把它们从更前面的问题推出来。推的时候只用一件货:一枚币,现价先记成 100,000 美元。

成交:两个人交换了什么

买卖做成的那一瞬间,只发生一件事:你交出一笔美元,对方交出一枚币,双方认可同一个数字。这个数字叫成交价。没有成交,账上什么都没变。

问题马上出现:你想买,对方想卖,但你们报的数字对不上。对方开口 100,800,你只肯出 99,200。怎么办?

挂单:把价格写好,等对方来就你

两条路。

吃单的代价是立刻按对方的价走;挂单的代价是可能一直等不到。网格选的是第二条:全是挂单。交易所因此给你返佣,大约成交金额的 0.002%(写成 −0.2 个基点;1 个基点 = 万分之一)。别人来吃你的单,你的格子才成交。

挂单是等别人来就你的价。吃单是你去就别人的价。

定单簿:所有还没成交的挂单,按价格排成两列

交易所里同时等着的挂单很多。把它们按价格排开:数字大的在上,数字小的在下。上面一列是卖单——有人肯按这个价把币让出去;下面一列是买单——有人肯按这个价把币收进来。

这本排队表就叫定单簿。不是账本,是还没成交的价位清单。

一本最小的定单簿 · 中间空着的那截就是买卖双方还谈不拢的距离

买单还在等价格卖单还在等
100,800卖 0.10
100,000 中间价
买 0.1099,200

最好的买是 99,200,最好的卖是 100,800。两边对不上,中间空着 1,600 美元。这截空档叫买卖缝。缝的正中点 100,000中间价——屏幕上跳的那个数,K 线上的现价,指的就是它。

中间价不是「币的真实价值」。它只是此刻买卖双方还在等的两个价的中点。没有规定你的挂单必须围着它左右对称。这一点后面会反复用到。

定单簿是还没成交的价位清单。中间价是清单上买卖两边的中点,不是真理。

档、格:同一本簿上,价位是一格一格排的

你可以只挂一档买、一档卖。也可以在下面再挂 99,200 − 828、再下面再挂……每一条等待中的价位叫一。相邻两档之间的美元距离叫一。你们盘上一格约 828 美元。

「价格穿过 8 个买档」翻译成刚刚的词:中间价一路往下走,把你写在下面的 8 张买单依次吃掉,成交了 8 次。

库存:成交之后,手里多出来、还没出掉的币

一张买单成交,你的美元少了,币多了。多出来、还没卖掉的那部分叫库存。空仓 = 库存 0。买进 0.10 还没卖 = 库存 0.10。连买 8 档、每档 0.10 = 库存 0.80。

两个记账数字会跟着出现,它们不是后面公式要用的零件,但读盘时会看见:

库存本身不是亏。它是「你现在暴露在价格上的币数」。价格每再跌 1,000,0.80 个币的账上多亏 800——货越多,同一段下跌越疼。这才是后面要把库存放进公式的理由。

库存 = 买了还没卖的币。均价和浮亏是记账;后面公式看的是这堆币还要在手里抖多久。

还要扛多久、波动:货停在手里的那段时间,价格会自己走

网格出货的办法,是等中间价走回来,碰到你挂在上面的卖单。等的这段时间,货就停在手里,叫还要扛多久

扛的时候价格不会老实停着。一年里价格典型能走出自身的百分之几十,这个百分数叫波动率。默认盘写成 50%:现价 100,000 时,一年量级大约是 ±50,000。时间越短,走得越少,但不是按比例少——时间翻倍,波幅只多大约 41%(根号时间)。把波幅再平方,涨和跌都算进风险,得到的叫方差

所以「这堆货有多危险」是三件事乘在一起:货有多少 × 价格会抖多厉害 × 还要抖多久。这就是后面 AS 那三个乘数,现在先用中文钉住。

网格:你自己做的一小本定单簿

把买单铺在中间价下面、卖单铺在中间价上面,档与档之间隔开同样的一格——这排挂单就是网格。它不是预测涨跌的工具。它在赌一件更窄的事:价格会来回穿过这些档。

穿过下面的买单,库存 +1 档;再穿过上面的卖单,库存 −1 档。这一来一回,你收下两档之间那条缝,外加两笔挂单返佣。这个动作后面叫来回。价格不回来,来回做不成,手里剩下的就是库存。

靠挂单收缝、并因此承担库存的人,论文里叫市商。你们的网格就是一个只用挂单的市商。AS / GLFT 要回答的,不是币会涨还是会跌,而是:货堆起来之后,这本自制定单簿该怎么改。

先摆问题:你此刻有三个选择

零件齐了,把场景钉死。中间价 10 万时开的网格,一格约 828 美元。阴跌两天,中间价一路穿过 8 个买档走到 93,400 附近,每穿一档买 0.10——现在库存 0.80 个币、均价约 96,300,浮亏约 2,300。价格在低位磨着,弹不回去。

下面还有 12 个买档等着接,上面 8 个卖档越来越远。这排挂单该怎么摆?

做法后果对应
A整排档钉在开仓时的位置不动再跌还会按原价接刀,货一路堆到 20 档;涨回来卖档又太远,出货慢最朴素的网格。你们已经知道它扛单难受
B整排档往下搬一点:卖档贴近现价好出货,买档退远一点少接刀问题变成搬多少。凭手感搬,回测没法复现AS:给出搬多少的公式
C货太多时干脆停止挂买单问题变成多少算太多GLFT:给出停手的规则

选项 A 的难受不是感觉,可以算。

跌时接刀太勤,涨时出货太懒——两头吃亏。

所以选项 B、C 才值得认真对待。但它们各卡在一个数字上。B 卡在搬多少:搬 500 还是搬 5,000?凭手感搬,明天复盘时你自己都说不清为什么是这个数。C 卡在多少算太多:8 档停还是 20 档停?

这两个数恰好就是 AS 和 GLFT 各自的输出。会上说的下面挂更密集的卖单、上面挂更稀疏的卖单,就是选项 B 的口语版;有界网格、到 20 档不再加买就是选项 C。论文只是把你们已经在做的事,写成能算、能复现的数。

零件地图:上面推出来的词,对回你们的盘

对照表只做收束,不当第一次见面。每个词左边是上一节推出的含义,右边是模拟盘上你能指到的那一块。

它是从哪个问题长出来的在你们盘里指哪
挂单 / 吃单价谈不拢时:写下自己的价等,还是立刻就对方的价网格全是挂单。别人吃你的单,格子才成交;返佣 −0.2 个基点
定单簿把还没成交的挂单按价格排成卖上买下两列那排蓝橙虚线本身就是一小本定单簿
买卖缝 / 中间价最好的买和最好的卖对不上;缝的中点就是屏幕上跳的数K 线现价。挂单不必围着它对称
档 / 格一条等待中的价位;相邻两条之间的美元距离一格约 828;「穿过 8 个买档」= 成交 8 次
库存买了还没卖的币,价格再动会直接算到你头上账户栏 持仓 0.80 @ 96,300,20 档封顶 2.00
均价 / 浮亏过去付过的成本;按现在中间价估的账面差只出现在账户栏。后面公式不用这两个数
还要扛多久 / 波动率货停在手里的时间;这段时间价格会走出多远阴跌里一扛一天起步;看板 还要扛短时钟 σ
网格 / 来回 / 市商自制定单簿收缝;一买一卖收下一格;靠挂单赚钱并扛库存的人整套策略。AS / GLFT 管的是货堆起来之后这本簿怎么改
库存为什么算风险,用已经推出的零件说 0.80 个币,中间价每再跌 1,000 美元,账上多亏 800。波动率 50% 时,一天里中间价通常能走 ±2,600 左右——这堆货一天之内随手就能让你多亏两千。货翻倍,这个数翻倍;扛四天,波幅再按根号时间放大。所以货 × 波动 × 时间必须进公式。这就是后面三个乘数的来历,不是新概念。

还要扛多久先折成美元,这一步后面反复要用。σ=50% 年化、现价 10 万时,价格在一段时间里的典型波动范围是(根号时间,所以翻倍时间只多 41% 的波幅):

扛多久价格典型波动折成格(÷828)读法
15 分钟±2700.3 格走不出一格,货几乎无风险
1 小时±5300.6 格还是不到一格
8 小时±1,5101.8 格开始能穿两档
1 天±2,6203.2 格随手穿三档——隔夜库存真正的危险所在

这四行就是看板上 还要扛 滑杆的四个档位。同一堆货,扛 15 分钟和扛 1 天,是完全不同的风险——时间那个乘数的全部含义就在这里。

先看会动的:缝是怎么被赚走的

零件齐了,先别急着进论文。下面横轴是时间、纵轴是价格。横着的每根线是一个钉死不动的价位档——100,000 上下每 828 一格,正是上一节说的那本自制网格。线的颜色 = 这一档上现在挂的单:蓝 = 买单红 = 卖单、灰 = 刚被吃掉还没补。

金线是中间价,全场唯一自己会动的东西。它向下穿过蓝线,那张买单成交(蓝点),网格在上一格补挂卖单;向上穿过红线,卖单成交(红点),下一格补回买单。

档位从头到尾不挪一毫米。动的只有价格,和单子的生灭。

钉死的网格 · 三幕连播

档距 828 · 价位线不动 · 线变色 = 挂单被吃 / 补挂 · 圆点 = 成交

右上角的实时账本记了三个数,第三幕拍扁后再对一遍账。

先看收入侧:完成来回的个数。每个来回 = 下面一格先按低价买进的 0.10 个币,被高一档卖出。赚的就是两档之间那条 828 的缝,外加两笔挂单各 −0.2 bps 的返佣。这是网格的全部收入来源——不预测方向、不吃趋势,只把价格来回晃动时穿过档线的次数换成钱。

再看风险侧:持仓的档数,即买单成交比卖单多出来的部分。每一档都是按当时更高的价格接的货,还没等到弹回来出手。第一幕里金线一路向下的那几秒,账本上持仓一格一格涨、累计收缝纹丝不动——这就是阴跌盘里网格的真实处境。

麻烦在于,这两个数是同一个旋钮的两头:想多收来回,就得把买档铺得密、贴得近;铺得越近,单边行情里堆库存也越快。

你没法只要第一个数,不要第二个数。

AS / GLFT 全部的心思,就是给这个旋钮一个定量的拧法:AS 说货多了整排挂单往哪挪、挪多少;GLFT 说货到多少直接停。这就是下面两篇论文的事。

这两篇论文各自解决什么

问题的学名叫做市商问题:靠挂单赚买卖之间那条缝的人,怎么在多成交少囤货之间摆自己的报价——正是上面动画里那个旋钮。你们的网格就是一个只用挂单的做市商,所以这两篇是会上点名的必读。

1981 年,Ho 和 Stoll 把这个问题第一次写成数学:报价是你的决策,成交是随机到来的,库存的涨跌亏赚是随机的,求让你最舒服的报价策略。写是写出来了,但那组方程解不出一个能贴在屏幕边上用的公式,问题在纸面上搁了快三十年。

2008 年,Avellaneda 和 Stoikov(AS)做了三个简化:库存当成连续的数(可以是 0.8000 个币,不必是整档);挂得越远成交越少,用一条指数衰减描述;再做一次近似展开。

换来的是两行能写在纸上的公式——公平价该离现价多远,和买卖第一档之间的缝该多宽。代价埋在第一个简化里:库存没有上限,货再多它也只是把中心越推越远,从不喊停。

2013 年,Guéant、Lehalle 和 Fernandez-Tapia(GLFT)把这笔账算严格:库存按一档一档的整数记(0.10、0.20……),并且设死上限。解不再是一条公式,而是每个库存档一个方程、联立解出的一张挂单表——库存在第 n 档时,买单挂哪、卖单挂哪、到顶挂不挂。

他们顺手证明了:货少的时候,这张表和 AS 的公式几乎给出同样的数。所以 AS 是直觉和手算工具,GLFT 是实盘可执行的版本。

两篇论文管的范围到此为止:价格还在格子附近时,挂单怎么摆。冲出格子的尾巴,是虚值期权的事,论文里没有期权。

看板不用先读说明书:工具栏里有 ▶ 自动演示,它会替你把滑杆一步步拖一遍,每一步用金框框住看板上正在变的那行读数,字幕跟着走。演完再自己上手。

看板不止呈现当前一帧。深度图上的 中心 每次挪动都会留下渐隐的金色拖尾——你能看见它是过去的,不是跳过去的。

深度图下面那条窄图是全程轨迹:库存从 0 堆到 2.00,中心要走的整条路先画在那里,AS 一条、GLFT 一条。当前状态是路上的一个金点,你拖过的每个位置都留白色脚印。看单帧知道现在在哪;看这条路,知道接下来会去哪。

同一本定单簿,只改库存

左边那张图叫深度图:把定单簿横过来画。横轴是价格,中间那条白线是中间价,蓝条是买单堆在左边,红条是卖单堆在右边。和中间那列竖着的定单簿是同一套挂单,只是观察角度不同。

一格大约 828 美元——格子疏密 1.55,乘短时钟 50%,乘现价 100,000,再除以一年小时数的根号。AS / GLFT 改的不是这一格有多宽,而是整本簿对准哪。拖 已成交库存 滑杆,看定单簿中间那列价格怎么走,以及 按当前一格 那行报几格。

现货定单簿 · 报价看板 · 期权看板

现价锁 100,000 · 每档 0.10 · 上限 2.00 BTC

买档 卖档 现价 簿中心(模型输出) 期权 K(锁死不动)

买 0.10价格卖 0.10
现货报价
100,000
现价100,000
簿的中心(公平价)
比现价低
按当前一格
最优买 / 卖
买卖缝
一格 δ
库存 / 上限
买档

期权看板 · 开仓锁死,不跟定单簿挪

行权价合约距现价在不在现货簿里谁决定
80,955看跌−19%在簿下方很远,深度图最左侧那根紫虚线开网格时按边界外 15% 锁死
100,000平值对照0现价,簿的中缝AS / GLFT 不管这张;你们也不买它
119,045看涨+19%在簿上方很远,深度图最右侧紫虚线开网格时锁死

AS / GLFT 只移动中间那本现货簿。虚值两档在深度图上画着,是为了让你看见:保险的 K 和现货档不是同一层。

对着看板读三遍,每遍只动一个滑杆

第一遍:把 已成交库存 拖到 0。

右侧报价看板:簿的中心(公平价) = 100,000,和 现价 100,000 重合。公平价 = 这枚币此刻对你值多少(AS 一节细讲),空仓时你和市场没有分歧,所以两个数相等。最优买 / 卖 = 96,534 / 103,466——两边各让开半条缝(买卖缝 6,931 的一半),再往外按 一格 δ = 828 一档一档铺。中间那列定单簿上下完全对称。这就是开盘、还没成交任何一格时的样子。

第二遍:库存拖到 0.80,还要扛 选 1 天。

簿的中心 掉到 94,521比现价低 报 5,479,按当前一格 写着偏 6.62 格;最优买 / 卖 变成 91,055 / 97,986

翻译一下:卖单挂到离现价只有 2,000 的地方,货好出手;买单退到 91,055 才肯接,少接刀。左边深度图同步在动——红色卖压贴近白色现价线,蓝色买压被推到最左。

第三遍:库存不动,还要扛 拨回 1 小时。

同样 0.80 的货,簿的中心 回到 99,772,只比现价低 228——不到 0.3 格,定单簿几乎看不出挪过。

中心偏多少,是还要扛多久说了算。

网格扛的是隔夜库存,必须按天算。1 小时对应的那 285 美元只是手算单位,不是开着网格时该用的偏移。

报价看板的哪一行它是什么库存 0 → 0.80、扛 1 天时的变化
现价屏幕中间价,期权平值对照100,000,不变
簿的中心(公平价)AS 算出的心里公平价,整列挂单对准的锚100,00094,521
最优买 / 卖中心两侧各让半条缝后的第一档96,534/103,46691,055/97,986
按当前一格(现价 − 公平价)÷ 一格宽度,中心偏移折成格数0 格 → 6.62 格。数形结合就看这一行
买档还在挂的买单档数GLFT 且库存拖满 2.00 时显示停手;AS 永远给个更低的买价
期权看板两行 K虚值看跌 / 看涨80,955 / 119,045,全程不动

公式出现之前,先把字母钉死

论文爱用希腊字母,是因为一个字母比一串汉字短。你不需要先会念它们。下面这张表把全篇会出现的字母,全部对回看板字段和默认盘的数。往后看见一个怪符号,回来对一下就行。

字母怎么念中文说法看板上那一行 / 那根滑杆默认盘的数
S就是 S现价、中间价现价100,000
r就是 r公平价、簿的中心簿的中心(公平价)空仓 = 100,000;0.80 扛 1 天 = 94,521
q就是 q已成交库存已成交库存0.80 个币
σ西格玛短时钟波动率短时钟 σ50%
τ还要扛多久还要扛1 天 = 1/365 年;1 小时 = 1/8760 年
γ伽马有多不想继续囤有多不想继续囤一般档 = 0.001
δ德尔塔一格有多宽一格 δ828 美元
ψ普赛买卖缝买卖缝扛 1 天 = 6,931

同一件事下面会用三种写法各说一遍:先中文,再带入默认盘的数字,最后才出现字母。三种写法算的是同一个数。

字母只是缩写。读不懂字母,先读中文那一行。

AS:库存 × 路滑² × 还要扛多久

Avellaneda–Stoikov,2008。它对你们的网格只做一件事:现货簿的中心从现价改成一个更低的公平价,整排虚线跟着平移。没有新的格子种类。下面把公平价是怎么算出来的,一步一步摆开。

第一步,先想清楚空仓时为什么对称。手里没货,价格涨 1,000 和跌 1,000 对你完全一样——都只是错过或等到一次成交。你心里的公平价就是屏幕上的中间价,买卖围着它对称挂,没有任何理由偏。这就是看板第一遍读到的样子。

第二步,公平价:不是市场的价,是对你的价。中间价 100,000 是市场此刻的成交参考,对谁都一样。公平价(论文里叫保留价)回答的是另一个问题:此刻的你,觉得这枚币值多少钱?它因人而异——准确说,因你手里压着多少货而异。

你的公平价不用算,两笔假想交易就能试出来。现在你压着 0.80 个币、还要扛一天:

买要打折、卖愿让价,两个答案指向同一件事:这枚币在你心里的估值低于 100,000。这个估值就是你的公平价。空仓的人对两笔交易都无所谓——所以空仓时公平价 = 中间价,这正是第一步说的对称。

报价为什么围着它摆:卖单挂在自己估值之上、买单挂在自己估值之下,这样每一笔成交都发生在比你心里价更划算的位置。估值下移,整本簿跟着下移——看板上 簿的中心(公平价) 那行就是这个数。

别和持仓均价搞混 96,300 是你过去付出的成本,已经沉没,AS 的公式里根本没有这个变量。公平价说的是现在再多一枚、或少一枚币,对你值多少。解不解套是记账问题;公平价是往前看的风险问题。

AS 要算的只有一件事:你的公平价比中间价低多少。

第三步,低多少 = 三个乘数。AS 的回答是:这堆货在你手里的这段时间,能造成多大的不确定性,就补偿多少。逐个看——先读中文,字母只是缩写:

中文说法字母它在量什么对应看板
这段时间价格的方差σSτ1 小时波幅约 ±530,平方后约 285,000 美元²;扛 1 天,方差按时间线性放大 24 倍短时钟 σ还要扛
有多不想继续囤γ换算汇率:每 1 单位方差,你要求多少美元补偿。0.001 时,285,000 美元² 折成 285 美元。拧大 = 更怕囤货有多不想继续囤
已成交库存q线性放大:两倍的货,两倍的敞口,两倍的补偿已成交库存

三件事乘在一起,就是公平价要比现价低多少:

中文

公平价要比现价低的美元数 = 库存 × 不想囤 × 这段时间价格的方差

代入

5,479 = 0.80 × 0.001 ×(50,000)² ×(1 ÷ 365)

字母

\(q\,\gamma\,(\sigma S)^{2}\,\tau\)

第四步,把默认盘面的数带进去,一级一级算——和上面那条式子是同一笔账:

#算的是怎么算结果
11 个币扛 1 小时的补偿不想囤 0.001 ×(50% × 100,000)² ÷ 8760285 美元
21 个币扛 1 天285 × 246,849 美元
30.80 个币扛 1 天6,849 × 0.805,479 美元
4簿的中心 = 现价 − 第 3 步100,000 − 5,47994,521
5折成格 = 第 3 步 ÷ 一格宽度5,479 ÷ 8286.6 格

第 4、5 两行就是看板第二遍读到的 簿的中心按当前一格。第三遍把「还要扛」拨回 1 小时,等于从第 2 步撤掉 ×24,全链条缩回 285×0.8=228 美元、0.3 格——这就是为什么第三遍里定单簿几乎看不出挪过。

第五步,中心定了,还差第一档离中心多远——买卖缝。看板上 买卖缝 报 6,931,它由两半拼成:

中文

买卖缝 = 风险补偿 + 挂远成交变少的补偿

代入

6,931 = 6,849 + 82

字母

\(\psi=\gamma(\sigma S)^{2}\tau+\dfrac{2}{\gamma}\ln(1+\gamma/k_{\mathrm{盘口}})\)

验证方法:把 还要扛 拨到 1 小时,风险半边缩到 285,整条缝塌到 367。概率半边几乎不动——所以这条缝几乎全是时间撑起来的。

这条缝,几乎全是时间撑起来的。

第一档怎么挂:公平价两侧各让开半条缝。0.80、扛 1 天时,半条缝是 3,466——买在 94,521 − 3,466 = 91,055,卖在 94,521 + 3,466 = 97,986。再往外按一格 828 一档一档铺。这就是中间那列定单簿。

到此 AS 的全部输出就两个数:簿的中心(随库存、还要扛多久、短时钟、不想囤变)和 买卖缝(随还要扛多久、短时钟、不想囤变)。一格 δ = 828 还是你们自己按波动率定的,模型不碰它。

同一组数,三种写法并排——和看板上读到的是同一套:

中文

公平价 = 现价 − 库存 × 不想囤 × 这段时间价格的方差
偏了几格 =(现价 − 公平价)÷ 一格宽度

代入

94,521 = 100,000 − 5,479
6.6 格 = 5,479 ÷ 828

字母

\(r=S-q\,\gamma\,(\sigma S)^{2}\,\tau\)
\((S-r)/\delta\approx 6.6\)

还想看一格宽度怎么来的

一格宽度不是 AS 算的,是你们网格自己的疏密。短时钟 50%、现价 100,000、格子疏密 1.55:

中文

一格宽度 = 格子疏密 × 短时钟 × 现价 ÷ 一年小时数的根号

代入

828 = 1.55 × 0.50 × 100,000 ÷ √8760

字母

\(\delta=k_{\mathrm{格子}}\,\sigma\,S/\sqrt{8760}\)

买在 公平价 − 半条缝 起,再按一格宽度往下铺;卖对称往上铺。

γ 怎么定:从拍脑袋到回测

看板上 有多不想继续囤 给了三个现成的档,但实盘里这个数从哪来?没人真去内省自己的效用函数。不想囤系数(字母写成 γ,念伽马)的校准,用的是你手里本来就有的两样东西:仓位结构给锚点,历史成绩给校准。由浅到深四层。

第一层,先看懂这个系数的量纲——它本身就是一笔钱。它乘的是(美元波动)²,出来是美元,所以单位是 1/美元。

1 ÷ 不想囤系数,就是你愿意拿来吸收方差的那笔钱。

看板档位不想囤系数 γ1 ÷ 系数 = 风险预算
不太想出0.00042,500 美元
一般0.0011,000 美元
很不想囤0.003333 美元

这一层只用来核对量级:你给这个策略分配的风险资本如果和「1 ÷ 系数」差着两个数量级,系数肯定拍错了。

第二层,用仓位上限反解不想囤系数。这是最贴你们盘的办法。这个系数不可观察,但可以把它换成一个能拍板的运营问题:满仓 2.00、还要扛一天时,我希望簿的中心偏几格?假设答案是 10 格,反着算:

#算的是怎么算结果
1目标偏移10 格 × 8288,280 美元
2满仓扛一天的方差项2.00 × (0.5×100,000)² ÷ 365约 1,370 万美元²
3不想囤系数 = 目标偏移 ÷ 方差项8,280 ÷ 13,698,630≈ 0.0006

对照默认档:不想囤 = 0.001 在满仓时中心偏 13,699 美元、16.5 格——比整个 20 档的梯子还深一大半。这本身就说明 0.001 对你们的仓位结构偏保守,卖档会被压得太急。

把不可观察的系数,换成一个会上能吵明白的数:满仓该偏几格。

第三层,用历史回测扫这个系数。它在数学上是每单位收益方差,你要求多少期望收益的影子价格,所以最诚实的校准是把它当超参数,在模拟盘上扫:

坑:不想囤系数和短时钟会互相顶账 中心偏移里这两个数乘在一起。如果你的短时钟本来就在滚动重估,扫不想囤时必须把短时钟固定成同一套历史估计,否则两个参数在拟合同一件事,扫出来的最优值换个行情就不认账。学界对此的诚实版本是 Cartea–Jaimungal 一支:干脆不提效用函数,把不想囤的位置换成一个明说是调参项的库存惩罚系数,直接从数据里选。

第四层,让不想囤系数跟着近期表现动。静态选完还可以在线自适应,常见两种:

落地顺序 第二层用满仓偏几格反解出量级(≈0.0006)→ 第三层在模拟盘上扫出精确值 → 第四层加回撤缩放做保险。第一层的「1 ÷ 系数」只做量级核对。不想囤系数从此不是拍出来的,是三步都能复现的流程算出来的。
AS 在满仓时会显得傻,算给你看 它把库存当成可以无限加的连续量,中心按直线往下推。货到 2.00、再扛一天:中心 = 100,000 − 2×6,849 = 86,302,第一档买单还要再让半条缝,挂到 82,836——离现价 20.7 格。名义上买单还在,实际上永远等不到成交,还占着保证金。一个更根本的别扭:库存明明到顶了不能再买,公式却假装你还能无限加仓。这就是为什么还要 GLFT。

GLFT:同一本簿,满 2.00 撤买档

Guéant–Lehalle–Fernandez-Tapia,2013。它衡量风险的方式和 AS 是同一件货——还是库存 × 方差 × 时间那笔账。改的是两个假设:库存按档记(0.10、0.20……不再是连续的数)、库存有上限(2.00 封死)。别小看这两条,它们把解的形态整个换了:AS 给的是一条对任何库存都成立的公式,GLFT 给的是一张 21 行的挂单表——库存在第 0 档到第 20 档,每一行写着这档时买单挂哪、卖单挂哪、还挂不挂。

这张表读出来有三个特征,看板上都能验证:

卖档为什么留着、而且贴得更近?因为模型的目标从来不是"别买了",而是把库存推回 0:满仓时唯一降风险的动作就是出货,所以卖单反而要挂到最容易成交的位置。

你们网格到 20 档不再向下加买的规矩,就是这张表的最后一行。AS 永远不会撤单,只会把买价报得越来越远——上面那个 82,836 的例子就是它的下场。

看板没有去解论文里那组微分方程,只落下你能看见的两条检查项,和一条压扁:

中文

满仓附近的公平价 = 现价 − 上限 × 不想囤 × 这段时间方差 × 压扁(库存 ÷ 上限)

代入

库存到顶时,压扁 ≈ 1,公平价不再按 2 × 6,849 直线推到 86,302,而是收在更近的位置

字母

\(r=S-Q_{\max}\,\gamma\,(\sigma S)^{2}\tau\,\tanh(1.35\,q/Q_{\max})\)

压扁函数论文写成 tanh,读作双曲正切。你只需要记住它的形状:开头几乎是直线(货少时跟 AS 重合),靠近 1 就趴下(满仓时不再无限下移)。完整的那组微分方程仍在论文里。

期权看板故意不动

网格管得了格子里面的来回,管不了中间价一口气冲出 20 档。那种一次性的大跌,用挂单去防会把日常缝收入赔光。于是另买一张保险。

保险的写法是期权:你先付一小笔权利金,约定一个行权价(看板写成 K)。中间价真的越过这个数,对方必须按约定跟你结算;没越过,权利金就当保费烧掉。行权价离现在的中间价越远,越不容易赔到你,权利金越便宜——这种叫虚值。深度图左右两根紫虚线,就是开仓时锁死的两张虚值:看跌在 80,955,看涨在 119,045

现货簿在 9.4 万~10.6 万之间挪来挪去时,这两根线不动。AS / GLFT 没有期权变量。它们管的是:还在格子里时,现货档往哪偏、满了停不停买。

冲出 20 档、价格跌破 80,955,现货簿早已停买,AS / GLFT 不再给新的买档。从那里起,覆盖来自 80,955 那张看跌期权,不是来自把 γ 拧得很大。

为什么不干脆拧大 γ 来扛尾巴?因为 γ 惩罚的是所有波动,不分日常小晃和极端大跌。在看板上试:γ 从 一般 拧到 很不想囤买卖缝 从 6,931 直接翻到两万出头——日常来回基本熄火。等于为了防一年一两次的大跌,全年无休地放弃缝收入。

尾巴是低频事件,按次付费的深虚值期权便宜得多;日常波动是高频收入,γ 只该按日常来定。这就是期权看板故意不跟簿走的原因。

两层风险,两个工具,各管各的。

回到你们的盘 短时钟 σ 定一格多宽;库存乘还要扛多久,定 簿的中心 偏几格(AS);20 档到顶就撤光买单(GLFT);虚值 K 80,955 / 119,045 开仓锁死、不跟簿走。格子疏密的 k 和论文里盘口衰减的 k,仍是两件事。

模拟盘原文:波动率网格 + 双买期权