Проектирование торговой системы

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

Знакомство

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

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

Проектирование торговой системы

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

  1. Класс активов
  2. Тип торговой стратегии
  3. Регулирование (правила обмена или регулирующие органы, такие как SEC)

Классы активов

Предварительное знание класса активов, на котором будет работать торговая система, во многом определяет, как система будет спроектирована. Класс активов в значительной степени контролирует различные факторы, такие как:

  1. Биржи, с которыми может взаимодействовать торговая система, и протокол для общения.
  2. Время, когда торговая система может исполнять ордера.
  3. Скорость, с которой могут исполняться ордера и так далее.

Ниже приведены некоторые примеры правил, налагаемых на торговую систему некоторыми классами активов.

  • Рынки Форекс (FX) торгуются 24 часа в сутки, но только в будние дни. FX содержит множество валютных пар, которыми можно торговать на многих биржах, этот рынок может меняться в результате новостей.
  • Фондовые рынки США торгуются только на двух биржах Nasdaq Stock Market (NASDAQ) и Нью-Йоркской фондовой бирже (NYSE), с 9:30 до 16:00, за исключением праздничных дней, этот рынок может измениться в результате новостей.
  • Волатильность (VIX) торгуется 24 часа в сутки, каждый день недели, этот рынок напрямую не зависит от новостей рынка
  • Криптовалюты торгуются 24 часа в сутки, каждый день недели, на этот рынок так или иначе влияют новости рынка.

Из приведенного выше случая мы теперь можем сделать вывод о том, как выбор класса активов для торговли влияет на различные вещи, такие как время, в течение которого наша система будет торговать, протоколы, которые система должна будет использовать, и так далее.

Тип торговой стратегии

Выбранная стратегия для торговли, может определять различные решения, например, язык программирования, необходимый для реализации стратегии.

Ниже приведены некоторые практические примеры.

  • Создание HFT, который необходим для отправки 1000 заказов в миллисекунду, потребует очень быстрого языка для быстрого принятия решений, что может привести к использованию FPGA с низкой задержкой, C ++, Java и, возможно, Rust, но не Python, поскольку это очень медленно, другая стратегия, основанная на методах машинного обучения для генерации заказов, будет означать, что программистам придется использовать Python. из-за обширных библиотек машинного обучения.
    Чтобы пойти еще дальше, возможно, потребуется внести различные улучшения на сетевом уровне и даже в расположение центра обработки данных от обмена.

Регулирование

Внешние факторы, такие как регулирование со стороны биржи или регулирующего органа, такого как SEC, напрямую навязывают определенные операционные или технические решения о том, как спроектировать торговую систему.

Ниже приведены некоторые практические примеры этого.

  • Биржа под названием IEX реализовала задержку в 350 миллисекунд для всех транзакций в качестве механизма предотвращения арбитража с задержкой. Чтобы узнать больше, прочтите эту статью на hackaday.

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

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

Диаграмма взята из книги Себастьяна Донадио «Разработка систем высокочастотной торговли» | Сурав Гош | Ромен Россайе

Из приведенной выше диаграммы ниже приведены основные компоненты в архитектуре торговой системы.

  • Судебный округ: Это общий термин для любой платформы, сопоставляющей ордера на покупку и продажу для сторон ценных бумаг или деривативов, примером места проведения является ECN, банк или агрегатор.
  • Шлюз: Это интерфейс между торговой системой и внешним миром (биржами, банками, ECN или агрегаторами).
  • Конструктор книг: Конструктор книг строит лимитный ордер или ордер на исполнение на рынке из данных, собранных со шлюзов.
  • Стратегия: Стратегия анализирует рынки на основе данных с площадок и принимает решение о позиции для открытия (ордер на покупку или продажу)
  • Менеджер заказов: Менеджер ордеров отвечает за сбор всех ордеров, поступающих из торговых стратегий, и отслеживание всего жизненного цикла ордеров.

Пример из практики ~ Импульсная торговая система

