[Перевод] Инструменты хакера в торговле

Для того, чтобы осуществить наш хакерский финансовый эксперимент (чтобы еще на нем и заработать), нам потребуется программа, которая может проводить исследования, тестирование, обучение и торговлю по алгоритму. Ни одна из существующих программ на сегодняшний день по-настоящему не покрывает все эти области. Тем не менее, можно объединить различные системы и попытаться решить задачу. К счастью, есть пара подходящих инструментов. По большому счету, я буду использовать Zorro Trader и язык R, но иногда и некоторые другие инструменты.
b35876082a9346e0ad68685862a869d5.jpg

Выбор языка


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

Свободы в выборе языка программирования еще меньше. Всегда хочется взять язык с простым и красивым синтаксисом. Наверное, один из лучших вариантов, где сочетается простота и объектная ориентированность — Python. Язык обладает богатой библиотекой статистических и индикативных функций, именно поэтому многие программисты начинают свой путь с него. Однако все они в конечном счете удивляются медлительности разработанной ими программы. Никакие средства вложенные в дорогие и сверхбыстрые компьютеры здесь не помогут. Причина медлительности, на самом деле, очень проста: чем проще синтаксис языка, тем больше времени требуется на выполнение алгоритма, который на нем написан.

В основном скорость работы алгоритма зависит от того, является ли язык, на котором он написан, компилируемым или интерпретируемым. К примеру, C, Pascal или Java — компилируемые языки программирования. Это означает, что код программы будет выполнятся непосредственно на процессоре (в случае с C, Pascal) или на виртуальной машине (в случае с Java). В то же время языки Python, R, MATLAB — интерпретируемые, то есть код не будет работать сам по себе. Для него потребуется своеобразный переводчик. Интерпретируемый язык работает значительно медленнее и при этом требует больше ресурса от процессора и оперативной памяти, чем компилириуемый язык. Но при этом они интерактивны, то есть вы сможете вводить команды непосредственно в консоли. Есть и компромиссные языки. К примеру, C# является промежуточным языком между компилируемым и интерпретируемым. Программа на C# будет скомпилирована в промежуточный аппаратно-независимый код, который в дальнейшем, в зависимости от реализации, будет либо интерпретирован, либо преобразован в машинный код. C# примерно в 4 раза медленнее, чем C, но при этом в 30 раз быстрее, чем Python.

Ниже приведена таблица производительности двух тестовых программ, написанных на нескольких языках: решалка судоку и цикл умножения матриц размера 1000 на 1000. Результаты в секундах:

Язык


Судоку


Матрицы


C, C++


1.0


1.8


Java


1.7


2.6


Pascal



4


C#


3.8


9


JavaScript


18.1


16


Erlang


18


31


Python


119


121


Ruby


98


628


Matlab



621


R



1738



Почему же скорость выполнения программы так важна для торговых систем? Разработка стратегии зачастую происходит эмпирическим путем. То есть вы ищите подходящие параметры системы из многих вариантов и каждый раз тестируете. Предположим, что один тест параметров для программы на C занимает 1 минуту. В таком случае та же стратегия, но уже написанная на EasyLanguage потребует на тест уже порядка 30 минут. На Python — 2 часа, а на R — 10 часов! Если бы я делал тест для своей статьи The Trend Experiment, то я бы ждал результаты до сих пор. Теперь вы понимаете, почему многие торговые платформы используют свой собственный компилируемый язык программирования или варианты языка C для работы стратегий. При этом высокочастотные торговые стратегии обычно реализуются на C или непосредственно на машинном языке.

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

Zorro Traid: ~ 4 секунд (Lite-C, вариант C)
МТ4: ~ 110 секунд (на mql4, другой вариант C)
MultiCharts: ~ 155 секунд (EasyLanguage, С/Pascal микс).


Однако, эти различия не так критичны. Есть одна хитрость для преодоления медленной скорости работы языка. Даже в интерпретируемых языках есть библиотеки функций, которые часто написаны на C/C++. Скрипты, которые не идут шаг за шагом по историческим данным, а только вызывают нужные функции из библиотек, которые обрабатывают данные одновременно, будут работать с сопоставимой скоростью на всех всех языках. И действительно некоторые торговые системы могут быть запрограммированы в этом так называемом векторном способе (вы увидите это ниже на примере кода на языке R). К сожалению, подобный метод работает только с простыми системами и только для тестирования, он не применим для разработки стратегий для боевой работы.

Выбор инструментов


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

  • Это бесплатно (если вы богаты))
  • Скрипты на языке C пишутся легко и работают очень быстро. Вы можете реализовать систему или идею буквально в течение 5 минут
  • Открытая архитектура — вы можете добавить все что угодно с помощью DLL
  • Минималистичность — только фронтэнд для языка программирования
  • Позволяет автоматизировать эксперименты
  • Очень точные и реалистичный механизм имитации реальной торговли
  • Встроенное управление портфелем
  • Есть вся основные функции для обработки данных и статистические функции (большинство с исходным кодом).
  • Продукт постоянно развивается и поддерживается (новые версии обычно выходят раз в 2–3 месяца).
  • Последнее, но не менее важное: я досконально знаю платформу, потому что я написал по ней учебник…


