Избранное трейдера jk555
Продолжаю серию статей. Начало тут http://smart-lab.ru/blog/310895.php
Итак, у нас имеется история в виде набора упорядоченных по времени тиков, но используем мы только данные цены. Перед началом проведем подготовку данных (как я называю «упаковку тиков»). Например, есть исторический отрезок со следующими данными (окончание сессии от 12.02.2016 по ESH16):
Как мы видим множество соседних тиков, имеют одинаковое значение цены, что создает «избыточность данных». Если мы оставим только те последовательные тики, цена которых отличается от предыдущего, то количество данных ощутимо сократиться:
Это я и называю упаковкой тиков. Но на самом деле такой способ упаковки удобен для дата-майнинга, для симуляции на истории удобен способ «меньшего сжатия», когда мы оставляем только те последовательные тики, цена которых отличается от предыдущих. Или тики, которые по времени отстоят от предыдущего более чем на 1 секунду. Это необходимо при симуляции выставления и исполнения ордеров. И также дает нам биржевое время, с точностью до секунды, для функционирования работа в режиме симуляции по истории. В этом случае картинка будет следующей:
Итак, данные подготовлены и можно приступить к «описанию и поиску простейших паттернов» (этот блок служит для ввода в курс дела, а не отражает практический способ). Например, имеется некоторый паттерн, представленный на следующем рисунке:
Паттерн выделен оранжевым цветом. Какая особенность алгоритма необходима для его выявления? Это то, что он должен искать паттерн при поступлении каждой порции данных. Паттерн может начаться с любого тика, и закончится на любом. Т.е. поиск в данном случае будет представлять «трафарет»:
Подставляемый для каждого тика в последовательности, и при совпадении с которым паттерн считается «опознанным» (Т.е. трафарет как-бы скользящий).
Представленный пример достаточно сильно утрирован, в реальности трафарет не столь «жёсткий» и возможно бы включал в себя и следующие представления:
P.P.S
Формирование следующих статей цикла будет производиться по мере наличия времени и желания ;)
Всем успехов в торговле!
Всем привет.
Решил выложить в открытый доступ базу данных тиков с CME, которая накапливалась за последние годы, и обновляется по итогу дня.
85.25.211.62
login: smartlab
pass: smartlabpass
Ссылки на торрент: http://ge.tt/1Ql8j3Y2
№2: app.box.com/s/h0dhmkif0fhnvlpzdp8ma89c1ysv876t
seconds (int32) — кол-во секунд с начала суток по Чикаго.
milliseconds (int32)
price (int32)
volume (int32)
bestBidPrice (sbyte) — расстояние в тиках между price и реальной ценой BidPrice
bestAskPrice (sbyte) - расстояние в тиках между price и реальной ценой AskPrice
bestBidSize (int32) — доступно с июня 2015
bestAskSize (int32) - доступно с июня 2015
Создаем класс Tick:
Если говорить образно. То, чтобы отправить сообщение на сервер, нам просто нужно сформировать нужную строку со всеми данными и отправить ее на биржу. Ну например:
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));
Обзор рынков. Пятница, 12 февраля 2016
[напоминание. все графики достаточного качества, чтобы их рассмотреть в chrome: правый клик, открыть картинку в новом окне]Финансовые рынки с начала 2016 года вошли в явный режим “risk off” (риск выключен), и этот режим становится все более и более явным. Растут в цене “безопасные гавани” — госбумаги и золото. Наблюдается высокая волатильность и динамика активов напоминающая условия глобальной рецессии. Однако новостей оправдывающих негативные ожидания и страхи почти не так и много.
Из цепи событий можно выделить следующее. В конце года ФРС подняла ставку с 0...0.25% до 0.5%, хотя это не является радикальным ужесточением. Однако после 9 лет нулевых ставок это породило “новую реальность”. Также, 2016 год начался с обвала китайских акций, что потянуло за собой распродажи акций по всему миру и, очевидно, способствовало обвалу нефти (Брент доходил до 27 долл./барр.). Сейчас китайцы празднуют новый год по лунному календарю и всю текущую неделю не работают (со следующего понедельника вернутся к обычному режиму).
S&P 500 в вчера упал до минимума с апреля 2014 г. (если не обращать внимание на интрадей и считать по закрытию), STOXX Europe 600 в четверг потерял 3.7%, и вышел район новых минимумов с сентября 2013. С максимума в этом году STOXX 600 потерял уже 27%, что соответствует классическим признакам “медвежьего рынка” (падение больше 20%). S&P 500 с исторических максимумов мая потерял только 14%, но это много для этого индекса. Завал продолжается и в текущий момент, на момент написания Nikkei 225 показывает минус 4.9%, с июля 2015 г. это падение 29%. Жуть.
Среди отчетливых признаков текущего момента — резкое ухудшение отношения к банкам. График выше показывает резкое и синхронное расширение спрэдов свопов на кредитный дефолт крупнейших банков для “старших” (то есть не субордирированных долгов).
5-ти летний контракт CDS на долги Deutsche Bank-а вчера вырос в цене до 265 б.п. (базисных пунктов). Границы больше 200 б.п. (как и спрэды дефолта >2%) мы бы считали границей начала “джанка” (не-инвестиционного уровня). Отсутствие у банка инвестиционной ступени крайне нежелательно, поскольку может привести к набегу вкладчиков. Нам кажутся маловероятными потери по вложениям огромного глобального банка имеющего большое значение для Германии, страны с рейтингом ААА и большой возможностью занимать.
Однако рынки ожидают потерь в этом банке и растущую необходимость привлечь капитал. CDS на субординированные долги (5-ти летний контракт) Deutsche Bank-а вчера поднялся в цене до рекордных значений за все время обращения этих контрактов и превзошли рекорды кризис 2007-2009 гг. и период долгого кризиса еврозоны 2011-2012 годов (график ниже — для субординированных долгов банка, которые в случае необходимости конвертируются в акции). Под этим есть основания,