Trade Classification When You Have No Side Flag: Tick, Quote, Lee-Ready, BVC
Ko'pchilik mikrostruktura darsliklari bu masalani qanday boshlashidan farqli o'laroq, avval bir narsani aniqlab olaylik. Ushbu blog amalda savdo qiladigan birjalarda savdo yo'nalishini taxmin qilish shart emas — u alohida maydon sifatida beriladi. Binance aggTrades yozuvlarida isBuyerMaker, Bybit savdo oqimida esa side mavjud. Barlarni qurish haqidagi maqola tajovuzkor tomonini shu bayroqdan oladi va tasniflagichni umuman ishga tushirmaydi:
def on_trade(self, timestamp: int, price: float, qty: float, is_buyer_maker: bool):
side = -1 if is_buyer_maker else 1
Bu nanosekundlik aniqlikdagi bepul ground truth. Agar zamonaviy kripto CEX tasmasidan imzolangan buyurtma oqimini tuzayotgan bo'lsangiz, sizga bu maqola kerak emas.
U to'rtta holatda kerak bo'ladi va ularning barchasi amaliy jihatdan muhim:
- Sizda faqat barlar bor. Tarixiy OHLCV ko'pchilik provayderlar sotadigan va ko'pchilik backtestlar foydalanadigan ma'lumotdir; savdo oqimi arxivlanmagan yoki uni olish tadqiqot qiymatidan qimmatroq. Quyidagi BVC muammosi aynan shu.
- Birja tomonni belgilamaydi. Kichik CEXlar, aksiyalar uchun TAQ uslubidagi datasetlar va 2017-yilgacha bo'lgan deyarli barcha arxivlar faqat narx va hajmni beradi.
- DEX va on-chain oqim. Swap hodisasi qaysi token qaysi tomonga o'tganini ko'rsatadi, ammo yo'naltirilgan multi-hop savdo yoki agregator bo'ylab tajovuzkorlikni bog'lash uchun qo'shimcha bayroq yo'q.
- Siz chop etilgan tadqiqotni takrorlayapsiz. Kaylning lambda hisob-kitoblari, VPIN, tarqalish parchalanishlari — deyarli butun mikrotuzilma adabiyoti Li-Ready tomonidan tasniflangan maʼlumotlarga asoslangan, shuning uchun taqqoslash haqiqiy tomonni oʻqishdan koʻra ularning klassifikatorini ishga tushirishni anglatadi.
Quyida qoidalar to'plami, eng muhim nosozlik rejimi, bulk-volume soddalashtirishi va barchasini o'lchash protokoli beriladi — chunki kripto aksiyalar adabiyotida hech qachon bo'lmagan ground-truth yorliqlarni taqdim etadi.
Tick testi

Joriy savdo narxini avvalgi narx bilan solishtiring: :
Intuitsiya shunday: xaridor tashabbusidagi savdolar askni olib, narxni yuqoriga suradi; sotuvchi tashabbusidagi savdolar bidni urib, narxni pasaytiradi. Nol o'zgarishlarda oldingi belgi davom ettiriladi; xatolarning katta qismi shu yerda yuzaga keladi — bir ticklik spreadga ega likvid instrumentda ketma-ket savdolarning ko'pchiligi bir xil narxda amalga oshadi.
sign = np.sign(np.diff(prices, prepend=prices[0]))
sign[sign == 0] = np.nan
directions = pd.Series(sign).ffill().fillna(1).astype(int).values
Xuddi shu oldinga ko'chirish semantikasidagi ishlab chiqarish implementatsiyasi vaqt barlaridan tashqari tick va volume imbalance bar generatorlari ichidagi _tick_sign() sifatida allaqachon mavjud — ikkinchi nusxani saqlash o'rniga undan foydalaning.
Quote qoidasi

Ketma-ket savdolarni emas, savdo narxini amaldagi midpoint bilan solishtiring:
def quote_rule(trade_prices: np.ndarray,
bid_prices: np.ndarray,
ask_prices: np.ndarray) -> np.ndarray:
"""Classify trades using the quote rule.
Returns +1 (buy), -1 (sell), or 0 (unclassified) for midpoint trades.
"""
midpoints = (bid_prices + ask_prices) / 2.0
directions = np.zeros(len(trade_prices), dtype=int)
directions[trade_prices > midpoints] = 1
directions[trade_prices < midpoints] = -1
return directions
Quote qoidasi tick testiga qaraganda ko'proq ma'lumotdan foydalanadi, ammo boshqa joyda muvaffaqiyatsiz bo'ladi: midpointda aynan amalga oshgan savdolar haqida hech narsa demaydi. Spreadi tor va narxi tick bilan cheklangan instrumentda bu chekka holat emas — lentaning katta qismi shunday bo'lishi mumkin. Qoidaga fallback kerak; bu Lee-Ready.
Lee-Ready: gibrid va eskirgan quote taxmini

