Trong lĩnh vực giao dịch crypto và phát triển bot giao dịch tần suất cao, dữ liệu order book là tài sản quý giá nhất. Bài viết này sẽ hướng dẫn bạn cách回放 Hyperliquid order book, so sánh các giải pháp thay thế Tardis, và triển khai data quality validation để đảm bảo độ chính xác của dữ liệu.

1. Bối cảnh thị trường AI và chi phí xử lý dữ liệu 2026

Trước khi đi vào chi tiết kỹ thuật, hãy xem xét bối cảnh chi phí AI vào năm 2026. Với các mô hình LLM phổ biến, chi phí xử lý dữ liệu order book và phân tích có thể được tối ưu hóa đáng kể:

Mô hình AI Giá Input (2026) Giá Output (2026) Chi phí cho 10M token/tháng
GPT-4.1 $8/MTok $24/MTok $160
Claude Sonnet 4.5 $15/MTok $75/MTok $300
Gemini 2.5 Flash $2.50/MTok $10/MTok $50
DeepSeek V3.2 $0.42/MTok $1.68/MTok $8.40
HolySheep AI Tiết kiệm 85%+ — Tỷ giá ¥1=$1

Đăng ký tại đây để nhận tín dụng miễn phí khi bắt đầu.

2. Hyperliquid Order Book là gì và Tại sao cần回放

Hyperliquid là một Layer 1 blockchain chuyên về perpetual futures với tốc độ cực nhanh và phí giao dịch thấp. Order book của Hyperliquid chứa đầy đủ thông tin về:

Việc回放 (replay) order book cho phép bạn:

3. So sánh Tardis và các giải pháp thay thế

Tiêu chí Tardis HolySheep API Giải pháp Self-hosted
Chi phí hàng tháng $200-2000+ Tỷ giá ¥1=$1 Server + Infrastructure
Độ trễ 50-200ms <50ms Phụ thuộc vào setup
Độ khó setup Dễ dàng Dễ dàng Rất khó
Customization Hạn chế Full control Full control
Data quality validation Có sẵn Tự triển khai Tự triển khai

4. Triển khai Hyperliquid Order Book回放 với HolySheep AI

Để xử lý và phân tích dữ liệu order book hiệu quả, bạn có thể sử dụng HolySheep AI API. Dưới đây là kiến trúc hoàn chỉnh:

4.1. Kết nối Hyperliquid WebSocket và xử lý dữ liệu

import websocket
import json
import asyncio
from datetime import datetime
from typing import Dict, List
import hmac
import hashlib
import time

