KK Blog
← 全部文章
研究笔记 · 2026-09-07 · COMEX 黄金 GC,2025-05-20 → 2026-05-19

一张大单落下来,金价会怎么动

七月我做过一次回测,结果对不上,我当时不知道为什么。这篇是我回头把这一年黄金期货逐笔数据从头看一遍的记录。看完发现其实是两件事:大单有两种,一种自己把价格推到位,之后就不动了;另一种撞上一堵墙,当时几乎不动,后面慢慢走。后面这种扣掉成本还剩一点,但主要在后半年。

起因是七月那次回测

KTV 终端默认有一个「聚合大单」信号。七月我拿一年的黄金期货逐笔数据回测过它:一年触发大约 10 万次,毛收益 −0.19 tick,等于什么都没有。

换一条规则,「单笔成交记录 ≥60 手」,同样的数据,全年 +13 万美元,块置换检验(把整天的方向随机翻转再重跑,看真实结果能排多前;做法在后面)p = 0.010。

同一份数据,两种数「大单」的办法,一个有,一个没有。我一开始以为是聚合的口径太宽。后来发现不是宽窄的问题,是数的东西根本不一样。这个后面再说。

先看数据长什么样

数据是 Databento 的 GLBX.MDP3,也就是 CME 的原始行情回放,schema 是 MBP-1:每条成交都带成交那一刻的最优买卖价和挂量。区间 2025-05-20 → 2026-05-19,312 个交易日,每天取成交量最大的那个单腿 GC 合约。一共 3,160 万笔成交,4,775 万手;把同一张主动单的记录合并之后是 2,782 万张。金价这一年从大约 3,275 涨到 5,551 美元。

两个我实际查过的细节:成交记录带的盘口和前一条消息 100% 一样,所以记的是成交前的簿;side = B 的成交价高于中价的比例是 99.6%,方向没标反。另外价差 ≤0 或 >10 tick 的记录我扔掉了,交叉盘口只占 0.001%,但不扔会算出几百 tick 的假利润。

第一眼看到三件事。

一是顶档很薄。最优价上挂量的中位数只有 2 手,2026 年以后只剩 1 手。单笔成交中位 1 手,99.9 分位也只有 36 手。所以 20 手在这里就算大单了:它们只占主动单的 0.38%,却贡献 7.7% 的成交量;≥40 手占 0.088%,每天大约 79 张,贡献 3.5%。一张 20 手的单子通常要打穿 4–10 个价位。所以「大单」在这里同时是两件事:它是一个信息事件,也是一次机械的吃簿。把这两件事分开,是我这次主要在做的。

二是手数分布的尾巴是幂律,不过比股票薄很多。

10.10.010.0010.00011e-051e-06131030100300P(手数 ≥ x)手数 x(对数轴)扫单 · ≥1 手:1.00e+00扫单 · ≥2 手:2.58e-01扫单 · ≥3 手:1.18e-01扫单 · ≥5 手:4.95e-02扫单 · ≥10 手:1.42e-02扫单 · ≥20 手:3.81e-03扫单 · ≥30 手:1.56e-03扫单 · ≥40 手:8.82e-04扫单 · ≥50 手:6.02e-04扫单 · ≥60 手:3.40e-04扫单 · ≥80 手:1.94e-04扫单 · ≥100 手:1.19e-04扫单 · ≥150 手:3.77e-05扫单 · ≥200 手:1.61e-05扫单 · ≥300 手:3.51e-06单笔记录 · ≥1 手:1.00e+00单笔记录 · ≥2 手:2.50e-01单笔记录 · ≥3 手:1.05e-01单笔记录 · ≥5 手:3.00e-02单笔记录 · ≥10 手:4.10e-03单笔记录 · ≥20 手:6.77e-04单笔记录 · ≥30 手:2.90e-04单笔记录 · ≥40 手:1.73e-04单笔记录 · ≥50 手:1.15e-04单笔记录 · ≥60 手:7.98e-05单笔记录 · ≥80 手:4.54e-05单笔记录 · ≥100 手:2.48e-05单笔记录 · ≥150 手:1.01e-05单笔记录 · ≥200 手:3.52e-06单笔记录 · ≥300 手:6.51e-07尾部指数(Hill,≥20 手):扫单 α≈3.4,单笔 α≈3.1扫单单笔记录
图 6 · 主动单手数的互补累积分布(log–log)。两种口径:扫单(把同一主动单合并)和原始成交记录,中位数都是 1 手。≥20 手的尾巴接近幂律,Hill 指数(尾巴的幂律指数,越大尾巴越薄)扫单口径约 3.4、记录口径约 3.1;股票市场里这个数是 1.5–1.7(Gopikrishnan 等 2000),GC 的尾巴薄很多。鼠标悬停可以看各点的数值。

三是后半年和前半年不是一个状态。2026 年 2–3 月金价冲高,波动率和价差都翻了一倍。具体数字放在「不稳的地方」那节,和图 7 一起。后面每个分半的结果,都得先想着这一点。

顺手记一个后面要用的:≥20 手里 45% 是整数手数,光 20 手这一档就有 23,844 张。

统计口径一句话:所有均值都先在每个交易日内平均,再对 312 个日均值算均值和 t;回归按日聚类;区间用按日重抽的自助法(500 次)。这样算比逐笔算保守很多,后面的 t 都是这个口径。详细的样本数字在文末。

先把成交记录拼回一张单

我最先做的事,是按原始成交记录画「即时冲击 vs 手数」。结果大手数反而往下走:20–29 手 3.1 tick,100–149 手 2.2 tick,300 手以上 1.7 tick。可 15 分钟冲击又很大(40–49 手 15.1、100–149 手 17.1 tick,标准误 4–7)。我以为是代码写错了。

后来发现是 CME 的报法。一张主动单在每个价位单独报一条。60 手打穿三个价位,就是三条记录,ts_event 一样,方向也一样。我把这些合并成一个「扫单」,手数相加,顺便记下打穿了几层。7.7% 的主动单打穿了不止一个价位;≥20 手里接近 90%。

