Ликвидационные каскады как торговый сигнал: как читать принудительный заранее объявленный поток
Большая часть рыночного потока остается тайной, пока не появляется в ленте. Дискреционный продавец решает продавать тогда, когда решает; о его намерении вы узнаете из ленты уже постфактум. Принудительные ликвидации позиций с плечом — исключение, причем огромное. Ликвидация принудительна — владелец позиции не может решить, произойдет она или нет, — и заранее объявлена — точная цена срабатывания является детерминированной функцией параметров, которые ончейн полностью публичны, а офчейн поддаются статистической оценке. Каждый лонг с плечом — это отложенный рыночный ордер на продажу, стоящий по цене, которую он сообщает всем, кому не лень ее вычислить.
Это полностью меняет взгляд на явление. В сопутствующей статье о механике ликвидаций в Aave и Compound ликвидации рассматриваются со стороны ликвидатора — как устроена гонка инфраструктур за право погасить плохой долг и получить бонус. Эта статья смотрит на тот же объект со стороны трейдера: не "как выиграть ликвидацию", а "совокупность цен ликвидации всех остальных — это карта будущего принудительного потока, и против этой карты можно торговать". Мы построим две версии карты — точную ончейн и размытую для перпов на CEX, количественно определим, когда цепочка ликвидаций начинает сама себя усиливать, и аккуратно сформулируем, что этот поток делает с ценой.
Ончейн-график глубины ликвидаций
На денежном рынке цена ликвидации позиции не оценивается. Она выводится. Вспомним health factor из введения в механику: позиция может быть ликвидирована, когда
где — объемы залога, — их оракульные цены, — пороги ликвидации, а — стоимость долгов. Мы не будем выводить формулу заново; вместо этого инвертируем ее. Возьмем распространенный случай — один волатильный залог (например, WETH) и стабильный долг (USDC). Если положить и решить уравнение относительно цены залога, получим цену срабатывания позиции:
Это единственное число заемщик уже сообщил рынку. Оно говорит: если WETH коснется на оракуле, эта позиция станет источником принудительного предложения. Размер этого предложения тоже можно узнать — при срабатывании ликвидатор погашает долга и получает залог стоимостью , поэтому примерно
стоимости залога выходит на рынок (или хеджируется), когда позиция срабатывает.
Возьмем конкретную позицию из введения в механику: внесено 10 WETH по цене LT = 0.83P_{\text{liq}} = 20{,}000 / (10 \times 0.83) = \char36 2{,}4100.5 \times 20{,}000 \times 1.05 = \char36 10{,}500P_{\text{liq}}$ и получите гистограмму: номинал принудительных продаж как функция цены. Это и есть ончейн-график глубины ликвидаций — нативный для DEX родственник стакана, только его "ордера" невольны, а цены вычисляются, а не котируются.