class HyperliquidOrderBookRecorder:
    """
    Recorders và processes Hyperliquid order book data
    với data quality validation tích hợp
    """
    
    def __init__(self, holysheep_api_key: str):
        self.api_key = holysheep_api_key
        self.order_book_snapshot = {}
        self.trade_history = []
        self.data_quality_metrics = {
            'total_messages': 0,
            'valid_messages': 0,
            'sequence_gaps': 0,
            'out_of_order': 0
        }
        
    async def connect_websocket(self, coin: str = "BTC"):
        """Kết nối Hyperliquid WebSocket để nhận real-time order book"""
        
        ws_url = "wss://api.hyperliquid.xyz/ws"
        
        # Subscribe to order book updates
        subscribe_msg = {
            "method": "subscribe",
            "subscription": {
                "type": "book",
                "coin": coin
            }
        }
        
        # Subscribe to trades
        trade_subscribe = {
            "method": "subscribe",
            "subscription": {
                "type": "trades",
                "coin": coin
            }
        }
        
        async with websocket.connect(ws_url) as ws:
            await ws.send(json.dumps(subscribe_msg))
            await ws.send(json.dumps(trade_subscribe))
            
            async for message in ws:
                await self.process_message(json.loads(message))
    
    async def process_message(self, message: dict):
        """Process và validate mỗi message từ WebSocket"""
        
        self.data_quality_metrics['total_messages'] += 1
        
        if 'channel' not in message:
            self.data_quality_metrics['invalid_messages'] += 1
            return
            
        channel = message.get('channel')
        
        if channel == 'book':
            await self.process_order_book_update(message['data'])
            self.data_quality_metrics['valid_messages'] += 1
            
        elif channel == 'trades':
            self.process_trade(message['data'])
    
    async def process_order_book_update(self, data: dict):
        """Xử lý order book update với validation"""
        
        coin = data.get('coin')
        timestamp = data.get('time')
        
        # Data quality checks
        if not self.validate_order_book_data(data):
            return
            
        bids = data.get('bids', [])
        asks = data.get('asks', [])
        
        # Store snapshot
        self.order_book_snapshot[coin] = {
            'timestamp': timestamp,
            'bids': [(float(p), float(sz)) for p, sz in bids],
            'asks': [(float(p), float(sz)) for p, sz in asks],
            'sequence': self.data_quality_metrics['total_messages']
        }
        
        # Tính spread
        if bids and asks:
            best_bid = float(bids[0][0])
            best_ask = float(asks[0][0])
            spread = (best_ask - best_bid) / best_bid * 100
            mid_price = (best_bid + best_ask) / 2
            
            # Log metrics for HolySheep AI processing
            await self.send_to_holysheep({
                'type': 'order_book_snapshot',
                'coin': coin,
                'timestamp': timestamp,
                'spread_bps': round(spread * 100, 2),
                'mid_price': mid_price,
                'depth': len(bids) + len(asks)
            })
    
    def validate_order_book_data(self, data: dict) -> bool:
        """Data quality validation cho order book"""
        
        # Check required fields
        if 'coin' not in data or 'time' not in data:
            return False
            
        # Check price reasonability
        bids = data.get('bids', [])
        asks = data.get('asks', [])
        
        for price, size in bids + asks:
            try:
                p, s = float(price), float(size)
                if p <= 0 or s < 0:
                    return False
            except (ValueError, TypeError):
                return False
                
        # Check bid < ask invariant
        if bids and asks:
            if float(bids[0][0]) >= float(asks[0][0]):
                self.data_quality_metrics['invalid_messages'] += 1
                return False
                
        return True
    
    async def send_to_holysheep(self, data: dict):
        """Gửi dữ liệu đã xử lý đến HolySheep AI để phân tích"""
        import aiohttp
        
        async with aiohttp.ClientSession() as session:
            payload = {
                'model': 'deepseek-v3.2',  # Chi phí thấp nhất
                'messages': [
                    {
                        'role': 'system',
                        'content': 'Bạn là chuyên gia phân tích thị trường crypto. Phân tích dữ liệu order book sau và đưa ra insights về liquidity và market microstructure.'
                    },
                    {
                        'role': 'user',
                        'content': f'Phân tích order book data: {json.dumps(data)}'
                    }
                ]
            }
            
            async with session.post(
                'https://api.holysheep.ai/v1/chat/completions',
                headers={
                    'Authorization': f'Bearer {self.api_key}',
                    'Content-Type': 'application/json'
                },
                json=payload
            ) as response:
                if response.status == 200:
                    result = await response.json()
                    return result['choices'][0]['message']['content']
        return None
    
    def get_data_quality_report(self) -> dict:
        """Generate data quality report"""
        
        total = self.data_quality_metrics['total_messages']
        valid = self.data_quality_metrics['valid_messages']
        
        return {
            'total_messages': total,
            'valid_messages': valid,
            'invalid_messages': self.data_quality_metrics.get('invalid_messages', 0),
            'quality_score': round(valid / total * 100, 2) if total > 0 else 0,
            'sequence_gaps': self.data_quality_metrics.get('sequence_gaps', 0),
            'out_of_order_count': self.data_quality_metrics.get('out_of_order', 0)
        }

4.2. Order Book回放 Engine với HolySheep AI Analysis

import asyncio
import aiohttp
from dataclasses import dataclass
from typing import List, Dict, Optional
from datetime import datetime, timedelta
import numpy as np

@dataclass
class OrderBookSnapshot:
    """Single order book snapshot"""
    timestamp: int
    bids: List[tuple]  # [(price, size), ...]
    asks: List[tuple]  # [(price, size), ...]
    sequence: int

@dataclass  
class BacktestTrade:
    """Simulated trade from replay"""
    timestamp: int
    side: str  # 'buy' or 'sell'
    price: float
    size: float
    pnl: float
    slippage: float

