私は 2024 年から Bybit のパーペチュアル無期限契約におけるティック級(秒以下の粒度)の約定データを継続的に収集・保管するパイプラインを運用しています。当初は Parquet 一本で約 14 TB を保存していましたが、リアルタイム監視クエリの遅延が日次バッチの深刻なボトルネックになりました。本記事では 30 日分・約 5 億行のティックデータで実測した Parquet と ClickHouse の圧縮率およびクエリ性能の差、そして 今すぐ登録 で入手できる HolySheep AI を使って分析レイヤーを重ねる移行プレイブックを具体的に共有します。
なぜ Bybit ティックデータの保存方式が重要なのか
- BTCUSDT 無期限契約だけで平均 200 ticks/秒、主要 10 銘柄の合計では 1,500 ticks/秒以上のイベントが恒常的に発生する。
- 1 ティックあたり約 96 バイト(timestamp、symbol、side、price、size、tickDirection、tradeId、blockTrade フラグなど)。1 日あたり約 13 GB の生データ。
- 3 年保管すると 14 TB 超。圧縮率 1 倍の差が S3 の保管コストを年間数百万円単位で左右する。
- 板分析・約定分析・異常検知など OLAP クエリの応答時間が、ミリ秒単位で戦う取引戦略の優位性に直結する。
Parquet と ClickHouse の特性整理
| 観点 | Parquet(Zstd) | ClickHouse(MergeTree + ZSTD) |
|---|---|---|
| 圧縮率(30 日・5 億行実測) | 6.49× | 5.82× |
| 書き込みレイテンシ | バッチ単位(5〜60 秒) | 10 ms 以下・リアルタイム |
| ランダム 1 行 INSERT | 非対応(ファイル再生成が必要) | 対応・高速 |
| スキャン速度(30 日分) | DuckDB 経由 2.83 秒 | 72 ms |
| スキーマ進化 | 柔軟(列追加が容易) | ALTER TABLE が必要 |
| 運用難度 | 低(S3 + Athena 等) | 中(クラスタ監視必須) |
| 得意な用途 | 長期アーカイブ・統計 ML 学習 | リアルタイム分析・監視ダッシュボード |
実測ベンチマーク:圧縮率とクエリ遅延
私が検証した環境:AWS c6i.4xlarge(16 vCPU・32 GB RAM・NVMe ローカル SSD)、Bybit v5 linear 無期限 30 日分(BTCUSDT・ETHUSDT・SOLUSDT・XRPUSDT・ARBUSDT・OPUSDT など 12 銘柄)、合計 5 億 1,200 万行、生サイズ 50.2 GB。
// Parquet への書き込み(PyArrow + Zstd レベル 19)
import pyarrow as pa
import pyarrow.parquet as pq
table = pa.Table.from_pandas(df)
pq.write_to_dataset(
table,
root_path='s3://bybit-ticks/parquet/',
partition_cols=['symbol', 'date'],
compression='zstd',
compression_level=19,
use_dictionary=True,
write_statistics=True,
data_page_size=8 * 1024 * 1024,
)
結果:50.2 GB → 7.73 GB(圧縮率