Lee va Ready (1991) ikkala usulni birlashtirdi: quote qoidasini qo'llang, midpointdagi savdolar uchun esa tick testiga qayting.
def lee_ready(trade_prices: np.ndarray,
bid_prices: np.ndarray,
ask_prices: np.ndarray,
quote_lag: int = 0) -> np.ndarray:
"""Lee-Ready classification.
quote_lag : number of quote observations to lag (0 = contemporaneous).
Set > 0 only if your quote feed is known to trail the trade
feed; see the discussion of the 5-second rule below.
Depends on tick_test() with carry-forward semantics — the `_tick_sign()`
implementation from /blog/beyond-time-bars-candle-construction.
"""
if quote_lag > 0:
bid = np.concatenate([bid_prices[:quote_lag], bid_prices[:-quote_lag]])
ask = np.concatenate([ask_prices[:quote_lag], ask_prices[:-quote_lag]])
else:
bid, ask = bid_prices, ask_prices
directions = quote_rule(trade_prices, bid, ask)
unclassified = directions == 0
if unclassified.any():
directions[unclassified] = tick_test(trade_prices)[unclassified]
return directions
Maqolaning odatda asossiz takrorlanadigan qismi eng qiziq yarimidir. Lee va Ready faqat gibridni taklif qilmagan; ular har bir savdoni besh soniya oldin amalda bo'lgan quote bilan solishtirishni ham taklif qilgan. Bu raqam bozor haqidagi modellashtirish tanlovi emas, hisobot artefaktiga tuzatish edi: 1980-yillar NYSE konsolidatsiyalangan lentasida savdolar va quote'lar turli kanallardan, turli kechikishlar bilan tarqalgan va quote'lar o'zlariga tegishli savdolardan oldinroq kelishga moyil bo'lgan. Savdoni ayni paytda bosilgan quote bilan solishtirish aslida uni allaqachon aks ettirgan quote bilan solishtirish bo'lib, bozorni siljitgan savdolarning belgisini teskari aylantirardi.
Buni kriptoga ko'chiradigan har bir kishi uchun bundan ikki xulosa kelib chiqadi.
5 soniyalik qoida eskirgan va uni qo'llash faol zarar keltiradi. U endi mavjud bo'lmagan tarqatish kechikishini tuzatadi. Aksiyalar bozorlari bu tafovutni 1990-yillarning o'rtalarida yopgan; kripto birjasida savdo va order-book delta oqimlari bir xil sequence space'ni bo'lishadi va mikrosekund aniqlikda ayni matching engine tomonidan timestamp qilinadi. BTCUSDTda besh soniya sinxronlash toleransi emas, balki yuzlab book yangilanishlaridir. Quote'ni besh soniyaga kechiktirish eskirgan quote'ni tuzatmaydi, uni yaratadi. O'zingiz yig'gan ma'lumotda haqiqiy offsetni o'lchamagan bo'lsangiz, quote_lag=0 dan foydalaning.
Ammo asosiy muammo yangi ko'rinishda saqlanib qoladi. Endi quote eskirishi birjaning emas, sizning pipeline'ingizning aybi. Book'ni WebSocket delta oqimidan qayta tuzish va savdolarni wall-clock timestamp bo'yicha qo'shish buffering, snapshot resync siyosati va soatingizga bog'liq kechikish kiritadi. Book'dan foydalanadigan tasniflagichga ishonishdan oldin buni o'lchang: bir oynani qayta ijro eting, savdolarni book holatiga birlashtiring va qaysi ulushi birlashtirilgan [bid, ask] oralig'idan tashqarida qolishini tekshiring. Birlashtirilgan askdan yuqorida bosilgan savdo siz moslagan book eskirganini isbotlaydi.
Tuzatish Lee va Ready usulidagidan farq qiladi, ammo nosozlik rejimi bir xil.
Ommaviy hajm tasnifi

