Trade Classification When You Have No Side Flag: Tick, Quote, Lee-Ready, BVC
Адегенде микро түзүлүш боюнча окуу китептердин көпчүлүгү баштаган бул маселенин версиясын четке кагабыз. Бул блог иш жүзүндө соода кылган аянтчаларда соода багытын боолголобойт — ал даяр талаа катары берилет. Binance aggTrades агымында isBuyerMaker; Bybitтин соода агымында side бар. Барларды куруу макаласы агрессордун тарабын ошол белгиден түз алат да классификатор иштетпейт:
def on_trade(self, timestamp: int, price: float, qty: float, is_buyer_maker: bool):
side = -1 if is_buyer_maker else 1
Бул — наносекунддук чечилиштеги акысыз чындык. Эгер заманбап крипто CEX агымынан белгиленген ордер агымын куруп жатсаңыз, бул макаланын кереги жок.
Ал төрт кырдаалда керек, жана булар жетишерлик кеңири кездешет:
- Сизде барлар гана бар. Тарыхый OHLCV — көпчүлүк сатуучулар саткан жана көпчүлүк бэктесттер иштеткен нерсе; соода агымы архивделген эмес же аны чогултуу изилдөөнүн наркына татыбайт. Төмөндөгү BVC маселеси ушул.
- Аянтча тарапты белгилебейт. Кичине CEX-тер, акциялардын TAQ тибиндеги топтомдору жана 2017-жылга чейинки архивдердин дээрлик баары баа менен өлчөмдү гана берет.
- DEX жана ончейн агымы. Swap окуясы кайсы токен кайсы жакка жылганын айтат, бирок маршрутталган көп-hop соодада же агрегатордо агрессияны аныктоого кайрыла турган белги жок.
- Жарыяланган изилдөөнү кайталап жатасыз. Kyle лямбдасынын баалары, VPIN, спред декомпозициялары — микро түзүлүш адабиятынын дээрлик баары Lee-Ready менен классификацияланган маалыматка курулган, демек салыштыруу үчүн чыныгы тарапты окуунун ордуна алардын классификаторун иштетүү керек.
Төмөндө эрежелер жыйындысы, эң маанилүү бузулуу режими, bulk-volume кыскартмасы жана баарын өлчөө протоколу берилет — анткени крипто акциялар адабиятында болбогон белгилерди бекер берет.
Tick тести

Учурдагы соода баасы менен мурунку бааны салыштырыңыз:
Интуициясы мындай: сатып алуучу баштаган соода ask-ке көтөрүлүп, бааны жогорулатат; сатуучу баштаган соода bid-ди уруп, бааны түшүрөт. Нөл тиктер мурунку белгини алдыга өткөрөт, катанын көбү ушул жерде: бир тиктик спреди бар ликвиддүү инструментте удаалаш соодалардын басымдуу бөлүгү бир эле баада басылат.
sign = np.sign(np.diff(prices, prepend=prices[0]))
sign[sign == 0] = np.nan
directions = pd.Series(sign).ffill().fillna(1).astype(int).values
Ошол эле алдыга өткөрүү семантикасы менен өндүрүштүк ишке ашыруу убакыт барларынан кийинки тик жана көлөм дисбалансы бар генераторлорунун ичиндеги _tick_sign() функциясында бар — экинчи көчүрмөнү кармабай, ошону кайра колдонуңуз.
Quote эрежеси

Удаалаш соодаларды салыштыруунун ордуна соода баасын учурдагы орто чекит менен салыштырыңыз:
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 эрежеси tick тестине караганда көбүрөөк маалымат колдонот, бирок башка жерде иштен чыгат: так орто чекитте басылган соодалар тууралуу эч нерсе айтпайт. Спреди тар, тик өлчөмү чектелген инструментте бул четки учур эмес — тасманын чоң бөлүгү ушундай. Эрежеге fallback керек, аны Lee-Ready берет.
Lee-Ready: гибрид жана эскирген quote божомолу

