アルゴリズム取引システムにおけるデータ通信:技術概要
アルゴリズム取引において、利益と損失の差はマイクロ秒単位で測定されることがあります。データ伝送アーキテクチャは、取引システムの効率を決定する重要な要因の一つです。本記事では、取引所とのインタラクションから内部のサービス間通信、ストレージ、データ配信に至るまで、あらゆるレベルの通信技術を解説します。

本記事は「外部」(取引所プロトコル)から「内部」(IPC、メッセージブローカー、ストレージ)へとレベル順に構成されており、アルゴリズム取引プラットフォームの実際のアーキテクチャを反映しています。

1. 取引所との通信:REST、WebSocket、FIX
1.1 REST API
RESTは、取引所APIとやり取りする最も簡単で一般的な方法です。各リクエストは独立したHTTP接続です:TCPハンドシェイク → TLSハンドシェイク → リクエスト送信 → レスポンス受信 → 接続クローズ。
取引におけるRESTの問題点:
各リクエストには接続セットアップのオーバーヘッドが伴います。HTTP keep-aliveを使用しても、「リクエスト-レスポンス」モデルではリクエストを送信するよりも速くデータを受信することはできません。これはポーリングにつながります——「新しいデータはありますか?」という無限のクエリサイクルで、取引所サーバーの負荷の最大80%を生み出します(暗号取引所開発者による)。取引所はレートリミット(通常1分間に10〜1200リクエスト)を導入しており、RESTは高頻度戦略には不向きです。
RESTが適切な場合: 過去データの取得(ローソク足、OHLCV)、アカウント管理(残高、ポジション)、非リアルタイム操作(DCAボット、1時間ごとのリバランス)。
1.2 WebSocket
WebSocketは、データが双方向に流れる1つの永続的なTCP接続を確立します。通常のHTTPリクエストとしてUpgradeヘッダーで開始し、その後双方向フレーミングプロトコル(ペイロードはテキストJSONまたはバイナリ)に切り替わります。
取引における利点:
主な利点は、リクエストごとのオーバーヘッドがないことです。一度確立されると、データはサーバーから即座にプッシュされます。WebSocket経由のマーケットデータ配信レイテンシは、取引所ゲートウェイからクライアントまで通常50ミリ秒未満です。1つの接続で50以上のシンボルを同時にサブスクライブできます。
重要なポイント:WebSocket経由の注文。 多くのトレーダーは、一部の取引所(Binance、HitBTC、Deribit、Bybitなど)がWebSocket経由で注文を送信できること——データの受信だけでなく——を知りません。これは以下の理由でRESTよりも根本的に高速です:
- 各注文でTCP/TLSハンドシェイクが不要(接続はすでに「ウォーム」)
- HTTPオーバーヘッドなし(ヘッダー、Cookie等)
- 非同期モデル:注文を送信し、同じWebSocketを通じてスレッドをブロックせずに確認を受信。
Deribitによると、WebSocketとFIXはしばしば同じ実行速度を持ちます。RESTは接続レベルの前処理のため若干遅くなります。WebSocket注文はFIX注文と同様にマッチングエンジンキューに入ります。
コンテキスト混在問題。 REST経由で注文を送信し、WebSocket経由で約定通知を受信すると、レースコンディションが発生します:WebSocket通知がRESTリクエストの完了前に到着する可能性があります。これは状態の不整合につながります。解決策は、同じWebSocketで注文を送信し、完全に非同期モデルに移行することです。
1.3 FIXプロトコル(Financial Information eXchange)
FIXは1992年から存在する電子取引の産業標準です(Fidelity InvestmentsとSalomon Brothersによって作成)。取引のために特別に設計されたバイナリオーバーTCPプロトコルです。
FIXアーキテクチャ:
- セッション層 — 接続管理、ハートビート、シーケンス番号、ギャップリカバリ。配信とメッセージ順序を保証。
- アプリケーション層 — ビジネスロジック:注文タイプ、約定レポート、マーケットデータリクエスト。
FIXメッセージはSOH文字で区切られた「タグ=値」ペアで構成されます。例えば、AAPLの100株を$150で買う注文は次のようになります:
8=FIX.4.2|35=D|49=BUYER|56=SELLER|11=ORD1001|38=100|40=2|54=1|55=AAPL|44=150.00
FIXがWebSocketより高速な理由: FIXはHTTP層のないネイティブTCPプロトコルです。AWSは暗号取引所のtick-to-trade最適化ガイドで、プロトコル起因のレイテンシを最小化するためにFIXをRESTやWebSocketより明示的に推奨しています。FIXはマイクロ秒レベルで動作しますが、WebSocketは通常ミリ秒です。
FIXが支配的な場面: 取引所マッチングエンジンへのDMA(Direct Market Access)、機関投資家向けのアルゴリズム・HFT取引、流動性集約(プライムブローカーがFIX経由で数十の銀行に接続)。
FIXの制限: 統合の複雑さ、時代遅れのメッセージフォーマット(テキストのタグ-値はバイナリフォーマットより効率が低い)、参入障壁の高さ。暗号業界ではFIXをサポートする取引所は限られています。
1.4 SBE(Simple Binary Encoding)— FIXの進化形
SBEは、FIX Trading Community内のHigh Performance Working Groupによって作成されたバイナリシリアライゼーションフォーマットです。そのミッションは、超低レイテンシ取引のためにテキストFIXフォーマットをコンパクトなバイナリ表現に置き換えることです。
SBEの主要原則:
- Zero-copy flyweightパターン — エンコーダとデコーダがバッファ上の「テンプレート」として機能。値は中間コピーなしで直接書き込まれます(複数回コピーが必要なProtobufとは異なる)。
- ワイヤフォーマット = メモリフォーマット — ワイヤ上のデータはメモリ上と同じ形式で、変換オーバーヘッドを最小化。
- 固定フィールドが先、可変フィールドが後 — Protocol Buffersと比較して桁違いのパフォーマンスを実現する設計制約。
SBE + Aeronは高性能取引システムの標準的な組み合わせです。AeronはReal Logicによるオープンソースメッセージングシステムです(元LMAX Exchange CTOのMartin Thompsonと元29West/Ultra Messaging CTOのTodd Montgomeryが作成)。実質的にUDPと共有メモリ上で動作する金融システム向け特殊トランスポート層であり、1桁マイクロ秒のレイテンシを実現します。SBEがシリアライゼーションを担当し、Aeronがマイクロ秒の遅延で配信を管理します。Aeronの詳細はセクション3.1で説明します。
1.5 取引所プロトコル比較表