Easley, Lopez de Prado va O'Hara (2012) boshqa muammoga murojaat qiladi: individual savdolarni umuman ko'rmasangiz nima bo'ladi? BVC bar ichidagi jami hajmni tasniflaydi va uni standartlashtirilgan narx o'zgarishining standart normal CDF'i yordamida ajratadi:
bu yerda , esa bar narxi o'zgarishlarining standart og'ishi.
from scipy.stats import norm
def bulk_volume_classification(open_prices: np.ndarray,
close_prices: np.ndarray,
volumes: np.ndarray,
sigma: float | None = None) -> tuple:
"""Split bar volume into buy/sell using the BVC rule.
Returns (buy_volume, sell_volume) as continuous, not integer, splits.
"""
delta_p = close_prices - open_prices
if sigma is None:
sigma = max(float(np.std(delta_p)), 1e-8)
buy_fraction = norm.cdf(delta_p / sigma)
return volumes * buy_fraction, volumes * (1.0 - buy_fraction)
BVC boshqa vosita, yomonrog'i emas; buni uchta xususiyati tushuntiradi. U savdolarni tasniflamaydi — ulush ishlab chiqaradi. Shuning uchun o'zgarmagan holda yopilgan bar ichidagi har bir savdoni tanga tashlab belgilash o'rniga 50/50 bo'linish olasiz. Agar iste'molchingizga har bir savdoning belgisi kerak bo'lsa, BVC buni bera olmaydi. U lenta emas, barlar ustida ishlaydi; aynan shu sababli savdo darajasidagi ma'lumot mavjud bo'lmaganda ishlaydigan yagona usuldir. esa natijani o'zgartiradigan erkin parametr: to'liq namuna bahosi look-ahead bo'ladi, juda qisqa rolling baho esa ni to'yintirib, har bir barni 0/100 tomon suradi. Bu tanlov default emas, sezgirlik tahlili bilan tekshirilishi kerak.
Asl maqolada BVC VPINni baholash uchun savdo darajasidagi tasnifni yetarlicha yaqindan kuzatishi qayd etilgan. Aniq ko'rsatkichlar bar hajmi, instrument va baholagichiga kuchli bog'liq; ikkilamchi manbalardagi raqamlar esa kamdan-kam hollarda uchalasini ham ko'rsatadi. Aksiyalar tadqiqotidagi natijani ko'chirmang — o'zingiz o'lchang.
Tasniflashga xos yagona feature

Qoidani ishga tushirish o'rniga modelni o'rgatsangiz, feature'larning ko'pchiligi allaqachon e'lon qilingan: spread, depth imbalance, trade-flow imbalance va rolling realized volatility mashinaviy o'rganish bilan spread modelingda, ko'p darajali order-book feature'lari esa DeepLOBda bor. Ulardan foydalaning.
Bu masalaga xos va ikkala manbada ham uchramaydigan feature — savdoning spread ichidagi pozitsiyasi:
Bidda bajarilgan savdo 0, askda 1, midpointda 0,5 ga teng. Bu quote qoidasining uzluksiz umumlashmasi: midpointda threshold qo'yish o'rniga modelga masofani beradi. Shunda model 0,95 qiymatli savdo deyarli aniq buy, 0,55 qiymatli savdo esa juda kam axborot berishini o'rganishi mumkin. dan tashqaridagi qiymatlar oldingi bo'limdagi eskirgan quote diagnostikasidir; ularni clip qilishdan ko'ra logga yozish kerak.
Bu feature'lar ustida boosted baseline qurish uchun pipeline mashinaviy o'rganish bilan spread modelingda e'lon qilingan pipeline'ning o'zi, faqat maqsad binary qilib almashtiriladi; eng muhimi, undagi purged va embargo qilingan walk-forward CV saqlanadi. Mikrostruktura tasniflagichini oddiy TimeSeriesSplit bilan baholamang: bu maqola va walk-forward optimization natijaning nega optimistik bo'lishini tushuntiradi. Book snapshot'lari ustidagi sequence modellar uchun DeepLOB reference arxitektura, u yerdagi training-considerations bo'limi o'zgarmagan holda qo'llanadi.
To'g'ri o'lchash: kripto sizga label beradi