冲击怎么量:按主动方向定号的中价变化,单位 tick(GC 一个 tick = 0.1 美元 = 每手 10 美元);时距从 0+(扫单结束后市场看到的第一个报价)到 1 小时。

051015200+1s5s15s1m5m15m30m1h中价变化(tick,按主动方向定号)事件后时距1 手 · 0+:0.95 tick(SE 0.03,n=19,290,984)1 手 · 1s:1.35 tick(SE 0.04,n=19,219,143)1 手 · 5s:1.40 tick(SE 0.05,n=19,211,020)1 手 · 15s:1.44 tick(SE 0.06,n=19,206,375)1 手 · 1m:1.48 tick(SE 0.07,n=19,199,358)1 手 · 5m:1.48 tick(SE 0.09,n=19,154,951)1 手 · 15m:1.51 tick(SE 0.15,n=19,040,678)1 手 · 30m:1.60 tick(SE 0.24,n=18,879,418)1 手 · 1h:1.62 tick(SE 0.24,n=18,530,952)10-19 手 · 0+:3.01 tick(SE 0.09,n=267,144)10-19 手 · 1s:3.52 tick(SE 0.12,n=268,365)10-19 手 · 5s:3.56 tick(SE 0.16,n=268,255)10-19 手 · 15s:3.42 tick(SE 0.17,n=268,330)10-19 手 · 1m:3.14 tick(SE 0.33,n=268,068)10-19 手 · 5m:3.30 tick(SE 0.39,n=267,459)10-19 手 · 15m:3.27 tick(SE 0.79,n=265,702)10-19 手 · 30m:3.64 tick(SE 1.00,n=263,294)10-19 手 · 1h:1.12 tick(SE 0.78,n=258,075)40-49 手 · 0+:7.50 tick(SE 0.33,n=7,100)40-49 手 · 1s:7.94 tick(SE 0.34,n=7,204)40-49 手 · 5s:8.11 tick(SE 0.43,n=7,215)40-49 手 · 15s:8.07 tick(SE 1.06,n=7,216)40-49 手 · 1m:6.93 tick(SE 0.64,n=7,212)40-49 手 · 5m:6.91 tick(SE 1.59,n=7,176)40-49 手 · 15m:11.85 tick(SE 3.02,n=7,133)40-49 手 · 30m:9.20 tick(SE 3.55,n=7,066)40-49 手 · 1h:8.57 tick(SE 3.42,n=6,937)60-79 手 · 0+:9.58 tick(SE 0.48,n=3,655)60-79 手 · 1s:10.11 tick(SE 0.52,n=3,764)60-79 手 · 5s:9.93 tick(SE 0.59,n=3,765)60-79 手 · 15s:10.09 tick(SE 0.64,n=3,772)60-79 手 · 1m:10.76 tick(SE 1.04,n=3,762)60-79 手 · 5m:12.11 tick(SE 1.99,n=3,751)60-79 手 · 15m:11.24 tick(SE 2.76,n=3,736)60-79 手 · 30m:10.63 tick(SE 2.96,n=3,709)60-79 手 · 1h:6.36 tick(SE 3.59,n=3,630)100-149 手 · 0+:14.64 tick(SE 0.78,n=1,958)100-149 手 · 1s:14.83 tick(SE 0.77,n=2,097)100-149 手 · 5s:14.52 tick(SE 0.79,n=2,098)100-149 手 · 15s:13.34 tick(SE 0.83,n=2,107)100-149 手 · 1m:13.57 tick(SE 1.35,n=2,108)100-149 手 · 5m:12.82 tick(SE 2.28,n=2,101)100-149 手 · 15m:14.18 tick(SE 4.47,n=2,095)100-149 手 · 30m:13.08 tick(SE 5.81,n=2,084)100-149 手 · 1h:15.05 tick(SE 6.80,n=2,046)10-19 手1 手60-79 手40-49 手100-149 手1 手10-19 手40-49 手60-79 手100-149 手
图 1 · 冲击响应曲线(扫单口径,按主动方向定号,tick)。横轴是事件后的时距,0+ 是扫单结束后市场看到的第一个报价。曲线从上到下手数递增。≥40 手的曲线在 1 秒后基本就平了;1 手的曲线从 0.95 慢慢升到 1.5。

合并之后曲线就正常了。即时冲击随手数单调上升:1 手 0.95 tick,40–49 手 7.5,100–149 手 14.6,300 手以上 22.6;每档按日 t 都 ≥ 8.9,大多在 20 以上。

≥20 手的扫单,冲击差不多全是永久的。15 分钟冲击除以即时冲击在 0.9–1.2 之间(30–39 手的 0.58 和 40–49 手的 1.58 看起来是相邻桶的噪声,合并后约 0.9)。一小时内基本不回撤。也就是说,扫单结束时那个报价,平均看已经把这张单的信息吃完了。

小单反而事后还在涨:1 手从 0.95 到 1.5,2 手从 1.1 到 1.6。我不觉得是 1 手自己带信息,更像订单流自相关,一笔买后面更容易跟着买(Bouchaud 等 2018 叫它订单拆分)。完整数表(表 2)在文末。

冲击按根号长,单位是波动率

把每个手数桶的即时冲击均值对桶内平均手数做对数—对数回归。扫单口径全部 15 个桶:β = 0.59,按日自助 95% 区间 0.57–0.61。只用 ≥20 手的 10 个桶是 0.52 [0.46, 0.58];时距换成 1 秒、1 分钟、15 分钟,β 是 0.52、0.54、0.55。

