Trade Classification When You Have No Side Flag: Tick, Quote, Lee-Ready, BVC
Mulakan dengan mengetepikan versi masalah ini yang biasanya menjadi pembukaan kebanyakan buku teks mikrostruktur. Di bursa yang sebenarnya didagangkan oleh blog ini, arah dagangan bukan sesuatu yang perlu anda simpulkan — ia ialah satu medan data. aggTrades Binance menyediakan isBuyerMaker; aliran dagangan Bybit menyediakan side. Artikel pembinaan bar mengambil sisi pengagresif terus daripada flag itu dan tidak pernah menjalankan pengelas:
def on_trade(self, timestamp: int, price: float, qty: float, is_buyer_maker: bool):
side = -1 if is_buyer_maker else 1
Itulah kebenaran asas, secara percuma, pada resolusi nanosaat. Jika anda membina aliran pesanan bertanda daripada suapan CEX kripto moden, anda tidak memerlukan artikel ini.
Anda memerlukannya dalam empat keadaan, dan keadaan ini cukup lazim untuk menjadi penting:
- Anda hanya mempunyai bar. OHLCV sejarah ialah perkara yang dijual oleh kebanyakan pembekal dan digunakan oleh kebanyakan backtest; aliran dagangan tidak pernah diarkibkan atau kosnya lebih besar daripada nilai penyelidikan. Itulah masalah BVC di bawah.
- Bursa tidak menandakan sisi. CEX yang lebih kecil, set data gaya TAQ ekuiti, dan hampir semua arkib sebelum 2017 hanya memberikan harga dan saiz.
- Aliran DEX dan atas rantaian. Satu peristiwa swap menyatakan token mana bergerak ke arah mana, tetapi atribusi agresi merentas dagangan berbilang lompatan yang dirutekan atau agregator tidak mempunyai flag untuk dijadikan sandaran.
- Anda mengulangi penyelidikan yang diterbitkan. Anggaran lambda Kyle, VPIN, dan pecahan spread — hampir keseluruhan literatur mikrostruktur dibina atas data yang dikelaskan dengan Lee-Ready, jadi kebolehbandingan bermakna anda perlu menjalankan pengelas mereka dan bukannya membaca sisi sebenar.
Yang berikut ialah set peraturan, mod kegagalan yang paling penting, jalan pintas volum pukal, dan protokol untuk mengukur semuanya — kerana kripto memberikan anda label yang tidak pernah dimiliki oleh literatur ekuiti.
Ujian tick

Bandingkan harga dagangan semasa dengan harga sebelumnya:
Intuisinya: dagangan yang dimulakan pembeli mengangkat ask dan menolak harga ke atas; dagangan yang dimulakan penjual memukul bid dan menolaknya ke bawah. Tick sifar membawa tanda sebelumnya ke hadapan, dan di situlah kebanyakan ralat berlaku — pada instrumen cair dengan spread satu tick, majoriti dagangan berturutan dicetak pada harga yang sama.
sign = np.sign(np.diff(prices, prepend=prices[0]))
sign[sign == 0] = np.nan
directions = pd.Series(sign).ffill().fillna(1).astype(int).values
Pelaksanaan produksi dengan semantik bawa-ke-hadapan yang sama sudah tersedia sebagai _tick_sign() di dalam penjana bar ketidakseimbangan tick dan volum dalam melangkaui bar masa — guna semula pelaksanaan itu dan bukannya menyelenggara salinan kedua.
Peraturan quote

Daripada membandingkan dagangan berturutan, bandingkan harga dagangan dengan titik tengah semasa :
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
Peraturan quote menggunakan lebih banyak maklumat berbanding ujian tick, tetapi gagal di tempat yang berbeza: ia tidak menyatakan apa-apa tentang dagangan yang dicetak tepat pada titik tengah. Pada instrumen dengan spread sempit yang tertakluk kepada tick, ini bukan kes terpencil — ia merupakan bahagian besar pita dagangan. Peraturan ini memerlukan sandaran, dan itulah peranan Lee-Ready.
Lee-Ready: gabungan hibrid dan andaian quote lapuk

