Hawkes Processes for Order Arrival and Market Event Modeling
Статья о цифровом отпечатке трейдера использует трехкомпонентный вектор — hawkes_mu, hawkes_alpha, hawkes_beta — как временную составляющую поведенческой сигнатуры участника и утверждает, что маркет-мейкеры демонстрируют сильное самовозбуждение. В ней не сказано, откуда берутся эти три числа, по каким данным они оцениваются и насколько им можно доверять. Эта статья — недостающая половина: оценивание, диагностика подгонки и одна производная величина, которая оказывается важнее самих трех параметров, — коэффициент ветвления .
Проверяемое здесь утверждение узкое и проверяемое. Поток ордеров самовозбуждается: агрессивная продажа повышает вероятность следующей агрессивной продажи так, что это не может воспроизвести пуассоновская модель с любой меняющейся во времени интенсивностью. Если это так, процесс Хоукса, подогнанный к исходным временным меткам сделок, должен (а) превосходить пуассоновский базовый уровень по правдоподобию на отложенных данных, (б) давать коэффициент ветвления строго между 0 и 1 и (в) проходить проверку согласия с преобразованием времени. Результаты (а) и (б) широко описаны для фондовых фьючерсов. Пункт (в) — место, где опубликованные статьи о процессах Хоукса обычно умолкают, и именно его криптовалютный поток в этом блоге еще не проверялся.
У блога уже есть два фрагмента необходимого контекста, поэтому здесь они не выводятся заново. Структура самовозбуждающейся обратной связи — события вызывают новые события того же типа, система докритична ниже порога и становится неуправляемой выше него — конкретно выведена как число воспроизводства в статье каскады ликвидаций как торговый сигнал, вместе с суммарным движением геометрического ряда, сверхкритическим режимом мгновенного обвала и автоматическими выключателями как одним из трех ограничителей. Коэффициент ветвления ниже — аналог для точечного процесса. Новое здесь состоит в том, что можно оценивать в реальном времени только по временным меткам сделок, без карты ликвидаций, глубины стакана и предположений о кредитном плече. Именно ради этого стоит использовать аппарат точечных процессов.
Предпосылка о том, что календарное время — неправильная ось выборки, лежит в основе статьи за пределами временных баров, где проблема решается построением более качественных баров. Здесь она решается иначе: мы вообще не делаем выборку, а моделируем моменты событий напрямую.
Основы точечного процесса, кратко

Точечный процесс — это случайное множество моментов событий, определяемое его условной интенсивностью — мгновенной скоростью поступления при известной полной истории :
Однородный процесс Пуассона соответствует случаю . Неоднородный процесс Пуассона позволяет следовать детерминированной форме, например внутридневной кривой в виде буквы U, но все равно предполагает условную независимость: знание о только что совершившейся сделке ничего не говорит о близости следующей. Именно это предположение нарушает реальный поток ордеров, и именно этому нарушению посвящена статья. Звездочка в — вся суть различия: она отмечает зависимость от истории.
Процесс Хоукса

Одномерный процесс Хоукса имеет интенсивность
где — фоновая интенсивность (экзогенные поступления), а — ядро возбуждения. Каждое событие увеличивает интенсивность на , после чего это увеличение затухает по форме . Кластер недавних событий создает высокую интенсивность и делает дальнейшие события более вероятными: процесс помнит собственную историю.
Коэффициент ветвления
— среднее число дочерних событий, вызванных одним родительским. Для стационарности требуется ; стационарная средняя интенсивность равна и расходится при . Поэтому делит общую активность на экзогенную долю и эндогенную долю : при семьдесят процентов событий являются реакцией на другие события, а не ответом на что-то внешнее по отношению к рынку.
Это ровно то же разделение каскадного множителя на докритическую и сверхкритическую части, которое рассмотрено в статье каскады ликвидаций, только полученное с другой стороны. Различается стоимость вычисления: для нужна прямая модель плотности принудительных продаж и текущей глубины стакана, а обе величины оцениваются на основе предположений о распределении плечей. Для нужен список временных меток.
Filimonov и Sornette (2012) сообщили о росте примерно с 0.3 до более чем 0.7 для фьючерсов E-mini S&P 500 в период с 1998 по 2007 год. Hardiman, Bercot и Bouchaud (2013) получили для того же контракта значение около при степенном ядре с показателем примерно на коротких лагах. Оба результата относятся к фондовым фьючерсам более чем десятилетней давности, и ни один нельзя перенести на криптовалюты без измерений. Цель этой статьи не в их воспроизведении, а в проверке того, сохраняется ли такой же режим на круглосуточном потоке бессрочных фьючерсов с другими участниками и без разрыва, связанного с открытием рынка.
Выбор ядра
Экспоненциальное ядро, , с . Оно марковское, поэтому правдоподобие вычисляется рекурсией за на событие (см. ниже). С него начинается практически любая подгонка.
Степенное ядро, . Оно воспроизводит кластеризацию с долгой памятью, но лишается рекурсии: вычисление правдоподобия становится или требует усечения.
Сумма экспонент, . Она приближает степенное затухание с временными масштабами, сохраняя рекурсию. Обычно достаточно --, причем охватывают диапазон от миллисекунд до минут.
Экспоненциально ли затухает поток сделок в криптовалютах или по степенному закону — эмпирический вопрос, на который отвечает отношение правдоподобий. Ниже он измеряется, а не заменяется ссылкой на литературу.
Многомерные процессы Хоукса

