1. Введение
У трейдеров появилась новая тенденция развивать для себя набор навыков программирования и становиться алгоритмическими трейдерами. Большинство инструментов и брокеров предлагают хорошо документированные API с пользовательским интерфейсом для упрощения доступа. Это отличный способ научиться программировать торговые приложения. Есть много бесплатных поставщиков API с демо-счетами, пополняемыми виртуальными деньгами, чтобы оценить стратегию без какого-либо риска. Есть некоторые положительные и отрицательные аспекты, связанные с демо-счетами, потому что разница между реальным рынком, комиссиями, спредом и иногда манипулируемыми ценами убеждает потенциального трейдера подписаться на реальный счет.

Есть много отличных курсов по Python или R, самым популярным языкам программирования на торговой арене. Упомянутый в статье язык программирования Scala с фреймворком Akka Actors также очень популярен; однако для этого требуется гораздо больше знаний в области кодирования. Провайдеры онлайн-трейдинга также предлагают курсы, связанные с алгоритмической торговлей, к сожалению, в основном ориентированные на конкретный инструмент или брокера с возможностями «черного ящика», делающего что-то без прозрачности действий внутри.

Что такое алгоритмическая торговля?
Алгоритмическая торговля основана на компьютерных программах, которые выполняют алгоритмы для автоматизации некоторых или всех элементов торговой стратегии. Алгоритмы представляют собой последовательность шагов или правил для достижения цели и могут принимать различные формы. В случае машинного обучения (ML) алгоритмы преследуют цель изучения других алгоритмов, а именно правил, для достижения цели на основе данных, например минимизации ошибки прогнозирования.[1]

На самом базовом уровне алгоритм может быть набором периодически проверяемых условий и другим набором действий (открытая или закрытая позиция), когда состояние допустимо. Алгоритму нужны два входа. В случае торговли иностранной валютой (FX) потоки данных о ценах и сигналах. Сигнал может быть получен от внешнего платного API и сгенерирован алгоритмом из загруженных потоковых данных, а не только цен.

Основные инструменты алгоритмической торговли
Документ называется «… торговля с помощью Akka/Scala», поэтому основное внимание здесь уделяется инструментам программирования, рынку, торговле и инструментам визуализации.

JetBrains IntelliJ IDE или «старый и добрый» Eclipse — два лучших инструмента. Вместе с JDK, плагинами Apache Spark, SBT и Scala составляют идеальный набор инструментов для разработки приложений на основе Scala. Linux или macOS являются более удобными средами для разработки.
(Примечание автора: я был удивлен производительностью Apache Spark в Windows, но настроить и настроить все части было непросто)

Lightbend Akka — это фреймворк, использующий модель Актера, впервые описанную Карлом Хьюиттом, Питером Бишопом и Ричардом Штайгером в документе «Универсальный модульный формализм ACTOR для искусственного интеллекта» 1973 года. [2]
Akka — это комбинация Актеров, которые обеспечивают простой и высокоуровневые абстракции для распределения, параллелизма и параллелизма. Асинхронная, неблокирующая и высокопроизводительная модель программирования, управляемая сообщениями, абсолютно необходима для торговых приложений.
Могут быть очень легкие процессы, управляемые событиями (миллионы участников на гигабайт памяти кучи), что делает приложение пригодным для запуска. в контейнерах.
Отказоустойчивость Семантика «не допускайте сбоя» делает код высокоустойчивым к сбоям системам, которые самовосстанавливаются и никогда не останавливаются. Фреймворк Akka предназначен для работы в распределенной среде. Все взаимодействия субъектов используют простую передачу сообщений в асинхронном режиме.
Последнее преимущество, о котором следует упомянуть, заключается в том, что изменения состояния, с которыми сталкивается субъект, могут сохраняться и воспроизводиться при запуске или перезапуске субъекта. Эта возможность позволяет субъектам восстанавливать свое состояние даже после сбоя JVM или при миграции на другой узел. Akka — это вариант, при котором фреймворк работает и ведет себя очень осторожно по отношению к торговым приложениям C++ с малой задержкой.