Lee dan Ready (1991) menggabungkan kedua-duanya: gunakan peraturan quote, dan bagi dagangan pada titik tengah, kembali kepada ujian 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
Bahagian kertas kajian yang lebih menarik ialah bahagian yang biasanya diulang tanpa justifikasinya. Lee dan Ready bukan sekadar mencadangkan gabungan hibrid; mereka mencadangkan perbandingan setiap dagangan dengan quote yang berkuat kuasa lima saat sebelumnya. Angka itu bukan pilihan pemodelan tentang pasaran. Ia pembetulan untuk artifak pelaporan: pada pita gabungan NYSE pada tahun 1980-an, dagangan dan quote disebarkan melalui laluan berbeza dengan kelewatan berbeza, dan quote cenderung tiba sebelum dagangan yang berkaitan dengannya. Oleh itu, membandingkan dagangan dengan quote bercetak yang segerak bermakna membandingkannya dengan quote yang sudah mencerminkan dagangan itu — lalu membalikkan tanda tepat pada dagangan yang menggerakkan pasaran.
Dua perkara berikut penting untuk sesiapa yang memindahkan kaedah ini ke kripto.
Peraturan 5 saat sudah lapuk, dan penggunaannya sebenarnya memudaratkan. Ia membetulkan kelewatan penyebaran yang sudah tiada. Pasaran ekuiti menutup jurang itu menjelang pertengahan 1990-an; aliran dagangan dan delta buku sesuatu bursa kripto berkongsi ruang jujukan dan dicap oleh enjin padanan yang sama pada resolusi mikrosaat. Lima saat pada BTCUSDT bukan toleransi penyegerakan, tetapi ratusan kemas kini buku. Melengahkan quote selama lima saat tidak membaiki quote lapuk, sebaliknya menghasilkannya. Gunakan quote_lag=0 kecuali anda telah mengukur offset sebenar dalam tangkapan anda sendiri.
Namun masalah asas itu kekal dalam bentuk baharu. Kelapukan quote kini berpunca daripada saluran paip anda, bukan bursa. Bina semula buku daripada aliran delta WebSocket, gabungkan dagangan menggunakan cap masa jam dinding, dan anda telah memperkenalkan kelewatan yang tanda dan saiznya bergantung pada penimbalan, dasar penyegerakan semula snapshot, dan jam anda. Ukurnya sebelum mempercayai mana-mana pengelas yang membaca buku: ulang main satu tetingkap, gabungkan dagangan dengan keadaan buku, dan semak bahagian yang jatuh di luar [bid, ask] yang digabungkan. Dagangan yang dicetak di atas ask gabungan membuktikan buku yang anda padankan dengannya sudah lapuk.
Pembaikannya berbeza daripada Lee dan Ready; mod kegagalannya sama.
Pengelasan Volum Pukal

Easley, Lopez de Prado dan O'Hara (2012) menyerang masalah yang berbeza: bagaimana jika anda tidak pernah melihat dagangan individu? BVC mengelaskan volum agregat dalam sebuah bar, lalu membahagikannya dengan fungsi taburan normal piawai bagi perubahan harga piawai:
di mana dan ialah sisihan piawai perubahan harga bar.
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 ialah alat yang berbeza, bukan alat yang lebih buruk, dan tiga ciri menjelaskan sebabnya. Ia tidak mengelaskan dagangan — ia menghasilkan pecahan, jadi bar yang ditutup tanpa perubahan menerima pecahan 50/50, bukannya lambungan syiling pada setiap dagangan di dalamnya; jika pengguna anda memerlukan tanda setiap dagangan, BVC tidak dapat menyediakannya. Ia berjalan pada bar, bukan pita dagangan, dan itulah tujuannya: ia satu-satunya kaedah di sini yang berfungsi apabila data peringkat dagangan tidak wujud. Selain itu, ialah parameter bebas yang menggerakkan keputusan — anggaran sampel penuh ialah kebocoran pandangan hadapan, manakala anggaran gelungsur pendek menyebabkan tepu dan menolak setiap bar ke arah 0/100. Pilihan itu wajar diuji melalui imbasan sensitiviti, bukan ditetapkan sebagai lalai.
Kertas asal melaporkan bahawa BVC menjejaki pengelasan peringkat dagangan dengan cukup rapat untuk anggaran VPIN. Angka ketepatan khusus banyak bergantung pada saiz bar, instrumen, dan penganggar , manakala angka yang dipetik dalam sumber sekunder jarang menyatakan ketiga-tiganya. Jangan bawa satu angka daripada kajian ekuiti — ukur sendiri.
Satu-satunya ciri khusus pengelasan

