网格讲义的续篇 · 会上点名的两篇库存论文
后面要用到的词——定单簿、挂单、库存、中间价——单拎出来好像都认识。一放进讲义,它们却撑不起下一步。所以这篇不从论文开,也不从你们的盘开,从一笔买卖开。每个词都从它要解决的那个问题长出来,长出来之后才拿去当零件。
后面每一节都默认你会用这些词,不只是认得。所以先把它们从更前面的问题推出来。推的时候只用一件货:一枚币,现价先记成 100,000 美元。
买卖做成的那一瞬间,只发生一件事:你交出一笔美元,对方交出一枚币,双方认可同一个数字。这个数字叫成交价。没有成交,账上什么都没变。
问题马上出现:你想买,对方想卖,但你们报的数字对不上。对方开口 100,800,你只肯出 99,200。怎么办?
两条路。
吃单的代价是立刻按对方的价走;挂单的代价是可能一直等不到。网格选的是第二条:全是挂单。交易所因此给你返佣,大约成交金额的 0.002%(写成 −0.2 个基点;1 个基点 = 万分之一)。别人来吃你的单,你的格子才成交。
挂单是等别人来就你的价。吃单是你去就别人的价。
交易所里同时等着的挂单很多。把它们按价格排开:数字大的在上,数字小的在下。上面一列是卖单——有人肯按这个价把币让出去;下面一列是买单——有人肯按这个价把币收进来。
这本排队表就叫定单簿。不是账本,是还没成交的价位清单。
一本最小的定单簿 · 中间空着的那截就是买卖双方还谈不拢的距离
最好的买是 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 管的是货堆起来之后这本簿怎么改 |
把还要扛多久先折成美元,这一步后面反复要用。σ=50% 年化、现价 10 万时,价格在一段时间里的典型波动范围是(根号时间,所以翻倍时间只多 41% 的波幅):
| 扛多久 | 价格典型波动 | 折成格(÷828) | 读法 |
|---|---|---|---|
| 15 分钟 | ±270 | 0.3 格 | 走不出一格,货几乎无风险 |
| 1 小时 | ±530 | 0.6 格 | 还是不到一格 |
| 8 小时 | ±1,510 | 1.8 格 | 开始能穿两档 |
| 1 天 | ±2,620 | 3.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(锁死不动)
—
| 行权价 | 合约 | 距现价 | 在不在现货簿里 | 谁决定 |
|---|---|---|---|---|
| 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,000 → 94,521 |
| 最优买 / 卖 | 中心两侧各让半条缝后的第一档 | 96,534/103,466 → 91,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 |
同一件事下面会用三种写法各说一遍:先中文,再带入默认盘的数字,最后才出现字母。三种写法算的是同一个数。
字母只是缩写。读不懂字母,先读中文那一行。
Avellaneda–Stoikov,2008。它对你们的网格只做一件事:现货簿的中心从现价改成一个更低的公平价,整排虚线跟着平移。没有新的格子种类。下面把公平价是怎么算出来的,一步一步摆开。
第一步,先想清楚空仓时为什么对称。手里没货,价格涨 1,000 和跌 1,000 对你完全一样——都只是错过或等到一次成交。你心里的公平价就是屏幕上的中间价,买卖围着它对称挂,没有任何理由偏。这就是看板第一遍读到的样子。
第二步,公平价:不是市场的价,是对你的价。中间价 100,000 是市场此刻的成交参考,对谁都一样。公平价(论文里叫保留价)回答的是另一个问题:此刻的你,觉得这枚币值多少钱?它因人而异——准确说,因你手里压着多少货而异。
你的公平价不用算,两笔假想交易就能试出来。现在你压着 0.80 个币、还要扛一天:
买要打折、卖愿让价,两个答案指向同一件事:这枚币在你心里的估值低于 100,000。这个估值就是你的公平价。空仓的人对两笔交易都无所谓——所以空仓时公平价 = 中间价,这正是第一步说的对称。
报价为什么围着它摆:卖单挂在自己估值之上、买单挂在自己估值之下,这样每一笔成交都发生在比你心里价更划算的位置。估值下移,整本簿跟着下移——看板上 簿的中心(公平价) 那行就是这个数。
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\)
第四步,把默认盘面的数带进去,一级一级算——和上面那条式子是同一笔账:
| # | 算的是 | 怎么算 | 结果 |
|---|---|---|---|
| 1 | 1 个币扛 1 小时的补偿 | 不想囤 0.001 ×(50% × 100,000)² ÷ 8760 | 285 美元 |
| 2 | 1 个币扛 1 天 | 285 × 24 | 6,849 美元 |
| 3 | 0.80 个币扛 1 天 | 6,849 × 0.80 | 5,479 美元 |
| 4 | 簿的中心 = 现价 − 第 3 步 | 100,000 − 5,479 | 94,521 |
| 5 | 折成格 = 第 3 步 ÷ 一格宽度 | 5,479 ÷ 828 | 6.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.0004 | 2,500 美元 |
| 一般 | 0.001 | 1,000 美元 |
| 很不想囤 | 0.003 | 333 美元 |
这一层只用来核对量级:你给这个策略分配的风险资本如果和「1 ÷ 系数」差着两个数量级,系数肯定拍错了。
第二层,用仓位上限反解不想囤系数。这是最贴你们盘的办法。这个系数不可观察,但可以把它换成一个能拍板的运营问题:满仓 2.00、还要扛一天时,我希望簿的中心偏几格?假设答案是 10 格,反着算:
| # | 算的是 | 怎么算 | 结果 |
|---|---|---|---|
| 1 | 目标偏移 | 10 格 × 828 | 8,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 对你们的仓位结构偏保守,卖档会被压得太急。
把不可观察的系数,换成一个会上能吵明白的数:满仓该偏几格。
第三层,用历史回测扫这个系数。它在数学上是每单位收益方差,你要求多少期望收益的影子价格,所以最诚实的校准是把它当超参数,在模拟盘上扫:
第四层,让不想囤系数跟着近期表现动。静态选完还可以在线自适应,常见两种:
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 直接翻到两万出头——日常来回基本熄火。等于为了防一年一两次的大跌,全年无休地放弃缝收入。
尾巴是低频事件,按次付费的深虚值期权便宜得多;日常波动是高频收入,γ 只该按日常来定。这就是期权看板故意不跟簿走的原因。
两层风险,两个工具,各管各的。
模拟盘原文:波动率网格 + 双买期权