Тартип агымынын дисбаланс: Конт-Куканов-Стойков окуясынын декомпозициясы
Бул блогдогу китептен алынган сигналдардын көпчүлүгү * көз ирмемдик сүрөттөр *: азыр ар бир тарапта канча көлөм бар. Тартип агымынын дисбаланс - бул башка объект. Бул эки көз ирмемдик сүрөттүн ортосундагы жаңыртуулардын агымынын бир кол коюлган санга декомпозициясы – бул базардагы сатууну эсептегендей, тендерди жокко чыгарууну эсептейт.
Бул ажыроо бул макаланын темасы болуп саналат. Тактап айтканда: аны аныктаган Cont-Kukanov-Stoikov (2014) окуя индикаторлору, Xu-Gould-Howison (2019) көп деңгээлдүү кеңейтүү жана анын негизги компонентин кыскартуу жана Ли-Даяр жана Жаппай көлөм классификациясы эрежелери каналыңыз соода багытын белгилебегенде сизге керек.
Алдын ала бир кадрдык эскертүү, анткени ал төмөндөгү ар бир санды кантип окушуңузду жөнгө салат. CKS кагазындагы атактуу 50-65% R-квадрат - бул заманбап регрессия: интервалдагы баанын өзгөрүүсү ошол эле интервалдагы буйрутма агымында регрессацияланган. Бул алардын болжолу эмес, баанын жылышынын декомпозициясы. Аны 1-2% дисперсия менен салыштыруу, күнүмдүк капиталдын кирешелүүлүгүнүн модели алмадан апельсинге чейин түшүндүрөт жана бул блог узакка чейин талашкан. DeepLOB жана прогноз-пайдага каршы ажырым жана ичинде чынчыл терс натыйжа — бул экөөнү бириктирүү, окуу куралдары кантип тузак болуп калат. Катуу артта калган OFI регресси мыйзамдуу жана алда канча азыраак сан. Бул макалада бир кабар жок.
Эмне үчүн соода эмес, заказ агымы

Үзгүлтүксүз чектүү заказ китебиндеги баанын өзгөрүшү так төрт механизм аркылуу ишке ашат: рыноктук сатып алуу эс алуу сурамдарын талап кылат; базар сатуу эс алуу сунуштарын жейт; табыштаманы жокко чыгаруу колдоону алып салат жана сунуштун төмөндөшүнө жол берет; суроо боюнча жаңы чектөө тартиби каршылык кошот. Биринчи экөө гана соода болуп саналат. Акыркы экөө эч кандай көлөмгө негизделген өлчөө үчүн көрүнбөйт - VWAP, баланстагы көлөм, кол коюлган соода агымы - жана көпчүлүк жерлерде буйрутма-соода катышы 10:1ден ашат, ошондуктан көрүнбөгөн бөлүгү чоң бөлүгүн түзөт. OFI пайдалуулугуна бүт дооматы, ал бардык төрт механизмди бирдей шкалада баалайт. (Китеп үчүн маалымат структурасы жана стандарт катары сүрөттүн өзгөчөлүгү вектору, караңыз DeepLOB.)
Конт-Куканов-Стойков ОФИ модели