Kubernetes (используемый в качестве среды для развертывания демонстрационного торгового приложения) — это переносимая, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и службами, которая упрощает как декларативную настройку, так и автоматизацию. Он имеет обширную, быстрорастущую экосистему и список участников. Экосистема, сервисы, инструменты и технологические партнеры Kubernetes широко доступны.
В целом контейнеры очень похожи на виртуальные машины. Контейнер гораздо более гибок в использовании HW. У него есть свой ЦП, оперативная память, временное или постоянное хранилище, сетевой уровень и операционная система. Гибкость контейнеров означает отсутствие привязки к базовой инфраструктуре, сохранение переносимости между облаками и дистрибутивами ОС. Контейнеры означают для разработчиков большую гибкость и простоту развертывания, запуска и тестирования кода. Такие возможности, как обнаружение сервисов и балансировка нагрузки, оркестровка хранилища (автоматическое монтирование, масштабирование и т. д.), автоматическое развертывание и откат, автоматическая упаковка контейнеров (управление вычислительными ресурсами), самовосстановление (перезапуски, замена и т. д.), управление секретами и конфигурацией (сложные безопасность для управления конфиденциальной информацией) установлены по умолчанию.
Развертывание на Google Cloud Platform с использованием Google Kubernetes Engine с Container Registry — идеальное решение для окончательного алгоритма.

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

Следующей частью должен быть API в режиме реального времени для получения данных о ценах и совершения сделок. Oanda является мировым лидером в области услуг онлайн-торговли несколькими активами, а также валютных данных и аналитики с бесплатным демо-счетом, пополненным на 100 000 фунтов стерлингов, и поведением, не слишком отличающимся от реальных рыночных данных. Существует возможность использовать их API с предоставленными пакетами или библиотеками. Другая альтернатива использует прямые вызовы HTTP/S, которые обеспечивают лучший контроль над передаваемыми данными. Есть еще одно преимущество, такое как пользовательский интерфейс с графической интерпретацией ценовых данных, торговой информации, сделок, позиций, ордеров, состояния счета и так далее. https://dl.acm.org/citation.cfm?id=1624804

Алгоритмические торговые стратегии
Существует много книг о торговых стратегиях, но для абсолютных новичков «Форекс для начинающих» Анны Коуллинг дает отличное введение. Код в разделе 2 следует рекомендациям по основным кросс-валютным парам[3], которые часто торгуются, и золото в паре с долларом США (XAU_USD) идеально подходит для начала. XAU_USD торгуется 24/7, а основной пик приходится на 7 утра. и 7 вечера. BST, когда Лондон и Нью-Йорк открыты.

Сидней и Токио не оказывают слишком существенного влияния на эту «комбо». XAU_USD также является парой с известными паттернами, например. Точно так же, если свеча закрывается выше сопротивления на графике индекса доллара, на следующий день открывается короткая сделка по XAU/USD.[4] (рисунок)

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

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

Существует несколько типов стратегий, которые можно использовать при разработке вашего приложения для алгоритмической торговли.
• Макроэкономические новости и события (например, изменения процентной ставки)
• Фундаментальный анализ (например, данные о доходах, доходах)
> • Статистический анализ (например, корреляция)
• Технический анализ (например, числовой анализ, скользящие средние)
• Микроструктура рынка (например, арбитраж или торговая инфраструктура)
• Составление предварительных исследований

В настоящее время машинное обучение и глубокое обучение широко используются для поиска правильного баланса и определения общих и в основном скрытых закономерностей между сигналами. Яннес Клаас в своей книге Машинное обучение для финансов [5] описывает тип нейронной сети LSTM (долговременная кратковременная память) как лучший для данных торговли временными рядами. Более подробное исследование можно прочитать в статье 1994 года, изучение долгосрочных зависимостей с помощью градиентного спуска затруднено, доступной по адресу https://ieeexplore.ieee.org/document/279181 Йошуа Бенжио, Патриса Симара и Паоло Фраскони. .

