Hawkes Processes for Order Arrival and Market Event Modeling
数字指纹文章使用三数向量——hawkes_mu、hawkes_alpha、hawkes_beta——作为参与者行为签名的计时组成部分,并断言做市商表现出强烈的自激励。它从未说明这三个数字来自哪里,它们是根据什么估计的,或者你应该在多大程度上相信它们。本文是缺失的一半:估计器、拟合诊断以及一个比三个参数本身更重要的导出量——分支比 。
这里所测试的主张是狭窄且可检查的。订单流是自我激励的:一次激进的卖出使得下一次激进的卖出更有可能,这是任何时变率的泊松模型都无法重现的。如果这是真的,那么适合原始交易时间戳的霍克斯过程应该 (a) 在保留可能性上击败泊松基线,(b) 产生严格在 0 和 1 之间的分支比,以及 (c) 通过时间重新缩放拟合优度测试。关于股票期货,(a) 和 (b) 点被广泛报道。 (c) 点是已发表的霍克斯论文通常会安静下来的地方,也是该博客上从未检查过加密磁带的地方。
两个背景本博客已经拥有,所以这里不再重新导出。自激反馈结构——事件触发更多同类事件,低于阈值的亚临界和高于阈值的失控——具体导出为作为交易信号的清算级联中的复制数,包括几何级数总移动、超临界闪崩机制和作为约束它的三个因素之一的熔断机制。下面的支化比 是 的点过程模拟。这里真正附加的是: 是可以仅根据交易时间戳实时估算的,没有清算图,没有订单簿深度,也没有杠杆假设。这就是使用点处理机械的全部原因。
时钟时间是错误采样轴的前提是超越时间条]的基本论点,它通过构建更好的条来解决这个问题。本文以不同的方式解决了这个问题:根本不采样,而是直接对事件时间进行建模。
点过程基础

点过程是一组随机的事件时间,由其条件强度 定义 - 给定完整历史记录 的瞬时到达率:
就是齐次泊松过程。非齐次泊松过程让 遵循确定性形状(例如 U 形日内曲线),但仍然假设条件独立:知道刚刚发生的交易并不能告诉您另一笔交易是否即将发生。实际订单流违反了这一假设,而这种违反正是本文的全部主题。 中的星号是整个区别 - 它标志着对历史的依赖。
霍克斯过程

单变量霍克斯过程具有强度
其中 为背景强度(外源到达), 为激励内核。每个事件都会使强度增加 ,然后随着 的形状而衰减。最近发生的一系列事件会产生高强度,使进一步发生的事件更有可能发生——这个过程会记住自己的历史。
分支率
是由一个父级触发的子级事件的平均数量。平稳性要求;平稳平均强度为 ,发散为 。因此, 将总活动分为外源部分 和内源部分 :在 ,70% 的事件是对其他事件的反应,而不是对市场以外任何事件的反应。
这正是清算级联中级联倍增器的亚临界/超临界分裂,从不同的方向达到。计算成本的差异: 需要强制卖出密度和实时账簿深度的正向图,这两者都是基于杠杆分布假设的估计。 需要时间戳列表。
Filimonov 和 Sornette (2012) 报告称,1998 年至 2007 年间,E-mini S&P 500 期货中 从大约 0.3 上升到 0.7 以上。Hardiman、Bercot 和 Bouchaud (2013) 将相同的合约置于 附近,并以 指数的幂律核为空滞后。两者都是十多年前的股票期货结果,并且都不会在未经衡量的情况下转移到加密货币。复制它们不是本文的重点;检查相同的制度是否适用于不同参与者的 24/7 永续期货磁带,并且没有市场开盘中断。
核函数选择
指数,,带 。马尔可夫,因此似然度具有 -per-event 递归(如下)。这是每一次实际配合的开始。
幂律,。再现长记忆聚类,但丢失递归 - 似然评估变为 或需要截断。
指数总和,。使用 时间尺度近似幂律衰减,同时保持递归。 到 通常就足够了, 的时间跨度为毫秒到分钟。
加密货币贸易到达量是呈指数衰减还是幂律衰减是一个具有似然比答案的经验问题,并且它是在下面测量的而不是引用的。
多元霍克斯过程

