Как я заработал $500K на машинном обучении и высокочастотном трейдинге — Часть 2

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





Создание полноценного симулятора торгов


Итак, у меня был фреймворк, который позволил мне протестировать и оптимизировать индикаторы. Но я должен был сделать что-то большее – мне нужен был фреймворк, который позволил бы мне протестировать и оптимизировать всю трейдинговую систему целиком; такой, в котором я мог бы отсылать команды и открывать позиции. В таком случае я смог бы оптимизировать общие прибыли и убытки и – до определенной степени – средние прибыли и убытки за одну торговую сессию.

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

  • Когда команда отправляется на рынок в симуляторе я должен смоделировать временной лаг. Тот факт, что моя система «увидела» предложение, не означает, что она может его сразу купить. Система пошлет команду, подождет примерно 20 миллисекунд и только тогда, если предложение все еще будет в силе, будет рассматривать его, как закрытую сделку. Это не совсем точно, так как длительность реального лага не всегда одинакова и не регистрируется.
  • Когда я размещаю предложения купить или продать акции, мне нужно учитывать поток исполнения сделок (который обеспечивает API) и использовать его, чтобы отслеживать, когда мой заказ будет исполнен. Чтобы сделать это правильно, я должен отслеживать позицию моей команды в очереди (очередь формируется по системе first-in first-out). И снова я не смог сделать это в точности, но смоделировал максимально приближенную к реальности систему.
Чтобы усовершенствовать симуляцию исполнения приказов я взял логи, собранные во время реальной торговли с использованием API, и сопоставил их с логами, записанными во время симуляции торгов за тот же самый временной отрезок. Я смог приблизить свой симулятор к состоянию, очень близкому к реальности, а в отношении тех моментов, которые в точности смоделировать не удалось, я постарался убедиться, что выходные результаты соответствовали статистическим данным (по тем метрикам, которые я счел важными).

Обеспечение прибыльных торгов


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

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

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

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

  • Предсказание поведения цен (которое мы обсуждали раньше)
  • Рассматриваемый уровень цен (внутренние уровни означают более вероятный ценовой скачок)
  • Количество контрактов до моего заказа в очереди (чем меньше, тем лучше)
  • Количество контрактов после моего заказа в очереди (чем больше, тем лучше)
По существу эти факторы определяют «безопасную» зону для покупки/продажи. Само по себе предсказание поведения цен было бы неадекватным способом оценки ситуации, поскольку оно не принимало в расчет тот факт, что, размещая предложение о покупке, я не закрывал позицию автоматически – ведь это случается только тогда, когда кто-то реально продает мне ценные бумаги. В реальности же сам факт того, что кто-то что-то мне продает по заданной цене меняет вероятностную картину торгов.

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

Что игнорировала моя программа


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

  • Цена входа на позицию – В офисе трейдинговой компании нередки разговоры о цене, по которой кто-либо заключает длинные и короткие сделки, как будто это должно повлиять на принятие подобных решений в будущем. Несмотря на то, что такие данные имеют некоторое значение в рамках стратегии сокращения рисков, они не имеют никакого отношения к дальнейшему развитию рыночных событий. Поэтому моя программа полностью игнорировала эту информацию. Это все равно, что игнорировать необратимые издержки.
  • Заключение длинной/короткой сделки – Как правило, у трейдера-человека был бы специальный критерий, определяющий, где продавать длинную позицию, а где – заключать короткую сделку. Однако, с точки зрения моего алгоритма, не было никакой разницы между этими двумя понятиями. Если мой алгоритм ожидал падение цен, то продажа была логичным шагом вне зависимости от того, какой характер имела сделка: «лонг», «шорт» или «флэт».
  • Стратегия «удвоения» – Это общепринятая стратегия, согласно которой трейдеры покупают больше акций в том случае, если изначально торги идут не в их пользу. Как следствие, ваша средняя цена покупки снижается, а это означает, что когда (если) цена на акции изменит курс, вы «отобьете» свои расходы в кратчайшие сроки. Мне кажется, это просто кошмарная стратегия, если только вы не Уоррен Баффет. Вы обманываете себя, думая, что у вас все хорошо, потому что большая часть ваших сделок выгорит. Проблема заключается в том, что если вам не повезет, то проигрыш будет ошеломляющий. Другое следствие этого подхода заключается в том, что становится крайне сложно определить, действительно ли вы получили рыночное преимущество, или вам просто повезло. Важным качеством моей программы было как раз то, что я мог отслеживать и подтверждать ситуации, когда моя программа действительно таковым преимуществом обладала.

Управление рисками


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

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

Работа с алгоритмом


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

Каждую неделю я должен был бы заново обучать мою программу на основе данных, собранных за предыдущие 4 недели. Однако я выяснил, что это нарушает баланс между поиском последних поведенческих рыночных трендов и обеспечением уверенности в том, что мой алгоритм получает достаточно информации для разработки значимых паттернов поведения. Когда обучение стало занимать все больше и больше времени, я разбил его так, чтобы оно могло осуществляться 8 виртуальными машинами с использованием сервиса Amazon EC2. Затем полученные результаты объединялись на моей локальной машине.

Наивысшей точкой моих торгов стал октябрь 2009, когда я заработал почти 100 000 долларов. Впоследствии я провел еще 4 месяца, пытаясь улучшить мою программу несмотря на то, что прибыль с каждым месяцем снижалась. К несчастью, на сегодняшний день мне кажется, что я перепробовал все свои лучшие идеи, потому что все, что я использовал, не особенно мне помогло.

Испытывая разочарование от неспособности улучшить программу и отсутствия ощущения роста, я начал думать о новом направлении. Я написал письма 6 разным трейдинговым компаниям, специализирующимся на высокочастотных торгах, и поинтересовался, не захотят ли они купить мою программу и нанять меня к себе на работу. Никто не ответил. Потом у меня появились идеи новых стартапов, над которыми я хотел бы поработать, так что я окончательно забросил это дело.

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

Наверху страницы [в оригинальном посте – прим. переводчика] есть комментарий, в котором встречаются такие выражения, как «манипулирование статистикой», а меня называют одним из «инвесторов-ритейлеров», про которых настоящие кванты [кванты/квонты – в российской переводческой практике используются оба варианта перевода – прим. переводчика] говорят, что их «отстреливать надо». Это весьма неудачный комментарий, попросту далекий от реальности. А между тем, существуют и более интересные отзывы на мою статью.

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

Источник: habrahabr.ru/company/itinvest/blog/211642/