Рекуррентные нейронные сети можно использовать для сопоставления входных последовательностей с выходными последовательностями, например, для задач распознавания, производства или прогнозирования. Однако сообщалось о практических трудностях при обучении рекуррентных нейронных сетей для выполнения задач, в которых временные непредвиденные обстоятельства, присутствующие во входных/выходных последовательностях, охватывают длительные интервалы. Мы показываем, почему алгоритмы обучения на основе градиента сталкиваются со все более сложной проблемой по мере увеличения продолжительности захвата зависимостей. Эти результаты показывают компромисс между эффективным обучением с помощью градиентного спуска и удержанием информации в течение длительного времени. На основе понимания этой проблемы рассматриваются альтернативы стандартному градиентному спуску.[6]

Бэктестинг и машина времени
Бэктестинг — это процесс, и среда создается для проверки торговой стратегии и алгоритма. Смысл тестирования на исторических данных заключается в выявлении моментов, когда ожидание не соответствует действию. Этот метод помогает обнаружить новый паттерн, который не покрывается и может привести к потенциальной потере денег.
Еще один тип тестирования — «Машина времени». В настоящее время компании сосредотачивают свой интерес от тестирования на истории к тестированию на будущее. Машинное обучение позволило построить модель на данных временных рядов для имитации поведения с поправкой на сезонные и другие события для создания будущей рыночной среды. Благодаря опции «путешествовать во времени» стратегию можно оценивать в различных рыночных условиях, фильтруя или воздействуя на события типа «черный лебедь», комментарии в социальных сетях и так далее.

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

Исполнение в реальном времени
Существует несколько способов начать торговлю. ПК или ноутбук для запуска кода идеально подходят для полного контроля и мониторинга. Пользовательский интерфейс, предлагаемый Oanda, можно использовать вместе с Tradingview.com, чтобы получить набор бесплатных инструментов для анализа торговли. Обычно первые попытки терпят неудачу, потому что набор правил не охватывает все возможные сценарии. Разработчик должен быть готов к эмоциональным взлетам и падениям. Следующим этапом обычно является развертывание в облаке, позволяющее алгоритму торговать круглосуточно и без выходных. Предостережение связано с простыми алгоритмами, которые постоянно требуют ручного вмешательства, чтобы не потерять много денег из-за неожиданных рыночных событий. С другой стороны, приложение будет работать на надежном оборудовании и в среде с гарантированным подключением к Интернету.

Итог
Этот термин происходит от нижней позиции по чистой прибыли в отчете о прибылях и убытках компании. Это означает важное число, объединяющее результаты общей прибыли и всех убытков с, конечно же, всеми затратами. Практический результат должен отслеживать и постоянно обсуждать с командой, чтобы убедиться, что риск находится на правильном уровне. Алгоритмическая торговля должна создать базу, низкий риск, меньшую прибыль, но значительный объем. Модели должны подстраиваться под общую стратегию компании и реальную ситуацию.

2. Код
База данных Postgres, работающая в кластере Kubernetes в многорежимном развертывании, поскольку хранилище данных о ценах, вероятно, является самым основным компонентом стека. Две таблицы содержат цены и статистические данные.

создать таблицу, если не существует akkapit.price
(
серийный номер не нулевой
ограничение price_pk
первичный ключ,
метка времени ts не нулевая,
инструмент varchar( 10) не нуль,
o_price с двойной точностью,
h_price с двойной точностью,
l_price с двойной точностью,
c_price с двойной точностью
); создать таблицу, если не существует akkapit.stats
(
серийный номер не нулевой
ограничение stats_pk
первичный ключ,
временная метка ts не нулевая,
инструмент varchar( 20) не нуль,
stats_id varchar(20),
stats_val с двойной точностью,
stats_desc varchar(50)
);

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

// Сборка ActorSystem (2 актора)
val system = ActorSystem("Система")
val ApiActorStatus: ActorRef = system.actorOf(Props[ApiActorStatus], name = "ApiActorStatus")
val ApiActorPrice: ActorRef = system.actorOf(Props[ApiActorPrice], name = «ApiActorPrice»)