对于 事件类型,
其中 描述类型 如何激发类型 。对于指数核,分支矩阵为 ,平稳性需要谱半径 。与最大特征值相关的 特征向量确定了主要激励模式 - 哪组事件类型倾向于一起触发。
订单簿的有趣实例是 :市场买入、市场卖出、限价买入、限价卖出、取消买入、取消卖出。该矩阵有 36 个条目,是该博客中没有的 Hawkes 工具包的一部分。请注意,其预测条目之一已经在没有词汇的情况下凭经验记录:连续级别上的相关质量取消(墙拉动)直接在队列位置和订单簿墙分析中测量。拟合的 与表示为内核的现象相同,并且两个测量值应该一致。如果他们不这样做,那么其中之一就是错误的。
跨资产和多场所版本是具有不同标签的相同机制:非对角线内核捕获超前滞后和传染,Shi、Broussard 和 Booth (2019) 在 2010 年闪电崩盘期间对 30 只道指股票使用了这一点,发现了具有可识别传染源的不对称交叉激励。
## 校准

最大似然
对于 上的事件时间 :
第一个术语奖励事件发生的强度;第二个惩罚没有产生任何结果的强度。
对于指数核,递归
每个事件在 处给出 ,并且补偿器关闭:
总成本为 ,这使得百万事件适合常规。在积极约束下使用 L-BFGS-B 进行优化。
在您信任输出之前,值得了解两种故障模式。似然曲面像 一样严重平坦,因此近临界拟合可以报告位于 中的 几乎水平的山谷中的看起来自信的点估计 — 始终在 中分析似然性,而不是读取优化器的 Hessian 矩阵。在多变量情况下,参数计数随着 的增长而增长,因此在 之前,您需要在内核范数上进行组套索,或者矩阵是拟合噪声。
EM 和非参数估计
EM 将分支结构视为潜在的:每个事件要么是来自 的移民,要么是某个早期事件的后代。 使用 HMMs 进行状态检测] 的 Baum-Welch 部分介绍了通用 E 步/M 步机制、局部最优警告和多重初始化规则,并且此处相同。 Hawkes 特定部分是 E 步量本身:
是哪个事件导致哪个的后验 - 一个可解释的输出,而不仅仅是一个优化中间值。按事件类型汇总,它给出了磁带的属性:最后一小时的销售的这一部分是由之前的销售触发的,该部分是从外部到达的。它还允许您以非参数方式估计 作为网格上的分段常数,这就是您在不承诺替代方案的情况下检查指数假设的方式。成本: 用于完整的 矩阵,因此它不会在没有近似的情况下扩展到大致 事件。
Bacry 和 Muzy 的谱方法是另一种无模型路线 - 固定霍克斯过程的功率谱密度因式为 ,因此估计协方差密度并求解因式分解可恢复内核,而无需假定参数形式。
应用于真实加密交易数据