Jika anda melatih model untuk melakukan perkara ini dan bukannya menjalankan peraturan, kebanyakan set ciri sudah diterbitkan: spread, ketidakseimbangan kedalaman, ketidakseimbangan aliran dagangan, dan turun naik realisasi bergulir ditabulasikan serta dilaksanakan dalam pemodelan spread dengan pembelajaran mesin, manakala ciri buku pesanan berbilang aras terdapat dalam DeepLOB. Gunakan ciri-ciri tersebut.
Ciri yang khusus kepada masalah ini, dan tidak muncul dalam mana-mana satunya, ialah kedudukan dagangan di dalam spread:
Dagangan pada bid dipetakan kepada 0, pada ask kepada 1, dan pada titik tengah kepada 0.5. Ini ialah generalisasi berterusan peraturan quote: daripada menggunakan ambang pada titik tengah, ia memberikan jarak kepada model, supaya model boleh belajar bahawa dagangan pada 0.95 hampir pasti merupakan belian manakala dagangan pada 0.55 hampir tidak bermaklumat. Nilai di luar ialah diagnostik quote lapuk daripada bahagian sebelumnya, dan wajar direkodkan dan bukannya dipotong.
Untuk garis dasar terboost di atas ciri-ciri ini, salurannya ialah yang sudah diterbitkan dalam pemodelan spread dengan pembelajaran mesin, dengan objektif ditukar kepada binari — termasuk, yang penting, CV walk-forward yang telah dipurge dan di-embargo. Jangan nilai pengelas mikrostruktur dengan TimeSeriesSplit biasa; artikel itu dan pengoptimuman walk-forward sama-sama menerangkan sebab nombor yang terhasil terlalu optimistik. Untuk model jujukan atas snapshot buku, DeepLOB ialah seni bina rujukan dan bahagian pertimbangan latihan di sana terpakai tanpa perubahan.
Mengukur dengan betul: kripto memberikan anda label

Setiap angka ketepatan dalam literatur pengelasan dagangan ekuiti dianggarkan berbanding proksi kebenaran — TORQ, subsampel jejak audit, atau rekod dalaman satu bursa — kerana sisi pengagresif sebenar tidak pernah diterbitkan. Kripto menerbitkannya. isBuyerMaker pada aggTrades Binance ialah label bagi setiap dagangan, tanpa kos. Oleh itu eksperimen ini tersedia kepada sesiapa sahaja, dan saya belum menemuinya diterbitkan untuk kripto. Protokolnya:
Data. Sebulan aggTrades BTCUSDT bersama aliran ticker buku, digabungkan supaya setiap dagangan membawa bid dan ask yang berkuat kuasa serta-merta sebelumnya. Ulangi pada alt yang nipis, kerana keseluruhan persoalannya ialah apa yang berlaku apabila spread lebar.
Label. direction = -1 if is_buyer_maker else +1. Kemudian buang flag itu dan jalankan setiap kaedah hanya pada data harga dan quote.
Kaedah. Ujian tick, peraturan quote, Lee-Ready pada quote_lag=0, Lee-Ready pada lag sejarah lima saat (untuk mengukur kerosakan yang dilakukan peraturan lapuk), dan BVC pada beberapa saiz bar berbanding pecahan volum belian sebenar bagi setiap bar.
Pecahan. Ketepatan keseluruhan ialah angka yang paling kurang menarik. Pecahkan mengikut rejim spread (satu tick berbanding lebar — bawa-ke-hadapan ujian tick sepatutnya runtuh apabila spread terkunci), sama ada dagangan dicetak pada titik tengah (mengasingkan tempat peraturan quote berkecuali dan tempat sandaran Lee-Ready melakukan semua kerja), saiz dagangan (entri aggTrades ialah sweep; dagangan besar memacu impak dan kos paling tinggi apabila ditandatangani secara salah), dan rejim turun naik ( BVC dianggarkan, jadi ralatnya bergantung pada rejim secara binaan).
| Kaedah | Keseluruhan | Pada tengah | Spread ketat | Spread lebar | Dagangan besar |
|---|---|---|---|---|---|
| Ujian tick | — | — | — | — | — |
| Peraturan quote | — | — | — | — | — |
| Lee-Ready (lag 0) | — | — | — | — | — |
| Lee-Ready (lag 5s) | — | — | — | — | — |
| BVC (pecahan setiap bar) | — | t/a | — | — | t/a |
Ketepatan bukan objektifnya