Негизги модель Конт, Куканов жана Стойковдун 2014-жылдагы "Заказ китебинин окуяларынын баага тийгизген таасири" (Финансылык эконометрика журналы) аттуу макаласынан алынган.
Тартиптин агымынын дисбалансын аныктоо
Эң жакшы сунуш баасын карап көрүңүз , эң жакшы суроо баасын , жана алардын өлчөмдөрү жана . ырааттуу байкоолордун ортосунда жана :
Сатып алуу жана сатуу жагындагы окуянын салымдары бул жерде:
Жөнөкөй тил менен айтканда: эгерде эң жакшы сунуш баасы көтөрүлсө, жаңы сатып алуу кызыгуусу пайда болду — анын толук көлөмүн оң деп эсептеңиз. Эгерде ал түшүп кетсе, сатып алуу пайыздары жоголуп кетти - эски өлчөмүн алып салуу. Эгер баа өзгөрүлбөсө, өлчөмүн өзгөртүүнү гана эсептеңиз. суроо жагы күзгү сүрөттөлүш болуп саналат.
Бул үч индикатордун бутактары китептин үстүнкү бөлүгүндөгү бардык мүмкүн өтүүнү камтыйт, андыктан ар бир жаңыртуу так бир кол коюлган санга карталарды камтыйт. Эч кандай соода классификациясы, каптал энбелгилери жок, билдирүү деңгээлиндеги канал талап кылынбайт - эки катары менен тартылган сүрөт жетиштүү.
Интервалдар боюнча топтоо
Бир интервал үчүн камтыган китеп жаңыртуулары:
Сызыктуу баа таасир модели
кайда орто баанын өзгөрүшү болуп саналат, баа таасир коэффициенти болуп саналат, жана калдык ызы-чуу болуп саналат. CKS 10 секунддан 1 мүнөткө чейинки аралыкта АКШнын акциялары боюнча бир акцияга 50-65%. Дагы: бирдей-аралык, алдыга эмес.
Cross-Sectional Scaling
CKS ошондой эле тереңдик менен тескери таасир коэффициентинин масштабын көрсөттү:
кайда эң жакшы сунуш жана суроо боюнча орточо эс алуу көлөмү. Ошол эле агым жука китепте бааны андан ары түртөт. Бул моделдин бир бөлүгү, ал деңгээлди өзгөртпөстөн, ар кайсы жерде өткөрүлөт, анткени ал санды эмес, * мамилени* алдын ала айтат — жана ал ар кандай тереңдиктеги крипто жуптарда түздөн-түз текшерилет.
Көп деңгээлдүү тартип агымынын дисбаланс (MLOFI)

Оригиналдуу модель китептин үстүн гана колдонот. Xu, Gould, and Howison (2019) аны узартты деңгээл.
Аныктама
кайда үчүн бирдей үч тармактык формуланы колдонот -чү сунуш/суроо жуп.
Көп деңгээлдүү баа таасири
Nasdaq акциялары боюнча жарыяланган тыянак, ар бир кошумча деңгээл үлгүдөн тышкары кошумчалайт - болжол менен 10-15 пайыздык пункт бир деңгээлден бешке чейин баратат, ал эми маргиналдуу пайда дагы эле ондо. Коэффициенттер монотондуу түрдө бузулат, : китептин үстүнкү бөлүгү үстөмдүк кылат, бирок тереңирээк деңгээлдер тривиалдуу эмес кошумча сигналды алып жүрөт.
Бул крипто китепте жашайбы, бул макаладагы эң кызыктуу ачык суроо. Крипто китептери ичке жана тереңирээк майдаланган жана Nasdaq заказ китебинен чыккандан кийин 2-5-деңгээлдер эч нерсе кошпойт.
Негизги компонентти кыскартуу
Коңшу деңгээлдеги ОФИлер өтө корреляцияланган (жарыяланган үлүштүк натыйжаларда 0,8ден жогору), ошондуктан негизги компоненттин декомпозициясы табигый көрүнүш. Кабарланган биринчи компонент жалпы дисперсиянын 89% ашуунун камтыйт жана бирдиктүү жалпы сигнал катары кызмат кылат:
менен OFI ковариация матрицасынын алдыңкы өз вектору. Практикалык жагымдуулугу - бул коллинеардык регрессияны бир жакшы шартталган скалярга кыйратат - сиздин маалыматтарыңыздагы дисперсия үлүшү азыраак болсо дагы, жасоо керек.
Соодаларды классификациялоо: Сатып алуу жана сатуу