0.5125102040131030100300即时冲击(tick,事件后第一条记录)桶内平均手数 Q(对数轴)扫单(同一主动单合并) · 1 手(均 1.0):0.95 tick,n=19,290,984扫单(同一主动单合并) · 2 手(均 2.0):1.10 tick,n=3,638,568扫单(同一主动单合并) · 3-4 手(均 3.3):1.29 tick,n=1,812,012扫单(同一主动单合并) · 5-9 手(均 5.9):1.73 tick,n=920,214扫单(同一主动单合并) · 10-19 手(均 11.9):3.01 tick,n=267,144扫单(同一主动单合并) · 20-29 手(均 22.6):4.99 tick,n=57,584扫单(同一主动单合并) · 30-39 手(均 32.7):6.46 tick,n=16,904扫单(同一主动单合并) · 40-49 手(均 43.4):7.50 tick,n=7,100扫单(同一主动单合并) · 50-59 手(均 52.3):8.41 tick,n=6,549扫单(同一主动单合并) · 60-79 手(均 68.0):9.58 tick,n=3,655扫单(同一主动单合并) · 80-99 手(均 88.1):11.48 tick,n=1,867扫单(同一主动单合并) · 100-149 手(均 113.6):14.64 tick,n=1,958扫单(同一主动单合并) · 150-199 手(均 171.3):15.37 tick,n=509扫单(同一主动单合并) · 200-299 手(均 233.4):15.58 tick,n=284扫单(同一主动单合并) · 300+ 手(均 357.4):22.61 tick,n=82单笔成交记录 · 1 手(均 1.0):1.15 tick,n=21,965,446单笔成交记录 · 2 手(均 2.0):1.78 tick,n=4,271,428单笔成交记录 · 3-4 手(均 3.3):2.54 tick,n=2,225,340单笔成交记录 · 5-9 手(均 6.0):2.86 tick,n=778,898单笔成交记录 · 10-19 手(均 12.3):2.98 tick,n=100,995单笔成交记录 · 20-29 手(均 23.2):3.08 tick,n=11,238单笔成交记录 · 30-39 手(均 33.6):2.92 tick,n=3,409单笔成交记录 · 40-49 手(均 43.9):2.63 tick,n=1,678单笔成交记录 · 50-59 手(均 53.4):2.44 tick,n=1,045单笔成交记录 · 60-79 手(均 68.6):2.35 tick,n=1,002单笔成交记录 · 80-99 手(均 88.2):1.67 tick,n=616单笔成交记录 · 100-149 手(均 115.8):2.16 tick,n=440单笔成交记录 · 150-199 手(均 173.8):1.90 tick,n=199单笔成交记录 · 200-299 手(均 233.6):1.46 tick,n=87单笔成交记录 · 300+ 手(均 367.4):1.74 tick,n=20斜率 β = 0.588 [0.567, 0.605]扫单单笔记录
图 2a · 即时冲击 vs 手数(log–log)。横轴是桶内平均手数,纵轴是即时冲击。蓝色是扫单口径,虚线是拟合(β = 0.59);橙色是成交记录口径,大手数处往下掉,就是上一节那个问题。

这个在股票市场早有人发现(Lillo 等 2003),Tóth 等 (2011) 在元订单层面叫它平方根律。我这里是单张主动单,看起来也差不多。直觉上不难理解:顶档只有 2 手,越深越厚,吃 Q 手要推的距离大约 ∝ √Q。

然后是我担心的事。后半年波动率翻倍,按 tick 算,40–59 手的即时冲击前半年 5.2、后半年 10.8;100 手以上 9.5 对 23.5。所有按 tick 算的数后半年都差不多翻倍。把即时冲击除以当天的日内波动 σday(当天 1 分钟中价变化的平方和再开方,单位 tick)之后,40–59 手前后半年是 1.82% 对 1.65%,100 手以上是 3.41% 对 3.26%,差别在标准误里。手数那边也同样除以当天成交量 Vday

0.10.31310-5.5-5-4.5-4-3.5-3-2.5-2即时冲击 / 当日波动 σ(%)log10(Q / 当日成交量)前半年(2025-05 → 2025-11) · log10q=-5.625:0.106% σ(SE 0.003,n=1,593,063)前半年(2025-05 → 2025-11) · log10q=-5.375:0.142% σ(SE 0.002,n=5,568,405)前半年(2025-05 → 2025-11) · log10q=-5.125:0.176% σ(SE 0.002,n=4,150,627)前半年(2025-05 → 2025-11) · log10q=-4.875:0.213% σ(SE 0.002,n=1,552,008)前半年(2025-05 → 2025-11) · log10q=-4.625:0.265% σ(SE 0.002,n=756,450)前半年(2025-05 → 2025-11) · log10q=-4.375:0.362% σ(SE 0.004,n=328,527)前半年(2025-05 → 2025-11) · log10q=-4.125:0.537% σ(SE 0.006,n=136,966)前半年(2025-05 → 2025-11) · log10q=-3.875:0.806% σ(SE 0.009,n=87,770)前半年(2025-05 → 2025-11) · log10q=-3.625:1.112% σ(SE 0.014,n=35,113)前半年(2025-05 → 2025-11) · log10q=-3.375:1.539% σ(SE 0.030,n=11,139)前半年(2025-05 → 2025-11) · log10q=-3.125:2.215% σ(SE 0.087,n=4,282)前半年(2025-05 → 2025-11) · log10q=-2.875:3.615% σ(SE 0.243,n=1,491)前半年(2025-05 → 2025-11) · log10q=-2.625:5.663% σ(SE 0.626,n=474)前半年(2025-05 → 2025-11) · log10q=-2.375:5.054% σ(SE 0.465,n=155)前半年(2025-05 → 2025-11) · log10q=-2.125:6.131% σ(SE 0.911,n=37)后半年(2025-11 → 2026-05) · log10q=-5.625:0.074% σ(SE 0.007,n=674,264)后半年(2025-11 → 2026-05) · log10q=-5.375:0.125% σ(SE 0.003,n=3,237,664)后半年(2025-11 → 2026-05) · log10q=-5.125:0.157% σ(SE 0.003,n=4,896,611)后半年(2025-11 → 2026-05) · log10q=-4.875:0.180% σ(SE 0.003,n=1,811,795)后半年(2025-11 → 2026-05) · log10q=-4.625:0.217% σ(SE 0.003,n=670,517)后半年(2025-11 → 2026-05) · log10q=-4.375:0.297% σ(SE 0.004,n=278,922)后半年(2025-11 → 2026-05) · log10q=-4.125:0.448% σ(SE 0.007,n=126,615)后半年(2025-11 → 2026-05) · log10q=-3.875:0.678% σ(SE 0.011,n=54,230)后半年(2025-11 → 2026-05) · log10q=-3.625:1.000% σ(SE 0.019,n=34,927)后半年(2025-11 → 2026-05) · log10q=-3.375:1.419% σ(SE 0.041,n=7,983)后半年(2025-11 → 2026-05) · log10q=-3.125:2.265% σ(SE 0.098,n=3,595)后半年(2025-11 → 2026-05) · log10q=-2.875:3.275% σ(SE 0.294,n=1,214)后半年(2025-11 → 2026-05) · log10q=-2.625:2.643% σ(SE 0.341,n=423)后半年(2025-11 → 2026-05) · log10q=-2.375:4.623% σ(SE 0.627,n=99)log-log 斜率 0.55 [0.54, 0.57](全样本)前半年后半年
图 2b · 归一化主曲线,前后半年叠合。横轴 log10(Q / Vday),纵轴 I0+ / σday(%)。前半年(低波动,价差 2.2 tick)和后半年(高波动,价差 4.2 tick)两条线基本叠在一起。只画了事件数 ≥30 的分箱。