image

Пример стратегии, написанной на C — классическое пересечение простых скользящих средних (SMA):

function run()
{
  vars Close = series(priceClose());
  vars MA30 = series(SMA(Close,30));    
  vars MA100 = series(SMA(Close,100));
        
  Stop = 4*ATR(100);
  if(crossOver(MA30,MA100))
    enterLong();
  if(crossUnder(MA30,MA100))
    enterShort();
}


Вы видите, что Zorro Trader предлагает очень простой метод реализации стратегии. Но здесь вы столкнетесь с недостатком языка C: вы не сможете вызвать внешние библиотеки так же просто, как в Python или в R. Использование пакетов для машинного обучения на основе языка C/C++ требует довольно продолжительного времени для реализации. К счастью, для этих целей Zorro Trader умеет вызывать R функции.

R — это интерпретатор сценариев для анализа данных и построения графиков. Это не язык программирования с последовательным синтаксисом, а скорее конгломерат операторов, функций и структур данных, который сильно разросся за 20 лет. Он не очень логично структурирован и труднее в изучении, чем обычный язык программирования, однако, имеет некоторые уникальные преимущества. Я буду использовать его в этой статье, когда дело будет касаться комплексного анализа или задач машинного обучения. Это мой инструмент потому что:

  • Это бесплатно («Программное обеспечение как секс: всегда лучше, когда это бесплатно»)
  • Скрипты R могут быть очень короткими и эффективными (как только вы привыкли к его синтаксису).
  • Это глобальный стандарт для анализа данных и машинного обучения.
  • Открытая архитектура — можно добавить почти любой модуль.
  • Минималистичность — только консоль с интерпретатором.
  • Есть горы пакетов для всех мыслимых и немыслимых математических и статистических задач.
  • Постоянно развивается и поддерживается мировым научным сообществом (около 15 новых пакетов выходят почти каждый день).


image

Пример пересечения SMA в R для векторного бэктеста:

require(quantmod)
require(PerformanceAnalytics)

Data <- xts(read.zoo("EURUSD.csv", tz="UTC", format="%Y-%m-%d %H:%M", sep=",", header=TRUE))
Close <- Cl(Data)
MA30 <- SMA(Close,30)
MA100 <- SMA(Close,100)
 
Dir <- ifelse(MA30 > MA100,1,-1) # calculate trade direction
Dir.1 <- c(NA,Dir[-length(Dir)]) # shift by 1 for avoiding peeking bias
Return <- ROC(Close)*Dir.1 
charts.PerformanceSummary(na.omit(Return))


Вы видите, что векторный код, по сути, просто состоит из вызовов функций. При этом он работает так же быстро, как и такой же эквивалент на C. Но подобная функция очень трудна для прочтения и для реальной торговли должна быть переписана, а такие вещи, как stop-loss нужно убрать, так как они не будут работать на векторном бэктесте. То есть насколько хорош R для интерактивного анализа данных, настолько же он бесполезен для написания торговых стратегий, хотя некоторые пакеты, к примеру Quantstart предполагают рудиментарные функции для тестирования и оптимизации. Они требуют «особого» стиля программирования и при это не очень реалистично имитирует торговлю и при этом остаются слишком медленными для серьезных тестов. То есть в то время как одни функции и пакеты языка R могут работать довольно быстро, так как они написаны на C, сам язык не сможет провести серьезное тестирование быстро. Но Zorro Trader и R прекрасно дополняют друг друга.

Больше хакерских штучек.


Помимо языков и платформ, часто нужны вспомогательные инструменты, которые могут быть небольшими, простыми, дешевыми (или бесплатными), но решать оперативно некоторые задачи. Для редактирования скриптов я не использую редакторы Zorro Trader или консоль R. Я использую Notepad++. Для интерактивной работы с R я могу рекомендовать RStudio. Очень полезно для разработки стратегии иметь инструмент для сравнения файлов, к примеру, вы хотите сравнить логи различных вариантов системы и проверить, какой вариант открытия сделки лучше, определить разницу во времени и оценить последствия различий. Для этого я использую Beyond Compare.

Кроме Zorro trader и R, есть еще одна относительно новая система разработки программного обеспечения, которые я планирую рассмотреть получше в ближайшее время: TSSB для генерации и тестирования торговые системы со свободными параметрами с помощью усовершенствованных алгоритмов машинного обучения. Дэвид Аронсон и Тимоти Мастерс участвовали в ее разработке, поэтому, я уверен, система не будет такой же бесполезной, как и большинство других генераторов торговых систем. Однако, есть еще одно ограничение: TSSB не может торговать, поэтому Вы не сможете реально торговать на своих хитроумных системах. Хотя, может быть, я смогу найти способ объединить TSSB с Zorro Trader.

© Geektimes