📝

Draft article

This draft is visible to admins and superusers only. Sign in with an authorized account.

← Макалаларга кайтуу
August 23, 2026
5 мүн окуу

Trade Classification When You Have No Side Flag: Tick, Quote, Lee-Ready, BVC

Trade Classification When You Have No Side Flag: Tick, Quote, Lee-Ready, BVC
#microstructure
#trade-classification
#Lee-Ready
#order-flow
#deep-learning

Адегенде микро түзүлүш боюнча окуу китептердин көпчүлүгү баштаган бул маселенин версиясын четке кагабыз. Бул блог иш жүзүндө соода кылган аянтчаларда соода багытын боолголобойт — ал даяр талаа катары берилет. 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 агымынан белгиленген ордер агымын куруп жатсаңыз, бул макаланын кереги жок.

Ал төрт кырдаалда керек, жана булар жетишерлик кеңири кездешет:

  1. Сизде барлар гана бар. Тарыхый OHLCV — көпчүлүк сатуучулар саткан жана көпчүлүк бэктесттер иштеткен нерсе; соода агымы архивделген эмес же аны чогултуу изилдөөнүн наркына татыбайт. Төмөндөгү BVC маселеси ушул.
  2. Аянтча тарапты белгилебейт. Кичине CEX-тер, акциялардын TAQ тибиндеги топтомдору жана 2017-жылга чейинки архивдердин дээрлик баары баа менен өлчөмдү гана берет.
  3. DEX жана ончейн агымы. Swap окуясы кайсы токен кайсы жакка жылганын айтат, бирок маршрутталган көп-hop соодада же агрегатордо агрессияны аныктоого кайрыла турган белги жок.
  4. Жарыяланган изилдөөнү кайталап жатасыз. Kyle лямбдасынын баалары, VPIN, спред декомпозициялары — микро түзүлүш адабиятынын дээрлик баары Lee-Ready менен классификацияланган маалыматка курулган, демек салыштыруу үчүн чыныгы тарапты окуунун ордуна алардын классификаторун иштетүү керек.

Төмөндө эрежелер жыйындысы, эң маанилүү бузулуу режими, bulk-volume кыскартмасы жана баарын өлчөө протоколу берилет — анткени крипто акциялар адабиятында болбогон белгилерди бекер берет.

Tick тести

Tick тестинин окуялар тизмеги

Учурдагы соода баасы PtP_t менен мурунку бааны салыштырыңыз:

dttick={+1if Pt>Pt11if Pt<Pt1dt1tickif Pt=Pt1d_t^{\text{tick}} = \begin{cases} +1 & \text{if } P_t > P_{t-1} \\ -1 & \text{if } P_t < P_{t-1} \\ d_{t-1}^{\text{tick}} & \text{if } P_t = P_{t-1} \end{cases}

Интуициясы мындай: сатып алуучу баштаган соода 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 эрежеси

Bid-ask геометриясынын ичинде жайгашкан соодалар

Удаалаш соодаларды салыштыруунун ордуна соода баасын учурдагы орто чекит Mt=(At+Bt)/2M_t = (A_t + B_t)/2 менен салыштырыңыз:

dtquote={+1if Pt>Mt1if Pt<Mtundefinedif Pt=Mtd_t^{\text{quote}} = \begin{cases} +1 & \text{if } P_t > M_t \\ -1 & \text{if } P_t < M_t \\ \text{undefined} & \text{if } P_t = M_t \end{cases}
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 божомолу

Кечиккен quote бетиндеги соода агымы

Lee менен Ready (1991) экөөнү бириктирген: quote эрежесин колдонуп, орто чекиттеги соодада tick тестине өтөт.

dtLR={dtquoteif PtMtdttickif Pt=Mtd_t^{\text{LR}} = \begin{cases} d_t^{\text{quote}} & \text{if } P_t \neq M_t \\ d_t^{\text{tick}} & \text{if } P_t = M_t \end{cases}
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-и менен бөлөт:

Vtbuy=VtΦ(ΔPtσΔP),Vtsell=VtVtbuyV_t^{\text{buy}} = V_t \cdot \Phi\left(\frac{\Delta P_t}{\sigma_{\Delta P}}\right), \qquad V_t^{\text{sell}} = V_t - V_t^{\text{buy}}

мында ΔPt=PtclosePtopen\Delta P_t = P_t^{\text{close}} - P_t^{\text{open}}, ал эми σΔP\sigma_{\Delta P} — бардагы баа өзгөрүүлөрүнүн стандарттык четтөөсү.

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 аны бере албайт. Ал тасманын ордуна барларда иштейт, негизги мааниси да ушунда: соода деңгээлиндеги маалымат жок кезде бул жерде иштеген жалгыз ыкма. Ал эми σ\sigma — натыйжаны жылдырган эркин параметр: толук үлгүдөгү баа lookahead, кыска жылма баа болсо Φ\Phi-ни каныктырып, ар бир барды 0/100 жакка түртөт. Бул тандоо демейки мааниге эмес, сезгичтик текшерүүсүнө татыктуу.

Баштапкы макала BVC соода деңгээлиндеги классификацияны VPIN баалоосуна жетиштүү жакын ээрчий турганын баяндайт. Тактык сандары бар өлчөмүнө, инструментке жана σ\sigma баалоочусуна катуу көз каранды, ал эми экинчи булактардагы сандар үчөөнү тең сейрек атайт. Акциялар боюнча изилдөөдөн бир санды көчүрбөңүз — өлчөп көрүңүз.

Классификацияга тиешелүү жалгыз белги

Белгиленген микро түзүлүш сигналы

Эреже иштетпей, муну модельге үйрөтсөңүз, белгилер топтомунун көбү жарыяланган: спред, тереңдик дисбалансы, соода агымынын дисбалансы жана жылма реализацияланган волатилдүүлүк ML менен спредди моделдөө материалында таблицага түшүрүлүп, ишке ашырылган, ал эми көп деңгээлдүү ордер китебинин белгилери DeepLOB макаласында бар. Ошолорду колдонуңуз.

Бул маселеге өзгөчө тиешелүү жана эки материалда тең жок белги — сооданын спреддин ичиндеги орду:

relative_pricet=PtBtAtBt\text{relative\_price}_t = \frac{P_t - B_t}{A_t - B_t}

Bidдеги соода 0гө, askдеги 1ге, орто чекиттеги 0,5ке түшөт. Бул quote эрежесинин үзгүлтүксүз жалпылоосу: орто чекитте босого коюунун ордуна модельге аралыкты берет, ошондо модель 0,95теги соода дээрлик сөзсүз сатып алуу экенин, 0,55теги соода болсо араң маалымат берерин үйрөнө алат. [0,1][0, 1] сыртындагы маанилер — мурунку бөлүмдөгү эски 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 σ\sigma-ны баалайт, демек анын катасы түзүлүшү боюнча режимге көз каранды).

Ыкма Жалпы Орто чекитте Тар спред Кең спред Ири соодалар
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 баасын отчет кылыңыз.

blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

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.

Newsletter

Рынктан бир кадам алдыда болуңуз

AI соода аналитикасы, рынок талдоолору жана платформа жаңылыктары үчүн биздин жаңылыктар бюллетенине жазылыңыз.

Биз сиздин купуялыгыңызды урматтайбыз. Каалаган убакта жазылымдан чыга аласыз.