Для типов событий
где описывает, как тип возбуждает тип . Для экспоненциальных ядер матрица ветвления имеет вид , а для стационарности требуется спектральный радиус . Собственный вектор , соответствующий наибольшему собственному значению, определяет доминирующий режим возбуждения — группу типов событий, которые обычно происходят вместе.
Интересная постановка для стакана ордеров имеет : рыночная покупка, рыночная продажа, лимитная покупка, лимитная продажа, отмена покупки, отмена продажи. В этой матрице 36 элементов, и именно такой части инструментария Хоукса больше нет нигде в блоге. Заметим, что один из предсказываемых ею элементов уже эмпирически описан без этой терминологии: коррелированная массовая отмена на последовательных уровнях — снятие стен — напрямую измеряется в статье позиция в очереди и анализ стен стакана. Подогнанное — то же явление, выраженное через ядро, поэтому два измерения должны согласовываться. Если это не так, одно из них ошибочно.
Модели для нескольких активов и площадок используют тот же аппарат с другими метками: внедиагональные ядра фиксируют опережение-запаздывание и заражение. Shi, Broussard и Booth (2019) применили именно этот подход к 30 акциям Dow во время мгновенного обвала 2010 года и обнаружили асимметричное перекрестное возбуждение с идентифицируемыми источниками заражения.
Калибровка

Метод максимального правдоподобия
Для моментов событий на отрезке :
Первое слагаемое поощряет высокую интенсивность там, где события произошли; второе штрафует интенсивность, которая не породила событий.
Для экспоненциального ядра рекурсия
дает за на событие, а компенсатор замыкается:
Общая стоимость — , поэтому подгонка на миллионе событий выполняется рутинно. Оптимизируйте методом L-BFGS-B с ограничениями положительности.
До доверия результату стоит знать о двух режимах отказа. При поверхность правдоподобия сильно уплощается: околокритическая подгонка может выдать выглядящую уверенно точечную оценку в почти плоской впадине, где изменение лежит в пределах для . Поэтому всегда профилируйте правдоподобие по , а не считывайте оценку из матрицы Гессе оптимизатора. В многомерном случае число параметров растет как , поэтому после нужна group-Lasso-регуляризация норм ядер, иначе матрица подгоняет шум.
EM и непараметрическая оценка
EM рассматривает структуру ветвления как скрытую: каждое событие является либо иммигрантом от , либо потомком более раннего события. Общая механика E- и M-шагов, оговорка о локальном оптимуме и дисциплина множественных инициализаций описаны в разделе Baum-Welch статьи обнаружение режимов с HMM и здесь полностью совпадают. Специфическая для Хоукса часть — сама величина E-шага:
— апостериорная вероятность того, какое событие вызвало какое. Это интерпретируемый результат, а не просто промежуточная величина оптимизации. Суммирование по типу события дает атрибуцию потока: вот такая доля продаж за последний час вызвана предыдущими продажами, а такая пришла извне. Кроме того, это позволяет непараметрически оценить как кусочно-постоянную функцию на сетке и проверить экспоненциальное предположение, не выбирая заранее альтернативную форму. Стоимость полной матрицы — для , поэтому без приближения метод не масштабируется примерно дальше событий.
Спектральный метод Bacry и Muzy — другой безмодельный путь: спектральная плотность мощности стационарного процесса Хоукса раскладывается как , поэтому оценка плотности ковариации и решение факторизации восстанавливают ядра без предположения о параметрической форме.
Подгонка реального криптовалютного потока