Aksiyalar savdosini tasniflash adabiyotidagi har bir accuracy ground truth'ning proxy siga nisbatan baholanadi — TORQ, audit-trail subsample'lari yoki bitta venue'ning ichki yozuvlari — chunki haqiqiy aggressor tomoni hech qachon e'lon qilinmagan. Kripto esa uni e'lon qiladi. Binance aggTrades dagi isBuyerMaker har bir savdo uchun bepul label. Shuning uchun tajriba istagan har kim uchun ochiq; kriptoda bunday nashrni topmadim. Protokol:
Ma'lumotlar. Bir oylik BTCUSDT aggTrades va book-ticker oqimini qo'shing, shunda har bir savdoda undan darhol oldin amalda bo'lgan bid va ask bo'ladi. Spread keng bo'lganda nima bo'lishini ko'rish uchun tajribani likvidligi past altkoinlarda ham takrorlang.
Label. direction = -1 if is_buyer_maker else +1. So'ng bayroqni tashlang va har bir usulni faqat narx hamda quote ma'lumotlari bilan ishlating.
Usullar. Tick testi, quote qoidasi, quote_lag=0 bilan Lee-Ready, tarixiy 5 soniyalik lag bilan Lee-Ready (eskirgan qoida keltiradigan zararni o'lchash uchun) va bir nechta bar hajmida BVC — barchasini har bir barning haqiqiy buy-volume ulushiga solishtiring.
Kesimlar. Umumiy accuracy eng kam qiziq ko'rsatkich. Natijani spread rejimi bo'yicha ajrating (bir ticklik va keng spread — spread qotib qolgan joyda tick testining carry-forward xatosi kuchayishi kerak), savdoning midpointda bosilgan-bosilmaganiga ko'ra (quote qoidasi qayerda abstain qilishini va Lee-Ready fallback'i qayerda ishni bajarishini ajrating), savdo hajmi bo'yicha (aggTrades yozuvlari sweep'larni bildiradi; katta savdolar narxga ta'sir qiladi va noto'g'ri imzolansa eng qimmatga tushadi) hamda volatility rejimi bo'yicha (BVC ni baholaydi, shuning uchun xatosi tabiatan rejimga bog'liq).
| Usul | Umumiy | Midpointda | Tor spread | Keng spread | Katta savdolar |
|---|---|---|---|---|---|
| Tick testi | — | — | — | — | — |
| Quote qoidasi | — | — | — | — | — |
| Lee-Ready (lag 0) | — | — | — | — | — |
| Lee-Ready (5s lag) | — | — | — | — | — |
| BVC (bar ulushi) | — | n/a | — | — | n/a |
Accuracy maqsad emas

Framing intizomini DeepLOBdan oling: tasniflash accuracy'si natija emas, natijaga kiruvchi inputdir. Hech kim savdo belgisining o'zini savdo qilmaydi — butun sign oqimidan hisoblangan narsani savdo qiladi va xatolar unga neytral tarzda o'tmaydi. Savdolarning 10 foizida tasodifiy xato qiladigan klassifikator bilan katta va narxni siljitadigan 10 foiz savdoda muntazam xato qiladigan klassifikator bir xil accuracy'da ham juda boshqacha signed order flow hosil qiladi. Tick testining carry-forward xatosi ayniqsa narx o'zgarmagan holat bilan bog'liq — signed flow informativ bo'lishi kerak bo'lgan rejim. Shuning uchun haqiqiy natija sarlavhadagi raqam emas, yuqoridagi kesimlardir.
Ground-truth label bilan downstream savolni bevosita o'lchash mumkin: kerakli miqdorni haqiqiy sign'lar yordamida baholang, keyin har bir klassifikator sign'lari bilan qayta baholang va farqni hisobot qiling.
- Price impact. Fixed windows'da signed net taker flow yordamida mid-price o'zgarishlarini regress qiling — estimator slippage cost modelsda berilgan, public Binance ma'lumotidagi ishlaydigan implementatsiyasi esa Almgren-Chriss optimal executionda bor. Bu yerda qayta ta'riflamang; ikki marta ishga tushirib, fitted coefficient'ni solishtiring.
- Order-flow imbalance predictor sifatida. Haqiqiy sign'lar va tasniflangan sign'lar ostida OFI bilan forward return o'rtasidagi korrelyatsiyani hisoblang. Korrelyatsiyadagi pasayish — misclassification cost, u muhim bo'lgan yagona birlikda ifodalanadi.
- Toxicity metrikalari. VPIN va trade-flow imbalance feature'lari tasniflangan volume iste'molchilaridir; ikkalasi ham mashinaviy o'rganish bilan spread modelingda yoritilgan. Ularning tasniflash xatosiga sezgirligini xuddi shu tarzda o'lchash mumkin.
Xulosa

Agar venue aggressor flag yuborsa, undan foydalaning. Kriptoning katta qismida bu odatda mavjud.
Agar bunday flag bo'lmasa, contemporaneous quote'lar bilan Lee-Ready to'g'ri default hisoblanadi — u aniq bo'lgani uchun emas, standart bo'lgani uchun. E'lon qilingan o'ttiz yillik baholar bilan taqqoslash siz tekshira olmaydigan bir necha accuracy punktidan qimmatroq. Besh soniyalik qoida 1980-yillar tape latency'sining qoldig'i; uni zamonaviy ma'lumotga ko'chirish aynan bartaraf etish uchun yaratilgan eskirganlikni kiritadi. Agar faqat barlar bo'lsa, umuman ishlaydigan yagona variant BVC; u boshqa savolga — trade sign'ga emas, volume split'ga — javob beradi.
Har qanday holatda kripto bepul beradigan label'lar bilan o'lchang, natijani spread rejimi va trade size bo'yicha ajrating va faqat necha foiz to'g'ri bo'lganini emas, xato downstream'da qancha turishini ham hisobot qiling.
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.