Три оговорки не дают этому графику превратиться в фантазию:
- У позиций с несколькими активами нет единственной цены триггера. Позиция с двумя волатильными залогами и двумя долгами ликвидируется на поверхности в пространстве цен, а не в одной точке. Практическое упрощение — вычислять триггер вдоль оси доминирующего волатильного залога, удерживая цены всех остальных оракулов на текущем уровне. Это верно для движения одного актива и неверно для движения коррелированной корзины — а это важно, потому что именно при коррелированных обвалах многие триггеры сдвигаются одновременно. Считайте одноактивный приближением первого порядка по маржинальному эффекту, а не гарантией.
- Принудительная продажа не равна рыночному сбросу на одной площадке. Компетентные ликвидаторы не продают изъятый залог вслепую рыночным ордером в самый тонкий доступный пул; они маршрутизируют сделку через DEX и CEX, а часто удерживают залог и дельта-хеджируются через перп, вместо того чтобы немедленно продавать его (проблема выходного свопа, подробно разобранная в введении в механику). Поэтому — это верхняя граница потока, влияющего на цену, а не точечная оценка. Часть потока уходит в хеджи и никогда не касается спота.
- Триггеры движутся вместе с оракулом, а не с рынком. В Aave и Compound позиция становится ликвидируемой, когда оракул пересекает , а оракулы обновляются по расписанию отклонения и heartbeat, отставая от рынка. Поэтому график глубины — карта того, где принудительный поток получает право на срабатывание, причем это зависит от следующей передачи данных оракулом — тонкость, которую введение разбирает подробно.
Между графиком денежного рынка и картой CEX есть третий источник: perp DEX. Hyperliquid, GMX и dYdX v4 запускают маржинальные бессрочные контракты как централизованная биржа, но хранят состояние позиций ончейн или в доступном для запросов клиринговом модуле. Поэтому их цены ликвидации подчиняются той же формуле изолированной маржи, что и перпы на CEX, но вычисляются по реальным позициям (размер, залог, вход), а не оцениваются по совокупному OI. Состояние клирингового модуля Hyperliquid раскрывает маржу каждого аккаунта и mark price; позиции GMX находятся ончейн и ликвидируются по ценам, выведенным из оракула, через keepers. Практический вывод: для perp DEX можно построить карту ликвидаций с плечом в стиле CEX, но с ончейн-точностью, гораздо ближе к точности графика Aave, чем к догадкам тепловой карты. Если площадка публикует позиции, гадать не приходится.
Даже с этими оговорками ончейн-график — самая чистая карта принудительного потока из всех существующих на рынках: никаких предположений о распределении плеча, никаких скрытых размеров, каждый вход читается из состояния.
Тепловая карта ликвидаций CEX
Централизованные бессрочные биржи дают противоположную картину — гораздо больший открытый интерес и почти полное отсутствие детализации по позициям, которая делает ончейн-график точным. Прочитать отдельные позиции нельзя. Зато доступны совокупный открытый интерес и объем торгов. Тепловая карта ликвидаций — это результат попытки восстановить график глубины по этим агрегатам и допущениям, причем допущения здесь определяют все.
Арифметика для отдельной позиции проста. Для лонга с изолированной маржой и линейным расчетом (в USDT), открытого по цене с плечом и ставкой поддерживающей маржи , ликвидация срабатывает, когда капитал падает до уровня требования поддерживающей маржи:
и симметрично . Зафиксируем вход при и пройдем по уровням плеча:
| Плечо | Расстояние ниже входа | |
|---|---|---|
| 5× | $2,415 | −19.5% |
| 10× | $2,715 | −9.5% |
| 25× | $2,895 | −3.5% |
| 50× | $2,955 | −1.5% |
| 100× | $2,985 | −0.5% |
Форма этого столбца и есть причина, по которой тепловые карты загораются чуть ниже недавней цены: позиции с большим плечом ликвидируются почти у входа, поэтому там, где недавно проходил объем, плотная полоса триггеров 50–100× оказывается в долях процента от уровня. Создатель тепловой карты действует так: принимает недавно проторгованный объем за приближение к месту, где открывались позиции (их ), распределяет этот объем по предполагаемому набору уровней плеча — 5×, 10×, 25×, 50×, 100× с некоторыми предполагаемыми весами, — проецирует каждый фрагмент на его и закрашивает ценовую ось оценочным номиналом плеча, ликвидируемым на этом уровне. Яркие полосы — это плотные оценочные зоны ликвидаций.