Lee менен Ready (1991) экөөнү бириктирген: quote эрежесин колдонуп, орто чекиттеги соодада tick тестине өтөт.
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
Макаланын кызыктуураак жарымы — адатта негиздемесиз көчүрүлүп жүргөн бөлүгү. Lee менен Ready жөн гана гибрид сунуштаган эмес; алар ар бир сооданы беш секунд мурунку quote менен салыштырууну сунуштаган. Бул сан рынок тууралуу моделдик тандоо эмес. Ал отчет берүү артефактын оңдоо үчүн керек болгон: 1980-жылдардагы NYSEнин бириктирилген тасмасында соодалар менен quote-тар ар башка кечигүүлөрү бар жолдор аркылуу таратылып, quote-тар тиешелүү соодалардан мурун келүүгө жакын болгон. Демек сооданы ошол учурда басылган quote менен салыштыруу аны буга чейин чагылдырган quote менен салыштыруу болуп, рынокту жылдырган дал ошол соодаларда белгини тескери бурган.
Мындан криптого көчүрүп жаткандар үчүн эки нерсе чыгат.
Беш секунд эрежеси эскирген жана аны колдонуу түздөн-түз зыяндуу. Ал азыр жок таратуу кечигүүсүн оңдойт. Акция рыноктору бул ажырымды 1990-жылдардын ортосуна чейин жапкан; крипто аянтчасынын соода жана китеп-delta агымдары бир sequence мейкиндигин бөлүшүп, бир matching engine тарабынан микросекунддук чечилиште белгиленет. BTCUSDT үчүн беш секунд синхрондоштуруу толеранттуулугу эмес, жүздөгөн китеп жаңыртуусу. Quote-тарды беш секунд кечиктирүү эски quote-тарды оңдобойт, аларды өзү жаратат. Өз capture-иңизде чыныгы жылышты өлчөмөйүнчө quote_lag=0 колдонуңуз.
Бирок негизги көйгөй жаңы формада сакталды. Эми quote эскилигине биржа эмес, конвейериңиз күнөөлүү. Китепти WebSocket delta агымынан кайра куруп, соодаларды дубал саатынын timestamp-тери менен кошсоңуз, буферлөөңүзгө, snapshot кайра синхрондоштуруу саясатына жана саатыңызга көз каранды кечигүүнү киргизесиз. Китепти окуган ар кандай классификаторго ишенүүдөн мурда муну өлчөңүз: бир терезени кайра ойнотуп, соодаларды китеп абалына кошуңуз да, кошулган [bid, ask] сыртында калгандардын үлүшүн текшериңиз. Кошулган ask-тин үстүндө басылган соода ага салыштырылган китептин эскиргенин далилдейт.
Түзөтүү Lee менен Ready сунуштагандан башка, ал эми бузулуу режими ошол эле.
Bulk Volume Classification

Easley, Lopez de Prado жана O'Hara (2012) башка маселеге чабуул коёт: жеке соодаларды таптакыр көрбөсөңүз эмне болот? BVC бар ичиндеги агрегатталган көлөмдү стандартташтырылган баа өзгөрүүсүнүн стандарттуу нормалдык CDF-и менен бөлөт:
мында , ал эми — бардагы баа өзгөрүүлөрүнүн стандарттык четтөөсү.
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 — начарыраак эмес, башка аспап; муну үч касиет түшүндүрөт. Ал соодаларды классификациялабайт — үлүш чыгарат, демек өзгөрбөй жабылган бар ичиндеги ар бир соода үчүн тыйын ыргытуунун ордуна 50/50 болуп бөлүнөт; эгер керектөөчүгө ар бир соодага белги керек болсо, BVC аны бере албайт. Ал тасманын ордуна барларда иштейт, негизги мааниси да ушунда: соода деңгээлиндеги маалымат жок кезде бул жерде иштеген жалгыз ыкма. Ал эми — натыйжаны жылдырган эркин параметр: толук үлгүдөгү баа lookahead, кыска жылма баа болсо -ни каныктырып, ар бир барды 0/100 жакка түртөт. Бул тандоо демейки мааниге эмес, сезгичтик текшерүүсүнө татыктуу.
Баштапкы макала BVC соода деңгээлиндеги классификацияны VPIN баалоосуна жетиштүү жакын ээрчий турганын баяндайт. Тактык сандары бар өлчөмүнө, инструментке жана баалоочусуна катуу көз каранды, ал эми экинчи булактардагы сандар үчөөнү тең сейрек атайт. Акциялар боюнча изилдөөдөн бир санды көчүрбөңүз — өлчөп көрүңүз.
Классификацияга тиешелүү жалгыз белги

