937
0,2
2014-04-11
Как я заработал $500K на машинном обучении и высокочастотном трейдинге — Часть 1
От переводчика: На днях на Хабре был опубликован топик о том, как IT-специалисту сохранить и приумножить свои деньги, который вызвал довольно большой интерес. Я с недавних пор интересуюсь финансовой темой, и мне на глаза попалась интересная история парня, который, применив свои технологические навыки, смог за год заработать полмиллиона долларов. Мне кажется, его опыт может быть интересен многим хабражителям (хоть у него и уже был опыт работы на бирже), поэтому решил перевести этот текст (он очень объемный, так что будет две части).
В этом посте подробно описано то, как я заработал примерно полмиллиона долларов на высокочастотном трейдинге в период с 2009 по 2010 год. Поскольку я работал совершенно независимо и больше не использую мою программу, я свободно могу рассказать об этом все. По большей части я участвовал в торгах фьючерсными контрактами на индексы DAX и Russell 2000.
Ключ к моему успеху, на мой взгляд, заключался не в использовании сложных финансовых уравнений, а скорее в применении общего алгоритмического подхода, который увязал вместе множество простых компонент и включал в себя принцип машинного обучения для оптимизации алгоритма и достижения максимальной прибыльности. При чтении этой статьи вам не понадобится знание какой-либо специфической терминологии – когда я запустил мою программу, я полагался лишь на интуицию. (К сожалению, прекрасный курс Эндрю Нг’а (Andrew Ng) по машинному обучению тогда еще не был доступен публике – между прочим, если пройдете по ссылке, попадете на мой текущий проект: CourseTalk, сайт отзывов на массовые открытые онлайновые курсы/MOOC).
Во-первых, я просто хочу продемонстрировать, что мой успех не был лишь счастливым совпадением. Моя программа проводила 1000-4000 сделок в день (как «длинных», так и «коротких»), однако в единицу времени у меня всегда были открыты всего несколько контрактов. Это означает, что мои шансы на внезапный успех достаточно быстро усреднялись. Это означает также и то, что я никогда не проигрывал больше $2000 в день и ни разу не наблюдал убытков в месячном периоде.
(Поправка: это показатели за вычетом комиссий)
А вот график, показывающий вариации моего заработка в течение дня. Заметьте, что на данном графике нет последних 7 месяцев, потому что – как только суммы перестали расти – я потерял мотивацию их вводить.
Мой опыт торговли на бирже
Прежде чем начать работать с моей программой автоматизированного трейдинга, я два года проработал трейдером в «обычном» режиме. Это было в 2001 году – в годы становления электронных торгов, когда мелкие спекулянты имели возможность неплохо заработать. То, как я тогда работал, было в определенном смысле сродни компьютерным и азартным играм. Быть успешным значило быть быстрым, дисциплинированным и иметь хорошие способности к интуитивному распознаванию паттернов поведения рынка. Я зарабатывал примерно $250k, что позволяло мне оплачивать обучение да еще и откладывать. Профит!
В течение следующих пяти лет я старался поднять пару стартапов, параллельно совершенствуя свои навыки программирования. К трейдингу я вряд ли смог бы вернуться до 2008 года. Однако игра на бирже показалась мне хорошей возможностью поправить финансовое положение в тот момент, когда деньги с продажи последнего стартапа начали подходить к концу – такое занятие могло бы дать мне возможность обдумать следующие шаги.
API для трейдинга
В 2008 я был обыкновенным дневным трейдером на фьючерсном рынке и использовал ПО под названием T4. Я очень хотел заполучить какие-нибудь кастомизированные комбинации «горячих клавиш» для того, чтобы отдавать команды, поэтому узнав, что T4 обладает открытым API, я потрудился изучить C# (язык программирования, используемый API), а потом пошел дальше и сам создал необходимые «горячие клавиши».
Попробовав свои силы с API, я решил увеличить свои аппетиты: я захотел научить компьютер торговать за меня. API предоставляет как стриминг данных с рынка, так и простой способ отправки команд на биржу – и все, что мне нужно было сделать – создать логику, которая бы связывала эти два события.
Ниже приведен скриншот рабочего окна T4. Особенно хорошо было то, что, создав свою собственную программу, я мог наблюдать компьютерные торги с того же самого интерфейса. Следить за тем, как настоящие команды появляются и исчезают в рабочем окне (появляются сами собой, привязанные к моим реальным деньгам) было и пугающе, и захватывающе одновременно.
Проектирование собственного алгоритма
Поначалу моя цель заключалась в создании системы, относительно которой я мог бы быть обоснованно уверен – она приносит прибыль – еще до начала реальной игры на бирже. Для того, чтобы достичь такой уверенности, мне было необходимо создать фреймворк, симулирующий торги, который мог бы – настолько точно, насколько это возможно – воссоздавать поведение рынка.
[Обычно для этого используют тестовый доступ на биржу, такая возможность есть и на отечественных площадках. Также многие трейдеры используют уже готовые фреймворки для разработки торговых роботов (для русских бирж есть несколько таких решений, в основном, платных) – прим. перев.]
Поскольку реальная торговля требует обработки рыночных обновлений, в потоковом режиме передающихся через API, режим симуляции потребовал организовать чтение рыночных обновлений из файла с данными. Для сбора таких данных я установил первую версию моей программы просто чтобы подключиться к API и записать рыночные обновления с метками времени. Для того, чтобы протестировать и обучить мою систему, мне понадобилось в общей сложности 4 недели собирать текущую информацию с рынков.
Даже имея базовый фреймворк, я все равно должен был выяснить, как создать трейдинговую систему, приносящую прибыль. Как выяснилось, мой алгоритм как бы распадается на два отдельных компонента, которые я рассмотрю по отдельности:
- Предсказание движения цен
- Организация прибыльных торгов
Предсказание движения цен
Возможно, очевидный компонент любой трейдинговой системы – способность предсказывать, как изменятся цены. И моя система не стала исключением. Я определил текущие цены, как среднее значение между внутренней ценой спроса и внутренним предложением и поставил целью предсказать, как изменится цена за ближайшие 10 секунд. Таким образом, моему алгоритму понадобилось бы предсказывать положение цен раз от раза в течение всего дня.
Создание и оптимизация индикаторов
Я создал сразу несколько индикаторов, с помощью которых можно было подтвердить мою способность предсказывать движения цен в краткосрочном периоде. Каждый индикатор выдавал некоторое значение, которое было либо положительным, либо отрицательным. Польза таких индикаторов состояла в том, что чаще всего положительное значение соответствовало росту, а отрицательное – падению рынка.
Моя система позволяла мне быстро определять качество предсказаний каждого из индикаторов, поэтому я мог экспериментировать с большим их количеством, чтобы выяснить, какие из них работают наиболее точно. Многие индикаторы задаются формулами, содержащими переменные – зная эти формулы, я мог подобрать оптимальные значения переменных, производя попарные сравнения результатов, достигнутых с использованием различных значений.
Индикаторы, оказавшиеся максимально полезными, были относительно просты и основывались на последних данных с рынка, на котором я торговал, а также на информации с других рынков, где торговались похожие ценные бумаги.
Точные предсказания поведения цен
Однако, иметь индикаторы, просто предсказывающие повышение или понижение цен, было недостаточно. Мне нужно было знать, насколько точно каждое значение каждого индикатора предсказывает конкретное изменение цены. Мне нужна была формула, которая могла бы обращать значение индикатора в точную цену.
Чтобы этого достичь я распределил предсказанные скачки цен по 50 группам, различавшимся по разбросу значений индикаторов. Это позволило сделать уникальное предсказание по каждой группе, на основании значений которого я мог построить график в Excel. Как видите, вероятность изменения предсказанной цены возрастает с ростом значения индикатора.
На основе подобного графика я смог создать формулу, которая соответствовала полученной кривой. Вначале я делал эту «подгонку под кривую» вручную, но вскоре написал небольшую подпрограмму, которая автоматизировала этот процесс.
Между прочим, не все индикаторные кривые имели схожие графики. Кроме того, группы были распределены логарифмически, чтобы в каждой группе было примерно равное количество исходных значений. Стоит отметить также, что отрицательные значения индикаторов (и соответствующие предсказания понижения цен) были взяты по модулю и скомпонованы с положительными значениями (мой алгоритм работает с повышением и понижением цены абсолютно одинаково).
Компоновка индикаторов для получения однозначного предсказания поведения цен
Важно обратить внимание вот на какой момент: все индикаторы не были абсолютно независимы. Я не мог просто свалить в кучу все предсказания индикаторов и выбрать из них конечное значение. Важно было выделить добавленную прогностическую ценность, которой каждый индикатор дополнял уже предсказанное значение. Это было не так уж сложно сделать, но это означало, что если я вручную подгонял под кривую значения одновременно нескольких индикаторов, мне нужно было быть осторожным – изменение одного индикатора могло вызвать изменение остальных.
Для того, чтобы подогнать под заданную кривую все индикаторы одновременно я настроил оптимизатор так, чтобы с каждой итерацией кривая прогнозирования менялась в сторону заданной только на 30%. Этот скачок в 30% позволял кривым прогнозирования стабилизироваться за небольшое количество итераций.
Благодаря тому, что теперь каждый индикатор только прибавлял точности к предсказанию цены, я мог использовать все индикаторы сразу, чтобы получить однозначный прогноз относительно того, где окажется рынок в течение ближайших 10 секунд.
Почему недостаточно просто предсказывать цены
Вам может показаться, что с таким рыночным преимуществом я мог озолотиться. Но важно помнить, что рынок состоит из спроса и предложения – а не только из рыночных цен. Успех в высокочастотном трейдинге приходит к тем, кто предлагает наилучшие цены, а это непросто.
Сложности при создании системы, позволяющей заключать прибыльные сделки, можно выделить следующие:
- С каждой торговой операции мне нужно платить комиссию и моему брокеру, и бирже.
- Факт существования спреда (разницы между лучшей ценой покупки и продажи) означает, что если бы я просто в случайном порядке покупал и продавал, то потерял бы массу денег.
- Большую часть рынка занимают другие боты, которые заключат со мной сделку только если сочтут ее статистически выгодной.
- Найти привлекательное предложение – не значит заключить сделку. К тому моменту, когда приказ на покупку достигнет биржи, предложение, скорее всего, может стать неактуальным.
- Как мелкий игрок на рынке, я не могу в одиночку конкурировать только за счет скорости.
Продолжение следует...
Источник: habrahabr.ru/company/itinvest/blog/208500/
Охотники на волков с Wall Street. Часть 1
Как я заработал $500K на машинном обучении и высокочастотном трейдинге — Часть 2