OFI өзү соода классификациясын талап кылбайт. Бирок, эгерде сиз аны соодага негизделген чараларга салыштыргыңыз келсе, же сизде жалпы тилкелер гана болсо, анда сиз багытты чыгарышыңыз керек.
Цитата эрежеси
соода баасын салыштыруу үстөмдүк кылган орто чекитке :
Ортодон жогору соода, кыязы, сатып алуучу сунушту көтөргөн; анын ылдый жагында, сатуучу сунушту чапкан.
Lee-Ready алгоритми (1991) - бул цитата эрежеси аныкталбаган так орто чекитте соодалар үчүн белги-эреже кайтарылышы менен цитата эрежеси. Кене эрежеси - акыркы баанын өзгөрүшүнүн белгиси, мурунку тарапты нөл белгиге алып баруу - мурунтан эле келип чыккан жана ишке ашырылган. Убакыттын чегинен тышкары, кайсы бир жумушчу ташыйт _tick_sign(). Ли-Даяр классификациянын тактыгы рынокко жана мезгилге жараша 72-85% ды түзөт.
Жаппай көлөм классификациясы (BVC)
Жеке соодаларды дайындоо мүмкүн болбогондо - бириктирилген тилкелер, көпчүлүк ачык шам API'лери - Easley, Lopez de Prado жана O'Hara's Bulk Volume классификациясы бардын көлөмүнүн сатып алуу үлүшүн анын нормалдаштырылган баанын өзгөрүүсүнөн баалайт:
менен стандарттык нормалдуу CDF жана баалардын акыркы өзгөрүүлөрүнөн болжолдонууда. Кене деңгээлиндеги классификациядан азыраак так, бирок ал OHLCVде иштейт.
Эмне OFI эмес

Үч кошуна өлчөмдөрү OFI менен чаташтырышат. Ар бири бул блогдун башка жеринде туура камтылган; айырмачылыктар бул жерде маанилүү болуп саналат.
Статикалык заказ китеби дисбалансы (OBI) - бул снапшот версиясы — эс алуудагы суроо-талаптын көлөмүнө каршы эс алуу сунушунун көлөмү, окуяга көз салуу жок. Караңыз DeepLOB салттуу LOB өзгөчөлүктөрү формула жана анын көп баскычтуу формасы үчүн. Контраст бул OFIнин бүткүл пункту: OBI сизге китептин абалын айтып берет, OFI ал жакка кантип келгенин айтып берет.
Соода балансынын бузулушу (TI) жана анын көлөмүнүн өлчөнгөн варианттары кол коюлган соода агымы болуп саналат, аларда жылма функциялар катары аныкталат жана ишке ашырылат. машина үйрөнүү менен моделдөө жайылтылат. Байланыш жөнүндө жарыяланган жыйынтыктардын бири бул жерде жүктү көтөрөт: OFI жана TI орто баанын өзгөрүшүнө регрессорлор катары кошулганда, TI статистикалык жактан анча маанилүү эмес болуп калат. Анын мазмуну камтылган. Бул соода-сатыктын ордуна китеп окуяларына көз салуу үчүн эмпирикалык жагдай - дээрлик соодага айланган окуялар ошол эле маалыматты алып жүрөт.
Көлөмү боюнча салмактанып алынган орто бул дисбаланс өлчөөсү эмес, адилет наркты баалоочу болуп саналат жана ал DeepLOB — анын ичинде мартингалга ылайыкталган Стойковдун микро-баасы эмес* деген ат коюу. баалоочу так курулган, анткени жөнөкөй салмактуу орто бир жактуу.
Python ишке ашыруу