Важно прямо сказать, почему это размытая картина, а не близнец ончейн-графика:
- Распределение плеча неизвестно. Вся тепловая карта — свертка объема с предполагаемой гистограммой плеча. Другие предположения перемещают яркие полосы. Два уважаемых поставщика данных публикуют заметно разные тепловые карты одного рынка в один и тот же день, и оба "правы" с учетом своих априорных предположений.
- Кросс-маржа ломает формулу отдельной позиции. Приведенный выше выведен для изолированной маржи. Позиция с кросс-маржой ликвидируется по капиталу всего аккаунта, поэтому ее эффективный триггер зависит от других позиций трейдера, их нереализованного PnL и любого залога, добавленного по ходу движения, — ничего из этого не наблюдается. Размер кросс-маржи фактически невидим для оценщика.
- Скрытый и динамический размер. Открытый интерес — совокупный показатель нетто и брутто; он не сообщает, как OI распределен по отдельным входам. Трейдеры постоянно добавляют, сокращают и хеджируют позиции. Ступенчатая поддерживающая маржа ( растет вместе с номиналом позиции) сдвигает триггеры крупных позиций относительно малых при одинаковом плече.
- Ликвидация идет порциями, а не мгновенно. Биржи ликвидируют крупные позиции постепенно и направляют остаточный риск в страховой фонд и систему auto-deleveraging, поэтому даже правильно расположенный кластер не обязательно выливается в один принт.
Правильнее воспринимать тепловую карту как априорное представление о том, где вероятнее всего сконцентрирован принудительный поток, которое нужно подтверждать или опровергать фактическими принтами ликвидаций (потоком forceOrder из раздела о конвейере ниже), а не как реестр. Она действительно полезна и действительно неточна; притворяться обратным — верный способ попасть под колеса тех самых кластеров, за которыми вы наблюдаете. О том, почему на перпах вообще накапливается столько плеча и почему стоимость финансирования продолжает подталкивать позиции к триггерам, читайте в статье о арбитраже ставок финансирования между биржами.
Динамика каскада в числах
Одна ликвидация — это точка данных. Каскад — это петля обратной связи, и у нее есть порог, который можно записать. Механика проста: принудительная продажа бьет по стакану → ценовой импакт двигает рынок → движение переводит следующий уровень позиций за их триггер → они ликвидируются → принудительных продаж становится больше → повтор. Схлопнется ли процесс или уйдет в разнос — вопрос не настроений, а отношения двух величин, которые мы уже построили.
Работаем с дробными падениями цены . Нужны две составляющие:
- Плотность ликвидаций — номинал принудительных продаж на единицу дробного падения цены, считываемый непосредственно с графика глубины или тепловой карты: . Она показывает, сколько топлива сложено в ценовом диапазоне.
- Глубина рынка — номинал рыночных продаж, необходимый для движения цены на одну единицу . В линейной модели импакта (Kyle) продажа номиналом двигает цену на . Это способность стакана поглощать принудительный поток, и именно этому посвящен анализ стены стакана и позиции в очереди: "стена" — локальный всплеск .
Теперь запускаем итерацию. Экзогенный шок роняет цену на и вызывает принудительных продаж. Эти продажи вызывают дальнейшее падение . Определим множитель каскада
и рекурсия становится простой: . Полное падение — геометрический ряд:
Все определяется значением :
- — субкритический режим. Каждый раунд ликвидаций вызывает меньше продаж, чем предыдущий. Каскад сам затухает; итоговое движение — ограниченный множитель от первоначального шока. Так происходит с большинством ликвидационных событий.
- — сверхкритический режим. Каждый раунд вызывает как минимум столько же продаж, сколько предыдущий. Геометрический ряд расходится; движение ограничивается только исчерпанием ликвидируемых позиций, углублением стакана на более низких ценах или защитным выключателем биржи. Это режим "флеш-крэша / лонг-сквиза".
— это число воспроизводства, эпидемии ликвидаций. Оно говорит, что каскад уходит в разнос ровно тогда, когда сконцентрированное в ценовом диапазоне принудительное предложение превышает ликвидность стакана, доступную для его поглощения. Поэтому небольшой шок в плотном кластере на тонком стакане гораздо опаснее крупного шока в пустом ценовом пространстве: опасность определяется , а не размером шока. Такая самовозбуждающаяся структура — события порождают новые события того же типа — и лежит в основе моделирования потока ордеров процессами Хоукса; именно поэтому ликвидации приходят кластерами, а не равномерно.