Высокочастотная импульсная торговая стратегия реализована с использованием Python для совершения сделок через API Deriv.com для символа Vix 100 (R_100), где шлюз предоставляет доступ к платформе Deriv. Стратегия использует исторические данные для прогнозирования динамики цен, измеряя недавнюю динамику активов в течение заранее определенного периода времени. Обновления цен из разных мест хранятся в конструкторе книг, что помогает решить, когда начинать сделку. После того, как импульсный сигнал идентифицирован, ордер генерируется через систему управления ордерами с оговоренными условиями по сумме прибыли до закрытия сделки, символу актива, сумме для предложения о покупке, сумме для реализации и продолжительности удержания контракта. Система также интегрирует логику управления рисками для защиты от значительных потерь.

Исходя из приведенного выше примера, я хотел бы указать на различные компоненты здесь.

  • Судебный округ: Местом проведения в приведенном выше тематическом исследовании является Deriv Exchange.
  • Шлюз: Deriv (биржапредоставляет библиотеку под названием python-deriv-apiкоторая обрабатывает методы, используемые для связи между торговой системой и биржей, метод связи в этом случае осуществляется по протоколу https с использованием REST API.

import os
import logging
import asyncio
import argparse
from typing import List, Dict, Any
from deriv_api import DerivAPI

async def main() -> None:
«»»Deriv API endpoint and app_id»»»
# the api will act as the gateway through which price updates can happen
# and orders can be placed
api = DerivAPI(app_id=os.getenv(«APP_ID»))
await api.authorize(os.getenv(«DERIV_API»))
await run_tasks(api, args)

if __name__ == «__main__»:
logging.basicConfig(level=logging.INFO)
parser = argparse.ArgumentParser()
parser.add_argument(
«-s»,
«—symbol»,
default=»R_100″,
choices=[
«1HZ10V»,
«R_10»,
«1HZ25V»,
«R_25»,
«1HZ50V»,
«R_50»,
«1HZ75V»,
«R_75»,
«1HZ100V»,
«R_100»,
«1HZ150V»,
«1HZ250V»,
«OTC_DJI»,
],
)
parser.add_argument(«-p», «—proposal_amount», default=1, type=int)
# the default amount to by a proposal at.
parser.add_argument(«-a», «—amount», default=10, type=int)
# the default run time for a contract should be 1 full day (intraday trading)
parser.add_argument(«-d», «—duration», default=3600, type=int)
# target to take profits at.
parser.add_argument(«-t», «—target», default=4, type=int)
args = parser.parse_args()
asyncio.run(main())

  • Торговая система: Эта система опирается на импульсную торговую стратегию (опирается на исторические данные для прогнозирования будущих изменений цены), которая может быть реализована с использованием следующего класса.

class MomentumTrader:
«»»Class that implements momentum based strategy.»»»

def __init__(
self,
api: DerivAPI,
arguments: argparse.Namespace,
contracts: List[Dict[str, Any]],
lock: asyncio.Lock,
) -> None:
self.position = 0
self.momentum = 3
self.bar_length = «1min»
self.raw_data = pd.DataFrame()
self.min_length = self.momentum + 1
self.api = api
self.arguments = arguments
self.contracts = contracts
self.data = pd.DataFrame()
self.resample_rate = «120S»
self.lock = lock

async def trading_logic(self) -> None:
«»»Trading logic, that implments the momentum trading strategy.»»»
last_price = None
prev_price = None
account = await self.api.balance()
curr_balance = intial_balance = account[«balance»][«balance»]
# Momentum strategy parameters
while True and curr_balance >= intial_balance — 5:
account = await self.api.balance()
curr_balance = account[«balance»][«balance»]
logger.info(
f»Current balance: {curr_balance} — Initial balance: {intial_balance}»
)
proposal = await self.api.proposal(
{
«proposal»: self.arguments.proposal_amount,
«amount»: self.arguments.amount,
«barrier»: «+0.1»,
«basis»: «payout»,
«contract_type»: «PUT»,
«currency»: «USD»,
«duration»: self.arguments.duration,
«duration_unit»: «s»,
«symbol»: self.arguments.symbol,
}
)
spot_price = proposal[«proposal»][«spot»]
spot_time = proposal[«proposal»][«spot_time»]
if curr_balance > intial_balance / 2 and last_price is not None:
row = pd.DataFrame(
{«bid»: spot_price},
index=[pd.Timestamp(self.convert_timestamp(spot_time))],
)
self.raw_data = self.raw_data._append(row)
self.data = (
self.raw_data.resample(self.resample_rate).last().ffill().iloc[:-1]
)
self.data[«mid»] = self.data.mean(axis=1)
self.data[«returns»] = np.log(
self.data[«mid»] / self.data[«mid»].shift(1)
)
self.data[«position»] = np.sign(
self.data[«returns»].rolling(self.momentum).mean()
)
logger.info(self.data)
if len(self.data) > self.min_length:
self.min_length += 1
if self.data[«position»].iloc[-1] == 1:
if self.position == 0 or self.position == -1:
await self.create_options_contract(«CALL», spot_price)
# pause the momentum trader after a contract has been created.
# this is a precaution to prevent a BUY and SELL on the same
# asset class, within a short period of time.
await asyncio.sleep(self.arguments.duration * 0.5)
self.position = 1
elif self.data[«position»].iloc[-1] == -1:
if self.position == 0 or self.position == 1:
await self.create_options_contract(«PUT», spot_price)
# pause the momentum trader after a contract has been created.
# this is a precaution to prevent a BUY and SELL on the same
# asset class, within a short period of time.
await asyncio.sleep(self.arguments.duration * 0.5)
self.position = -1
prev_price = last_price
last_price = spot_price
logger.info(f»Previous price: {prev_price} — Last price: {last_price}»)
if curr_balance > intial_balance + self.arguments.target:
logger.info(f»Target amount reached.\nExiting script …»)
exit()

if self.data.size > 0:
self.record_data(self.data.tail(1))
await asyncio.sleep(5)

В примере aboce нет примера Book Builder и Order Manager.

Создание системы для торговли с биржами.

Стратегии принятия решений о том, когда торговать.

Торговая стратегия — это мозг торговой системы, это точка, в которой создаются ордера на покупку или продажу.

Торговая стратегия состоит из двух составляющих

  • Сигнальная составляющая: Этот компонент принимает решение об исполнении ордеров на покупку или продажу на основе запрограммированного торгового алгоритма и вводит информацию о текущих тенденциях на рынке из компонента конструктора книг.
  • Компонент исполнения: Исполнительная часть стратегии выполняет различные действия, такие как размещение ордера, полученного от сигнального компонента, в данном месте или повторная попытка, если размещение ордера не удалось.

Системы управления заказами

Системы управления заказами собирают коллекцию всех заказов и выполняют управленческие действия, такие как:

  1. Большое количество
  2. Неправильное направление
  3. Чрезмерные непогашенные позиции

Следует отметить, что заказ не пересылает заявку на обмен, если есть проблемы с данным ордером.

Измерение производительности торговой системы.

Производительность торговой системы может быть измерена с помощью некоторых из следующих критериев:

  1. Совокупная скорость всех компонентов в торговой системе.
  2. Процент попаданий (соотношение прибыли и убытка) системы.
  3. Разрешение данных в конструкторе книг.

Командование и управление

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

Интерфейс командной строки для управления торговой системой.

Следующая программа может быть завершена либо после достижения цели по прибыли или убытку, либо завершение программы с помощью сочетания клавиш «CMD + CTRL».

Сводка

Сообщение в блоге содержит подробное исследование компонентов торговой системы и их функционирования, что делает его исчерпывающим руководством по пониманию классов активов, типов торговых стратегий и правил проектирования торговых систем.

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

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

Чтобы помочь в понимании и применении, автор предлагает полный код торговой системы, обсуждаемой в этом посте. Этот код иллюстрирует все концепции и компоненты, описанные в блоге, и его можно приобрести через Gumroad по этой ссылке: https://sedemamekpewu.gumroad.com/l/momentum_trading_bot.
Наличие этого кода позволит вам напрямую применить знания, полученные из этого сообщения в блоге, в реальной торговой системе.

Источник