CKS ажыратуу түз ишке ашыруу, жалпыланган деңгээл.
Негизги OFI эсептөө
import numpy as np
import pandas as pd
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class OrderBookSnapshot:
timestamp: float
bid_prices: np.ndarray # best bid at index 0, descending
ask_prices: np.ndarray # best ask at index 0, ascending
bid_sizes: np.ndarray
ask_sizes: np.ndarray
@dataclass
class OFICalculator:
"""
Computes Order Flow Imbalance from consecutive order book snapshots.
Supports multi-level OFI (MLOFI) up to `n_levels` deep.
"""
n_levels: int = 5
prev_snapshot: Optional[OrderBookSnapshot] = field(default=None, init=False)
def compute_level_ofi(
self,
prev_price: float, curr_price: float,
prev_size: float, curr_size: float,
side: str
) -> float:
"""Compute single-level OFI contribution for bid or ask side."""
if side == "bid":
if curr_price > prev_price:
return curr_size # new level appeared above
elif curr_price < prev_price:
return -prev_size # old level disappeared
else:
return curr_size - prev_size # same level, size changed
else: # ask side
if curr_price < prev_price:
return curr_size # new level appeared below
elif curr_price > prev_price:
return -prev_size # old level disappeared
else:
return curr_size - prev_size # same level, size changed
def update(self, snapshot: OrderBookSnapshot) -> Optional[np.ndarray]:
"""
Process new snapshot, return MLOFI vector of shape (n_levels,).
Returns None on first call (no previous snapshot to compare).
"""
if self.prev_snapshot is None:
self.prev_snapshot = snapshot
return None
prev = self.prev_snapshot
n = min(self.n_levels, len(snapshot.bid_prices), len(prev.bid_prices))
ofi = np.zeros(n)
for level in range(n):
e_buy = self.compute_level_ofi(
prev.bid_prices[level], snapshot.bid_prices[level],
prev.bid_sizes[level], snapshot.bid_sizes[level],
side="bid"
)
e_sell = self.compute_level_ofi(
prev.ask_prices[level], snapshot.ask_prices[level],
prev.ask_sizes[level], snapshot.ask_sizes[level],
side="ask"
)
ofi[level] = e_buy - e_sell
self.prev_snapshot = snapshot
return ofi
Windows ичинде бириктирүү
@dataclass
class OFIAggregator:
"""
Aggregates raw OFI updates into fixed time windows.
Emits the regression inputs (aggregated MLOFI) and target (delta mid).
"""
window_seconds: float = 10.0
n_levels: int = 5
calculator: OFICalculator = field(init=False)
buffer: list = field(default_factory=list, init=False)
window_start: float = 0.0
def __post_init__(self):
self.calculator = OFICalculator(n_levels=self.n_levels)
def on_snapshot(self, snapshot: OrderBookSnapshot) -> Optional[dict]:
"""
Feed a new order book snapshot.
Returns aggregated window dict when a window completes, else None.
"""
ofi_vec = self.calculator.update(snapshot)
if ofi_vec is None:
self.window_start = snapshot.timestamp
return None
if not self.buffer:
self.window_start = snapshot.timestamp
self.buffer.append({
"timestamp": snapshot.timestamp,
"ofi": ofi_vec.copy(),
"mid": (snapshot.bid_prices[0] + snapshot.ask_prices[0]) / 2,
})
elapsed = snapshot.timestamp - self.window_start
if elapsed >= self.window_seconds:
return self._flush()
return None
def _flush(self) -> dict:
"""Aggregate buffered OFI updates into a single window record."""
ofi_matrix = np.array([b["ofi"] for b in self.buffer])
agg_ofi = ofi_matrix.sum(axis=0) # shape: (n_levels,)
result = {
"window_start": self.window_start,
"window_end": self.buffer[-1]["timestamp"],
"n_updates": len(self.buffer),
"mid_open": self.buffer[0]["mid"],
"mid_close": self.buffer[-1]["mid"],
"delta_mid": self.buffer[-1]["mid"] - self.buffer[0]["mid"],
"ofi_level1": agg_ofi[0],
"ofi_total": agg_ofi.sum(),
"mlofi": agg_ofi,
}
self.buffer.clear()
return result
Агрегатор эмнени чыгараарына көңүл буруңуз: mlofi жана delta_mid ошол эле терезенин үстүндө. Бул азыркы регрессия. Болжолдуу терезени алуу үчүн, терезени жуптаңыз нын mlofi терезе менен нын delta_mid жана бир кыйла начар туура келет.
Соода классификациясы (Lee-Ready)
def classify_trades_lee_ready(
trades: pd.DataFrame,
quotes: pd.DataFrame
) -> pd.DataFrame:
"""
Classify trades as buy (+1) or sell (-1) using Lee-Ready:
quote rule first, tick rule as fallback at the midpoint.
Parameters
----------
trades : DataFrame with columns ['timestamp', 'price', 'size']
quotes : DataFrame with columns ['timestamp', 'bid', 'ask']
Returns
-------
trades with added 'side' column
"""
trades = trades.sort_values("timestamp").copy()
quotes = quotes.sort_values("timestamp")
trades = pd.merge_asof(
trades, quotes,
on="timestamp",
direction="backward"
)
trades["mid"] = (trades["bid"] + trades["ask"]) / 2
trades["side"] = np.where(
trades["price"] > trades["mid"], 1,
np.where(trades["price"] < trades["mid"], -1, 0)
)
trades["price_diff"] = trades["price"].diff()
tick_sign = np.sign(trades["price_diff"])
tick_sign = tick_sign.replace(0, np.nan).ffill().fillna(1)
midpoint_mask = trades["side"] == 0
trades.loc[midpoint_mask, "side"] = tick_sign[midpoint_mask].astype(int)
return trades
Сигналды нормалдаштыруу
class OFISignal:
"""
Rolling z-score normalization of aggregated OFI.
Deliberately does NOT convert OFI into a predicted return: that
requires a fitted beta, and beta is venue-, pair- and regime-specific.
Fit it on your own data before wiring this into anything.
"""
def __init__(self, window_seconds: float = 10.0, n_levels: int = 5,
lookback: int = 100):
self.aggregator = OFIAggregator(
window_seconds=window_seconds, n_levels=n_levels,
)
self.lookback = lookback
self.ofi_history: list[float] = []
def process(self, snapshot: OrderBookSnapshot) -> Optional[dict]:
agg = self.aggregator.on_snapshot(snapshot)
if agg is None:
return None
ofi = agg["ofi_level1"]
self.ofi_history.append(ofi)
if len(self.ofi_history) > self.lookback:
self.ofi_history.pop(0)
if len(self.ofi_history) >= 20:
arr = np.array(self.ofi_history)
mu, sigma = arr.mean(), arr.std()
zscore = (ofi - mu) / max(sigma, 1e-10)
else:
zscore = 0.0
return {**agg, "ofi_zscore": zscore}
OFI кайдан кошулат