全样本斜率 0.55(区间 0.535–0.566),前后半年两条线叠在一起。冲击的单位看起来是波动率,不是 tick。同一张单放到波动率翻倍的市场里,推的 tick 数翻倍,推的 σ 数不变。顺带一句:用 tick 或美元定的「大单门槛」,换个波动率区间就不准了。

我还做了个事件级回归(表 4 在文末)。只放手数,log 手数每加一个单位(大约 2.7 倍)即时冲击多 4.1 tick;加上手数/顶档挂量(后面叫深度比;系数 1.95,t = 28),意思是同样的手数,顶档越薄冲击越大;再加打穿层数、事件前价差和当日波动率,R² 从 0.11 升到 0.51。这时层数(每 log 单位 2.95 tick,t = 22)和事件前价差(每 tick 0.95 tick,t = 24)把深度比的解释力拿走了大半,手数本身的系数降到 2.8,还是显著。即时冲击一半以上能从簿的形状直接算出来,是机械的部分。但 15 分钟冲击对这些变量的 R² 只有 0.001,手数效应还在(每 log 单位 6.3 tick,t = 6.5),事件之间几乎全是噪声。所以我后面把冲击拆成机械的和信息的两块。斜率的完整表(表 3)也在文末。

两种数法,答案相反

回到七月的问题。如果扫单后的报价已经无偏,那事件后漂移(15 分钟中价 − 1 秒中价)应该是零。这个数也是一个在事件后 1 秒进场的人能拿到的毛收益。

-15-10-5051015202520-2930-3940-4950-5960-7980-99100-149150-199200-299事件后漂移(tick):15 分钟中价 − 1 秒中价手数桶扫单 20-29 手:漂移 0.14 tick(t=0.15,n=57,432);扣成本净 -3.53扫单 30-39 手:漂移 -2.77 tick(t=-2.20,n=16,934);扣成本净 -6.39扫单 40-49 手:漂移 -0.31 tick(t=-0.16,n=7,066);扣成本净 -3.84扫单 50-59 手:漂移 -0.74 tick(t=-0.36,n=6,618);扣成本净 -4.32扫单 60-79 手:漂移 -0.48 tick(t=-0.21,n=3,695);扣成本净 -3.95扫单 80-99 手:漂移 -2.01 tick(t=-0.32,n=1,931);扣成本净 -5.48扫单 100-149 手:漂移 -4.94 tick(t=-1.52,n=2,069);扣成本净 -8.34扫单 150-199 手:漂移 2.50 tick(t=0.41,n=551);扣成本净 -0.72扫单 200-299 手:漂移 -5.60 tick(t=-0.61,n=328);扣成本净 -8.70单笔记录 20-29 手:漂移 1.49 tick(t=1.00,n=11,076);扣成本净 -2.04单笔记录 30-39 手:漂移 -2.92 tick(t=-1.00,n=3,331);扣成本净 -6.38单笔记录 40-49 手:漂移 9.59 tick(t=2.44,n=1,638);扣成本净 6.19单笔记录 50-59 手:漂移 -2.18 tick(t=-0.45,n=1,026);扣成本净 -5.52单笔记录 60-79 手:漂移 5.46 tick(t=1.22,n=987);扣成本净 2.11单笔记录 80-99 手:漂移 4.79 tick(t=1.08,n=606);扣成本净 1.56单笔记录 100-149 手:漂移 8.60 tick(t=1.59,n=430);扣成本净 5.52单笔记录 150-199 手:漂移 12.73 tick(t=1.41,n=193);扣成本净 9.54单笔记录 200-299 手:漂移 -1.37 tick(t=-0.10,n=87);扣成本净 -4.51扫单(同一主动单合并)单笔成交记录
图 3 · 事件后漂移(15 分钟中价 − 1 秒中价,tick),扫单 vs 成交记录口径。误差棒是按日聚类的 95% 区间。扫单口径几乎每个桶都是零或负;成交记录口径在 ≥40 手是正的。300 手以上样本太少(99 / 19),没画,数字见表 6。

扫单口径:从 20 手到 299 手,每个桶的漂移都在零附近或者是负的(30–39 手 −2.8 tick,t = −2.2;100–149 手 −4.9,t = −1.5)。只有 300 手以上(全年 99 张)有 +32.7 tick(t = 2.7)。

成交记录口径反过来:40–49 手 +9.6 tick(t = 2.4),60–79 手 +5.5,100–149 手 +8.6,150–199 手 +12.7(这几档 t 在 1.1–1.6),300 手以上 +65 tick(只有 19 条)。

同一批成交,两种数法,答案相反。差别只有一个:一张主动单被拆成了几条来报。这不是噪声,是报告方式造成的。