Эреже иштетпей, муну модельге үйрөтсөңүз, белгилер топтомунун көбү жарыяланган: спред, тереңдик дисбалансы, соода агымынын дисбалансы жана жылма реализацияланган волатилдүүлүк ML менен спредди моделдөө материалында таблицага түшүрүлүп, ишке ашырылган, ал эми көп деңгээлдүү ордер китебинин белгилери DeepLOB макаласында бар. Ошолорду колдонуңуз.
Бул маселеге өзгөчө тиешелүү жана эки материалда тең жок белги — сооданын спреддин ичиндеги орду:
Bidдеги соода 0гө, askдеги 1ге, орто чекиттеги 0,5ке түшөт. Бул quote эрежесинин үзгүлтүксүз жалпылоосу: орто чекитте босого коюунун ордуна модельге аралыкты берет, ошондо модель 0,95теги соода дээрлик сөзсүз сатып алуу экенин, 0,55теги соода болсо араң маалымат берерин үйрөнө алат. сыртындагы маанилер — мурунку бөлүмдөгү эски quote диагностикасы; аларды кыркып салгандан көрө журналга жазуу жакшы.
Бул белгилер боюнча boosted базис үчүн конвейер ML менен спредди моделдөө макаласында жарыяланган бойдон калат, болгону максат binary болуп өзгөрөт — анын purge жана embargo бар walk-forward CV-сы да кошулат. Микро түзүлүш классификаторун жөнөкөй TimeSeriesSplit менен баалабаңыз; бул макала жана walk-forward оптималдаштыруу алынган сан эмне үчүн оптимисттик экенин түшүндүрөт. Китеп snapshot-тары боюнча sequence моделдер үчүн DeepLOB — эталондук архитектура, ал жактагы окутуу боюнча эскертүүлөр өзгөрүүсүз колдонулат.
Муну туура өлчөө: крипто белгилерди берет

Акциялардын соодасын классификациялоо адабиятындагы ар бир тактык көрсөткүчү чындыктын проксиине каршы бааланат — TORQ, audit-trail ички үлгүлөрү же бир аянтчанын ички жазуулары — анткени чыныгы агрессор тарабы эч качан жарыяланган эмес. Крипто аны жарыялайт. Binance aggTrades ичиндеги isBuyerMaker ар бир соода үчүн акысыз белги. Демек эксперимент баарына жеткиликтүү, бирок анын крипто үчүн жарыяланганын таба элекмин. Протокол:
Маалымат. Бир айлык BTCUSDT aggTrades жана book ticker агымы; ар бир соода өзүнөн так мурун күчүндө болгон bid менен ask-ти алып жүрүшү үчүн аларды бириктириңиз. Спред кең болгондо эмне болорун көрүү үчүн жука альтта да кайталаңыз.
Белги. direction = -1 if is_buyer_maker else +1. Андан кийин белгини таштап, ар бир ыкманы баа менен quote маалыматтарына гана иштетиңиз.
Ыкмалар. Tick тести, quote эрежеси, quote_lag=0 менен Lee-Ready, эскирген эреженин зыянын өлчөө үчүн тарыхый беш секунддук lag менен Lee-Ready жана чыныгы арбардык buy-volume үлүшүнө каршы бир нече бар өлчөмүндөгү BVC.
Бөлүштүрүүлөр. Жалпы тактык — эң кызыксыз сан. Спред режими боюнча бөлүңүз (бир тикке каршы кең спред — тик тестинин алдыга өткөрүүсү спред бекитилген жерде кулашы керек), соода орто чекитте басылдыбы ошого жараша (quote эрежеси кайда токтой турганын жана Lee-Ready fallback кайда бардык ишти аткарарын бөлүү), соода өлчөмү боюнча (aggTrades жазуулары шыпыруулар; ири соодалар таасирди аныктайт жана туура эмес белгиленсе эң көп чыгым алып келет) жана волатилдүүлүк режими боюнча (BVC -ны баалайт, демек анын катасы түзүлүшү боюнча режимге көз каранды).
| Ыкма | Жалпы | Орто чекитте | Тар спред | Кең спред | Ири соодалар |
|---|---|---|---|---|---|
| Tick тести | — | — | — | — | — |
| Quote эрежеси | — | — | — | — | — |
| Lee-Ready (lag 0) | — | — | — | — | — |
| Lee-Ready (5s lag) | — | — | — | — | — |
| BVC (арбардык үлүш) | — | n/a | — | — | n/a |
Тактык максат эмес

