Тапсырыс ағынының теңгерімсіздігі: Конт-Куканов-Стойков оқиғасының ыдырауы
Бұл блогтағы кітаптан алынған сигналдардың көпшілігі суреттер болып табылады: дәл қазір әр жағында қанша көлем бар. Тапсырыс ағынының теңгерімсіздігі басқа нысан болып табылады. Бұл екі сурет арасындағы жаңартулар ағынының бір қол қойылған мөлшерге ыдырауы — ол нарықтағы сатуды есептегендей, өтінімнен бас тартуды есептейді.
Бұл ыдырау осы мақаланың тақырыбы болып табылады. Атап айтқанда: оны анықтайтын Cont-Kukanov-Stoikov (2014) оқиғасының көрсеткіштері, Сю-Гулд-Хоуисон (2019) көп деңгейлі кеңейтімі және оның негізгі құрамдас бөлігінің қысқаруы және арнаңыз сауда бағытын белгілемеген кезде сізге қажет Ли-Дайын және Жаппай көлемді жіктеу ережелері.
Алдыңғы жақтағы бір ескертпе, себебі ол төмендегі әрбір санды қалай оқу керектігін реттейді. CKS қағазындағы әйгілі 50-65% R-шаршы замандағы регрессия: аралықтағы бағаның өзгеруі бірдей аралықтағы тапсырыс ағынында регрессия болды. Бұл олардың болжамы емес, баға қозғалысының ыдырауы. Күнделікті капиталдың кірістілігі моделі оны 1-2% дисперсиямен салыстыра отырып, алмадан апельсинге дейін түсіндіреді және бұл блог ұзақ уақыт талқылады. DeepLOB және болжау-пайдаға қарсы айырмашылық және ішінде шынайы теріс нәтиже — бұл екеуін біріктіру оқу құралдарының тұзаққа айналуы. Қатаң артта қалған OFI регрессиясы заңды және әлдеқайда аз сан. Бұл мақалада бір хабар жоқ.
Неліктен сауда емес, тапсырыс ағыны

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

Негізгі үлгі Конт, Куканов және Стойковтың 2014 жылғы «Тапсырыстар кітабының оқиғаларының бағалық әсері» (Журнал қаржылық эконометрика) мақаласынан алынған.
Тапсырыс ағынының теңгерімсіздігін анықтау
Ең жақсы ұсыныс бағасын қарастырыңыз , ең жақсы баға сұраңыз , және олардың өлшемдері және . Кезекті бақылаулар арасында және :
мұндағы сатып алу және сату тарапындағы оқиға жарналары:
Қарапайым тілмен айтқанда: егер ең жақсы ұсыныс бағасы көтерілсе, жаңа сатып алу пайызы пайда болды — оның толық мөлшерін оң деп санаңыз. Егер ол төмендесе, сатып алу қызығушылық жоғалып кетті - ескі өлшемді алып тастаңыз. Баға өзгеріссіз болса, тек өлшем өзгерісін есептеңіз. Сұрау жағы - айнадағы кескін.
Талғампаздығы мынада: бұл үш индикатор тармақтары кітаптың жоғарғы жағындағы кез келген мүмкін ауысуды қамтиды, сондықтан әрбір жаңарту дәл бір қол қойылған нөмірге сәйкес келеді. Сауда классификациясы, бүйірлік белгілер жоқ, хабар деңгейіндегі арна қажет емес — қатарынан екі сурет жеткілікті.
Аралықтар бойынша жинақтау
Аралық үшін қамтитын кітап жаңартулары:
Бағаға әсер етудің сызықтық моделі
қайда орташа бағаның өзгеруі, бағаның әсер ету коэффициенті болып табылады және қалдық шу болып табылады. 10 секундтан 1 минутқа дейінгі аралықтағы АҚШ акциялары туралы CKS бір мезгілде есеп береді акцияға 50-65%. Тағы да: бірдей интервал, болашаққа емес.
Көлденең қиманы масштабтау
CKS сонымен қатар тереңдікке кері әсер ету коэффициентінің шкаласын көрсетті:
қайда ең жақсы ұсыныс және сұрау кезіндегі орташа демалыс көлемі. Дәл сол ағын жұқа кітаптағы бағаны одан әрі итермелейді. Бұл деңгейді қайта орнатпастан орындар бойынша тасымалданатын модельдің бір бөлігі, себебі ол санды емес қарым-қатынасты болжайды — және ол әртүрлі тереңдіктегі крипто жұптарында тікелей тексеріледі.
Көп деңгейлі тапсырыс ағынының теңгерімсіздігі (MLOFI)