到这里七月那件事就对上了。「单笔记录 ≥60 手」本来就是记录口径。一条 100 手的记录,说明那个价位上本来至少挂着 100 手。这么深的一层,吃掉它报价不会马上动,信息要过一阵才进价格。

所以下一步很自然:把 ≥40 手的扫单按打穿了几层拆开。

两种大单,一种一步到位,一种慢慢走

051015单层块吸收扫 2–3 层扫 ≥4 层中价变化(tick)≥40 手主动单的类型单层块吸收 · 即时(0+):1.25 tick(SE 0.06,t=20.7,n=3,630)扫 2–3 层 · 即时(0+):1.35 tick(SE 0.08,t=17.7,n=851)扫 ≥4 层 · 即时(0+):12.31 tick(SE 0.50,t=24.4,n=17,523)1.251.3512.3单层块吸收 · 15 分钟后:13.87 tick(SE 3.18,t=4.4,n=3,553)扫 2–3 层 · 15 分钟后:13.00 tick(SE 4.49,t=2.9,n=841)扫 ≥4 层 · 15 分钟后:10.75 tick(SE 2.05,t=5.2,n=18,191)13.91310.7即时(事件后第一条记录)15 分钟后
图 4 · ≥40 手主动单的即时冲击与 15 分钟冲击,按订单簿形态分类。左边一次推到位,右边当时几乎不动、后面慢慢走。误差棒是按日聚类的 95% 区间。
表 5 · 按订单簿形态分类的 ≥40 手与 ≥100 手主动单(扫单口径,tick)。括号内为按日聚类 t 值。
类型n即时 0+15 min漂移 15 min − 1 s扣成本净值15 min / σday
≥40 手 · 单层块吸收3,553+1.25 (20.7)+13.87 (4.4)+6.78 (2.8)+3.41 (1.4)1.82% (3.0)
≥40 手 · 扫 2–3 层841+1.35 (17.7)+13.00 (2.9)+7.49 (1.7)+4.30 (1.0)1.08% (1.4)
≥40 手 · 扫 ≥4 层18,191+12.31 (24.4)+10.75 (5.2)-3.79 (-2.3)-7.41 (-4.4)1.74% (4.1)
≥100 手 · 单层块吸收552+1.22 (16.3)+21.74 (3.3)+13.58 (2.7)+10.48 (2.1)3.14% (3.3)
≥100 手 · 扫 2–3 层103+1.10 (6.4)+22.47 (2.1)+16.11 (1.5)+12.91 (1.2)3.49% (1.5)
≥100 手 · 扫 ≥4 层2,436+19.64 (22.3)+16.44 (4.0)-4.86 (-1.4)-8.31 (-2.4)2.88% (4.0)

漂移 = 15 分钟中价 − 1 秒中价;净值 = 漂移 − 进出各半个真实价差 − 0.4 tick 手续费。

先说一句怎么读数:漂移是 15 分钟中价减 1 秒中价,不是减即时冲击。1 秒时中价通常已经比 0+ 又走了几 tick,所以下面三个数不能直接相减。

三类:

到 ≥100 手差别更大:块吸收即时 1.2、15 分钟 21.7(t = 3.3)、漂移 +13.6 tick(t = 2.7);走簿即时 19.6、15 分钟 16.4、漂移 −4.9。按当日波动率算,块吸收 ≥100 手的 15 分钟冲击是 σday 的 3.1%(t = 3.3)。

我的理解

两类的信息含量差不多,15 分钟都在 11–22 tick,差别在价格是谁推上去的。走簿是主动方自己把价格推到位,还略微推过头,之后回吐一点;块吸收是主动方撞上一堵 55 手的墙(可能是冰山,可能是大机构的被动单),报价几乎没动,别人看到的只是「有人愿意在这个价位一口吃掉 50 手」,这个信号要过 15 分钟才慢慢定价。我的猜法是:市场对「打穿了几层」反应够了,对「一个价位上消失了多少手」反应不够。Glosten 和 Milgrom (1985) 那种做市商从成交里学信息的框架大概能套上。

两条旁证。按手数/顶档挂量分组,比值 ≤1 的漂移是正的(40–59 手 +7.3,100 手以上 +11.5,t = 2.2),比值 >20 的是负的。块吸收里那 292 张没把显示挂量吃空的(即时 0.07 tick),15 分钟也有 17.7 tick(t = 2.2)。

整数手数。≥100 手里,整数手数(100、150、200……)的 15 分钟冲击只有 4.9 tick(t = 0.6),非整数是 19.4 tick(t = 4.3);整数的漂移 −12.3(t = −2.2)。40–99 手区间差别不显著。按整数下单的,更像在执行一个定好的数,不是按有多确定来选手数。Alexander 和 Peterson (2007) 在股票上记过类似的事。

时段(亚洲 / 欧洲 / 美国 / 尾盘)之间没差别:40–59 手即时冲击 7.3–8.2 tick,漂移也没有稳定的时段模式。

价差一秒就回来了,然后算成本

上一节的延续能不能拿到手,要看成本。成本又要看大单之后价差变成什么样。这里又是一个和我想的相反的结果。

