← К списку статей
March 3, 2026
5 мин. чтения

Коммуникация данных в алготрейдинговых системах: обзор технологий

Коммуникация данных в алготрейдинговых системах: обзор технологий
#алготрейдинг
#архитектура
#WebSocket
#FIX
#gRPC
#Kafka
#Aeron
#Redis
#QuestDB
#HFT

В алгоритмической торговле разница между прибылью и убытком может измеряться микросекундами. Архитектура передачи данных — один из ключевых факторов, определяющих эффективность торговой системы. В этой статье мы разберём технологии коммуникации на всех уровнях: от взаимодействия с биржей до внутренней межсервисной коммуникации, хранения и распространения данных.

Архитектура алготрейдинговой системы

Статья организована по уровням — от "внешнего" (протоколы связи с биржами) к "внутреннему" (IPC, message brokers, хранилища), что отражает реальную архитектуру алготрейдинговой платформы.


Сравнение стеков протоколов: REST, WebSocket, FIX

1. Взаимодействие с биржей: REST, WebSocket, FIX

1.1 REST API

REST — самый простой и распространённый способ взаимодействия с биржевым API. Каждый запрос — это отдельное HTTP-соединение: TCP handshake → TLS handshake → отправка запроса → получение ответа → закрытие соединения.

Проблемы REST для трейдинга:

Каждый запрос несёт на себе overhead установки соединения. Даже с HTTP keep-alive, модель "запрос-ответ" означает, что вы не можете получать данные быстрее, чем отправляете запросы. Это приводит к polling — бесконечному циклу опросов "а есть ли новые данные?", который создаёт до 80% нагрузки на биржевые серверы (по оценкам разработчиков криптобирж). Биржи вводят rate limits (обычно 10–1200 запросов в минуту), что делает REST непригодным для высокочастотных стратегий.

Когда REST уместен: получение исторических данных (свечи, OHLCV), управление аккаунтом (баланс, позиции), операции, не требующие real-time (DCA-боты, ребалансировка раз в час).

1.2 WebSocket

WebSocket устанавливает одно персистентное TCP-соединение, через которое данные текут в обоих направлениях. Начинается как обычный HTTP-запрос с заголовком Upgrade, после чего переключается на двунаправленный фреймовый протокол (payload может быть как текстовым JSON, так и бинарным).

Преимущества для трейдинга:

Главное — нет overhead на каждый запрос. Соединение установлено один раз, и дальше данные push'атся сервером мгновенно. Задержка доставки маркет-данных по WebSocket обычно составляет менее 50 мс от шлюза биржи до клиента. Через одно соединение можно подписаться на 50+ символов одновременно.

Критически важный момент: ордера через WebSocket. Многие трейдеры не знают, что некоторые биржи (Binance, HitBTC, Deribit, Bybit и другие) позволяют отправлять ордера через WebSocket — не только получать данные. Это принципиально быстрее, чем REST, потому что:

  • Нет TCP/TLS handshake на каждый ордер (соединение уже "прогрето")
  • Нет HTTP overhead (заголовки, cookie, и т.д.)
  • Асинхронная модель: отправил ордер — получил подтверждение через тот же WebSocket, не блокируя поток

По данным Deribit, WebSocket и FIX в большинстве случаев имеют одинаковую скорость исполнения. REST немного медленнее из-за pre-processing на уровне соединения. При этом WebSocket-ордера попадают в очередь биржевого matching engine так же, как FIX-ордера.

Проблема смешивания контекстов. Если вы отправляете ордера через REST, а нотификации об их исполнении получаете через WebSocket, возникает race condition: уведомление по WebSocket может прийти раньше, чем завершится REST-запрос. Это ведёт к несогласованности состояния. Решение — отправлять ордера через тот же WebSocket, полностью переходя на асинхронную модель.

1.3 FIX Protocol (Financial Information eXchange)

FIX — индустриальный стандарт электронной торговли, существующий с 1992 года (создан Fidelity Investments и Salomon Brothers). Это бинарный протокол поверх TCP, специально спроектированный для торговых операций.

Архитектура FIX:

  • Session layer — управление соединением, heartbeat, sequence numbering, gap recovery. Гарантирует доставку и порядок сообщений.
  • Application layer — бизнес-логика: типы ордеров, execution reports, market data requests.

