ML Documentation

Hyperliquid L2 Orderbook Crawler (Rust版)

概要

高性能なRust実装によるHyperliquid L2オーダーブック取得システムです。WebSocket経由でリアルタイムのオーダーブックデータを取得し、RedPanda (Kafka)を通じてQuestDBに保存します。

アーキテクチャ

Hyperliquid WebSocket API
         ↓
[Rust Orderbook Crawler]
         ↓
    RedPanda/Kafka
         ↓
[Rust Orderbook Consumer]
         ↓
      QuestDB

主な機能

1. Orderbook Crawler

2. Orderbook Consumer

データ構造

orderbook_snapshots テーブル

- timestamp: タイムスタンプ
- exchange: 取引所名
- symbol: シンボル
- best_bid_price/size: 最良買い価格/数量
- best_ask_price/size: 最良売り価格/数量
- mid_price: 仲値
- spread: スプレッド
- spread_bps: スプレッド(ベーシスポイント)
- depth_imbalance: 板の不均衡度
- bid/ask_liquidity: 買い/売り流動性
- weighted_mid_price: 加重平均価格

orderbook_levels テーブル

- timestamp: タイムスタンプ
- exchange: 取引所名
- symbol: シンボル
- side: 売買区分(bid/ask
- level: レベル(0が最良気配)
- price: 価格
- size: 数量

orderbook_metrics テーブル

- spread_mean/std/min/max_1min: 1分間のスプレッド統計
- bid/ask_depth_5_levels: 上位5レベルの板厚
- depth_imbalance_5_levels: 上位5レベルの不均衡度
- liquidity_score: 流動性スコア
- market_depth_score: 市場深度スコア

環境変数

Crawler

RUST_LOG=hyperliquid_orderbook_crawler=info
KAFKA_BROKERS=redpanda:9092
SYMBOLS=ETH,SOL,AVAX,HYPE
KAFKA_TOPIC=hyperliquid-orderbook
ORDERBOOK_LEVELS=20          # 保存する板のレベル数
BATCH_SIZE=100              # バッチサイズ
FLUSH_INTERVAL_MS=1000      # フラッシュ間隔(ミリ秒)

Consumer

RUST_LOG=hyperliquid_orderbook_consumer=info
KAFKA_BROKERS=redpanda:9092
KAFKA_TOPIC=hyperliquid-orderbook
QUESTDB_HOST=questdb
QUESTDB_PORT=8812
QUESTDB_HTTP_PORT=9000
MAX_LEVELS_TO_STORE=10      # QuestDBに保存する最大レベル数
ENABLE_METRICS_CALCULATION=true  # メトリクス計算の有効化

起動方法

# 新しいサービスを含めてすべて起動
docker-compose up -d

# オーダーブッククローラーのみ起動
docker-compose up -d hyperliquid-orderbook-crawler hyperliquid-orderbook-consumer

# ログの確認
docker-compose logs -f hyperliquid-orderbook-crawler
docker-compose logs -f hyperliquid-orderbook-consumer

モニタリング

Prometheusメトリクス

# Crawlerメトリクス
curl http://localhost:19090/metrics

# 主なメトリクス:
- hyperliquid_orderbook_messages_sent_total: 送信メッセージ数
- hyperliquid_orderbook_websocket_connections_total: WebSocket接続数
- hyperliquid_orderbook_errors_total: エラー数
- hyperliquid_orderbook_batch_duration_seconds: バッチ処理時間

QuestDBクエリ例

-- 最新のオーダーブックスナップショット
SELECT * FROM orderbook_snapshots 
WHERE symbol = 'ETH' 
ORDER BY timestamp DESC 
LIMIT 10;

-- 特定時点の板情報(10レベル)
SELECT * FROM orderbook_levels 
WHERE symbol = 'ETH' 
  AND timestamp = '2024-01-01T00:00:00.000Z'
ORDER BY side, level;

-- 1時間のスプレッド推移
SELECT 
  timestamp,
  spread_mean_1min,
  spread_std_1min
FROM orderbook_metrics
WHERE symbol = 'ETH'
  AND timestamp > dateadd('h', -1, now())
ORDER BY timestamp;

-- 流動性の時系列変化
SELECT 
  timestamp,
  bid_liquidity + ask_liquidity as total_liquidity,
  depth_imbalance
FROM orderbook_snapshots
WHERE symbol = 'ETH'
SAMPLE BY 1m
ORDER BY timestamp DESC
LIMIT 60;

パフォーマンス最適化

  1. バッチ処理: 複数のオーダーブック更新をバッチで送信
  2. 非同期処理: Tokioランタイムによる高効率な非同期処理
  3. ゼロコピー: 可能な限りデータコピーを避ける実装
  4. LTO最適化: Link Time Optimizationによるバイナリ最適化

トラブルシューティング

WebSocket接続エラー

# ログを確認
docker logs hyperliquid-orderbook-crawler

# ネットワーク接続を確認
docker exec hyperliquid-orderbook-crawler ping api.hyperliquid.xyz

Kafka接続エラー

# RedPandaの状態を確認
docker exec -it redpanda rpk cluster health

# トピックの確認
docker exec -it redpanda rpk topic list

QuestDB書き込みエラー

# QuestDBのログを確認
docker logs questdb

# テーブルの存在確認
curl -G "http://localhost:9000/exec" --data-urlencode "query=SHOW TABLES"

今後の拡張予定

  1. 差分更新のサポート: フルスナップショットではなく差分更新の処理
  2. 複数取引所対応: Binance、Bybitなどのオーダーブック統合
  3. リアルタイム分析: ストリーミング分析エンジンの追加
  4. 機械学習統合: オーダーブックパターン認識モデルの実装