Рынок түзүү. OFI мурунтан эле алынган жана коддолгон инвентаризациялык ийкемдүүлүктүн үстүнө, адилет нарктын болжолдуу бурмаланган термини катары кирет. Avellaneda-Stoikov маркетмейкер: . Эки термин ар кандай суроолорго жооп берет - агым термини баа кайда бара жатканын айтат, инвентаризация термини сиз эмнени кармай аларыңызды айтат - жана жарыяланган макала экинчисин камтыйт, анын ичинде оң инвентаризация эмне үчүн эки тырмакчаны тең төмөндөтөт. А чоң ошондой эле каталогдо камтылган коргонуу жооптору (кеңейтүү, кичирейтүү, бир жагын тартуу) үчүн акылга сыярлык терс тандоо триггери болуп саналат. соодагердин идентификациясынын санариптик манжа издери жана аномалияны аныктоо.
Аткаруу. OFI – тактикалык катмардын толтуруу ыктымалдуулугун баалоо үчүн киргизүү , өзүнчө шашылыш контролер эмес. Пост-каршы кайчылаш чечим ачык-айкын зыянсыз арифметика болуп саналат - менен - жана жашайт бала буйругун аткаруу тактикасы, бул ошондой эле тактика катмары эч качан рынокко болгон өз көз карашынан шашылыш мамиле жасабашы керек деп ырастайт, анткени бул эки башка контролерду жаратат.
Практикалык ойлор