class HyperliquidReplayEngine:
    """
    Engine để回放 (replay) order book data
    với integration vào HolySheep AI cho advanced analysis
    """
    
    def __init__(self, holysheep_api_key: str):
        self.api_key = holysheep_api_key
        self.snapshots: List[OrderBookSnapshot] = []
        self.trades: List[BacktestTrade] = []
        
    async def load_historical_data(self, coin: str, start_time: int, end_time: int):
        """
        Load historical order book data từ Hyperliquid
        (Sử dụng archival data hoặc data export)
        """
        
        # Trong production, bạn sẽ load từ:
        # - Hyperliquid's own archival data
        # - Tardis (nếu có subscription)
        # - Custom data collector
        
        # Ví dụ: Load từ local storage
        # snapshots = await self.load_from_storage(coin, start_time, end_time)
        
        # Hoặc sử dụng HolySheep để phân tích batch data
        await self.process_batch_with_holysheep(coin, start_time, end_time)
        
    async def process_batch_with_holysheep(self, coin: str, start: int, end: int):
        """
        Sử dụng HolySheep AI để phân tích batch order book data
        Chi phí cực thấp với DeepSeek V3.2: $0.42/MTok input
        """
        
        batch_prompt = f"""
        Bạn là chuyên gia phân tích market microstructure.
        Phân tích đoạn order book history sau và đưa ra:
        
        1. Liquidity profile (bid/ask depth, spread patterns)
        2. Market impact estimation
        3. Optimal execution strategy recommendations
        4. Anomalies detection (wash trading, spoofing patterns)
        
        Coin: {coin}
        Start timestamp: {start}
        End timestamp: {end}
        
        Định dạng response: JSON với các trường:
        - liquidity_score (0-100)
        - avg_spread_bps
        - market_impact_factor
        - recommendations (array)
        - anomalies (array)
        """
        
        payload = {
            'model': 'deepseek-v3.2',
            'messages': [
                {'role': 'system', 'content': 'Bạn là chuyên gia phân tích thị trường crypto với kiến thức sâu về market microstructure.'},
                {'role': 'user', 'content': batch_prompt}
            ],
            'temperature': 0.3,
            'response_format': {'type': 'json_object'}
        }
        
        async with aiohttp.ClientSession() as session:
            async with session.post(
                'https://api.holysheep.ai/v1/chat/completions',
                headers={
                    'Authorization': f'Bearer {self.api_key}',
                    'Content-Type': 'application/json'
                },
                json=payload,
                timeout=aiohttp.ClientTimeout(total=30)
            ) as response:
                if response.status == 200:
                    result = await response.json()
                    return result['choices'][0]['message']['content']
                else:
                    error = await response.text()
                    raise Exception(f"HolySheep API error: {error}")
    
    async def replay_with_strategy(self, snapshots: List[OrderBookSnapshot], 
                                   strategy_fn, initial_balance: float = 10000):
        """
        Replay order book với custom strategy function
        
        Args:
            snapshots: List of order book snapshots (chronological order)
            strategy_fn: Function(position, current_snapshot) -> TradeSignal
            initial_balance: Starting capital in USD
        """
        
        balance = initial_balance
        position = 0
        trades = []
        
        for i, snapshot in enumerate(snapshots):
            # Calculate features from snapshot
            features = self.extract_features(snapshot)
            
            # Get signal from strategy
            signal = strategy_fn(position, features)
            
            if signal:
                trade = await self.execute_trade(signal, snapshot, balance)
                if trade:
                    trades.append(trade)
                    balance = self.update_balance(balance, trade)
                    position = self.update_position(position, trade)
            
            # Update features cache
            self.current_features = features
            
        return {
            'final_balance': balance,
            'final_position_value': position * self.get_mid_price(snapshots[-1]),
            'total_trades': len(trades),
            'win_rate': self.calculate_win_rate(trades),
            'sharpe_ratio': self.calculate_sharpe(trades)
        }
    
    def extract_features(self, snapshot: OrderBookSnapshot) -> dict:
        """Extract features từ order book snapshot"""
        
        bids = snapshot.bids
        asks = snapshot.asks
        
        if not bids or not asks:
            return {}
            
        best_bid = bids[0][0]
        best_ask = asks[0][0]
        mid_price = (best_bid + best_ask) / 2
        spread = (best_ask - best_bid) / mid_price
        
        # Depth calculation
        depth_levels = 10
        bid_depth = sum(size for _, size in bids[:depth_levels])
        ask_depth = sum(size for _, size in asks[:depth_levels])
        
        # Volume weighted average price
        def vwap(levels):
            total_volume = sum(size for _, size in levels)
            if total_volume == 0:
                return 0
            return sum(price * size for price, size in levels) / total_volume
            
        bid_vwap = vwap(bids[:depth_levels])
        ask_vwap = vwap(asks[:depth_levels])
        
        # Imbalance
        imbalance = (bid_depth - ask_depth) / (bid_depth + ask_depth) if (bid_depth + ask_depth) > 0 else 0
        
        return {
            'spread_bps': spread * 10000,
            'mid_price': mid_price,
            'bid_depth': bid_depth,
            'ask_depth': ask_depth,
            'bid_vwap': bid_vwap,
            'ask_vwap': ask_vwap,
            'imbalance': imbalance,
            'timestamp': snapshot.timestamp
        }
    
    async def execute_trade(self, signal: dict, snapshot: OrderBookSnapshot, 
                           balance: float) -> Optional[BacktestTrade]:
        """Execute trade với realistic slippage modeling"""
        
        side = signal['side']
        size = signal['size']
        order_type = signal.get('type', 'market')
        
        if side == 'buy':
            # Execute against asks
            levels = snapshot.asks
        else:
            # Execute against bids
            levels = snapshot.bids
        
        # Calculate execution price với slippage
        exec_price, avg_price = self.calculate_execution(levels, size)
        
        # Slippage estimation
        mid = self.get_mid_price(snapshot)
        slippage = abs(exec_price - mid) / mid * 100
        
        # Fee calculation (Hyperliquid: 0.035% taker, 0.019% maker)
        fee_rate = 0.00035 if order_type == 'market' else 0.00019
        fee = size * exec_price * fee_rate
        
        return BacktestTrade(
            timestamp=snapshot.timestamp,
            side=side,
            price=exec_price,
            size=size,
            pnl=0,  # Calculated at close
            slippage=slippage
        )
    
    def calculate_execution(self, levels: List[tuple], size: float) -> tuple:
        """
        Calculate execution price cho given size
        Returns: (worst_price, avg_price)
        """
        
        remaining = size
        total_cost = 0
        worst_price = 0
        
        for price, level_size in levels:
            if remaining <= 0:
                break
                
            fill_size = min(remaining, level_size)
            total_cost += fill_size * price
            worst_price = price
            remaining -= fill_size
            
        avg_price = total_cost / size if size > 0 else 0
        return worst_price, avg_price
    
    def get_mid_price(self, snapshot: OrderBookSnapshot) -> float:
        """Get mid price từ snapshot"""
        
        if not snapshot.bids or not snapshot.asks:
            return 0
        return (snapshot.bids[0][0] + snapshot.asks[0][0]) / 2
    
    def calculate_win_rate(self, trades: List[BacktestTrade]) -> float:
        """Calculate win rate từ trades"""
        
        if not trades:
            return 0
            
        winning_trades = sum(1 for t in trades if t.pnl > 0)
        return winning_trades / len(trades) * 100
    
    def calculate_sharpe(self, trades: List[BacktestTrade], risk_free: float = 0.02) -> float:
        """Calculate Sharpe ratio từ trades"""
        
        if len(trades) < 2:
            return 0
            
        returns = [t.pnl for t in trades]
        avg_return = np.mean(returns)
        std_return = np.std(returns)
        
        if std_return == 0:
            return 0
            
        return (avg_return - risk_free) / std_return * np.sqrt(252)
    
    def update_balance(self, balance: float, trade: BacktestTrade) -> float:
        """Update balance sau trade"""
        
        if trade.side == 'buy':
            return balance - trade.price * trade.size
        else:
            return balance + trade.price * trade.size
    
    def update_position(self, position: float, trade: BacktestTrade) -> float:
        """Update position sau trade"""
        
        if trade.side == 'buy':
            return position + trade.size
        else:
            return position - trade.size

