Trong thế giới giao dịch crypto, dữ liệu order book là "xương sống" của mọi chiến lược market microstructure. Bài viết này sẽ đưa bạn từ con số 0 đến việc thành thạo việc parse dữ liệu order book từ Tardis Normalized format - một trong những định dạng phổ biến nhất hiện nay cho market data.
Order Book Là Gì? Tại Sao Nó Quan Trọng?
Order book (sổ lệnh) là bảng ghi lại tất cả lệnh mua và bán chưa khớp trên sàn giao dịch. Nó cho bạn biết:
- Bids (lệnh mua): Giá cao nhất mà người mua sẵn sàng trả
- Asks (lệnh bán): Giá thấp nhất mà người bán chấp nhận
- Depth: Tổng khối lượng ở mỗi mức giá
- Spread: Chênh lệch giữa bid cao nhất và ask thấp nhất
Trong kinh nghiệm thực chiến 5 năm của tôi với market data, order book là nguồn dữ liệu quý giá nhất để phân tích hành vi thị trường, phát hiện whale activity, và xây dựng các chỉ báo độc quyền.
Tardis Normalized Format Là Gì?
Tardis (tardis.dev) là một trong những nhà cung cấp market data đáng tin cậy nhất cho crypto. Họ cung cấp raw market data từ hơn 50 sàn giao dịch với latency cực thấp. Normalized format là phiên bản chuẩn hóa của họ - điều này có nghĩa là bạn nhận được cùng một cấu trúc dữ liệu bất kể sàn giao dịch nào.
Cấu Trúc Dữ Liệu Normalized
Dữ liệu Tardis Normalized được chia thành 4 loại message chính:
- orderbook_snapshot: Ảnh chụp toàn bộ order book tại một thời điểm
- orderbook_update: Các thay đổi delta so với snapshot
- trade: Thông tin về các giao dịch đã khớp
- ticker: Thông tin tổng hợp về giá
Bắt Đầu Từ Đâu: Thiết Lập Môi Trường
Cài Đặt Dependencies
pip install tardis-client websockets pandas numpy
Kiểm tra phiên bản
python -c "import tardis; print(tardis.__version__)"
Code Kết Nối Đầu Tiên
import asyncio
from tardis_client import TardisClient, Message
async def connect_tardis():
# Đăng ký miễn phí tại tardis.dev để lấy API key
tardis_client = TardisClient(api_key="YOUR_TARDIS_API_KEY")
# Kết nối đến Binance futures orderbook
await tardis_client.connect(
exchanges=["binance-futures"],
channels=["orderbook"],
symbols=["btcusdt"]
)
# Lắng nghe messages
async for message in tardis_client.get_messages():
print(f"Type: {message.type}")
print(f"Data: {message.data}")
print("---")
if __name__ == "__main__":
asyncio.run(connect_tardis())
⚠️ Lưu ý quan trọng: Thay YOUR_TARDIS_API_KEY bằng API key thật của bạn. Tardis cung cấp gói free với 50,000 messages/ngày.
Parse Order Book Data Chi Tiết
Xử Lý Order Book Snapshot
Khi bạn nhận được snapshot message, đây là cách tôi parse nó trong production:
import json
import pandas as pd
from dataclasses import dataclass
from typing import Dict, List
@dataclass
class OrderBookLevel:
price: float
size: float
@dataclass
class OrderBook:
exchange: str
symbol: str
bids: List[OrderBookLevel] # Sắp xếp giảm dần theo giá
asks: List[OrderBookLevel] # Sắp xếp tăng dần theo giá
timestamp: int
def get_spread(self) -> float:
if self.asks and self.bids:
return self.asks[0].price - self.bids[0].price
return 0.0
def get_mid_price(self) -> float:
if self.asks and self.bids:
return (self.asks[0].price + self.bids[0].price) / 2
return 0.0
def get_depth(self, levels: int = 10) -> Dict:
bid_volume = sum(level.size for level in self.bids[:levels])
ask_volume = sum(level.size for level in self.asks[:levels])
return {
"bid_volume": bid_volume,
"ask_volume": ask_volume,
"imbalance": (bid_volume - ask_volume) / (bid_volume + ask_volume) if (bid_volume + ask_volume) > 0 else 0
}
def parse_orderbook_snapshot(data: dict) -> OrderBook:
"""Parse Tardis orderbook snapshot message"""
bids = [
OrderBookLevel(price=float(bid[0]), size=float(bid[1]))
for bid in data.get("bids", [])
]
asks = [
OrderBookLevel(price=float(ask[0]), size=float(ask[1]))
for ask in data.get("asks",