Каждое число в этом разделе должно быть получено из настоящей подгонки на реальных данных. Восстановление параметров, заранее внесенных в симулятор, доказывает только работоспособность оптимизатора.
Данные: временные метки aggTrade для Binance BTC/USDT на заданном окне, причем окно, символ и число событий должны быть явно указаны рядом с каждой опубликованной цифрой. 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 имеют миллисекундное разрешение. Сделки, которые действительно разделены микросекундами, схлопываются в одинаковые миллисекундные метки, а правдоподобие Хоукса воспринимает совпадающие события как максимальное возбуждение — вычисляется ровно при нулевом лаге. Это смещает вверх, причем смещение растет вместе с активностью. Значит, оно сильнее всего именно во время всплесков, когда числу особенно хочется доверять. Измерьте это: посчитайте долю событий, имеющих общую временную метку с соседним событием, затем повторно подгоните модель, равномерно добавив этим событиям шум внутри их миллисекундного интервала, и сообщите, насколько изменился . Если джиттер меняет больше, чем доверительный интервал, итоговое число измеряет часы, а не рынок.
Пакетирование биржей. Биржи не отправляют события в момент их возникновения; они отправляют их, когда конвейер сопоставления и распространения сбрасывает накопившиеся данные. Документированный пример — ограничение Binance потока ликвидаций до одного сообщения в секунду: поток, который выглядит как кластер поступлений, частично является артефактом издателя. Любая пакетная обработка торговой ленты оставляет периодичность в распределении межсобытийных интервалов, которую ядро Хоукса охотно поглотит в . Проверьте это напрямую: постройте гистограмму межсобытийных интервалов и найдите пики на периоде пакетирования до любой подгонки.
Чувствительность к предполагаемому затуханию. зависит от , а обычно фиксируют или ищут по сетке, а не оценивают совместно. Отчитывайтесь о как о функции на правдоподобном диапазоне, а не как об одной точке. Если кривая плоская, число устойчиво; если тесно следует за , вы просто выбрали ответ заранее.
Окно оценки. Оценки на часе, дне и неделе будут различаться частично потому, что процесс действительно нестационарен, а частично потому, что длинное окно смешивает режимы. Это раздувает кажущееся возбуждение, смешивая межрежимную вариативность с кластеризацией внутри режима. Публикуйте sweep по длине окна. Правильно интерпретировать растущий можно только в сравнении с тем же размером окна в другие моменты, а не с числом, полученным на другом окне.
Здесь действует тот же принцип, что установлен в статье ловушка точности GPU: чисто работающий конвейер, который возвращает правдоподобное число, не доказывает правильность числа. Единственная защита — возмущать входы, которые не должны иметь значения, и проверять, что результат не меняется.
Что это дает и чего не дает

Три связи с теорией микроструктуры — кратко, потому что блог подробно рассматривает каждую в других статьях.
Формирование цены. В модели Kyle (1985) маркет-мейкер оценивает цену по чистому потоку ордеров, смешивающему информированную и шумовую торговлю; коэффициент воздействия и глубина , вместе с последующей литературой и свидетельствами против линейности Kyle, разобраны в статье модели проскальзывания и затрат. В интерпретации Хоукса соответствует действительно новой информации, а самовозбужденные события — механической реакции. Поэтому становится измеримым приближением доли потока, обусловленной шумом.
Кластеризация волатильности. Кластеризация, персистентность, условие стационарности и долгосрочная дисперсия — структурно точный аналог условий и — рассмотрены в статье прогнозирование волатильности криптовалют с GARCH. Действительно новое утверждение принадлежит Bacry, Delattre, Hoffmann и Muzy (2013): почти критический процесс Хоукса порождает ряды доходностей, автокорреляция волатильности которых затухает по степенному закону, без явной модели волатильности. Кластеризация волатильности возникает как свойство самовозбуждающегося потока ордеров, а не задается заранее.
Эффект Эппса. Bacry и Muzy показали, что двумерная модель Хоукса воспроизводит падение измеренной корреляции на высокой частоте выборки исключительно за счет конечного времени распространения возбуждения между двумя процессами — дополнительный механизм не нужен.
Для исполнения из самовозбуждения следует рекомендация: замедлиться после одного среза и ускориться в спокойные периоды. Она уже лежит в основе раздела об обратной связи POV в статье алгоритмы исполнения TWAP, VWAP и POV, а критика наивного равномерного дробления приведена в Almgren-Chriss. Подгонка Хоукса добавляет не совет, а число: период полураспада подогнанного ядра показывает, сколько времени требуется для затухания возбуждения от собственного среза, превращая фразу о коротком ожидании в конкретную длину паузы.
Ограничения