Example strategy function

def example_momentum_strategy(position: float, features: dict) -> Optional[dict]: """Simple momentum strategy example""" if not features: return None imbalance = features.get('imbalance', 0) spread = features.get('spread_bps', 100) # Entry conditions if position == 0: if imbalance > 0.05 and spread < 15: # Strong bid side pressure return {'side': 'buy', 'size': 0.1, 'type': 'market'} elif imbalance < -0.05 and spread < 15: return {'side': 'sell', 'size': 0.1, 'type': 'market'} # Exit conditions if position != 0: if imbalance < 0 and position > 0: # Sentiment reversed return {'side': 'sell', 'size': abs(position), 'type': 'market'} elif imbalance > 0 and position < 0: return {'side': 'buy', 'size': abs(position), 'type': 'market'} return None

Usage example

async def run_backtest(): api_key = "YOUR_HOLYSHEEP_API_KEY" engine = HyperliquidReplayEngine(api_key) # Load historical data (replace with actual data source) start_time = int((datetime.now() - timedelta(days=7)).timestamp() * 1000) end_time = int(datetime.now().timestamp() * 1000) # Get analysis from HolySheep analysis = await engine.process_batch_with_holysheep("BTC", start_time, end_time) print(f"HolySheep Analysis: {analysis}") # Run replay (requires actual snapshot data) # results = await engine.replay_with_strategy( # snapshots=loaded_snapshots, # strategy_fn=example_momentum_strategy, # initial_balance=10000 # ) # print(f"Backtest Results: {results}") if __name__ == "__main__": asyncio.run(run_backtest())