Сообщения FIX представляют собой пары "тег=значение", разделённые SOH-символом. Например, ордер на покупку 100 акций AAPL по $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 — это нативный TCP-протокол без HTTP-прослоек. AWS в своём руководстве по оптимизации tick-to-trade для криптобирж прямо рекомендует FIX перед REST и WebSocket для минимизации protocol-induced latency. FIX оперирует на уровне микросекунд, тогда как WebSocket — обычно миллисекунды.

Где FIX доминирует: DMA (Direct Market Access) к matching engine биржи, алгоритмический и HFT-трейдинг в институциональном пространстве, агрегация ликвидности (prime broker подключается к десяткам банков через FIX).

Ограничения FIX: сложность интеграции, устаревший формат сообщений (текстовые тег-значения неэффективны по сравнению с бинарными форматами), высокий порог входа. В криптоиндустрии FIX поддерживается ограниченным числом бирж.

1.4 SBE (Simple Binary Encoding) — эволюция FIX

SBE — это бинарный формат сериализации, созданный High Performance Working Group внутри FIX Trading Community. Задача — заменить текстовый формат FIX на компактное бинарное представление для ультра-low-latency торговли.

Ключевые принципы SBE:

  • Zero-copy flyweight pattern — энкодеры и декодеры работают как "трафарет" поверх буфера. Значения записываются прямо в буфер без промежуточных копий (в отличие от Protobuf, который требует несколько копий).
  • Wire format = memory format — данные на проводе выглядят так же, как в памяти, что минимизирует overhead трансформации.
  • Фиксированные поля в начале, переменные — в конце — это ограничение дизайна, но оно даёт на порядок большую производительность по сравнению с Protocol Buffers.

SBE + Aeron — стандартная комбинация для высокопроизводительных торговых систем. Aeron — это open-source система передачи сообщений от Real Logic (создана Martin Thompson, бывшим CTO биржи LMAX Exchange, и Todd Montgomery, бывшим CTO 29West/Ultra Messaging). По сути это специализированный транспортный слой для финансовых систем, работающий поверх UDP и shared memory с латентностью в единицы микросекунд. В связке SBE отвечает за сериализацию сообщений в компактный бинарный формат, а Aeron — за их передачу с микросекундной задержкой. Подробнее об Aeron — в разделе 3.1.

1.5 Сравнительная таблица протоколов связи с биржей

Сравнение REST, WebSocket, FIX и Aeron

Параметр REST WebSocket FIX FIX+SBE
Латентность 10–100+ мс 1–50 мс 10–500 мкс 1–100 мкс
Модель Request-response Bidirectional push Bidirectional sessions Bidirectional sessions
Ордера Да (синхронно) Да (асинхронно, не все биржи) Да (нативно) Да (нативно)
Прогрев соединения Каждый запрос Один раз Один раз Один раз
Формат JSON/текст JSON/binary Tag-value текст Binary
Сложность интеграции Низкая Средняя Высокая Очень высокая

Микросервисная архитектура торговой системы

2. Внутренняя межсервисная коммуникация

Когда данные попали в вашу систему с биржи, начинается внутренняя обработка: парсинг маркет-данных → стратегия → принятие решения → отправка ордера. На каждом этапе — межсервисная коммуникация.

2.1 gRPC Bidirectional Streaming (TCP)

gRPC — фреймворк от Google на базе HTTP/2, использующий Protocol Buffers для сериализации. Для алготрейдинга особенно важен bidirectional streaming — когда клиент и сервер одновременно отправляют потоки сообщений через одно соединение.

Почему gRPC подходит для торговых систем:

  • Protobuf — компактный бинарный формат (в 3–10 раз меньше JSON)
  • HTTP/2 мультиплексирование — несколько потоков через одно TCP-соединение
  • Строгая типизация через .proto схемы — ошибки ловятся на этапе компиляции
  • Кодогенерация для Python, Rust, Go, C++, Java и других языков
  • Bidirectional streaming позволяет реализовать паттерн "маркет-данные вниз, ордера вверх" через один канал

По данным SmartDev, 70% финансовых институтов, развёртывающих HFT с использованием AI, применяют gRPC или raw TCP для достижения микросекундного времени отклика.