Без торможения. Классическая модель позволяет событиям только увеличивать интенсивность. На рынках бывает обратное: крупный лимитный ордер, поглощающий давление, может сдерживать агрессивную торговлю. Процессы Хоукса с ингибированием допускают отрицательные значения ядра, но требуют поддерживать . Важно ли это для конкретной подгонки, видно по непараметрической оценке ядра: если кусочно-постоянная опускается ниже нуля на каком-либо лаге, ограниченная модель сопротивляется данным.
Нестационарность. Стандартная модель предполагает стационарность, а криптовалютный рынок работает 24/7, но не является однородным: ликвидность, состав участников и частота событий меняются в течение дня и около временных меток финансирования. Изменяющаяся во времени базовая интенсивность учитывает это ценой дополнительных параметров, а приведенная выше чувствительность к окну оценки помогает понять, нужна ли такая модель.
Итоги

Процесс Хоукса стоит своих вычислительных затрат по одной причине: он сводит кластеризацию потока ордеров к одному интерпретируемому числу — коэффициенту ветвления , который вычисляется только по временным меткам, без реконструкции стакана и предположений о плече или позиционировании. Это самая дешевая доступная оценка того, насколько рынок сейчас эндогенен, — тот же вопрос, на который каскады ликвидаций отвечают дороже через .
Аппарат прост: экспоненциальные ядра дают правдоподобие за благодаря рекурсии , EM дает интерпретируемое апостериорное распределение того, какое событие вызвало какое, а преобразование времени дает настоящую проверку согласия вместо аргумента о правдоподобии. Сложно не вычислить результат, а доверять ему. Округление миллисекундных меток смещает вверх именно во время всплесков, пакетирование биржей оставляет структуру, которую ядро поглощает, а меняется вместе с предполагаемым затуханием и окном оценки. Коэффициент ветвления без этих четырех проверок чувствительности — это число, а не измерение.
Ссылки и дополнительная литература
- Hawkes, A. G. (1971). "Спектры некоторых самовозбуждающихся и взаимно возбуждающихся точечных процессов." Biometrika, 58(1), 83-90.
- Bacry, E., Mastromatteo, I. и Muzy, J.-F. (2015). "Процессы Хоукса в финансах." Market Microstructure and Liquidity.
- Shi, F., Broussard, J. P. и Booth, G. G. (2019). "Моделирование поведения мгновенного обвала на фондовом рынке с помощью многомерных процессов Хоукса."
- Hardiman, S., Bercot, N. и Bouchaud, J.-P. (2013). "Критическая рефлексивность на финансовых рынках: анализ процесса Хоукса."
- Bacry, E. и Muzy, J.-F. (2014). "Модель Хоукса для динамики цен и сделок на высокой частоте." Quantitative Finance.
- Bompaire, M., Bacry, E. и Gaiffas, S. (2017). "tick: библиотека Python для статистического обучения с акцентом на процессы Хоукса." JMLR.
- Filimonov, V. и Sornette, D. (2012). "Количественная оценка рефлексивности на финансовых рынках."
- Kumar, P. (2021). "Глубокий процесс Хоукса для высокочастотного маркет-мейкинга."
- Документация библиотеки tick: модуль Hawkes.
- Morse, S. "Класс Python для процессов Хоукса." (Учебник и код)
Авторы
Инженер торговых систем
Разработка торговых ботов с 2017 года: межбиржевой арбитраж (подключал до 30 бирж), парный арбитраж на коинтеграции между спотом и фьючерсами, скальпинг, фронтраннинг, торговля по новостям, сентиментный анализ, трендовые алгоритмы, а также алгоритмы управления и балансировки портфелей. Делает выставление ордеров до 1 мс, warehouse для big data, бэктестинг-движки, AI-агентов и интерфейсы для ботов (в т.ч. open-source profitmaker.cc). Стек: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, архитектура.