Небольшая статья с ресурса http://www.talaikis.com/ о построении простой стратегии, использующую наивный байесовский классификатор при создании процесса возврата к среднему. Весь код в статье приведен на языке Python.
Это достаточно большая область исследований, но расскажем все очень кратко. Мы попытаемся найти взаимоотношение между временными сериями (в данном случае возьмем в качестве сигнала взаимный фонд XLF из финансового сектора, сдвинутый по времени на 1 день назад), а нашей целью будет фьючерс S&P500 в форме CFD. Будем входить в длинную позицию по этой бумаге при нулевой вероятности приращения. Логически нулевая вероятность ни о чем не говорит, другими словами, будем покупать возврат к среднему.
1. Получение данных
Y = read_mongo(dbase, "S&P5001440") X = read_mongo(dbase, syms[s]).shift() #готовим набор данных res = pd.concat([X.CLOSE, Y.CLOSE], axis=1, join_axes=[X.index]).pct_change().dropna() res.columns = ['X', 'Y']
Продолжение. Начало здесь.
После того, как стратегия протестирована и, насколько это возможно, избавлена от недооценки/подгонки, с хорошим коэффициентом Шарпа и минимизированными просадками, настало время выстроить систему исполнения.
Система исполнения ордеров
Система исполнения отвечает за то, каким образом список сделок, сгенерированных стратегией, отправляется и исполняется на стороне биржи. Несмотря на тот факт, что генерация сделок может быть полу- или полностью автоматической, механизм исполнения может быть ручным, полуавтоматическим или полностью автоматическим. Для LFT стратегий ручное или полуавтоматическое исполнение применяется наиболее часто. Для HFT алгоритмов необходимо создать полностью автоматический механизм исполнения, который скорее всего будет тесно интегрирован с генератором сделок (из-за сильной зависимости стратегии и технологии).
Своим опытом в построении высокопроизводительных торговых систем с использованием генетического программирования делится Dr Jonathan Kinlay в своем блоге.
Увеличение времени, стоимости и риска разработки стратегий заставило трейдинговые компании исследовать возможности итенсификации процессов разработки. Одним из таких подходов является генетическое программирование.
Генетическое программирование (ГП) это эволюционная методология разработки, которая может быть использована для идентификации паттернов или зависимостей в структурах данных. ГП это набор инструкций ( обычно простые операторы, сложение и вычитание) для исходных данных и функция соответствия для определения, насколько хорошо система способна комбинировать функции и данные для достижения определенной цели.
О некоторых особенностях, свойственных высокочастотным стратегиям, рассказывает Dr Jonathan Kinlay в своем блоге. Представляю здесь перевод его статьи.
Большинство инвесторов, вероятно, никогда не видели эквити высокочастотной стратегии. Есть объективные причины этого: в связи с типичной производительностью таких стратегий, фирмы, использующие их, мало нуждаются в привлечении стороннего капитала. Кроме того, HFT алгоритмы имеют ограничения по емкости, которая очень важна для институциональных инвесторов. Поэтому интересно наблюдать реакцию инвестора на прибыльность HFT стратегии, которую он видит впервые. Привыкший к коэффициенту Шарпа в диапазоне 0,5-1,5 или до 1,8, при удачном стечении обстоятельств, он бывает поражен тем, что такие стратегии показывают значения коэффициента, выражаемые двузначными числами.
Прошлая часть — см. в моем блоге.
В этой части разберем технику улучшения производительности стратегии, использующую множество моделей.
Одним из наиболее мощных методов улучшения прибыльности вашей модели является объединение нескольких алгоритмов в так называемое «множество». Теория состоит в том, что комбинируя разные модели и их предсказания, мы получаем более робастные результаты. Тесты показывают, что даже объединение простых моделей может быть производительнее более сложной, но единственной стратегии.
Существует три основных техники объединения:
Смешивание:
Смешивание основано на создании моделей, прогоняемых на немного различных тренировочных наборах и усреднения их результатов для получения одного предсказания. Тренировочный набор переделывается путем повторения или удаления вхождений данных, в результате чего получается несколько разных наборов. Этот процесс работает хорошо для нестабильных алгоритмов (например, деревья решений) или, если присутствует определенная степень случайности в процессе создания моделей ( как, например, начальные веса в нейронных сетях). Получив усредненное предсказание для коллекции моделей с высоким значением подгонки, мы можем уменьшить результирующую подгонку без увеличения недооценки, что приведет к лучшим результатам.
Основные принципы увеличения прибыльности алгоритмов автоматизированной торговли изложены в блоге Inovancetech. Представляю здесь перевод этой статьи. В ней использованы некоторые алгоритмы и результаты цикла про машинное обучение (часть 1, часть 2).
После построения алгоритма, вам нужно убедиться, что он робастен и будет генерировать прибыльные сигналы при реальной торговле. В данном посте мы представим 3 легких способа увеличить производительность вашей модели.
Прежде чем улучшать модель, вы должны определить базовую производительность стратегии. Самый лучший способ сделать это — протестировать модель на новых исходных данных. Однако, вы всегда владеете довольно ограниченным набором данных, несмотря на их множество, предоставляемое финансовыми институтами. Значит, вы должны тщательно обдумать, как использовать имеющийся набор. По этим причинам, самое лучшее — разделить его на три отдельных части.
На графике выше результаты моей торговли роботами за апрель. Прибыль показана в процентах от начального капитала с начала торговли 10 марта 2015 года (апрель отделен красной линией). В прошлом посте были приведены основные характеристики рабочих алгоритмов.
Как видно на графике имела место значительная просадка 16 апреля, причем до этого три дня были хоть с небольшим, но минусом. Это вызывает уже вопросы о робастности применяемых алгоритмов, таких просадок я не наблюдал на используемых мной исторических данных, что может свидетельствовать о подгонке на бэктестировании. Хотя день 16.04 был очень интересным, ниже приведен график прибыли за день:
Не путать с работорговлей :). Как автор блога об алгоритмической торговле, считаю нужным выкладывать эквити моих роботов, которые запущены на бирже в настоящее время. В заглавии поста результаты за март, в процентах от капитала на начало месяца. В боевых торгах алгоритмы принимают участие с 10 марта.
Немного расскажу об используемых роботах. Общая архитектура этих программ основана на структуре robot_uralpro, но значительно усовершенствована в плане гибкости, что позволяет добавлять любой новый алгоритм без перестройки основного скелета робота, вплоть до опционных стратегий. Новый робот торгует валютным фьючерсом Si, но применяются некоторые элементы старого алгоритма robot_uralpro. Всего реализовано 3 стратегии на данный момент, в торгах принимают участие пока только две, третья не набрала достаточного количества статистики, так как медленнее остальных, поэтому только тестируется. Сделана диверсификация по параметрам для каждого алгоритма на 10 разных наборов, следовательно, торгуют одновременно как бы 20 роботов. Стратегии основаны на наблюдениях, сделанных при тестировании математических моделей, никаких ценовых паттернов не используется. Роботы подключены к бирже через Plaza2, колокейшена нет, выбран обычный хостинг с минимальным пингом до плазовских IP. На данный момент он равен 3 мс. Средний раундтрип заявок составляет около 10 мс. Эквити за один день — 23.03.2015 — на графике ниже. Выбрал, конечно, один из лучших:)
Интересный подход к предсказанию направления рынка рассмотрен в статье "Using CART for Stock Market Forecasting". Для того, чтобы предугадать движение цены на недельном отрезке используется техника под названием CART (Classification And Regression Trees) — построение классификационного графа (дерева) с целью предсказать значение целевой характеристики (цены) на основании набора объясняющих переменных. CART находит применение во многих областях науки и техники, но применим и в торговле, так как обладает набором свойств, хорошо подходящими для этой цели:
Для построения дерева автор использует библиотеку языка R, вычисляющую рекурсивное разделение (Recursive Partitioning) rpart.
Трейдеры, которые приобрели мою программу robot_uralpro (см. пост на смарт-лабе), спрашивают, можно ли доработать алгоритм для применения его на современном рынке? Напомню, стратегия робота основана на взаимоотношении цен синтетического индекса, составляемого динамически из рыночных цен акций, входящих в индекс РТС, и фьючерса RI. Идея «одноногого» статистического арбитража, реализованного в роботе, будет работать и сейчас, только в том случае, если научиться правильно определять, какой актив опережает другой в смысле динамики их цен. Эта статья посвящена правильному выявлению такого взаимодействия, которое в англоязычных источниках называется «lead-lag relationship» -опережение-отставание между разными активами.
Те алготрейдеры, кто не приобретал robot_uralpro, тоже сочтут эту статью полезной, так как lead-lag relationship может использоваться в стратегиях парного трейдинга и им подобным. Например, определив такое взаимодействие, можно исключить из парного трейдинга один из активов ( с учетом того, конечно, что отношение торгуемых инструментов было описано четкой моделью) и значительно увеличить тем самым прибыльность стратегии.