DeepLOB материалындагы түзүмдүк тартипти алабыз: классификациянын тактыгы — натыйжа эмес, натыйжага кире турган нерсе. Эч ким сооданын белгисин соодалабайт — алар белгилердин бүт агымынан эсептелген нерсени соодалашат жана каталар ага бейтарап тарабайт. Соодалардын 10%ында туш келди жаңылган классификатор менен, бааны жылдырган ири соодалардын 10%ында системалуу жаңылган классификатор бирдей тактыкта болсо да, кол коюлган ордер агымы таптакыр башкача чыгат. Tick тестинин алдыга өткөрүү катасы flat баа менен өзгөчө корреляцияланган — дал кол коюлган агым маалыматтуу болушу керек болгон режим. Ошондуктан жогорудагы бөлүштүрүүлөр, башкы сан эмес, чыныгы натыйжа.
Чыныгы белгилер барда кийинки суроону түз өлчөөгө болот: сиз кызыккан чоңдукту чыныгы белгилерден эсептеңиз, ар бир классификатордун белгилеринен кайра эсептеңиз жана айырманы отчет кылыңыз.
- Баага таасир. Белгиленген таза taker агымы боюнча орто баанын өзгөрүшүн туруктуу терезелерде регрессиялаңыз — баалоочу slippage cost models материалында аныкталган, ал эми ачык Binance маалыматындагы иштеген ишке ашыруу Almgren-Chriss оптималдуу аткаруу материалында бар. Бул жерде аны кайра аныктабаңыз; эки жолу иштетип, туураланган коэффициентти салыштырыңыз.
- Божомолдоочу катары ордер агымынын дисбалансы. Чыныгы белгилердеги OFI менен кийинки кирешелердин жана классификацияланган белгилердеги ошол корреляциянын ортосундагы байланышты эсептеңиз. Ал корреляциянын начарлашы — туура эмес классификациянын баасы, маанилүү жалгыз бирдикте көрсөтүлгөн.
- Уулуулук метрикалары. VPIN жана соода агымынын дисбаланс белгилери классификацияланган көлөмдү керектейт; экөө тең ML менен спредди моделдөө материалында камтылган. Алардын классификация катасына сезгичтигин ушул эле жол менен өлчөөгө болот.
Бул сизди кайда калтырат

Эгер аянтчаңыз агрессор белгисин берсе, аны колдонуңуз. Криптонун көпчүлүгүндө көп учурда ушундай.
Эгер бербесе, учурлаш quote менен Lee-Ready туура демейки ыкма — так болгондуктан эмес, стандарт болгондуктан, ал эми жарыяланган баалоолордун отуз жылдыгы менен салыштыруу текшере албаган бир нече тактык упайынан баалуу. Беш секунд эрежеси — 1980-жылдардагы тасма кечигүүсүнүн фоссили; аны заманбап маалыматта кайталоо жоюу үчүн түзүлгөн эскирүүнүн өзүн киргизет. Эгер сизде барлар гана болсо, BVC таптакыр иштей турган жалгыз вариант жана ал башка суроого жооп берет: соода белгисине эмес, көлөмдүн бөлүнүшүнө.
Кандай болгон күндө да крипто бекер берген белгилерге салыштырыңыз, натыйжаны спред режими жана соода өлчөмү боюнча бөлүңүз, туура болгон пайызды эмес, катанын downstream баасын отчет кылыңыз.
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.