| パラメータ | REST | WebSocket | FIX | FIX+SBE |
|---|---|---|---|---|
| レイテンシ | 10–100+ ms | 1–50 ms | 10–500 μs | 1–100 μs |
| モデル | リクエスト-レスポンス | 双方向プッシュ | 双方向セッション | 双方向セッション |
| 注文 | 可能(同期) | 可能(非同期、部分的) | 可能(ネイティブ) | 可能(ネイティブ) |
| 接続ウォームアップ | 毎リクエスト | 1回のみ | 1回のみ | 1回のみ |
| フォーマット | JSON/テキスト | JSON/バイナリ | タグ-値テキスト | バイナリ |
| 統合難易度 | 低 | 中 | 高 | 非常に高 |

2. 内部マイクロサービス通信
データが取引所からシステムに入ると、内部処理が始まります:パース → 戦略 → 判断 → 注文送信。各ステップでサービス間通信が行われます。
2.1 gRPC双方向ストリーミング(TCP)
gRPCは、シリアライゼーションにProtocol Buffersを使用するHTTP/2ベースのGoogleフレームワークです。アルゴリズム取引では、双方向ストリーミングが特に重要です——クライアントとサーバーが1つの接続で同時にメッセージストリームを送信する方式です。
gRPCが取引システムに適する理由:
- ProtobufはJSON比で3〜10倍コンパクト
- HTTP/2マルチプレキシング — 1つのTCP接続で複数のストリーム
- .protoスキーマによる厳密な型付けでコンパイル時にエラーを検出
- Python、Rust、Go、C++、Java等のコード生成
- 双方向ストリーミングにより、1つのチャネルで「マーケットデータ下り、注文上り」パターンを実現。
SmartDevによると、AI駆動HFTを展開する金融機関の70%がマイクロ秒応答時間のためにgRPCまたは生TCPを使用しています。
アーキテクチャ例: Market Data Collector(Rust)→ gRPCストリーム → Strategy Engine(Python/Rust)→ gRPCコール → Order Router(Rust)→ WebSocket/FIX → 取引所。
2.2 Unix Domain Socket(UDS)経由のgRPC
サービスが同一マシン上で動作する場合(コロケーションの典型例)、TCPは不要なオーバーヘッドです。Unix Domain Socket(UDS)はネットワークスタック全体をバイパスします:TCPハンドシェイク、ルーティング、チェックサムなし。
ベンチマークは大きな差を示しています:
- UDS経由gRPC:約102 μs/リクエスト(100Kリクエスト)
- TCP経由gRPC:約127 μs/リクエスト(100Kリクエスト)
- UDS効果:小メッセージで約20%、大メッセージ(100KB+)で最大50%の改善。
F. Werner(MPI Heidelberg)によると、gRPC UDSと生ブロッキングI/O UDSを比較すると、gRPCは約10倍のオーバーヘッドを追加します——中央値約130 μs vs 生UDSの約13 μs。これは抽象化のコスト(HTTP/2フレーミング、protobufシリアライゼーション)です。
gRPC+UDSを使うべき場面: 開発者の利便性(スキーマ、コード生成)が絶対的な最小レイテンシよりも重視される場合の、単一サーバー上のプロセス間通信。UDSはUnixファイルパーミッションによるセキュリティ上の利点もあります。
使うべきでない場面: 10 μs未満のレイテンシが必要な場合は、共有メモリまたはgRPCなしの生UDSの方が適しています。参考:生UDS中央値約13 μs、gRPC UDS中央値約130 μs。共有メモリ(Aeron IPC)は1 μs未満、LMAX Disruptorリングバッファは約50〜100 ns。したがって、gRPC+UDSは生UDSより約10倍遅く、共有メモリより100〜1000倍遅くなります。ただし、レイテンシが低くなるほどコードの複雑さは増します。
自分で再現してみましょう: このセクションのすべてのIPCレイテンシ数値は、オープンソースのコンパニオンベンチマーク**suenot/trading-ipc-bench**で再現可能です——TCP、UDS、ZeroMQ IPC/TCP、WebSocket、Redis Pub/Sub、共有メモリ、名前付きパイプのラウンドトリップのPython実装で、自分のハードウェア上でp50/p95/p99/p99.9レイテンシとスループットを測定します。
gRPCなしの生UDS — gRPCのオーバーヘッドが過大な場合、gRPCを除去してソケットだけを維持します。パフォーマンス降順のオプション:
- AF_UNIXソケット + カスタムシリアライゼーション(SBE、FlatBuffers、MessagePack)— 中央値約13 μs、最大制御、最大複雑さ
- ZeroMQ IPC(
ipc://) — 約50〜100 μs、ボイラープレートなしの既成パターン(PUB/SUB、REQ/REP)、内部でUDSを使用 - nanomsg/NNG IPC — ZeroMQと同様、小メッセージ(<64 KB)で若干優れたレイテンシ
- Cap'n Proto RPC over UDS — ゼロコピーシリアライゼーション + RPC抽象化、gRPCより高速、スキーマあり
2.3 共有メモリIPC
同一ホスト上の超低レイテンシには共有メモリを使用します。2つのプロセスが同じRAMセグメントをマッピングし、データはシステムコールなしで(初期セットアップを除いて)受け渡されます。
LMAX Disruptorパターン(共有メモリ上のリングバッファ)は、単一スレッドで毎秒約600万イベントを処理します。このアプローチはLMAX Exchangeと多くのHFTシステムの中核です。
実装: Aeron IPC(Java/C++)、Chronicle Queue(Java)、カスタムmmapベースソリューション(Rust/C++)。IronSBE(Rust SBE実装)はSPSCチャネルレベルで約20 nsのレイテンシで共有メモリIPCをサポートします。
3. トランスポートシステム:メッセージブローカーとライブラリ
3.1 Aeron — ゴールドスタンダード
Aeronは、Real Logicが開発した高性能メッセージトランスポートシステムです。作成者はMartin Thompson(元LMAX CTO)とTodd Montgomery(元29West CTO)です。2014年に米国の大手取引所向けに始まり、現在70以上のコントリビューターと5000以上のGitHubサブスクライバーがいます。
実際には: Aeronはブローカー(Kafkaのような)でもソケットライブラリ(ZeroMQのような)でもありません。予測可能な低レイテンシのために設計されたトランスポート層です。UDP(ネットワーク)と共有メモリ(IPC)上で動作し、生のUDPにはない信頼性のある配信、順序付け、フロー制御を提供します。Aeronは「UDPレイテンシのTCP」と考えてください。
Aeronの特性:
- レイテンシ:クラウドで100 μs未満、ベアメタルで18 μs未満。
- スループット:マイクロ秒レイテンシで100万メッセージ/秒以上。
- ピーク2000万メッセージ/秒以上。
- ブローカーレス — 単一障害点なし。
- ユニキャスト、マルチキャスト、IPCをサポート。
- 内蔵のフロー制御とロス検出。
Aeron Cluster — 最小限の追加レイテンシで一貫した取引ロジックのためのフォールトトレラントなステートマシンレプリケーション(Raftコンセンサス)。
Aeron Archive — フルストリーム速度でのメッセージ永続化とリプレイ機能。
Aeron Sequencer — エコシステムの最新コンポーネントで、大規模組織全体で複数のプロジェクトを調整するために設計。Aeron TransportとAeron Clusterの上に構築。主な特性:
- 分散ログ — フォールトトレランスのために複数のマシンにレプリケートされるメッセージの長いシーケンス
- 複数リーダー — 複数のアプリケーションが異なる目的で同じログから同時に読み取り
- 分離されたチーム — チームは単一の調整されたシステム内で独立性を維持
- 対象ユースケース:マーケットデータ処理、ブローカープラットフォーム、取引所エンジン
Kafkaとの比較: どちらも分散ログを使用しますが、Aeronはマイクロ秒レイテンシ向け、Kafkaはミリ秒の耐久性とスループット向けです。Aeronはリアルタイムロジック用、Kafkaはデータパイプラインと分析用です。
3.2 Apache Kafka
Apache Kafkaは大規模イベントストリーミングの事実上の標準です。取引のホットパス向けではありません(ミリ秒の遅延)が、以下には不可欠です:
- マーケットデータ集約: 100以上の取引所からのストリームを1つのパイプラインに収集。
- イベントソーシング: すべてのシステムアクションをイベントトピックとして記録。
- CDC(Change Data Capture): 取引DBの変更を分析に流す。
- QuestDB統合: Kafka → QuestDBでリアルタイムティック分析。
エンドツーエンドのレイテンシは2〜15 ms。HFTには許容できませんが、1秒以上のホライズンを持つ戦略には十分です。
3.3 Redis Pub/Subとストリーム
Redisはインメモリストアであり、軽量ブローカーとしても機能します。
Redis Pub/Sub — ファイアアンドフォーゲット;サブミリ秒のレイテンシ。リアルタイム通知に最適:価格更新、戦略シグナル、アラート。
Redis Streams — 永続化とコンシューマーグループ(ミニKafka)を追加。履歴の読み取りとACKをサポート。
Redisは小メッセージに対してKafkaより高速(サブミリ秒)ですが、Kafkaのヘビーデューティなレプリケーションと耐久性には欠けます。
3.4 NATS
NATSはGoによる超軽量システムです。サブミリ秒のレイテンシ、内蔵のpub/sub、リクエスト/リプライ。NATS JetStreamは永続化とexactly-once配信を追加します。
3.5 ZeroMQとnanomsg
ピアツーピア通信のためのソケット抽象化を提供するブローカーレスライブラリ。ZeroMQは500万メッセージ/秒以上を処理し、2007年から実戦で検証済みです。nanomsg(およびNNG)はその「後継」で、小メッセージ(<64KB)でより優れたレイテンシを実現します。
4. クライアント向けリアルタイムPUB/SUB:Centrifugo
CentrifugoはGoで書かれたセルフホスト型PUB/SUBサーバーで、WebSocket、SSE、またはgRPC経由で数千〜数百万のクライアントへのブロードキャストに最適化されています。
Centrifugoがアルゴ取引に適する理由:
- 1台のサーバーで100万WebSocket接続と毎分3000万メッセージを処理。
- 60Hzストリーミングをサポート。
- トラフィック最小化のためのデルタ圧縮(Fossilアルゴリズム)。
- Webダッシュボードやモバイルアプリへの「ラストマイル」に最適。
5. リアルタイムアクセスデータストア
5.1 QuestDB — 取引のための時系列データベース
QuestDBはJava(ゼロGC)、C++、Rustで書かれたオープンソースの時系列データベースです。
- クエリ: SIMD経由のサブミリ秒ベクトル化実行。
- SAMPLE BY/ASOF JOIN: トレーダーフレンドリーなネイティブSQL拡張。
- WAL: 超低レイテンシの追記。
- B3(ブラジル証券取引所)が使用。
5.2 データ層としてのRedis
通常は中間層:
- 価格へのO(1)アクセスのためのホットキャッシュ。
- オーダーブック用のソート済みセット。
- アトミック操作のためのLuaスクリプト。
5.3 特殊ソリューション:RayforceDB、AXL DB
ゼロ依存とSIMDアクセラレーションを備えたミニマリストCベースのベクターデータベース(バイナリ<1MB)。HFTのための決定論的レイテンシに焦点。
6. シリアライゼーション:Protobuf vs SBE vs JSON
| フォーマット | エンコード/デコード | サイズ | ゼロコピー | 使用場面 |
|---|---|---|---|---|
| JSON | 遅い | 大きい | 不可 | REST API、デバッグ、ログ |
| Protobuf | 高速 | コンパクト | 不可 | gRPC、サービス間通信 |
| SBE | 超高速 | 最小 | 可能 | HFT、マッチングエンジン |
| FlatBuffers | 非常に高速 | コンパクト | 可能 | ゲーム開発、中レイテンシ |
7. リファレンスアーキテクチャ
7.1 暗号アービトラージ(中頻度)
取引所 → Collector(Rust)→ Redis(ホット)→ Strategy(Python)→ gRPC → Router(Rust)→ 取引所。
7.2 HFTマーケットメイキング(コロケーション)
取引所フィード → Kernel Bypass NIC → Aeron IPC → Strategy(C++)→ SBE → Aeron → 取引所。
8. 実践的アドバイス
- <10 μs(HFT): FPGA、共有メモリ、SBE、Aeron IPC。
- 10–100 μs: Aeron(UDP)、gRPC+UDS、ZeroMQ。
- 100 μs – 1 ms: gRPC(TCP)、WebSocket、Protobuf。
- 1–10 ms(中頻度): WebSocket、Kafka、Redis。
- >10 ms(低頻度/スイング): REST APIで十分。DCA、リバランス、ポートフォリオ管理。
ボトルネックでないものを最適化しないでください。 戦略の判断に50 msかかるなら、Aeronの100 μsの節約は重要ではありません。ハイブリッドアーキテクチャは正常です:セットアップにREST、コアにgRPC、配信にWSを使用。
ベンチマークリポジトリ
この記事で引用されたレイテンシ数値は、**suenot/trading-ipc-bench**で再現できます——ここで議論されたすべての主要IPCトランスポートをカバーするオープンソースのPythonベンチマークスイートです:TCP、UDS、名前付きパイプ、ZeroMQ IPC/TCP、WebSocket、Redis Pub/Sub、共有メモリ。
git clone https://github.com/suenot/trading-ipc-bench
cd trading-ipc-bench
pip install -r requirements.txt
python run_all.py # runs all 8 transports, saves results to results/
python report.py # prints a summary table + ASCII latency chart
自分のハードウェアで実行してください——結果はCPU、OS、カーネルバージョン、チューニングによってこの記事の数値と異なります。それが重要なのです。
結論
「完璧な」通信技術は存在しません。各レベルには固有の要件があります:外部(互換性)、内部(レイテンシ)、パイプライン(信頼性)、クライアント(柔軟性)。アーキテクチャとは、特定の仕事に適切なツールを選ぶことです。
MarketMaker.cc Team
クオンツ・リサーチ&戦略