Түпнұсқа модель тек кітаптың жоғарғы бөлігін пайдаланады. Xu, Gould, and Howison (2019) оны кеңейтті деңгейлері.
Анықтама
қайда үшін бірдей үш тармақты формуланы қолданады -ші ұсыныс/сұраныс жұбы.
Бағаның көп деңгейлі әсері
Nasdaq акциялары бойынша жарияланған қорытынды әрбір қосымша деңгей үлгіден тыс қосады — шамамен 10-15 пайыздық тармақ бір деңгейден беске ауысады, ал шекті табыс әлі де он деңгейінде. Коэффициенттер монотонды түрде ыдырайды, : кітаптың жоғарғы жағы басым, бірақ тереңірек деңгейлер тривиальды емес қосымша сигнал береді.
Бұл криптографиялық кітапта аман қалады ма - бұл мақаладағы ең қызықты ашық сұрақ. Криптографиялық кітаптар жұқа және тереңдігі әлдеқайда ұсақталған және Nasdaq тапсырыс кітабынан шыққаннан кейін 2-5 деңгейлер ештеңе қоспайтыны әбден мүмкін.
Негізгі құрамдас бөліктерді азайту
Көрші деңгейдегі OFI жоғары корреляцияға ие (жарияланған үлестік нәтижелерде 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 оның қалай жеткенін айтады.
Сауда теңгерімсіздігі (ТИ) және оның көлемі бойынша өлшенген нұсқалары қол қойылған сауда ағыны болып табылады, олар жылжымалы мүмкіндіктер ретінде айқындалады және жүзеге асырылады. машиналық оқыту арқылы модельдеуді тарату. Қарым-қатынас туралы жарияланған нәтижелердің бірі - бұл жерде жүктеме: 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 мүмкін емес жоюлар айырмашылықты тудырады.
-
Модель ниеті бойынша соқыр. Өлшемі бойынша бірдей салмақ оны бұрмалауға мүмкіндік береді.
-
Бұл мақалада ешнәрсе өлшенбейді. Келтірілген әрбір сан акциялар әдебиетінен алынған. Бұл сигнал капиталға тимес бұрын, ол сіздің жеке кітап деректеріне сәйкес келуі керек, бөлек хабарланған артта қалған спецификация және шеткі алымдар мен таралудан аман қалуын тексеру керек.
Қосымша оқу

- Cont, R., Kukanov, A., & Stoikov, S. (2014). «Тапсырыс кітабы оқиғаларының бағаға әсері». Journal of Financial Econometrics, 12(1), 47-88.
- Xu, K., Gould, M., & Howison, S. (2019). «Көп деңгейлі тапсырыс – лимиттік тапсырыстар кітабындағы ағын теңгерімсіздігі». arXiv:1907.06230.
- Kolm, P., Turiel, J., & Westray, N. (2023). «Тәртіп ағынының терең теңгерімсіздігі: шекті тапсырыстар кітабынан бірнеше көкжиектердегі альфаны алу». Математикалық қаржы, 33(4).
- Ли, С. және Дайын, М. (1991). «Бір күндік деректерден сауда бағытын шығару». Қаржы журналы, 46(2), 733-746.
- Easley, D., Lopez de Prado, M., & O'Hara, M. (2012). «Жоғары жиіліктегі әлемде ағынның уыттылығы мен өтімділігі». Қаржылық зерттеулерге шолу, 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.