本节中的每个数字都必须来自真实数据的实际拟合。恢复注入模拟器的参数并不能证明任何事情,除了优化器有效之外。
数据:币安 BTC/USDT aggTrade 在定义的窗口内的时间戳,窗口、符号和事件计数在每个报告的数字旁边明确说明。 aggTrade 将来自一个接受者订单的相同价格的成交汇总到一条记录中,这是这里的正确单位 - 一个激进订单是一个事件,而不是每个交易对手成交一个事件。
单变量拟合
import numpy as np
import pandas as pd
from tick.hawkes import HawkesExpKern
trades = pd.read_parquet("binance_btcusdt_aggtrades.parquet")
t0 = trades["transact_time"].iloc[0]
ts = ((trades["transact_time"] - t0) / 1000.0).to_numpy(dtype=np.float64)
T = ts[-1]
learner = HawkesExpKern(decays=BETA_GRID, penalty="none", verbose=False)
learner.fit([ts])
mu_hat = learner.baseline[0]
alpha_hat = learner.adjacency[0, 0]
n_hat = alpha_hat / BETA_CHOSEN
print(f"events = {len(ts)}")
print(f"window = {T/3600:.2f} h")
print(f"mu = {mu_hat:.4f} events/s")
print(f"n = {n_hat:.4f}")
print(f"lambda_bar (model) = {mu_hat/(1-n_hat):.4f} events/s")
print(f"lambda_bar (data) = {len(ts)/T:.4f} events/s")
最后两个打印是第一次健全性检查,无需任何成本:如果模型的平稳平均强度 未接近经验事件率,则无论优化器报告什么,拟合都是错误的。
不应用手固定。描绘衰减网格上的可能性并报告轮廓,因为 和 强烈权衡,并且 可以稳定,而两个参数都不稳定。
内核实际上会呈指数衰减吗?
文献中的幂律主张来自 2013 年的股票期货论文。直接测试它:将指数核和幂律核拟合到同一磁带上,通过对保留数据(不是样本内的数据,因为幂律有一个额外参数)的对数似然进行比较,并分别查看大额交易后的经验强度衰减。
large = ts[trades["quantity"].to_numpy() > LARGE_TRADE_THRESHOLD]
lags = np.logspace(-3, 2, 60) # 1 ms .. 100 s
rate = np.empty(len(lags) - 1)
for k in range(len(lags) - 1):
lo, hi = lags[k], lags[k + 1]
counts = [
np.searchsorted(ts, t0_ + hi) - np.searchsorted(ts, t0_ + lo)
for t0_ in large
]
rate[k] = np.mean(counts) / (hi - lo)
绘制双对数,指数核弯曲;幂律是直的。该图是比任何一个似然数更有力的证据,因为它显示了失配的“位置”——通常指数对尾部的拟合不足,而在前几毫秒的拟合过度。
分支矩阵
最小可行多元模型:二维,激进买入和激进卖出,以 is_buyer_maker 分隔。如果 L3 数据可用,则扩展到取消。
buys = ts[~trades["is_buyer_maker"].to_numpy()] # taker bought
sells = ts[ trades["is_buyer_maker"].to_numpy()] # taker sold
mv = HawkesExpKern(decays=BETA_CHOSEN, penalty="l2", C=C_CV, verbose=False)
mv.fit([buys, sells])
G = mv.adjacency / BETA_CHOSEN # branching matrix
rho = np.max(np.abs(np.linalg.eigvals(G)))
print("G =\n", G)
print(f"spectral radius = {rho:.4f}") # must be < 1
要发布的两个量是矩阵本身及其谱半径。不对称性是有趣的部分:卖出-刺激-卖出是否超过买入-刺激-买入,以及交叉项是否对称,这些都是关于加密磁带的可测试陈述,但这里没有人测量过。
拟合优度:时间重标度
时间重缩放定理:如果模型正确,则变换后的时间 形成单位速率泊松过程,因此差异 为 。
from scipy.stats import kstest, expon
compensator = np.empty(len(ts))
for i, ti in enumerate(ts):
compensator[i] = mu_hat * ti + (alpha_hat / BETA_CHOSEN) * np.sum(
1 - np.exp(-BETA_CHOSEN * (ti - ts[:i]))
)
tau = np.diff(compensator)
stat, pval = kstest(tau, expon(scale=1.0).cdf)
print(f"KS = {stat:.4f}, p = {pval:.4g}, N = {len(tau)}")
阅读此测试时需要注意一点: 有数十万个,KS 测试会因微小的错误指定而被拒绝。 的微小 p 值本身几乎没有任何意义;信息输出是 相对于 的 QQ 图和 KS 统计量本身,它是无标度效应大小。报告两者,并诚实地报告它们 - 如果指数内核在加密磁带上被拒绝,那么这是一个值得发布而不是埋葬的结果,本着与鲁棒边缘上诚实的负面结果相同的精神。
n 是否真的不稳定?
是实时脆弱性指标的说法不断被引用,但很少经过测试。测试很简单:在平静时期和已知的加密级联日期的滚动窗口上估计 ,并查看它是在事件之前还是仅在事件期间上升。仅与崩溃同时出现峰值的数量是一种描述,而不是警告。
稳定性和鲁棒性

除非您知道当您更改不重要的东西时它会移动多少,否则安装好的 并不是一种测量。四个特定陷阱,按造成伤害的大致顺序排列。
时间戳分辨率产生自激。 Binance aggTrade 时间戳是毫秒分辨率。真正相隔微秒的交易会崩溃到相同的毫秒标记上,霍克斯似然将同时发生的事件视为最大激励—— 的评估恰好为零滞后。这使 向上,并且偏差随着活动而增加,这意味着在您最希望数字值得信赖的突发期间最糟糕。量化它:计算与邻居共享时间戳的事件的比例,然后重新调整这些在毫秒容器内均匀抖动的事件,并报告 移动了多少。如果抖动对 的影响超过置信区间,则标题数字正在衡量时钟,而不是市场。
交换批处理。 交换不会在事件发生时发出事件;它们在匹配和传播管道刷新时发出它们。币安对清算流每秒一次的限制是有记录的先例——看起来像集群到达的流在一定程度上是发布者的产物。贸易提要中的任何批处理都会在到达间隔分布上留下周期性印记,Hawkes 内核会很乐意将其吸收到 中。直接检查:在拟合任何内容之前,对到达间隔时间进行直方图并在批处理期间查找峰值。
对假设衰减的敏感性。 取决于 ,并且 通常是固定的或网格搜索的,而不是联合估计的。将 报告为 在合理范围内的函数,而不是作为点。如果曲线平坦,则该数字为实数;如果密切关注,那么你已经选择了你的答案。
估计窗口。 在一个小时、一天和一周内的估计会有所不同,部分原因是该过程确实是非平稳的,部分原因是较长的窗口混合了区域,这通过将区域间变化与区域内聚类合并而夸大了表观激励。报告窗口长度扫描。读取上升的 的正确方法是针对其他时间测量的相同窗口长度,而不是针对来自不同窗口的数字。
这里的模式是在GPU精度陷阱中建立的模式:干净运行并返回可信数字的管道并不是正确数字的证据,唯一的防御措施是扰乱不重要的输入并确认输出不会移动。
这会给你带来什么,不会给你带来什么