def main(args: Array[String]): Unit = {
if (tradingHours) {
system.scheduler.schedule(0 секунд, 5 секунд)(Price())
system. scheduler.schedule(0 секунд, 5 секунд)(Статус())}}

Для управления базой данных Postgres из приложения — пример вставки и чтения ценовых данных.

def dbins(instrument: String, o_price: Double, h_price: Double, l_price: Double, c_price: Double): Unit = {
try {
val prep = conn.prepareStatement("ВСТАВИТЬ В akkapit.price ” +
“ (ts, Instrument, o_price, h_price, l_price, c_price)” +
“ VALUES (?, ?, ?, ?, ?, ?) “)
prep.setTimestamp (1, from(Instant.now()))
prep.setString(2, инструмент)
prep.setDouble(3, o_price)
prep.setDouble(4, h_price)
prep.setDouble(5, l_price)
prep.setDouble(6, c_price)
prep.executeUpdate
}
}

def dbget(limit: Int):Double = {
try {
val prep = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
val rs = prep.executeQuery("SELECT AVG (t.c_price) AS avg_c FROM(" +
"ВЫБЕРИТЕ c_price ИЗ akkapit.price AS p ORDER BY p.ts DESC LIMIT "+ limit +") t;")
while (rs.next ) {
res = rs.getString("avg_c").toDouble
}
}
res
}

Пример статистического значения на основе постоянно обновляемого набора данных.

def dbgetmax():Double = {
try {
val prep = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
val rs = prep.executeQuery("SELECT Date(t. ts), t.c_price ОТ akkapit.akkapit.price t ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБЕРИТЕ МАКС(c_price) КАК MaxC ИЗ akkapit.akkapit.price СГРУППИРОВАТЬ ПО Дате(ts)) q ON t.c_price = q.MaxC ORDER BY Date(ts) ) DESC LIMIT 1;")
while (rs.next) {
res = rs.getString("c_price").toDouble
}}res}

Решение о покупке со скользящими средними.

if (jAccountTradeCount.toInt ‹ 50) {
if (!buy_lock &&
last_5 && // цена последних 5 (закрытие) растет
dbget(12) ‹ last && // 1-минутная MA
dbget(120) ‹ last && // 10-минутная MA
dbget(720) ‹ last && // 60-минутная MA
mid_lvt ‹ last // выше дневной AVG
) {
buy(-1) // выполнить ордер на ПРОДАЖУ
}
}

Решение о продаже с заданным коэффициентом прибыли.

for (i ‹- 0 to tradeCount) {
totalPnL += jTradeUnrealizedPL(i).toDouble // торговля P/L

// 1410 * 0.995 =~ 1402 › current_price
if (!sell_lock) {
if ((jTradePrice(i).toDouble * coef) › dbgetlast()) {
sell(jTradeId( i).toInt)
}
}

tradeCount — 1
}

Несколько сотен строк кода охватывают всю концепцию алгоритмической торговли. Сложность можно добавить в модуль покупки/продажи. Машинное обучение (LSTM), сигналы от внешнего API можно легко внедрить и повысить общую производительность.

3. Результаты
Алгоритм торговли с простой стратегией MA — очень безопасный способ торговли. Пользовательский интерфейс Oanda показывает пример, когда сделки выполняются и руководствуются только здравым смыслом, что, вероятно, является лучшим моментом для «продажи».

30 минут спустя:

Торговый день №1 закрылся с реализованной прибылью/убытком 311,82 фунта стерлингов. (прибыль автоматически конвертируется из долларов США в фунты стерлингов в качестве валюты счета по умолчанию.

Следующий ежедневный прирост очень похож на ~ 300–400 фунтов стерлингов.

4. Рекомендации

Настройка модели
В общем, настройка модели может быть очень сложной задачей, требующей участия людей, вычислительных ресурсов и времени. Модели, основанные на наборе проверенных правил без машинного обучения, имеют более простой процесс настройки. Эти модели можно легко протестировать на исторических данных, чтобы проверить их ценность, прежде чем погрузиться с реальными деньгами. Импорт — это понимание причин того, что сделала модель и что вызвало действие. Сложность моделей машинного обучения и искусственного интеллекта иногда полностью скрывает импульс к длинной или короткой акции.
Рекомендация может быть связана с добавлением долгосрочных скользящих средних, например. 50-дневный и 15-дневный с соответствующей логикой. Оболочки приложений моделей могут быть расширены для оповещений, всплывающих сообщений или обновлений информационных панелей. Эта возможность может устранить необходимость ручного мониторинга и действий. Другие улучшения больше связаны с управлением рисками и безопасностью в торговле.

Управление рисками
Торговля одной валютной парой всегда сопряжена с риском. Чтобы сбалансировать потенциальное предостережение, можно добавить кросс-пару, такую ​​как USD_GBP, чтобы обезопасить себя от неожиданных событий со ставками против доллара США или на него. Целевая торговая прибыль от 5 до 10 процентов в течение длительного периода — отличный результат для начальной стратегии. Хорошей практикой и основным правилом является сохранение половины прибыли на стороне и продолжение торговли только со второй половиной. Книга Дэвиса Эдвардса «Управление рисками в трейдинге: методы повышения прибыльности хедж-фондов и торговых отделов»[7] идеально подходит для ознакомления с управлением рисками и всеми передовыми методами[8].

Стратегия снижения риска
Другой вариант снижения риска — добавить экономический календарь Forex и не торговать в эти критические дни, пока сложность алгоритма не будет к этому готова.
Алгоритм должны также содержать автоматические процедуры отключения в случае быстрых изменений на рынке, достижения определенных порогов, например конкретное количество открытых сделок, использованная маржа, объем торгов и т.д.

Управление параметрами
Большинство параметров МА постоянно обновляются и сохраняются для алгоритма в базе данных. В коде должен быть механизм управления с набором действий в случае отказа базы данных. Отсутствующие параметры и алгоритм, использующий значения по умолчанию, могут привести к огромным потерям денег. Кластер базы данных, работающий как несколько экземпляров с балансировщиком нагрузки в Kubernetes, может стать решением для минимизации риска.

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

5. Библиография и веб-источники

[1] ДЖЕНСЕН, Стефан. Практическое машинное обучение для алгоритмической торговли. 2018. Соединенное Королевство: опубликовано Packt Publishing, 2018. ISBN 9781789346411.

[2] Карл Хьюитт, Питер Бишоп, Ричард Стайгер. 1973. Универсальный модульный формализм ACTOR для искусственного интеллекта. https://dl.acm.org/citation.cfm?id=1624804

[3] КОУЛЛИНГ, Анна. Форекс для начинающих: что нужно знать, чтобы начать. 2013. Соединенное Королевство: Независимая издательская платформа CreateSpace, 2013. ISBN 9781494753757.

[4] СИНГХ, Марио. 17 проверенных стратегий торговли валютой: как получить прибыль на рынке Форекс. Хобокен, Нью-Джерси: Wiley, [2013]. ISBN 9781118385517.

[5] Клаас, Яннес. Машинное обучение для финансов. 2019. Соединенное Королевство: Packt Publishing, 2019. ISBN 9781789136364.

[6] БЕНДЖО Йошуа, СИМАР Патрис, ФРАСКОНИ Паоло. 1994. Изучение долгосрочных зависимостей с помощью градиентного спуска затруднено.
https://ieeexplore.ieee.org/document/279181

[7] ЭДВАРДС, Дэвис В. Управление рисками в трейдинге: методы повышения прибыльности хедж-фондов и торговых отделов. Хобокен: Wiley, 2014. ISBN 978–1–118–76858–7.

[8] НАЦИИ, Скотт. Полная книга опционных спредов и комбинаций: стратегии получения дохода, направленные движения и снижение риска. Хобокен, Нью-Джерси: John Wiley & Sons, [2014]. ISBN 9781118805459.