Пример архитектуры: Market Data Collector (Rust) → gRPC stream → Strategy Engine (Python/Rust) → gRPC call → Order Router (Rust) → WebSocket/FIX → Биржа.

2.2 gRPC через Unix Domain Socket (UDS)

Если сервисы работают на одной машине (что типично для co-location), TCP — это лишний overhead. Unix Domain Socket (UDS) убирает весь сетевой стек: нет TCP handshake, нет routing, нет checksumming.

Бенчмарки показывают существенную разницу:

  • gRPC через UDS: ~102 мкс/запрос (100K запросов)
  • gRPC через TCP: ~127 мкс/запрос (100K запросов)
  • Выигрыш UDS: ~20% на мелких сообщениях, до 50% на крупных (100KB+)

По замерам F. Werner (MPI Heidelberg), при сравнении gRPC UDS с raw blocking I/O через UDS, gRPC добавляет примерно 10x overhead — медиана ~130 мкс против ~13 мкс для raw UDS. Это плата за удобство абстракции (HTTP/2 framing, protobuf serialization).

Когда использовать gRPC+UDS: межпроцессная коммуникация на одном сервере, когда важнее удобство разработки (schema, codegen) чем абсолютная минимизация латентности. UDS также даёт преимущество в безопасности — Unix file permissions контролируют доступ.

Когда НЕ использовать: если нужна латентность <10 мкс, лучше shared memory или raw UDS без gRPC. Конкретные цифры: raw blocking I/O через UDS — медиана ~13 мкс, gRPC через UDS — медиана ~130 мкс (замеры F. Werner, MPI Heidelberg на AMD EPYC). Shared memory (Aeron IPC) — менее 1 мкс, LMAX Disruptor ring buffer — порядка 50–100 нс на событие. То есть gRPC+UDS проигрывает raw UDS примерно в 10 раз, а shared memory — в 100–1000 раз быстрее gRPC. Но каждый шаг вниз по латентности — это шаг вверх по сложности кода.

Воспроизведите сами: цифры из этого раздела можно измерить на своём железе с помощью открытого бенчмарка suenot/trading-ipc-bench — Python-реализации TCP, UDS, ZeroMQ IPC/TCP, WebSocket, Redis Pub/Sub, Shared Memory и Named Pipe с измерением p50/p95/p99/p99.9 задержки и throughput.