-0.500.510+1s5s15s1m5m15m30m1h价差变化(tick):事件后 − 事件前事件后时距1 手 · 0+:+0.050 tick(SE 0.001)1 手 · 1s:+0.233 tick(SE 0.007)1 手 · 5s:+0.221 tick(SE 0.007)1 手 · 15s:+0.212 tick(SE 0.008)1 手 · 1m:+0.203 tick(SE 0.008)1 手 · 5m:+0.161 tick(SE 0.010)1 手 · 15m:+0.099 tick(SE 0.016)1 手 · 30m:+0.047 tick(SE 0.023)1 手 · 1h:+0.037 tick(SE 0.017)10-19 手 · 0+:-0.352 tick(SE 0.019)10-19 手 · 1s:-0.143 tick(SE 0.013)10-19 手 · 5s:-0.172 tick(SE 0.014)10-19 手 · 15s:-0.184 tick(SE 0.016)10-19 手 · 1m:-0.223 tick(SE 0.023)10-19 手 · 5m:-0.259 tick(SE 0.016)10-19 手 · 15m:-0.362 tick(SE 0.025)10-19 手 · 30m:-0.427 tick(SE 0.027)10-19 手 · 1h:-0.441 tick(SE 0.024)40-49 手 · 0+:-0.482 tick(SE 0.071)40-49 手 · 1s:-0.159 tick(SE 0.045)40-49 手 · 5s:-0.107 tick(SE 0.043)40-49 手 · 15s:-0.084 tick(SE 0.050)40-49 手 · 1m:-0.109 tick(SE 0.052)40-49 手 · 5m:-0.230 tick(SE 0.066)40-49 手 · 15m:-0.237 tick(SE 0.061)40-49 手 · 30m:-0.286 tick(SE 0.068)40-49 手 · 1h:-0.345 tick(SE 0.046)100-149 手 · 0+:-0.151 tick(SE 0.102)100-149 手 · 1s:-0.196 tick(SE 0.061)100-149 手 · 5s:-0.095 tick(SE 0.058)100-149 手 · 15s:-0.132 tick(SE 0.058)100-149 手 · 1m:-0.093 tick(SE 0.048)100-149 手 · 5m:-0.119 tick(SE 0.054)100-149 手 · 15m:-0.272 tick(SE 0.068)100-149 手 · 30m:-0.305 tick(SE 0.062)100-149 手 · 1h:-0.383 tick(SE 0.056)300+ 手 · 0+:+1.151 tick(SE 0.358)300+ 手 · 1s:+0.344 tick(SE 0.146)300+ 手 · 5s:+0.303 tick(SE 0.143)300+ 手 · 15s:+0.397 tick(SE 0.152)300+ 手 · 1m:+0.251 tick(SE 0.174)300+ 手 · 5m:+0.264 tick(SE 0.223)300+ 手 · 15m:+0.021 tick(SE 0.177)300+ 手 · 30m:+0.158 tick(SE 0.199)300+ 手 · 1h:+0.028 tick(SE 0.179)1 手10-19 手40-49 手100-149 手300+ 手
图 5 · 大单之后的价差变化(事件后价差 − 事件前价差,tick),扫单口径。大单之后价差没变宽,反而收窄;只有 150 手以上先扩后收。数字在正文。

10–49 手扫单之后,市场看到的第一个价差比事前窄 0.35–0.5 tick(50–149 手窄 0.05–0.3)。我猜是两个原因叠一起:大单常在价差本来就宽的时候出现(≥20 手事件事前价差 3.2–3.7 tick,日中位 3.0),事后往均值回;扫单把薄的那层清掉后,新的限价单很快补上。只有 150 手以上先扩 0.7–1.15 tick,1 秒内回到 ±0.35 以内。15 分钟到 1 小时后,5–149 手的大多数桶比事前低 0.1–0.5 tick。在这个市场,大单打掉的流动性是秒级恢复的,不是分钟级。

所以成本可以按事件当时的真实价差算,不会系统性低估:事件后 1 秒进场吃半个价差,15 分钟后出场再吃半个,加 4 美元手续费(0.4 tick)。≥20 手事件的往返成本 3.1–3.7 tick,一手 31–37 美元。

表 6 · 事件后漂移、往返成本与净值(tick)。
口径 · 手数桶n漂移(t)往返成本净值t(净值)
扫单 · 20-29 手57,432+0.14 (0.2)3.67-3.53-3.9
扫单 · 30-39 手16,934-2.77 (-2.2)3.62-6.39-5.0
扫单 · 40-49 手7,066-0.31 (-0.2)3.53-3.84-2.0
扫单 · 50-59 手6,618-0.74 (-0.4)3.57-4.32-2.1
扫单 · 60-79 手3,695-0.48 (-0.2)3.47-3.95-1.7
扫单 · 80-99 手1,931-2.01 (-0.3)3.47-5.48-0.9
扫单 · 100-149 手2,069-4.94 (-1.5)3.40-8.34-2.5
扫单 · 150-199 手551+2.50 (0.4)3.22-0.72-0.1
扫单 · 200-299 手328-5.60 (-0.6)3.10-8.70-1.0
扫单 · 300+ 手99+32.68 (2.7)3.06+29.622.4
成交记录 · 20-29 手11,076+1.49 (1.0)3.53-2.04-1.4
成交记录 · 30-39 手3,331-2.92 (-1.0)3.46-6.38-2.2
成交记录 · 40-49 手1,638+9.59 (2.4)3.40+6.191.6
成交记录 · 50-59 手1,026-2.18 (-0.5)3.34-5.52-1.2
成交记录 · 60-79 手987+5.46 (1.2)3.36+2.110.5
成交记录 · 80-99 手606+4.79 (1.1)3.22+1.560.4
成交记录 · 100-149 手430+8.60 (1.6)3.08+5.521.0
成交记录 · 150-199 手193+12.73 (1.4)3.20+9.541.1
成交记录 · 200-299 手87-1.37 (-0.1)3.14-4.51-0.3
成交记录 · 300+ 手19+65.27 (2.3)3.91+61.362.2

往返成本 = 事件后 1 秒的半个价差 + 15 分钟后的半个价差 + 0.4 tick 手续费(4 美元)。净值为正且 t > 1.5 者标红。

扣完成本,扫单口径全负,20–299 手各桶 −3.5 到 −8.7 tick,大多显著。跟着走簿的大单做,扣完成本是亏的。这和第一节那个「聚合大单」回测(10 万次、−0.19 tick)对得上。块吸收口径为正但在边缘:≥40 手 +3.4 tick(t = 1.4),≥100 手 +10.5 tick(t = 2.1),不过后者一天只有 1.8 张。记录口径 ≥40 手各桶 −6.4 到 +9.5,单桶 t 都不到 1.6。