4.3. Data Quality Validation Pipeline hoàn chỉnh

import hashlib
import zlib
from dataclasses import dataclass, field
from typing import List, Dict, Optional, Callable
from enum import Enum
import asyncio
import aiohttp

class ValidationLevel(Enum):
    """Mức độ validation"""
    BASIC = "basic"
    INTERMEDIATE = "intermediate"  
    STRICT = "strict"

@dataclass
class ValidationResult:
    """Kết quả validation"""
    is_valid: bool
    errors: List[str] = field(default_factory=list)
    warnings: List[str] = field(default_factory=list)
    metrics: Dict = field(default_factory=dict)

@dataclass
class OrderBookData:
    """Structured order book data"""
    coin: str
    timestamp: int
    sequence: int
    bids: List[tuple]  # [(price, size), ...]
    asks: List[tuple]
    checksum: Optional[str] = None
    
class DataQualityValidator:
    """
    Comprehensive data quality validation cho Hyperliquid order book
    Đảm bảo data integrity trước khi sử dụng cho backtest
    """
    
    def __init__(self, level: ValidationLevel = ValidationLevel.INTERMEDIATE):
        self.level = level
        self.validation_cache = {}
        
    def validate_snapshot(self, data: OrderBookData) -> ValidationResult:
        """Main validation method"""
        
        errors = []
        warnings = []
        metrics = {}
        
        # 1. Structure validation
        struct_errors = self._validate_structure(data)
        errors.extend(struct_errors)
        
        # 2. Price validation
        price_errors, price_warnings = self._validate_prices(data)
        errors.extend(price_errors)
        warnings.extend(price_warnings)
        
        # 3. Size validation
        size_errors = self._validate_sizes(data)
        errors.extend(size_errors)
        
        # 4. Bid/Ask relationship
        invariant_errors, invariant_warnings = self._validate_invariants(data)
        errors.extend(invariant_errors)
        warnings.extend(invariant_warnings)
        
        # 5. Sequence validation (nếu có cache)
        if self.validation_cache:
            seq_result = self._validate_sequence(data)
            if seq_result:
                warnings.append(seq_result)
        
        # 6. Checksum validation
        if data.checksum:
            checksum_result = self._validate_checksum(data)
            if not checksum_result:
                errors.append("Checksum mismatch - data corruption detected")
        
        # Calculate metrics
        metrics = {
            'total_levels': len(data.bids) + len(data.asks),
            'spread_bps': self._calculate_spread(data),
            'mid_price': self._calculate_mid(data),
            'bid_depth': sum(s for _, s in data.bids),
            'ask_depth': sum(s for _, s in data.asks),
            'max_bid': max(p for p, _ in data.bids) if data.bids else 0,
            'min_ask': min(p for p, _ in data.asks) if data.asks else 0
        }
        
        return ValidationResult(
            is_valid=len(errors) == 0,
            errors=errors,
            warnings=warnings,
            metrics=metrics
        )
    
    def _validate_structure(self, data: OrderBookData) -> List[str]:
        """Validate data structure"""
        
        errors = []
        
        if not data.coin:
            errors.append("Missing coin identifier")
            
        if not data.timestamp or data.timestamp <= 0:
            errors.append("Invalid timestamp")
            
        if not isinstance(data.bids, list) or not isinstance(data.asks, list):
            errors.append("Bids/asks must be lists")
            
        if self.level == ValidationLevel.STRICT:
            if not data.sequence:
                errors.append("Missing sequence number (strict mode)")
                
        return errors
    
    def _validate_prices(self, data: OrderBookData) -> tuple:
        """Validate price values"""
        
        errors = []
        warnings = []
        
        all_prices = [p for p, _ in data.bids] + [p for p, _ in data.asks]
        
        for i, price in enumerate(all_prices):
            if price <= 0:
                errors.append(f"Non-positive price at level {i}: {price}")
                
            if price > 1_000_000:  # Unrealistic for crypto
                warnings.append(f"Very high price detected: {price}")
                
        # Check for NaN/Inf
        import math
        for price in all_prices:
            if math.isnan(price) or math.isinf(price):
                errors.append(f"Invalid price value: {price}")
                
        return errors, warnings
    
    def _validate_sizes(self, data: OrderBookData) -> List[str]:
        """Validate size values"""
        
        errors = []
        
        for i, (price, size) in enumerate(data.bids):
            if size < 0:
                errors.append(f"Negative size at bid level {i}")
            if size > 1_000_000:  # Suspiciously large
                errors.append(f"Suspiciously large size at bid level {i}: {size}")
                
        for i, (price, size) in enumerate(data.asks):
            if size < 0:
                errors.append(f"Negative size at ask level {i}")
            if size > 1_000_000:
                errors.append(f"Suspiciously large size at ask level {i}: {size}")
                
        return errors
    
    def _validate_invariants(self, data: OrderBookData) -> tuple:
        """Validate order book invariants"""
        
        errors = []
        warnings = []
        
        if data.bids and data.asks:
            best_bid = data.bids[0][0]
            best_ask = data.asks[0][0]
            
            # Bid must be less than ask
            if best_bid >= best_ask:
                errors.append(f"Bid-Ask invariant violated: bid {best_bid} >= ask {best_ask}")
                
            # Check for crossed market
            for bid_price, _ in data.bids:
                if bid_price >= best_ask:
                    errors.append(f"Crossed market: bid at {bid_price} >= best ask")
                    
            # Check for duplicate prices
            bid_prices = [p for p, _ in data.bids]
            if len(bid_prices) != len(set(bid_prices)):
                errors.append("Duplicate bid prices detected")
                
            ask_prices = [p for p, _ in data.asks]
            if len(ask_prices) != len(set(ask_prices)):
                errors.append("Duplicate ask prices detected")
                
            # Check price ordering
            for i in range(len(bid_prices) - 1):
                if bid_prices[i] < bid_prices[i + 1]:
                    errors.append(f"Bids not sorted descending at level {i}")
                    
            for i in range(len(ask_prices) - 1):
                if ask_prices[i] > ask_prices[i + 1]:
                    errors.append(f"Asks not sorted ascending at level {i}")
                    
        return errors, warnings
    
    def _validate_sequence(self, data: OrderBookData) -> Optional[str]:
        """Validate sequence continuity"""
        
        prev_seq = self.validation_cache.get(data.coin, 0)
        
        if data.sequence <= prev_seq:
            return f"Sequence not advancing: {data.sequence} <= {prev_seq}"
            
        if data.sequence > prev_seq + 1:
            gap = data.sequence - prev_seq - 1
            return f"Sequence gap detected: {gap} messages missing"
            
        self.validation_cache[data.coin] = data.sequence
        return None
    
    def _validate_checksum(self, data: OrderBookData) -> bool:
        """Validate checksum if present"""
        
        if not data.checksum:
            return True
            
        calculated = self.calculate_checksum(data)
        return calculated == data.checksum
    
    def calculate_checksum(self, data: OrderBookData) -> str:
        """Calculate checksum for order book data"""
        
        # Sort bids and asks by price
        bids = sorted(data.bids, key=lambda x: x[0])
        asks = sorted(data.asks, key=lambda x: x[0])
        
        # Create string representation
        content = f"{data.coin}:{data.timestamp}:"
        content += ";".join(f"{p},{s}" for p, s in bids)
        content += "|"
        content += ";".join(f"{p},{s}" for p, s in asks)
        
        # Calculate CRC32 + SHA256 hybrid
        crc = zlib.crc32(content.encode())
        sha = hashlib.sha256(f"{content}:{crc}".encode()).hexdigest()
        
        return sha
    
    def _calculate_spread(self, data: OrderBookData) -> float:
        """Calculate spread in bps"""
        
        if not data.bids or not data.asks:
            return 0
            
        best_bid = data.bids[0][0]
        best_ask = data.asks[0][0]
        mid = (best_bid + best_ask) / 2
        
        return (best_ask - best_bid) / mid * 10000
    
    def _calculate_mid(self, data: OrderBookData) -> float:
        """Calculate mid price"""
        
        if not data.bids or not data.asks:
            return 0
            
        return (data.bids[0][0] + data.asks[0][0]) / 2