Raw UDS без gRPC — если overhead gRPC избыточен, убираем его, оставляя только сокет. Варианты по убыванию производительности:

  • AF_UNIX сокеты + кастомная сериализация (SBE, FlatBuffers, MessagePack) — ~13 мкс медиана, максимальный контроль, максимальная сложность
  • ZeroMQ IPC (ipc://) — ~50–100 мкс, готовые паттерны (PUB/SUB, REQ/REP) без boilerplate, использует UDS под капотом
  • nanomsg/NNG IPC — аналогично ZeroMQ, чуть лучше латентность на малых сообщениях (<64 KB)
  • Cap'n Proto RPC over UDS — zero-copy сериализация + RPC-абстракция, быстрее gRPC, есть schema

2.3 Shared Memory IPC

Для ультра-low-latency на одном хосте — shared memory. Два процесса маппят один и тот же участок RAM, и данные передаются без каких-либо syscall'ов (кроме начальной настройки).

Паттерн LMAX Disruptor (ring buffer в shared memory) демонстрирует обработку ~6 миллионов событий в секунду на одном потоке. Этот подход лежит в основе архитектуры LMAX Exchange и многих HFT-систем.

Реализации: Aeron IPC (Java/C++), Chronicle Queue (Java), custom mmap-based solutions (Rust/C++). IronSBE (Rust-реализация SBE) поддерживает shared memory IPC с латентностью ~20 наносекунд на уровне SPSC-канала.


3. Транспортные системы: Message Brokers и Messaging Libraries

3.1 Aeron — стандарт для торговых систем

Aeron — это open-source высокопроизводительная система передачи сообщений (message transport), разработанная компанией Real Logic. Создатели — Martin Thompson (бывший CTO LMAX Exchange, автор LMAX Disruptor) и Todd Montgomery (бывший CTO 29West, разработчик Ultra Messaging — широко используемой low-latency messaging системы в финансах). Разработка началась в 2014 году по заказу крупной американской биржи; сейчас проект насчитывает 70+ контрибьюторов и 5000+ подписчиков на GitHub.

Что такое Aeron на практике: это не message broker (как Kafka или RabbitMQ) и не библиотека сокетов (как ZeroMQ). Aeron — это именно транспортный слой, заточенный под предсказуемую низкую латентность. Он работает поверх UDP (для сетевой коммуникации) и shared memory (для IPC на одном хосте), при этом обеспечивая reliable delivery, ordering и flow control — то, чего обычный UDP не гарантирует. Можно думать об Aeron как о "TCP с латентностью UDP".

Aeron поддерживает Java, C/C++ и .NET, что делает его доступным для большинства торговых стеков.

Характеристики Aeron:

  • Латентность: менее 100 мкс в облаке, менее 18 мкс на физическом железе
  • Пропускная способность: более 1 миллиона сообщений/сек при микросекундной латентности
  • 20+ миллионов сообщений/сек на пике
  • Brokerless — нет центрального брокера, нет single point of failure
  • Поддержка unicast, multicast и IPC
  • Встроенные механизмы flow control, congestion control, message loss detection

Aeron Cluster — расширение для fault-tolerant state machine replication. По сути это Raft-консенсус для торговых систем, обеспечивающий consistent replication с минимальной добавленной латентностью.

Aeron Archive — персистентность сообщений на диск с полной скоростью потока, с возможностью replay. Отключившийся сервис может переподключиться и восстановить пропущенные сообщения.

Aeron Sequencer — новейший компонент экосистемы, предназначенный для координации множества проектов в рамках крупных организаций. Построен на базе Aeron Transport и Aeron Cluster. Ключевые характеристики:

  • Distributed log — длинная последовательность сообщений, реплицированная на несколько машин для отказоустойчивости
  • Multiple readers — несколько приложений одновременно читают один и тот же лог для разных задач
  • Decoupled teams — команды остаются независимыми, но работают в рамках единой координируемой системы
  • Ориентирован на: обработку рыночных данных, брокерские платформы, биржевые движки

Сравнение с Kafka: Оба используют distributed log, но Aeron оптимизирован под латентность (микросекунды), а Kafka — под пропускную способность и durability (миллисекунды). Aeron — для real-time торговой логики, Kafka — для data pipeline и аналитики.

3.2 Apache Kafka

Apache Kafka — стандарт де-факто для event streaming в масштабе. Не подходит для hot path торговой логики (задержки в миллисекундах), но незаменим для:

  • Агрегация маркет-данных: собирать потоки с 100+ бирж в единый pipeline
  • Event sourcing: каждое действие системы записывается как событие в topic
  • CDC (Change Data Capture): стриминг изменений из trading DB в аналитику
  • Интеграция с QuestDB: Kafka → QuestDB для real-time аналитики тиковых данных

Kafka обеспечивает durability (данные реплицируются по брокерам), ordering (внутри партиции) и replay (можно перечитать историю). Для low-latency конфигурации: acks=0 (fire-and-forget), отключение persistence, партиционирование по символам.

Типичная латентность Kafka: 2–15 мс end-to-end при правильной настройке. Для HFT неприемлемо, но для стратегий с горизонтом >1 сек — вполне.

3.3 Redis Pub/Sub и Redis Streams

Redis — in-memory хранилище, работающее также как lightweight message broker.

Redis Pub/Sub — fire-and-forget: если subscriber был offline, сообщения потеряны. Латентность sub-миллисекундная на мелких сообщениях. Идеален для real-time нотификаций: обновления цен, сигналы стратегий, alerts.

Redis Streams — добавляет persistence и consumer groups (аналог Kafka в миниатюре). Можно читать историю, подтверждать обработку (ACK), масштабировать consumers.

В контексте трейдинга Redis используется как:

  • Real-time cache для текущих цен (SET/GET с TTL)
  • Pub/Sub слой для распространения сигналов между стратегиями
  • Rate limiter для контроля частоты запросов к биржам
  • Leaderboard для мониторинга производительности стратегий

Redis быстрее Kafka на мелких сообщениях (sub-мс до p99), но не имеет встроенной репликации и durability сопоставимой с Kafka.

3.4 NATS

NATS — ультралёгкий messaging system, написанный на Go. Минимальная архитектурная сложность, sub-миллисекундная латентность, встроенная поддержка pub/sub, request/reply и queue groups.

NATS JetStream — расширение с persistence, exactly-once delivery и stream processing. Хорошая альтернатива Kafka для проектов среднего масштаба.

Centrifugo (real-time pub/sub сервер) поддерживает NATS как backend для горизонтального масштабирования — удобно для распространения маркет-данных на web-клиенты.

3.5 ZeroMQ и nanomsg — brokerless messaging

ZeroMQ и его "наследник" nanomsg — это библиотеки (не серверы), предоставляющие socket-абстракции для peer-to-peer коммуникации.

ZeroMQ:

  • Паттерны: PUB/SUB, REQ/REP, PUSH/PULL, DEALER/ROUTER
  • Пропускная способность: 5+ миллионов сообщений/сек на отправку
  • Транспорты: TCP, IPC (Unix Domain Socket), inproc (внутри процесса)
  • Автоматическое batch'инг сообщений для максимизации throughput
  • Battletested с 2007 года, огромное сообщество

nanomsg (и NNG — next gen):

  • Более чистое API, pluggable транспорты и протоколы
  • Лучшая латентность на маленьких сообщениях (до 64 KB)
  • Дополнительные паттерны: SURVEY (опрос всех peer'ов)
  • ZeroMQ лидирует на больших сообщениях (>64 KB) по throughput

Для трейдинга: ZeroMQ/nanomsg хороши как "клей" между компонентами системы, особенно когда нужна гибкость топологии (fan-out маркет-данных, pipeline обработки). Но нет гарантии доставки — сообщения могут быть потеряны. Для ордеров нужен дополнительный acknowledgment-слой.

3.6 Сравнительная таблица messaging-систем

Система Латентность (типичная) Throughput Persistence Модель Best for
Aeron 18–100 мкс 20M+ msg/s Archive (опц.) Brokerless Hot path, matching
Kafka 2–15 мс 1M+ msg/s Да (built-in) Brokered Event sourcing, pipeline
Redis Pub/Sub <1 мс 1M+ msg/s Нет Brokered Real-time notifications
Redis Streams <1 мс 500K+ msg/s Да Brokered Lightweight event log
NATS <1 мс 10M+ msg/s JetStream Brokered Microservices
ZeroMQ <100 мкс 5M+ msg/s Нет Brokerless IPC, fan-out
nanomsg/NNG <100 мкс 3M+ msg/s Нет Brokerless IPC, peer-to-peer
RabbitMQ 1–5 мс 50K+ msg/s Да Brokered Complex routing

4. Real-time PUB/SUB для клиентов: Centrifugo

Centrifugo — self-hosted PUB/SUB-сервер на Go, поддерживающий WebSocket, HTTP-streaming, SSE, gRPC и WebTransport. Оптимизирован для broadcast-сценариев: одно сообщение → тысячи/миллионы клиентов.

Почему Centrifugo для алготрейдинга:

  • Тест с 1 миллионом WebSocket-соединений и 30 миллионами доставленных сообщений в минуту на оборудовании одного сервера
  • Стриминг данных с частотой 60 Гц (продемонстрировано на телеметрии Assetto Corsa → Grafana)
  • Горизонтальное масштабирование через Redis Cluster, Valkey, KeyDB, DragonflyDB или NATS
  • Channel history с автоматическим recovery при reconnect
  • Delta compression (алгоритм Fossil) для минимизации трафика
  • JSON и binary Protobuf форматы

Типичный сценарий: Backend собирает маркет-данные → обрабатывает → публикует через Centrifugo API → Centrifugo раздаёт всем подключённым WebSocket-клиентам (web-интерфейс, мобильные приложения, мониторинг).

Для внутренней коммуникации между компонентами трейдинговой системы Centrifugo — overkill. Здесь лучше gRPC, Aeron или ZeroMQ. Centrifugo — это именно "последняя миля" до пользователя или дашборда.


5. Хранилища данных с real-time access

5.1 QuestDB — time-series для трейдинга

QuestDB — open-source time-series база данных, оптимизированная для финансовых и промышленных данных. Написана на Java (zero-GC), C++ и Rust.

Ключевые возможности для трейдинга:

  • Ingestion: терабайты в день, миллионы строк в секунду на одном сервере
  • Queries: sub-миллисекундные, векторизованное выполнение с SIMD-инструкциями
  • SAMPLE BY — нативная агрегация по временным интервалам (свечи, OHLCV)
  • ASOF JOIN — join по ближайшему timestamp'у (критично для market data alignment)
  • LATEST ON — получение последнего значения для каждого символа
  • 2D arrays — нативные массивы для снимков orderbook'а
  • Materialized views — continuous OHLC rollups с REFRESH IMMEDIATE
  • Parquet support — нативная поддержка для исторических данных

Трёхуровневая архитектура хранения:

  1. WAL (Write-Ahead Log) — ультра-low-latency append для входящих данных
  2. Columnar storage — time-partitioned, дедуплицированный, мгновенно queryable
  3. Object storage — автоматическая выгрузка старых данных в Parquet

B3 (бразильская фондовая биржа, крупнейшая в Латинской Америке) использует QuestDB для real-time операций с securities.

5.2 Redis как real-time data layer

В контексте трейдинга Redis часто выступает как промежуточный слой:

  • Hot cache текущих цен: O(1) доступ к последней цене любого инструмента
  • Sorted sets для orderbook: ZADD book:BTC:bids price amount, O(log N) на вставку
  • TTL для автоматического протухания стейлых данных
  • Lua scripts для атомарных операций (проверка + обновление в одном вызове)

Типичный стек: Биржа → WebSocket collector → Redis (hot cache + pub/sub) → QuestDB (persistence + analytics).

5.3 Parquet для исторических данных

Apache Parquet — колоночный формат хранения, идеальный для backtesting и аналитики:

  • Отличная компрессия (10:1 и выше для маркет-данных)
  • Predicate pushdown — чтение только нужных колонок и строк
  • Совместимость с Pandas, Polars, DuckDB, Spark
  • QuestDB нативно выгружает старые данные в Parquet

5.4 Нишевые решения: RayforceDB, AXL DB, ThePlatform

Помимо мейнстримных баз данных существуют специализированные проекты, заточенные именно под задачи трейдинга и аналитики с минимальным footprint.

RayforceDB — колоночная векторная БД на чистом C от Антона Кунденко (singaraiona). Бинарник менее 1 МБ, ноль зависимостей, SIMD-векторизация (AVX2/NEON), кросс-платформенность включая WASM. Lisp-подобный язык запросов Rayfall. По заявлению авторов, "battle-tested в финансовой аналитике и HFT-окружениях". Есть биндинги для Python (rayforce-py с DataFrame API), Rust (rayforce-rs), VS Code-расширение и WASM-версия для браузера. Development partnership с Lynx Capital.

AXL DB — "tiny vector database engine" от того же автора. Ещё более минималистичный: полностью помещается в CPU cache, не зависит даже от libc, статически линкуется. Фокус на детерминистической латентности под нагрузкой, что критично для HFT. Поддерживает beyond-RAM datasets и Lisp-подобный синтаксис запросов.

ThePlatform — платформа для обработки и анализа real-time и исторических данных, также от singaraiona. Позиционируется как альтернатива KDB+/Q с более современным подходом. Включает встроенные "reagent"-типы для IPC, TCP, UDP, WebSocket, TLS — то есть коммуникационные примитивы интегрированы прямо в язык. Поддержка KDB-совместимости через плагин. Это интересный подход: вместо отдельной БД + отдельного транспорта + отдельного языка запросов — всё в одной среде.

Все три проекта объединяет философия "минимализм + производительность": нулевые зависимости, крошечный binary, SIMD-first. Для алготрейдинга это означает: предсказуемая латентность (нет GC, нет аллокаций на hot path), простота деплоя, возможность встраивания прямо в торговый процесс.

5.5 Что используют крупные квантовые фонды

Хотя HFT-фирмы крайне закрыты в отношении своих технологий, некоторые детали известны из публичных вакансий, open-source проектов и выступлений.

Jane Street — использует OCaml как основной язык для всего: от торговых систем до автоматизации и исследований. Выпустила в open-source около миллиона строк кода, включая: Core (альтернативная стандартная библиотека OCaml), Async (кооперативная конкурентность с блокирующими операциями, выраженными в системе типов), Incremental (самокорректирующиеся вычисления — пересчитывает только то, что изменилось, идеально для market data), magic-trace (трассировка производительности с наносекундным разрешением), Hardcaml (проектирование hardware на OCaml — вероятно, для FPGA-стратегий). В 2025 году анонсировали OxCaml — свой форк компилятора с расширениями для performance engineering: fearless concurrency, контроль над layout данных в памяти, нативный доступ к SIMD, контроль аллокаций для снижения GC-давления.

Citadel Securities — обрабатывает ~35% объёма торгов акциями в США (около $500 млрд/день). Из вакансий известно: KDB+/Q для time-series аналитики, Python для стратегий и data science, C++ для low-latency систем, FPGA для критических участков (наносекундная торговая логика, прошитая в железо). CTO Citadel Securities Josh Woods публично говорил о важности постоянного обновления технологического стека, чтобы не потерять гибкость.

Two Sigma — активно использует Apache Kafka и Apache Spark, выпустила Flint (time-series library для Spark), Cook (планировщик задач поверх Mesos). Стек: Python, Java, C++.

Общие паттерны крупных фондов:

  • KDB+/Q остаётся стандартом для time-series аналитики на торговых десках (хотя QuestDB, DuckDB и ClickHouse набирают популярность)
  • FPGA для hardware-accelerated торговой логики (наносекундная латентность)
  • Custom proprietary messaging (часто на базе Aeron или собственных UDP-решений)
  • Kernel bypass networking (DPDK, Solarflare/Xilinx ef_vi)
  • Всё критическое — in-house, open-source используется для инфраструктуры и тулинга

6. Сериализация: Protobuf vs SBE vs FlatBuffers vs JSON

Выбор формата сериализации напрямую влияет на латентность. Каждое сообщение в системе проходит encode → transmit → decode, и кодирование/декодирование может занимать больше времени, чем сама передача.

Формат Encode/Decode Размер Zero-copy Schema Когда использовать
JSON Медленный Большой Нет Нет REST API, дебаг, логи
Protobuf Быстрый Компактный Нет .proto gRPC, межсервисная коммуникация
SBE Ультра-быстрый Минимальный Да XML schema HFT, matching engines
FlatBuffers Очень быстрый Компактный Да .fbs Gamedev, mobile, средний latency
Cap'n Proto Очень быстрый Компактный Да .capnp IPC, RPC
MessagePack Быстрый Компактный Нет Нет Замена JSON, WebSocket

SBE даёт на порядок большую производительность за счёт ограничений: фиксированные поля в начале сообщения, переменные — только в конце. Для торговых сообщений (ордер, execution report, market data update) эти ограничения несущественны.

LinkedIn публично задокументировал, что переход с JSON на Protobuf дал заметное улучшение латентности на p99. SBE обещает ещё большее преимущество за счёт flyweight-паттерна.


7. Эталонные архитектуры

7.1 Криптоарбитраж (средняя частота)

Биржа A ──WS──┐
Биржа B ──WS──┤──▶ Market Data Collector (Rust)
Биржа C ──WS──┘         │
                    Redis Pub/Sub + Cache
                         │
                    Strategy Engine (Python)
                         │
                    gRPC (UDS) ──▶ Order Router (Rust) ──WS──▶ Биржи
                         │
                    Kafka ──▶ QuestDB (аналитика)
                         │
                    Centrifugo ──WS──▶ Web Dashboard

Обоснование выборов:

  • WS к биржам: хорошая задержка + простота подключения к 100+ биржам
  • Redis: hot cache цен + fan-out сигналов
  • gRPC UDS: typed коммуникация между strategy и order router на одной машине
  • Kafka: reliable pipeline для записи в QuestDB
  • Centrifugo: real-time дашборд для мониторинга

7.2 HFT Market Making (co-location)

Exchange Feed ──FIX/UDP Multicast──▶ NIC (kernel bypass)
                                        │
                                   Aeron IPC (shared memory)
                                        │
                                   Strategy (C++, single thread)
                                        │
                                   SBE encode ──▶ Aeron ──▶ FIX ──▶ Exchange
                                        │
                                   Aeron Archive ──▶ QuestDB (post-trade)

Обоснование:

  • Kernel bypass NIC (Solarflare/Xilinx) — обход OS сетевого стека
  • Aeron IPC — shared memory, наносекундная латентность
  • Single-threaded strategy — нет synchronization overhead
  • SBE — zero-copy сериализация
  • FIX — прямой доступ к matching engine
  • Всё на одном сервере в co-location

7.3 Data Platform (StockAPIs-подобная)

100+ бирж ──WS──▶ Collector Fleet (Rust)
                        │
                   Kafka (партиции по биржа:символ)
                        │
            ┌───────────┼───────────┐
            ▼           ▼           ▼
     Redis (hot)   QuestDB (ts)   Parquet (cold)
            │           │
            └─────┬─────┘
                  ▼
         gRPC API + Centrifugo WS
                  │
            ┌─────┼─────┐
            ▼     ▼     ▼
         Clients / Bots / AI Agents

Обоснование:

  • Kafka: единый backbone, горизонтальное масштабирование коллекторов
  • Трёхуровневое хранение: Redis (hot, <1мс), QuestDB (warm, <10мс), Parquet (cold, batch)
  • gRPC API: typed, efficient, bidirectional streaming для клиентов
  • Centrifugo: WebSocket для web/mobile клиентов с delta compression

8. Практические рекомендации

Правило выбора технологии по латентности стратегии:

  • <10 мкс (HFT): FPGA, kernel bypass, shared memory, SBE, Aeron IPC, raw UDP. Всё на одной машине в co-location.
  • 10–100 мкс (ultra-low): Aeron (UDP), gRPC+UDS, ZeroMQ inproc/IPC, SBE или Protobuf. Один или несколько серверов в одной стойке.
  • 100 мкс – 1 мс (low latency): gRPC (TCP), WebSocket, ZeroMQ TCP, Protobuf. Несколько серверов, возможно в разных AZ.
  • 1–10 мс (medium frequency): WebSocket к биржам, Kafka внутри, Redis cache. Стандартная cloud инфраструктура.
  • >10 мс (low frequency / swing): REST API вполне достаточен. DCA, ребалансировка, portfolio management.

Не оптимизируйте то, что не является bottleneck. Если ваша стратегия принимает решение за 50 мс, нет смысла тратить месяцы на переход с gRPC на Aeron ради экономии 100 мкс. Начните с профилирования end-to-end латентности: где реально теряется время?

Гибридные архитектуры — норма. По данным отрасли, более 60% enterprise AI-платформ используют гибридные протокольные архитектуры, комбинируя REST, gRPC и WebSocket для разных задач в одной системе.


Репозиторий с бенчмарками

Все цифры задержек, упомянутые в этой статье, можно воспроизвести с помощью suenot/trading-ipc-bench — открытого Python-бенчмарка для восьми IPC-транспортов: TCP, UDS, Named Pipe, ZeroMQ IPC/TCP, WebSocket, Redis Pub/Sub и Shared Memory.

git clone https://github.com/suenot/trading-ipc-bench
cd trading-ipc-bench
pip install -r requirements.txt
python run_all.py   # запустить все 8 транспортов, результаты → results/
python report.py    # сводная таблица + ASCII-график

Запустите на своём железе — результаты будут отличаться от приведённых в статье в зависимости от CPU, ОС и версии ядра. Это и есть смысл.


Заключение

Идеальной универсальной технологии передачи данных для алготрейдинга не существует. Каждый уровень системы имеет свои требования: внешний — совместимость с биржами (WS, FIX), внутренний hot path — минимальная латентность (Aeron, shared memory, gRPC+UDS), data pipeline — надёжность и масштабируемость (Kafka, Redis Streams), клиентский — удобство и широта транспортов (Centrifugo, WebSocket).

Ключ к эффективной архитектуре — понимание требований каждого компонента и осознанный выбор технологии под конкретную задачу, а не попытка использовать одно решение для всего.

Дисклеймер: Информация в этой статье предоставлена исключительно в образовательных и ознакомительных целях и не является финансовым, инвестиционным или торговым советом. Торговля криптовалютами сопряжена с высоким риском убытков.

MarketMaker.cc Team

Количественные исследования и стратегии

Обсудить в Telegram
Newsletter

Будьте в курсе событий

Подпишитесь на нашу рассылку, чтобы получать эксклюзивную аналитику по AI-трейдингу и обновления платформы.

Мы уважаем вашу конфиденциальность. Отписаться можно в любой момент.