高頻度データ分析 — ティックレベルの市場データ処理
暗号資産における高頻度取引はミリ秒/マイクロ秒の時間スケールで行われます。1日数百万のティックを処理し、バースト的なデータフローを扱い、マイクロストラクチャのシグナルを抽出することが、プロのトレーダーとそれ以外を分けます。このガイドでは、Smart Money APIの5分更新サイクルを支えるティックレベルのデータ管理とリアルタイム分析について説明します。
重要な洞察: クジラは市場を瞬時に動かしません。彼らのブロック取引は、オーダーブックの不均衡、ビッドアスクスプレッド、テイカーボリューム比率に検出可能なシグナルを作り出します。Smart Money APIはこれらのシグナルをリアルタイムで捕捉します。
ティックデータの収集と保存
データソース
暗号資産の場合、ティックデータは以下のソースから取得されます:
- 取引所API: Bybit, Binance, Hyperliquid (WebSocketストリーム)
- アグリゲーター: CoinGecko, Kaiko, Tardis.dev (履歴 + ライブ)
- オーダーブックスナップショット: 100ミリ秒ごとまたは更新ごと
Parquetを使用した効率的なティックデータ保存
高速クエリのために圧縮されたカラムナーデータを保存:
Python — ティックデータパイプライン
import pandas as pd
import pyarrow.parquet as pq
# リアルタイムティックバッファ (1時間蓄積して保存)
tick_buffer = []
def on_tick(exchange, symbol, price, size, side, timestamp):
tick_buffer.append({
"timestamp": timestamp,
"exchange": exchange,
"symbol": symbol,
"price": price,
"size": size,
"side": side # "buy" or "sell"
})
# 毎時、圧縮して保存
if len(tick_buffer) > 1_000_000:
df = pd.DataFrame(tick_buffer)
pq.write_table(
pa.Table.from_pandas(df),
f"ticks/{symbol}_{timestamp:%Y%m%d_%H}.parquet",
compression="snappy"
)
tick_buffer = []
オーダーブック分析
レベル2オーダーブックスナップショット
100-500ミリ秒ごとに完全なオーダーブックをキャプチャ:
Python — オーダーブック処理
class OrderBook:
def __init__(self):
self.bids = {} # price -> size
self.asks = {} # price -> size
def update(self, side, price, size):
if side == "bid":
if size == 0: del self.bids[price]
else: self.bids[price] = size
else:
if size == 0: del self.asks[price]
else: self.asks[price] = size
def get_imbalance(self, depth=10):
# ベスト10のビッドとアスクを取得
top_bids = sorted(self.bids.items(), reverse=True)[:depth]
top_asks = sorted(self.asks.items())[:depth]
bid_volume = sum(size for _, size in top_bids)
ask_volume = sum(size for _, size in top_asks)
# インバランス: >1 = 強気(買い圧力優勢)
return bid_volume / ask_volume if ask_volume > 0 else 1.0
def get_spread(self):
best_bid = max(self.bids.keys())
best_ask = min(self.asks.keys())
return (best_ask - best_bid) / best_bid # スプレッド率(パーセンテージ)
マイクロストラクチャーシグナル
オーダーブック構造から実用的なシグナルを抽出:
- 買い-売りインバランス: 上位10レベルの買い vs 売りボリューム比率
- スプレッド圧縮: スプレッド縮小 = 強い確信
- アイスバーグ識別: 同一価格での部分約定を検出(隠されたボリューム)
- フラッシュクラッシュ: マイクロ秒単位での5%+急落(流動性イベント)
市場マイクロストラクチャーメトリクス
出来高加重平均価格 (VWAP)
単純な終値より優れた執行ベンチマーク:
Python — VWAP計算
def calculate_vwap(ticks):
# ticks: (価格, 出来高) タプルのリスト
numerator = sum(price * volume for price, volume in ticks)
denominator = sum(volume for _, volume in ticks)
return numerator / denominator
テイカー買い/売り比率
どちら側が積極的かを識別:
Python — テイカー分析
def get_taker_direction(tick):
# 約定価格 = bidなら売り手が積極的(供給)
# 約定価格 = askなら買い手が積極的(需要)
if abs(tick.price - best_bid) < tick.price_step:
return "sell"
elif abs(tick.price - best_ask) < tick.price_step:
return "buy"
else:
return "mid" # Inside spread, possibly dark pool
buy_volume = sum(t.size for t in ticks if get_taker_direction(t) == "buy")
sell_volume = sum(t.size for t in ticks if get_taker_direction(t) == "sell")
return buy_volume / (buy_volume + sell_volume) # % buy
リアルタイムパイプラインアーキテクチャ
WebSocketストリーム処理
Bybit/Binance/HyperliquidのWebSocketに接続してライブデータを取得:
Python — ライブストリームハンドラ
import asyncio
import websockets
async def connect_bybit_ticks(symbol):
url = f"wss://stream.bybit.com/v5/public/spot"
async with websockets.connect(url) as ws:
# Subscribe to trade stream
await ws.send(json.dumps({
"op": "subscribe",
"args": [f"publicTrade.{symbol}"]
}))
async for message in ws:
data = json.loads(message)
for trade in data["data"]:
on_tick(
exchange="bybit",
symbol=symbol,
price=float(trade["price"]),
size=float(trade["size"]),
side=trade["side"],
timestamp=int(trade["time"])
)
Redis Streamsを使用した分散処理
メッセージキューイングで1日数百万のティックを処理:
Python — Redisストリーム処理
import redis
r = redis.Redis(host='localhost', port=6379)
# Producer: ストリームにティックをプッシュ
def publish_tick(exchange, symbol, tick):
stream_key = f"ticks:{exchange}:{symbol}"
r.xadd(stream_key, {
"price": tick.price,
"size": tick.size,
"side": tick.side,
"ts": tick.timestamp
})
# Consumer group reads with lag tracking
r.xgroup_create(stream_key, "analytics", id="$", mkstream=True)
リアルタイムシグナルをアナリティクスに追加
Smart Money APIは3つの取引所と250以上のクジラウォレットからのティックデータを集約します。事前計算されたマイクロストラクチャシグナルを使用して、独自のリアルタイム分析を強化します。
今日から無料で始める →