Сигналдын жарым ажыроо мезгили жана айлануу кайра калибрлөө. Бул OFIге тиешелүү бөлүк. OFI прогноздук мазмуну суюк инструменттерде миллисекунддан секундага чейинки убакыт шкаласында бузулат, демек, топтоо терезеси эркин параметр эмес — бул горизонттогу коюм. Жана туруктуу эмес: ал күн ичинде, тереңдикте жана пландаштырылган окуялардын айланасында жылат, ошондуктан ар кандай өндүрүштүк тууралоо арткы тесттен маанини кадоодон көрө, аны жылма терезелерде кайра баалайт.
Бул жерде калгандын баары башка жерде камтылган. Кечүү бюджеттери жана биргелешип жайгашуу / FPGA / ядрону айланып өтүү тепкичтери: DeepLOB өндүрүш бөлүмү. U түрүндөгү ликвиддүүлүктүн бир күндүк үлгүсү жана дрифттик нормалдаштыруу статистикасы: жайылган моделдөө. Ар бир жерди кайра калибрлөө жана эмне үчүн Nasdaqга орнотулган модель кол тийбеген крипто жупка өткөрүлбөйт: DeepLOB кайрадан, майдаланган тарап менен акылдуу заказ багыттоо.
Манипуляция. Бир натыйжа бул моделге мүнөздүү жана аны ачык айтууга арзыйт: CKS декомпозициясы ар бир окуяны өлчөм боюнча гана таразалайт, ниет же өжөрлүк түшүнүгү жок. Өлчөмдү жайгаштыруучу жана жокко чыгаруучу спуфер, демек, сигналга түздөн-түз, толук салмакта, курулуш менен сайылат. Эвристиканы аныктоо — жокко чыгаруу тарифтери, буйрутмалардын иштөө мөөнөттөрү, баа жакындаган сайын дубалдын жүрүм-туруму кезек абалы жана тартиби китеп дубал талдоо; кайчылаш мейкиндик фантомдук ликвиддүүлүк бар акылдуу заказ багыттоо.
Негизги алып салуулар

-
OFI – бул окуянын декомпозициясы, көз ирмемдик сүрөт эмес. Үч тармактык индикатор формуласы ар бир китептин жогорку өтүшүн – баанын көтөрүлүшүн, баанын төмөндөшүн, өлчөмүн өзгөртүүнү – эки катары менен тартылган сүрөттөрдөн бир кол коюлган санга чейин картага түшүрөт.
-
** R-squared баш макаласы замандаш болуп саналат.** CKS 50-65% көрсөткүчү бирдей аралыктагы баа жылыштарын ажыратат; бул прогноз эмес жана аны келечектүү кайтарым моделдери менен салыштырууга болбойт.
-
Көп деңгээлдүү OFI деңгээлдерди кошот жана PCA аларды кыйратат. Жарыяланган өсүш- жана 89% дисперсия натыйжалары Nasdaq акцияларынан. Тереңдик дагы эле крипто китепке жардам береби, бул жерде текшерилбейт.
-
OFI соода балансынын бузулушун камтыйт. Биргелешип киргенде, TI анча деле маанилүү эмес — жокко чыгаруулар OFI көрүп, TI айырмалай албайт.
-
Модель ниети боюнча сокур. Өлчөмү боюнча бирдей салмактуулук аны жасалма кылат.
-
Бул макалада эч нерсе өлчөнгөн эмес. Келтирилген ар бир сан акциялардын адабияттарынан алынган. Бул сигнал капиталга тийерден мурун, ал сиздин жеке китеп маалыматыңызга туура келиши керек, өзүнчө билдирилген артта калган спецификация жана чектин жыйымдарды жана жайылтуудан аман калганын текшерүү керек.
Андан ары окуу

- Конт, Р., Куканов, А., & Стойков, С. (2014). "Заказ китеби окуялардын баанын таасири." Финансылык эконометрика журналы, 12(1), 47-88.
- Xu, K., Gould, M., & Howison, S. (2019). "Көп деңгээлдүү тартип-агымдын дисбаланс лимиттик заказ китебинде." arXiv:1907.06230.
- Kolm, P., Turiel, J., & Westray, N. (2023). "Терең тартип агымынын дисбаланс: Чектөө тартиби китебинен бир нече горизонтто Альфаны алуу." Математикалык финансы, 33(4).
- Lee, C., & Ready, M. (1991). "Бир күндүк маалыматтардан соода багытын чыгаруу." Финансы журналы, 46(2), 733-746.
- Easley, D., Lopez de Prado, M., & O'Hara, M. (2012). «Жогорку жыштыктагы дүйнөдө агымдын уулуулугу жана өтүмдүүлүгү». Review of Financial Studies, 25(5), 1457-1493.
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.