Подставим числа. Пусть стакан устроен так, что рыночные продажи на $10M сдвигают ETH на 1%, то есть номинала на единицу дробной цены. Сравним два режима для диапазона шириной 1% сразу под спотом:
- Плотный диапазон, кластерный номинал принудительных продаж $30M. Тогда и . Режим сверхкритический: шок, задевший верх диапазона, подрывает весь стек, а нижняя граница модели определяется не , а местом, где заканчиваются позиции.
- Разреженный диапазон, кластерный номинал $6M. Тогда , , а итоговое движение равно — усиленное, но ограниченное падение. Тот же шок, тот же стакан, кластер в пять раз тоньше — и результат меняется с обвала на покупаемый фитиль.
Дискретная версия — это короткая симуляция по отсортированным кластерам. Ее стоит написать: порог становится наглядным:
def cascade(p0, clusters, kyle_lambda):
"""
p0: price after the exogenous shock
clusters: {trigger_price: forced_notional} for long positions
kyle_lambda: fractional price impact per $ of market sell (1/depth)
Returns the floor price and total liquidated notional.
"""
p, sold, fired = p0, 0.0, set()
while True:
new = [(tp, n) for tp, n in clusters.items()
if tp not in fired and tp >= p]
if not new:
break
q = sum(n for _, n in new) # this round's forced sell
fired.update(tp for tp, _ in new)
p *= (1 - kyle_lambda * q) # linear price impact of the round
sold += q
return p, sold
Два практических замечания. Во-первых, локален: он меняется вдоль ценовой оси, потому что меняются и (плотность кластера), и (глубина стакана). Торговый вопрос звучит не как "хрупок ли рынок", а как "на какой конкретной цене пересекает 1". Во-вторых, тот же механизм работает в обратную сторону для шортов при движении вверх (шорт-сквиз — это каскад с перевернутыми знаками), поэтому у карты две стороны: топливо лонг-ликвидаций ниже спота и топливо шорт-ликвидаций выше. Цикл "принудительная продажа порождает ценовой импакт, который порождает новые принудительные продажи" — это эндогенный механизм риска, формализованный в литературе о fire sales (Cont и Wagalath), где вынужденная ликвидация сама создает корреляцию и импакт.
Сигналы: кластеры как магниты и зоны разворота
Карта принудительного потока дает два разных, почти противоположных торговых прочтения — в зависимости от момента относительно каскада.
До каскада: кластеры — ценовые магниты. Плотный кластер ликвидаций — это пул гарантированного, нечувствительного к цене потока. Он привлекателен для двух типов участников: трейдеров, ищущих ликвидность и желающих исполнить большой размер против вынужденных контрагентов, и хищных трейдеров, которые толкают цену к кластеру именно для запуска потока (охота за стопами на уровне протокола). В результате цена имеет хорошо документированную тенденцию тяготеть к крупным кластерам — уровень действует как магнит, потому что существует постоянный стимул сократить расстояние. Когда спот на слабом импульсе дрейфует к яркой полосе, сама полоса является частью объяснения. Предсказать реакцию стакана по мере приближения цены — поглотит ли стена поток или сложится — это ровно та задача краткосрочного прогнозирования стакана, которой занимаются модели вроде DeepLOB.
После каскада: кластеры — зоны разворота. Это более ценное и чаще всего злоупотребляемое прочтение, поэтому сформулируем его осторожно. Поток принудительных ликвидаций по определению неинформационен: продавец не считает, что цена слишком высока; он продает, потому что так велел маржинальный движок. Неинформационный поток двигает цену временно. Когда кластерные позиции исчерпаны, механические продажи резко прекращаются, и если по пути вниз каскад ушел ниже справедливой стоимости, цена обычно откатывает — появляется "ликвидационный фитиль". Это не фольклор: стандартный результат состоит в том, что импакт от вынужденных неинформированных продаж имеет временную составляющую и возвращается после прекращения потока; та же логика fire sale порождает временное искажение и последичное частичное восстановление в литературе о распродажах проблемных акций.