Pinjam disiplin pembingkaian daripada DeepLOB: ketepatan pengelasan bukan hasil, tetapi input kepada hasil. Tiada siapa berdagang tanda sesuatu dagangan — mereka berdagang sesuatu yang dikira daripada keseluruhan aliran tanda, dan ralat tidak merebak ke dalamnya secara neutral. Pengelas yang salah secara rawak pada 10% dagangan dan pengelas yang salah secara sistematik pada 10% yang besar serta menggerakkan harga menghasilkan aliran pesanan bertanda yang sangat berbeza walaupun ketepatannya sama. Kegagalan bawa-ke-hadapan ujian tick berkorelasi khusus dengan harga mendatar — rejim ketika aliran bertanda sepatutnya bermaklumat. Itulah sebabnya pecahan di atas, bukan angka utama, merupakan output sebenar.
Dengan label kebenaran asas, soalan hiliran boleh diukur secara terus: anggarkan kuantiti yang anda pedulikan daripada tanda sebenar, anggarkan semula daripada tanda setiap pengelas, dan laporkan jurangnya.
- Impak harga. Regresikan perubahan harga tengah terhadap aliran bersih pengambil bertanda merentas tetingkap tetap — penganggar itu sudah dinyatakan dalam model kos slippage, dan pelaksanaan berfungsinya pada data Binance awam terdapat dalam pelaksanaan optimum Almgren-Chriss. Jangan takrifkan semula di sini; jalankannya dua kali dan bandingkan pekali yang dipadankan.
- Ketidakseimbangan aliran pesanan sebagai peramal. Kira korelasi antara OFI dan pulangan hadapan di bawah tanda sebenar dan tanda yang dikelaskan. Kemerosotan korelasi itu ialah kos salah pengelasan, didenominasikan dalam satu-satunya unit yang penting.
- Metrik ketoksikan. VPIN dan ciri ketidakseimbangan aliran dagangan menggunakan volum yang dikelaskan; kedua-duanya diliputi dalam pemodelan spread dengan pembelajaran mesin. Kepekaan mereka terhadap ralat pengelasan boleh diukur dengan cara yang sama.
Kesimpulannya

Jika bursa anda menyediakan flag pengagresif, gunakannya. Itulah keadaan bagi kebanyakan kripto, pada kebanyakan masa.
Jika tidak, Lee-Ready dengan quote serentak ialah lalai yang betul — bukan kerana ia tepat, tetapi kerana ia piawai, dan kebolehbandingan dengan tiga dekad anggaran yang diterbitkan lebih bernilai daripada beberapa mata ketepatan yang tidak dapat anda sahkan. Peraturan lima saat ialah fosil daripada kependaman pita tahun 1980-an; mengulanginya pada data moden menyuntik kelapukan yang asalnya cuba dihapuskan. Jika anda hanya mempunyai bar, BVC ialah satu-satunya pilihan yang berfungsi langsung, dan ia menjawab soalan yang berbeza: pecahan volum, bukan tanda dagangan.
Dalam setiap keadaan, ukur berbanding label yang diberikan kripto secara percuma, pecahkan hasil mengikut rejim spread dan saiz dagangan, dan laporkan kos ralat pada peringkat hiliran dan bukannya peratusan yang betul.
Pengarang
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.