与微观结构理论的三个联系保持简短,因为该博客在其他地方详细介绍了每个联系。
价格形成。 在 Kyle (1985) 中,做市商根据混合知情交易和噪音交易的净订单流进行定价;影响系数 和深度 与后续文献一起列出——包括反对凯尔线性的证据——在滑点成本模型中。 Hawkes 读数将 映射到真正的新信息,将自激事件映射到机械反应,使 成为噪声驱动流量份额的可测量代理。
Volatility clustering. Clustering, persistence, the stationarity condition and the long-run variance — structurally the exact analogue of and — are covered in GARCH volatility forecasting for crypto.真正的新主张是 Bacry、Delattre、Hoffmann 和 Muzy(2013):近临界霍克斯过程生成回报序列,其波动性自相关按照幂律衰减,任何地方都没有明确的波动性模型。波动性聚集是自激励订单流的一个新兴属性,而不是被假设的。
Epps 效应。 Bacry 和 Muzy 表明,双变量霍克斯模型纯粹根据两个过程之间激励的有限传播时间再现了高采样频率下测量到的相关性的衰减,无需额外的机制。
在执行时,自激励所遵循的处方——切片后减速,安静时段加速——已经是TWAP、VWAP和POV执行算法中POV反馈环路部分的核心,而对幼稚等切片的批评是Almgren-Chriss。霍克斯拟合添加的不是建议,而是数字:拟合的内核半衰期 表示来自您自己的切片的激发需要多长时间才能衰减,这会将“稍等一下”转换为特定的暂停长度。
限制

无抑制。 经典模型只允许事件增加强度。市场则相反:吸收压力的大限价单可以阻止激进的交易。具有抑制功能的 Hawkes 进程允许负内核值,但代价是必须强制执行 。这对于给定拟合是否重要在非参数核估计中可见 - 如果分段常数 在某个滞后处降至零以下,则约束模型正在与数据作斗争。
非平稳性。 标准模型假设平稳性,加密货币是 24/7 但不统一:流动性、参与者组合和事件率都会在一天中和融资时间戳附近发生变化。时变基线 可以以更多参数为代价来处理此问题,而上面的估计窗口灵敏度就是您确定是否需要它的方法。
## 概括

Hawkes 流程之所以值得使用,原因之一是:它将订单流的聚类分解为单个可解释的数字,即分支比率 ,可以仅根据时间戳进行计算,无需重建订单簿,也无需对杠杆或定位进行假设。这使得它成为目前市场内生性的最便宜的估计——同样的问题清算级联通过给出了昂贵的答案。
机制很简单:指数核通过 递归给出 可能性,EM 给出关于哪个事件导致哪个事件的可解释后验,时间重新缩放给出真正的拟合优度测试而不是合理性论证。并不简单的是信任输出。毫秒时间戳舍入使 在突发期间精确向上偏置,交换批处理印记结构内核将吸收,并且 随假设的衰减和估计窗口一起移动。在没有这四种敏感性的情况下报告的支化比是一个数字,而不是测量值。
参考文献和进一步阅读
- 霍克斯,A.G.(1971)。 “一些自激和互激点过程的光谱。” 生物计量学,58(1), 83-90。
- Bacry, E.、Mastromatteo, I. 和 Muzy, J.-F. (2015)。 “霍克斯金融流程。” 市场微观结构和流动性.
- Shi, F.、Broussard, J. P. 和 Booth, G. G. (2019)。 “使用多元霍克斯过程对股市中的闪电崩盘行为进行建模。”
- Hardiman, S.、Bercot, N. 和 Bouchaud, J.-P. (2013)。 “金融市场的关键反身性:霍克斯过程分析。”
- Bacry, E. 和 Muzy, J.-F. (2014)。 “价格和交易高频动态的霍克斯模型。” 量化金融.
- Bompaire, M.、Bacry, E. 和 Gaiffas, S. (2017)。 “tick:用于统计学习的 Python 库,重点是霍克斯过程。” JMLR.
- Filimonov, V. 和 Sornette, D. (2012)。 “量化金融市场的反身性。”
- 库马尔,P.(2021)。 “高频做市的深度霍克斯流程。”
- 勾选库文档:Hawkes module.
- Morse, S.“Hawkes 进程的 Python 类。” (教程和代码)
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.