-40k0k40k80k120k2025-062025-092025-122026-03累计净损益(美元,每事件 1 手,扣价差与手续费)交易日单笔记录 ≥60 手:$110k,日 t=2.12单层块吸收 ≥40 手:$87k,日 t=1.20单笔记录 ≥60 手单层块吸收 ≥40 手
图 8 · 两条规则的纸面累计净损益(美元)。每个事件 1 手,事件后 1 秒进场,持有 15 分钟,扣真实价差和手续费,不限并发。「单笔记录 ≥60 手」全年 +11.0 万美元(日 t = 2.1),前后半年各一半;「单层块吸收 ≥40 手」+8.7 万美元(日 t = 1.2),83% 来自后半年。「任意 ≥40 手扫单」是 −61 万,没画。

和七月回测对账(表 7 在文末)。七月那套更严:记录口径 ≥60 手、250 ms 延迟、持有 900 秒、最多同时 10 张。全年 +131,980 美元,日 t = 2.42,夏普 2.18;块置换检验(整天翻方向、重跑全部参数、取最大 t、按搜索次数校正)p = 0.010。两套口径说的是同一件事:信号是真的,但量级被成本压在 1–3 倍价差之内。

为什么它还在。我能想到的是:剩下的延续大约刚好等于把它套走要付的成本;一天十来张,容量太小,没人有动力抹平它。后半年价差翻倍,延续也翻倍。

不稳的地方

先看图 7,这是后面所有分半都绕不开的背景。

0246平均价差(tick)25/0525/0825/1126/0226/052025-05:2.172025-06:2.132025-07:1.822025-08:1.822025-09:1.712025-10:2.892025-11:3.052025-12:2.792026-01:3.522026-02:5.732026-03:5.232026-04:4.242026-05:3.9102505007501,000日内波动 σ(tick)25/0525/0825/1126/0226/052025-05:384.392025-06:327.592025-07:256.802025-08:224.862025-09:323.522025-10:627.702025-11:453.002025-12:465.822026-01:573.462026-02:891.262026-03:941.732026-04:643.682026-05:613.720102030日均成交量(万手)25/0525/0825/1126/0226/052025-05:15.642025-06:14.272025-07:12.612025-08:12.672025-09:17.732025-10:27.542025-11:15.242025-12:15.592026-01:19.852026-02:11.962026-03:13.532026-04:10.422026-05:8.89
图 7 · 逐月流动性状态。平均价差(tick)、日内波动 σday(tick)和日均成交量。2026 年 2–3 月金价冲高,日内波动率中位数从前半年的 324 tick 升到后半年的 623 tick,平均价差从 2.17 tick 到 4.16 tick,成交量没有跟着放大。
表 8 · 前后半年分半。H1 = 2025-05-20 → 2025-11-17(156 天),H2 = 2025-11-18 → 2026-05-19(156 天)。
指标前半年 H1后半年 H2
扫单 20-39 手 · 即时冲击3.66 tick · 1.46% σ7.04 tick · 1.27% σ
扫单 40-59 手 · 即时冲击5.17 tick · 1.82% σ10.79 tick · 1.65% σ
扫单 60-99 手 · 即时冲击6.33 tick · 2.10% σ15.49 tick · 2.21% σ
扫单 100+ 手 · 即时冲击9.50 tick · 3.41% σ23.53 tick · 3.26% σ
块吸收 ≥40 手 · 漂移+0.44 tick (t 0.2) · 0.11% σ+13.42 tick (t 2.9) · 3.60% σ
块吸收 ≥40 手 · 扣成本净值-2.08 tick (t -1.2)+9.15 tick (t 2.0)
成交记录 ≥60 手 · 纸面净损益$50,440$59,632

即时冲击以 tick 计后半年翻倍,以 σday 计不变;块吸收的漂移几乎全部来自后半年。

分半:前半年 2025-05-20 → 2025-11-17,后半年 2025-11-18 → 2026-05-19。即时冲击按 tick 后半年翻倍、归一化后重合,这部分我觉得站得住。

但块吸收之后的延续,几乎全部来自后半年。≥40 手块吸收的漂移,前半年 +0.4 tick(t = 0.2),后半年 +13.4 tick(t = 2.9);归一化之后是 0.1% 对 3.6% 的 σday,不是波动率尺度能解释的。纸面权益 83% 来自后半年。记录口径的 ≥60 手规则前后半年各一半(5.0 万对 6.0 万美元),七月那次严格的样本外检验也过了,所以我不觉得它「不存在」。但块吸收这个解释在前半年没有独立的支持。我更愿意把它看成一个和波动率状态有关的东西,不是常数。

其余的:

最后

四句话:

下一步。这套做法只要逐笔成交和簿快照就能搬,不依赖 CME 的任何特性。想试加密货币的现货和永续,还有用 CLOB 撮合的预测市场(比如 Polymarket)。那里价格本身就是概率,可以直接看一张大单之后价格要多久才走到位,以及价差和簿深有没有把这段延续吃掉。

复现。几个脚本,16 核机器上跑完不到两分钟,不含下载:

七月的 backtest.py / holdout.py / block_perm.py 用的是同一份抽出来的逐笔。表都是脚本输出直接生成的,没手抄。

看过的几篇:

完整的表格都在这里

表 1,样本概览:交易日数、成交笔数、手数、合并后的主动单数、顶档挂量和单笔手数的分位数。

表 1 · 样本概览。GC 前月合约,Databento MBP-1。
项目数值备注
交易日3122025-05-20 → 2026-05-19
成交记录 / 主动单(扫单)31,621,111 / 27,815,758多层扫单占主动单 7.7%
成交量(手)47,750,032日中位 153,106
单笔 / 扫单手数中位数1 / 1扫单 99.9 分位 36 手
顶档挂量中位(手)22026 年以后为 1 手
价差(tick,日均值的均值)3.16前半年 2.17 · 后半年 4.16
日内波动 σday(tick,中位)436前半年 324 · 后半年 623
中价范围(美元)3,275 – 5,551日收盘中价

