Избранное трейдера Сергей Сергаев
Статья с аггрегатора Quandl Resource Hub.
Quandl взял интервью у старшего менеджера по алгоритмическим стратегиям одного из больших хеджевых фондов. Мы говорили о создании торговых стратегий — от абстрактного представления рынка до конкретного воплощения в стратегию с оригинальной предсказательной способностью.
Можете вы рассказать, как создаются новые торговые стратегии?
Все начинается с гипотезы.Я предполагаю, что может существовать взаимоотношение между двумя инструментами, или появился новый инструмент на рынке, набирающий популярность, или возник необычный макроэкономический фактор, который влияет на микроструктурное поведение цены. Затем я записываю уравнение — или создаю модель, если вам угодно — с целью описания этого взаимоотношения. Обычно это некое уравнение процесса, показывающее изменение переменных во времени, со случайным (статистическим) компонентом.
Если говорить образно. То, чтобы отправить сообщение на сервер, нам просто нужно сформировать нужную строку со всеми данными и отправить ее на биржу. Ну например:
8=FIX.4.4;9=78;35=A;49=FG;56=tgFhcfx901U05;34=1;52=20160212-11:42:51.812;98=0;108=3000;141=Y;10=047;
Если быть внимательным, то мы увидим, что кол-во символов в строке у нас 100, а в заголовке сообщения мы передаем, что 78 (9 = 78). По правилам протокола FIX, длину сообщения нужно считать без учета концовки и первых двух полей заголовка. А именно:
С длиной сообщения разобрались. Теперь про разделитель. Пока в моем скрине это ";". В документациях западных написано что это символ SOH. Чтобы однозначно ответить на этот вопрос, я запустил прилагаемого клиента биржи и сниффером стал перехватывать сообщения между клиентом и биржей. Кстати, программа ведет логи, и их общение выглядит так (зеленое — передача запроса на биржу, красное — ответ от биржи)://Получаем ip сервера
IPAddress ipAddr = IPAddress.Parse(server);
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port);
//Создаем заголовк
HeaderMessage msHeader = new HeaderMessage
{
BeginString = «FIX.4.4»,
MsgType = «A», //Тип сообщения на установку сессии
SenderCompID = "",
TargetCompID = «FG»,
MsgSeqNum = 1
};
//Создаем сообщение на подключение onLogon
LogonMessage msLogon = new LogonMessage
{
EncryptMethod = 0,
HeartBtInt = 3000,
ResetSeqNumFlag = true
};//Вычисляем длину сообщения
msHeader.BodyLength = msHeader.GetHeaderSize() + msLogon.GetMessageSize();
//Создаем концовку сообщения
TrailerMessage msTrailer = new TrailerMessage(msHeader.ToString() + msLogon.ToString());//Формируем полное готовое сообщение
string fullMessage = msHeader.ToString() + msLogon.ToString() + msTrailer.ToString();
Console.WriteLine(«Сообщение для отправки {0}»,fullMessage);//Создаем сокет для подключения
sSender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
//Подключаемся
sSender.Connect(ipEndPoint);
Console.WriteLine(«Сокет соединился с {0} », sSender.RemoteEndPoint.ToString());
byte[] msg = Encoding.UTF8.GetBytes(fullMessage);
//Отправляем сообщение
int bytesSent = sSender.Send(msg);
Console.WriteLine(«Отправил {0} байт», bytesSent.ToString());
//Получаем ответ от сервера
byte[] bytes = new byte[1024];
int bytesRec = 0;
bytesRec = sSender.Receive(bytes);
Console.WriteLine(«Ответ от сервера: {0}», Encoding.UTF8.GetString(bytes, 0, bytesRec));
Продолжение. Начало здесь.
После того, как стратегия протестирована и, насколько это возможно, избавлена от недооценки/подгонки, с хорошим коэффициентом Шарпа и минимизированными просадками, настало время выстроить систему исполнения.
Система исполнения ордеров
Система исполнения отвечает за то, каким образом список сделок, сгенерированных стратегией, отправляется и исполняется на стороне биржи. Несмотря на тот факт, что генерация сделок может быть полу- или полностью автоматической, механизм исполнения может быть ручным, полуавтоматическим или полностью автоматическим. Для LFT стратегий ручное или полуавтоматическое исполнение применяется наиболее часто. Для HFT алгоритмов необходимо создать полностью автоматический механизм исполнения, который скорее всего будет тесно интегрирован с генератором сделок (из-за сильной зависимости стратегии и технологии).
Основные этапы создания автоматических торговых систем сформулировал Michael Halls-Moore на своем сайте www.quantstart.com. Я присоединяюсь к его советам и рекомендациям — по текстам на сайте видно, что автор действительно занимается практической работой по алготрейдингу.
Автоматическая торговля это чрезвычайно сложная область биржевых финансов. Значительное время может занять получение необходимых знаний для создания вашей собственной стратегии. Также потребуется неплохие навыки в программировании, как минимум на таких языках, как MATLAB, R или Python. В связи с постоянным ростом частоты сделок технологические аспекты торговли тоже становятся очень важны. Это требует изучения языков программирования C/C++.
Автоматическая торговая система состоит из следующих основных компонентов:
Призрачно все в этом рынке бушующем,
Нефть по 500 и обвал трежерей.
Есть только миг между прошлым и будущим,
Именно он называется трейд.
Нам «боковик» сердце вряд ли обрадует,
Да и «пила» — она как в горле кость.
А для всех поз, что сорвались и падают,
Есть только лось, офигительный лось.
Пусть этот тренд вдаль летит сквозь столетия,
Хоть не всегда по дороге мне с ним,
Чем дорожу, чем рискую на свете я?
Депозитом одним, депозитом одним.
Профит дано повстречать иль лося еще,
Нам не дано угадать свой рубеж.
Есть только миг между прошлым и будущим,
Имя ему: «я успел выйти в кэш».
P.S. Для молодежи, которая не в курсе — песня исполняется на мотив песни из к/ф «Земля Санникова».
Прошлая часть — см. в моем блоге.
В этой части разберем технику улучшения производительности стратегии, использующую множество моделей.
Одним из наиболее мощных методов улучшения прибыльности вашей модели является объединение нескольких алгоритмов в так называемое «множество». Теория состоит в том, что комбинируя разные модели и их предсказания, мы получаем более робастные результаты. Тесты показывают, что даже объединение простых моделей может быть производительнее более сложной, но единственной стратегии.
Существует три основных техники объединения:
Смешивание:
Смешивание основано на создании моделей, прогоняемых на немного различных тренировочных наборах и усреднения их результатов для получения одного предсказания. Тренировочный набор переделывается путем повторения или удаления вхождений данных, в результате чего получается несколько разных наборов. Этот процесс работает хорошо для нестабильных алгоритмов (например, деревья решений) или, если присутствует определенная степень случайности в процессе создания моделей ( как, например, начальные веса в нейронных сетях). Получив усредненное предсказание для коллекции моделей с высоким значением подгонки, мы можем уменьшить результирующую подгонку без увеличения недооценки, что приведет к лучшим результатам.
Основные принципы увеличения прибыльности алгоритмов автоматизированной торговли изложены в блоге Inovancetech. Представляю здесь перевод этой статьи. В ней использованы некоторые алгоритмы и результаты цикла про машинное обучение (часть 1, часть 2).
После построения алгоритма, вам нужно убедиться, что он робастен и будет генерировать прибыльные сигналы при реальной торговле. В данном посте мы представим 3 легких способа увеличить производительность вашей модели.
Прежде чем улучшать модель, вы должны определить базовую производительность стратегии. Самый лучший способ сделать это — протестировать модель на новых исходных данных. Однако, вы всегда владеете довольно ограниченным набором данных, несмотря на их множество, предоставляемое финансовыми институтами. Значит, вы должны тщательно обдумать, как использовать имеющийся набор. По этим причинам, самое лучшее — разделить его на три отдельных части.
После рассмотрения основ машинного обучения в первой части, мы перейдем к примеру использования наивного байесовского классификатора для предсказания направления движения цены акций Apple. Сначала разберем основные принципы работы наивного байесовского классификатора, затем создадим простой пример использования дня недели для предсказания направления цены закрытия — выше или ниже текущей, а в окончании построим более сложную модель, включающую технические индикаторы.
Что представляет собой наивный байесовский классификатор (НБК)?
НБК старается найти вероятность события А при условии, что событие В уже произошло, обзначаемую как Р(А|B) (вероятность А при условии В).
В нашем случае, мы должны спросить: какова вероятность того, что цена возрастет, при условии, что сегодня — среда? НБК берет во внимание обе вероятности — общую вероятность роста цены, то есть число дней, когда цена закрытия была выше цены открытия относительно всех рассматриваемых дней, и вероятность роста цены при условии, что сегодня среда, то есть сколько прошедших сред имело цену закрытия выше цены открытия?
В последнее время приобретают все большую популярность алгоритмы машинного обучения. Они применяются для решения задачи классификации входных данных, или, проще говоря, выявления паттернов в структуре этих данных. Небольшой цикл статей про машинное обучение опубликован на сайте inovancetech.com, здесь я представляю их перевод.
В этой серии статей мы рассмотрим построение и тестирование простой стратегии машинного обучения. В первой части отметим основные принципы машинного обучения и их применение к финансовым рынкам.
Машинное обучение становится одной из самых многообещающих областей в алгоритмической торговле за последние два года, но имеет репутацию слишком сложного математического подхода. В действительности это не столь трудно в практическом применении.
Цель машинного обучения (МО) в том, чтобы правильно смоделировать исторические данные, и затем использовать эту модель в предсказании будущего. В алгоритмической торговле применяется два типа МО:
Я узнал, что у меня
Есть огромная семья!
Биржа, фьючерс РТС;
Свечки, графики, ТС;
Безубыток, тэйк, стакан;
Кукл, гэп на весь экран...
Опционы, маржин-колл;
Герчик, уровни, прокол!
S&P и РТС;
Блок стат. данных, ФРС;
Клиринг, слив, сложный %
Нефть, но только марки Brent!
Вобщем, всех не перечесть,
Главное — нам в тренд залезть;
И тогда с моей семьёй -
Ярды понесём домой!)))