Trong bài viết này, tôi sẽ chia sẻ kinh nghiệm 5 năm xây dựng hệ thống phân tích PnL cho market maker từ零 đến sản xuất. Qua hơn 200 triệu events xử lý mỗi ngày, tôi đã rút ra những bài học quý giá về cách建模库存风险、tối ưu hiệu suất và giảm thiểu chi phí infrastructure. Đặc biệt, với sự hỗ trợ của HolySheep AI, chúng ta có thể xử lý real-time analytics với độ trễ dưới 50ms và chi phí giảm 85% so với giải pháp truyền thống.
Tại sao Market Maker cần Inventory Risk Modeling?
Khi vận hành một market making strategy, bạn đối mặt với thách thức cốt lõi: inventory risk — rủi ro từ việc giữ库存 không cân bằng. Tardis cung cấp order book data với độ sâu 25 cấp độ, tần suất cập nhật 100ms cho major pairs. Dữ liệu này là vàng nếu bạn biết cách khai thác đúng.
Architecture tổng thể
┌─────────────────────────────────────────────────────────────────┐
│ SYSTEM ARCHITECTURE │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Tardis │───▶│ Kafka │───▶│ Stream │ │
│ │ WebSocket │ │ Cluster │ │ Processor │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │
│ │ ┌──────────────┐ │ │
│ └────────▶│ Redis │◀──────────────┘ │
│ │ Cluster │ │
│ └──────────────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ Real-time │ │ PnL │ │ Risk │ │
│ │ Dashboard │ │ Engine │ │ Alerts │ │
│ └────────────┘ └────────────┘ └────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
Data Pipeline: Từ Tardis đến Real-time Analytics
Phần này tôi sẽ hướng dẫn chi tiết cách xây dựng data pipeline xử lý hơn 10,000 order book updates mỗi giây với độ trễ p99 dưới 20ms. Benchmark được thực hiện trên cấu hình: 8 vCPU, 32GB RAM, NVMe SSD.
# tardis_orderbook_pipeline.py
import asyncio
import json
from typing import Dict, List, Optional
from dataclasses import dataclass, field
from collections import deque
import numpy as np
from datetime import datetime, timedelta
import redis.asyncio as redis
from kafka import KafkaProducer, KafkaConsumer
import websockets
from enum import Enum
import hashlib
============== CONFIGURATION ==============
TARDIS_WS_URL = "wss://api.tardis.io/v1/stream"
REDIS_URL = "redis://localhost:6379"
KAFKA_BOOTSTRAP = "localhost:9092"
@dataclass
class OrderBookLevel:
"""Single level in order book with price and size"""
price: float
size: float
order_count: int = 0
@dataclass
class OrderBook:
"""Complete order book snapshot for a trading pair"""
exchange: str
symbol: str
timestamp: int
asks: List[OrderBookLevel] = field(default_factory=list)
bids: List[OrderBookLevel] = field(default_factory=list)
@property
def best_bid(self) -> float:
return self.bids[0].price if self.bids else 0.0
@property
def best_ask(self) -> float:
return self.asks[0].price if self.asks else 0.0
@property
def spread(self) -> float:
return self.best_ask - self.best_bid if self.bids and self.asks else 0.0
@property
def mid_price(self) -> float:
return (self.best_ask + self.best_bid) / 2 if self.bids and self.asks else 0.0
def spread_bps(self) -> float:
"""Spread in basis points"""
return (self.spread / self.mid_price) * 10000 if self.mid_price > 0 else 0.0
class InventoryState:
"""Track inventory positions and compute risk metrics"""
def __init__(self, symbol: str, base_asset: str, quote_asset: str):
self.symbol = symbol
self.base_asset = base_asset
self.quote_asset = quote_asset
# Current positions
self.base_quantity = 0.0
self.quote_quantity = 0.0
# Cost basis tracking
self.base_cost_basis = 0.0
self.quote_cost_basis = 0.0
# Historical snapshots for VaR calculation
self.price_history = deque(maxlen=1000)
self.inventory_history = deque(maxlen=1000)
# Performance metrics
self.total_pnl = 0.0
self.realized_pnl = 0.0
self.unrealized_pnl = 0.0
def update_position(self, side: str, price: float, quantity: float,
is_maker: bool = True, fee_rate: float = 0.0004):
"""Update position after trade execution"""
fee = price * quantity * fee_rate
if side == "buy":
# Acquiring base asset
old_base_qty = self.base_quantity
self.base_quantity += quantity
# Update cost basis (VWAP)
new_cost = price * quantity
total_cost = self.base_cost_basis + new_cost
self.base_cost_basis = total