表 2,冲击响应函数的完整数表:扫单口径各手数桶在九个时距上的冲击,以及 15 分钟冲击除以即时冲击的比值。

表 2 · 冲击响应函数(扫单口径,tick)。括号内为按日聚类标准误;n 为 15 分钟时距的事件数。
手数桶n0+1 s1 min15 min1 h15 min / 0+
1 手19,040,6780.95 (0.03)1.35 (0.04)1.48 (0.07)1.51 (0.15)1.62 (0.24)1.58
2 手3,594,4121.10 (0.03)1.62 (0.05)1.77 (0.12)1.56 (0.20)1.64 (0.30)1.42
3-4 手1,791,5861.29 (0.04)1.85 (0.06)1.74 (0.13)2.31 (0.47)2.23 (0.52)1.79
5-9 手911,4621.73 (0.05)2.25 (0.08)2.00 (0.27)2.84 (0.54)2.33 (0.64)1.64
10-19 手265,7023.01 (0.09)3.52 (0.12)3.14 (0.33)3.27 (0.79)1.12 (0.78)1.09
20-29 手57,8364.99 (0.16)5.60 (0.24)5.35 (0.68)5.55 (1.04)4.01 (2.53)1.11
30-39 手17,0756.46 (0.24)7.24 (0.29)6.10 (0.48)3.76 (1.40)7.54 (2.49)0.58
40-49 手7,1337.50 (0.33)7.94 (0.34)6.93 (0.64)11.85 (3.02)8.57 (3.42)1.58
50-59 手6,6708.41 (0.36)9.74 (0.49)9.21 (0.79)8.31 (1.84)6.58 (2.79)0.99
60-79 手3,7369.58 (0.48)10.11 (0.52)10.76 (1.04)11.24 (2.76)6.36 (3.59)1.17
80-99 手1,95511.48 (0.70)11.81 (0.71)10.77 (1.24)10.96 (6.28)14.01 (6.73)0.95
100-149 手2,09514.64 (0.78)14.83 (0.77)13.57 (1.35)14.18 (4.47)15.05 (6.80)0.97
150-199 手56215.37 (1.13)16.26 (1.02)19.36 (2.29)24.33 (7.48)19.16 (13.21)1.58
200-299 手33415.58 (1.43)17.91 (1.42)17.92 (2.78)13.68 (8.96)6.72 (15.52)0.88
300+ 手10022.61 (2.54)21.20 (2.10)32.84 (4.17)51.50 (12.87)38.89 (18.65)2.28

最后一列为 15 分钟冲击与即时冲击之比;≥20 手各桶在 0.9–1.2 之间者标红。30–39 与 40–49 两桶合并后该比值约为 0.9。

表 3,平方根律的斜率:不同口径、不同桶集合、不同时距下的 β 和按日自助区间。

表 3 · 平方根律:log Ī = a + β·log Q̄ 的斜率。95% 区间为按交易日重抽 500 次的自助法。
口径时距β95% 区间
扫单 · 全部 15 桶0+0.588[0.567, 0.605]
扫单 · ≥20 手 10 桶0+0.520[0.457, 0.581]
扫单 · 全部 15 桶1 s0.518[0.499, 0.536]
扫单 · ≥20 手 10 桶1 s0.480[0.428, 0.538]
扫单 · 全部 15 桶1 min0.541[0.511, 0.570]
扫单 · ≥20 手 10 桶1 min0.629[0.536, 0.719]
扫单 · 全部 15 桶15 min0.547[0.424, 0.628]
扫单 · ≥20 手 10 桶15 min0.722[0.343, 1.016]
归一化主曲线(I/σday 对 Q/Vday)0+0.550[0.535, 0.566]
归一化主曲线(I/σday 对 Q/Vday)15 min0.491[0.361, 0.593]
成交记录口径(对照)0+-0.003[-0.052, 0.036]
成交记录口径(对照)15 min0.463[0.315, 0.595]

表 4,事件级回归:≥20 手扫单的即时冲击和 15 分钟冲击对手数、深度比、层数、事件前价差、当日波动率的回归,标准误按日聚类。

表 4 · 事件级回归(≥20 手扫单,tick)。括号内为按交易日聚类的 t 值。
变量(1) 即时冲击(2) 即时冲击(3) 即时冲击(4) 15 分钟冲击
log 手数4.13 (19.7)2.96 (17.3)2.81 (17.3)6.35 (6.5)
log(手数/顶档挂量)1.95 (28.1)0.06 (1.9)0.38 (0.8)
log 打穿层数2.95 (21.8)0.11 (0.1)
事件前价差(tick)0.95 (24.4)0.17 (0.4)
σday(百 tick)0.17 (5.3)0.20 (1.0)
常数-8.84 (-14.5)-9.29 (-15.4)-13.15 (-19.9)-19.27 (-5.5)
0.1060.2520.5150.001
n96,49296,49296,49297,496

表 7,纸面策略汇总:这里的几条规则和七月那次回测放在一起。

表 7 · 纸面策略汇总(美元,单张 GC,312 个交易日)。
规则笔数总净损益日 t夏普最大回撤前半 / 后半
成交记录 ≥60 手(本文,不限并发)2,322110,0722.121.9124,19450,440 / 59,632
单层块吸收 ≥40 手(本文,不限并发)3,51887,2581.201.0861,24614,912 / 72,346
任意 ≥40 手扫单(本文,不限并发)22,357-611,268-3.18-2.86700,524-344,704 / -266,564
成交记录 ≥60 手 · 250 ms 延迟 · 并发 ≤10(2026-07 回测)2,320131,9802.422.1824,61451,066 / 80,914

前三行:每事件 1 手、事件后 1 秒进场、持有 15 分钟、扣真实价差与手续费。末行为此前更严格的回测(含延迟、并发上限、按日 PnL),其块置换检验经搜索校正的 p = 0.010。

t 都是按交易日聚类的;tick 是 GC 最小变动价位 0.1 美元,每手 10 美元。数字随方法修订会更新(v1,2026-09-07)。