Эта дисциплина требует сформулировать несколько вещей предельно прямо:
- Возврат к среднему после каскада — документированная тенденция, а не закон и не число. Он зависит от того, был ли поток действительно неинформационным и не поступила ли во время каскада новая информация. Каскад ликвидаций, который одновременно является переоценкой рынка из-за реальных новостей (депег, эксплойт, макрошок), не обязан разворачиваться: принудительный и информационный потоки наложены друг на друга, и только первый из них временен. Универсального преимущества "покупать фитиль" нет, а любую конкретную долю возврата, приведенную без указания выборки, площадки и режима, следует считать маркетингом.
- Сигнал — это исчерпание, а не падение. Торговый момент наступает, когда фактические принты ликвидаций редеют — когда лента
forceOrderзатихает после всплеска, — потому что механический продавец ушел. Входить в середине сверхкритического каскада () значит вставать перед той самой петлей обратной связи, о которой предупреждал предыдущий раздел. - Оба прочтения требуют одной и той же карты. Магнит и разворот — это одни и те же кластеры, увиденные на разных фазах; ни тем, ни другим нельзя торговать без предварительного построения графика глубины и тепловой карты и постоянной сверки с фактическими принтами.
Есть и более медленное направленное прочтение асимметрии двусторонней карты. Топливо лонг-ликвидаций находится ниже спота, топливо шорт-ликвидаций — выше; когда одна сторона намного сильнее загружена, у рынка появляется механический уклон в ее сторону, потому что именно там шок встречает больше всего самоподдерживающегося потока. Рынок со стеной лонг-ликвидаций на 3% ниже и почти полным отсутствием ликвидаций выше структурно уязвим вниз независимо от нарратива: путь наименьшего сопротивления — это путь с наибольшим топливом. Устойчивое одностороннее финансирование часто и создает эту асимметрию: рынок, который платит лонгам за то, чтобы оставаться в шорте (глубоко отрицательное финансирование), накапливает переполненные шорты, чей кластер ликвидаций затем оказывается выше цены как топливо для сквиза, и наоборот. Лента финансирования и карта ликвидаций — два взгляда на одно и то же плечо.
Конвейер данных
Система объединяет два потока с противоположными свойствами: прямо направленный ончейн-индекс позиций (где принудительный поток получит право на срабатывание) и фактический поток ликвидаций CEX (где принудительный поток печатается прямо сейчас). Один сообщает, где лежит топливо; другой — что оно загорелось.
Прямая карта — ончейн-индекс позиций. Начните с истории событий Aave/Compound (Supply, Borrow, Repay, Withdraw, LiquidationCall), воспроизводя логи или запрашивая подграф в The Graph, и сведите их в текущие балансы по пользователям — ту же точную подсистему индексирования, которую введение в механику описывает для ликвидационных ботов, только здесь она используется для агрегации, а не исполнения. По балансам и текущим параметрам риска вычисляйте и каждой позиции и складывайте их в гистограмму графика глубины. Обновляйте ее с появлением новых блоков; после загрузки балансов гистограмму дешево поддерживать инкрементально.
Фактическая лента — поток Binance forceOrder. Binance Futures публикует реальные ликвидации через websocket: wss://fstream.binance.com/ws/!forceOrder@arr (массив всех символов) или <symbol>@forceOrder; каждое событие содержит сторону, цену и количество ликвидационного ордера. Есть одна документированная ловушка, о которой важно честно сказать: публичный поток ограничен максимум одним событием ликвидации на символ в секунду — во время яростного каскада, когда ликвидации приходят намного чаще 1 раза в секунду, поток выбирает выборку, а не сообщает каждый исполнившийся ордер, поэтому совокупный объем ликвидаций, восстановленный по нему, систематически занижается именно тогда, когда это важнее всего. Используйте поток для тайминга и направления каскада (запустился ли он, какая сторона, ускоряется ли или затихает), а не как точный реестр объема.
Минимальный каркас приема данных — два асинхронных производителя, пишущих в одну нормализованную шину:
import asyncio, json, websockets
async def binance_liquidations(bus):
url = "wss://fstream.binance.com/ws/!forceOrder@arr"
async with websockets.connect(url) as ws:
async for msg in ws:
o = json.loads(msg)["o"] # order payload
await bus.put({
"src": "binance", "kind": "realized",
"symbol": o["s"],
"side": o["S"], # SELL = long liquidation
"price": float(o["p"]),
"qty": float(o["q"]), # NB: stream is sampled at 1/s
})
async def onchain_positions(bus, subgraph, poll=12):
while True:
positions = subgraph.fetch_open_positions() # balances + risk params
chart = {}
for pos in positions:
p_liq = pos.debt / (pos.collateral * pos.liq_threshold)
q = pos.close_factor * pos.debt * (1 + pos.liq_bonus)
chart[round(p_liq, 2)] = chart.get(round(p_liq, 2), 0.0) + q
await bus.put({"src": "aave", "kind": "forward", "chart": chart})
await asyncio.sleep(poll) # ~1 block cadence
async def main(subgraph):
bus = asyncio.Queue()
await asyncio.gather(
binance_liquidations(bus),
onchain_positions(bus, subgraph),
consumer(bus), # reconcile forward map vs realized tape, emit signals
)
Именно в consumer живет стратегия: хранить прямую карту (ончейн-график плюс оценочную тепловую карту CEX), оценивать локальный множитель каскада по глубине стакана в реальном времени и следить за фактической лентой forceOrder, чтобы обнаруживать начало и — что важно для торговли — исчерпание. Когда лента вспыхивает, а затем редеет, пока цена находится ниже кластера, который карта показывала заранее, перед вами неинформационный перескок, и механического продавца больше нет: сетап для разворота. Когда лента ускоряется и впереди , это сверхкритический каскад, от которого нужно держаться подальше. Одна карта, противоположные действия; именно лента позволяет различить их в реальном времени.
Главные выводы
Ликвидации переворачивают обычную информационную асимметрию рынков: вместо скрытого до момента публикации потока цена и размер принудительных продаж вычисляются заранее — точно ончейн и приблизительно на перпах CEX. Постройте карту (ончейн-график глубины точен с поправкой на маршрутизацию и задержку оракула; тепловая карта CEX — это априорная оценка, зависящая от неизвестного распределения плеча и не видящая кросс-маржу), и хрупкость карты сведется к одному отношению: множителю каскада , плотности принудительных продаж к глубине стакана, числу воспроизводства, которое ниже 1 является субкритическим, а выше 1 становится безудержным. Сигнал разделяется по фазам: до каскада кластеры — магниты, после — зоны разворота; преимущество разворота существует только потому, что принудительный поток неинформационен и потому временен, а документированная тенденция исчезает, как только каскад совпадает с реальными новостями. Торгуйте исчерпание, а не падение; уважайте ; и никогда не принимайте размытую тепловую карту за реестр того, где зарыты тела.
Источники
- Qin, Zhou, Gamito, Jovanovic, Gervais (2021), An Empirical Study of DeFi Liquidations: Incentives, Risks, and Instabilities. arXiv:2106.06389.
- Kyle, A. S. (1985), Continuous Auctions and Insider Trading. Econometrica 53(6) — линейный коэффициент ценового импакта , используемый в модели каскада.
- Cont, R., & Wagalath, L. (2016), Fire Sales Forensics: Measuring Endogenous Risk. Mathematical Finance 26(4) — ценовой импакт принудительной ликвидации и эндогенная корреляция.
- Bacry, E., Mastromatteo, I., Muzy, J.-F. (2015), Hawkes Processes in Finance. Market Microstructure and Liquidity 1(1) — самовозбуждающаяся кластеризация ордерного и ликвидационного потока.
- Документация Binance Futures API — потоки ликвидационных ордеров (
!forceOrder@arr,<symbol>@forceOrder), включая ограничение в 1 событие в секунду на символ. - Подграфы Aave v3 и Compound III в The Graph;
getUserAccountDataAave и параметры риска резервов.
Авторы
Инженер торговых систем
Разработка торговых ботов с 2017 года: межбиржевой арбитраж (подключал до 30 бирж), парный арбитраж на коинтеграции между спотом и фьючерсами, скальпинг, фронтраннинг, торговля по новостям, сентиментный анализ, трендовые алгоритмы, а также алгоритмы управления и балансировки портфелей. Делает выставление ордеров до 1 мс, warehouse для big data, бэктестинг-движки, AI-агентов и интерфейсы для ботов (в т.ч. open-source profitmaker.cc). Стек: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, архитектура.