Блог им. Serj90

Проблема ведения архива котировок фьючерсов

Привет, Смарт-лаб.

Сразу к делу.

Стоит задача собирать архив котировок фьючерсов с moex.
При этом инструмент, который будет пользоваться этим архивом, построен с позиции «широкого охвата» рынка. Что это значит? — В инструменте подтягиваемые данные по конкретному фьючу могут рассматриваться и анализироваться не только в границах конкретного фьючерса, но и относительно других фьючей.

Для удовлетворения этого условия для себя определил, что архив данных по отдельным фьючам должен иметь:
  • «А» — единую структуру (поля)
  • «Б» — общий параметр (ключ), по которому будет возможно в принципе сопоставить данные разных фьючерсов

С пунктом «А» проблем нет, загружаемый состав параметров в спецификациях фьючей у всех одинаковый.
С пунктом «Б» сложнее.

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

И если для индексов, акций (облиги будут позже, т.к. там долгосрок, срочности нет) всё работает исправно, то для фьючерсов начинается головная боль. А может эту боль я сам себе придумываю?

Итак, по какому ключу связывать фьючерсы, чтобы была возможность их сравнивать между собой? ну например, фьюч аэрофлота и палладий. Ключом в такой «экзотической» связке я вижу только дату проведения торгов инструментами.

Но дату проведения торгов чего конкретно брать за основу?:
  1. фьюча аэрофлота?
  2. фьюча палладия?
  3. может фьюча на ртс?
  4. может аналогично взять торговые дни индекса imoex?

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

по третьему пункту, типа, мы берем что-то отдельно стоящее от нашей пары, но важнее по «весу». Выбрали Ri, т.к. он важнее потому что это фьюч на индекс, а в индекс входят акции. Но почему надо воспринимать «вес» Ri больше чем «вес» фьюча палладия, ведь они как теплое с мягким?
(то есть пункт 3 покрывает задачу частично, + наверняка там есть риск присущий к четвертому пункту, об этом ниже)

по четвертому пункту вроде всё логично, более того он позволяет «широким охватом» сравнить индекс полной дохи, декабрьский фьюч аэрофлота, текущий фьюч палладия, да еще и акцию газпрома. Типа вообще красота, крути как хочешь.
(получается пункт 4 полностью покрывает задачу?)

Собственно теперь о фантомной боли:
В решении задачки «Б» получается логичным ориентироваться на даты торгов индексом, но возникает вопрос, есть ли здесь календарный фактор?
Я в механике рынка фьючерсов пока только разбираюсь, и у меня возник вопрос, всегда ли фондовая секция и срочная торгуются одновременно? Есть же, например, праздничные дни. Я посмотрел календарь торгов фондовой и срочной секции на этот год, расхождения по торговым дням не нашел. Получается, что боли нет, и можно спокойно строить архив по «дате индекса»? Но ведь в то же время есть праздничные дни за бугром, и есть фьючи, данные по которым «зеркалятся» к нам. Получается если там выходной, а у нас торги идут, то передается ли то что мы наторговали у себя на след день за бугор?

В общем если боль не фантомная, то код придется отложить пока не оценю значимость данных, которые есть риск не получить.
26 комментариев
не фига себе заморочка )
это ради экономии места?
avatar
Андрей К, ограничений по объему хранения нет. Суть в том чтобы объем данных по всем фьючам был одинаковый. Вот на примере акций:
акция 1 торговалась понедельник, среду и пятницу
акция 2 торговалась вторник и четверг.

Чьи данные станут эталоном в этой связке? акции 1 потому что у нее торговых дней больше? тогда по акции 2 мы никогда данные не получим за эту неделю. Поэтому брался индекс, относительно которого выбитые данные по акции 1 и акции 2 принимаются как допустимое явление. При этом в данном случае выбор индекса за основу позволяет:
1) сравнивать акции с индексом
2) сравнивать акции между собой
3) анализировать каждую акцию отдельно

с фьючами начинается какой-то трэш. Если реально торговые дни нескольких фьючерсов могут различаться, то все 3 условия одновременно не выполняются.
avatar
Serj90, своеобразная у вас задача, смысл которой с эталонами я не понял ). Думал у вас задача уплотнить данные.
avatar
Андрей К, в простейшем применении, наличие эталона позволяет накладывать графики одного инструмента на другой. В этом случае даже значение null не так критично, получится просто прерывистый график.
avatar
Андрей К, критерий эталонности — это регулярное наличие данных поля-ключа
avatar
Андрей К, даже индексный фьюч бы проблему не решил, хотя я его искал, т.к. он охватывал бы производные инструменты только конкретного класса активов, например товарного или фондового.
avatar
С фьючерсами основные проблемы это то, что одновременно торгуются контракты на один и тот же базовый актив, но имеющие разные даты экспирации. Фьючи на нефть и газ экспирируются каждый месяц, остальные раз в квартал. Цены исполнения фьючерсов с датой экспирации в один день могут определяться в разное время. Есть фьючерсы поставочные и расчетные. Может еще чего забыл.


avatar
Vkt, да, это была первая проблема, как хранить фьючерс ведь у него короткий срок жизни. Решил проблему следующим методом, например возьмем брент, там вообще фьючей до середины 22 года штук 7-8. Первым делом сортировка по дате экспиры, затем вычленяется shortname фьюча (например, у afm1 это aflt). Дальше по сортировке выставляю индексы -Br_0, Br_1, Br_2 и т.д. Соответственно в день экспиры ближайшего фьюча мы пишем данные в массив с суффиксом _0. на след день, когда текущий фьюч умер, в массив_0 будут записываться данные след фьюча, т.к. теперь его дата экспиры по сортировке считается ближайшей. То есть мы имеем постоянную склейку фьючерсов. Массив_0 это склеенные котиры текущего фьюча, массив_1 это склеенные котиры фьюча идущего впереди текущего на квартал (или месяц в зависимости от инструмента). Но основной прикол в том, что сегодня у всех фьючей базового актива есть цена. Пусть у самых дальних это будут нули, но цены есть.
avatar
Vkt, по поводу того какая цена будет взята в день экспирации у того или иного фьюча, на самом деле мало что от меня зависит, какую цену moex передаст ту и запишу, в моем случае главное настроить частоту опроса.
avatar
Serj90, не знаю какова цель данной глобальной базы, но я бы советовал в массив _0 в день экспирации ближайшего начинать записывать данные следующего фьюча, т.к. экспирируемые мало того, что будут умирать в разное время, так еще и на вечерке они уже не торгуются — получится дырка в данных, если следующий фьюч писать в эту базу со следующего дня.
avatar
Vkt, хм, к этой новости я как-то был не готов. На всякий случай уточню, я сначала загружаю список всех фьючей котируемых на данный момент на moex включая цену последней сделки у каждого. А дальше уже кручу верчу, сортирую, распихиваю по архивам. Соответственно, если фьюч умер, то он мне не должен вернуться в ответе на запрос. Моя цель чтобы рано утром перед началом торгов на ФОРТС, у меня были все цены по всему списку фьючей (пусть даже нули у дальних). Вы говорите, что:
так еще и на вечерке они уже не торгуются — получится дырка в данных

Я понаблюдаю что выдает moex в день экспиры по сгораемым фьючам, но подскажите, может ли быть ситуация, когда в день экспирации после самой экспирации на бирже фьюч числится живым, а цена по нему передается null или вообще пустая? Я был уверен, что когда экспирация закончена, то этот фьюч до закрытия торгов просто висит с ценой экспиры. Если это не так, то в принципе, ваше предложение реализовать не сложно, поля известны, доп проверка с текущей датой не проблема.

не знаю какова цель данной глобальной базы

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

В целом глобальный архив (если сразу в конфигах проставить значение all) решает несколько задач:
1) В любой момент времени мне доступны для анализа исторические данные по любому инструменту
2) исторические данные берутся из первоисточника (а это снижает риск некорректности данных, неактуальности данных, риск исчезновения контрагента-поставщика котировок)
3) автоведение архива + возможность применения самописных скриннеров по всему рынку. А это значит не привязанность к конкретным бумагах и работа по сигналам в любом инструменте (если скриннер будет на «ловлю ракет», то благодаря такому архиву можно видеть все ракеты рынка)

Я не тяну мегабайты данных из сети, полученный байты превращаются в мегабайты исключительно за счет внутренней логики работы загрузчика (он просто каждый день добавляет новую строку в каждом архиве + вписывает служебные данные)
avatar
цена по нему передается null или вообще пустая? Я был уверен, что когда экспирация закончена, то этот фьюч до закрытия торгов просто висит с ценой экспиры. 

Я не знаю откуда цена передается и где висит фьюч с ценой экспирации.
Соответственно не могу ответить на вопрос. Но думаю это и не важно. Мое мнение, что цена фьюча в день экспирации не интересна и не показательна для анализа, за исключением случая, когда непременно нужно знать цену экспирации.
avatar
Vkt, загружаю с api moex. Я понаблюдаю что возвращает сервис в день экспирации, спасибо за наводку.
Мое мнение, что цена фьюча в день экспирации не интересна и не показательна для анализа, за исключением случая, когда непременно нужно знать цену экспирации.

ну пока что цель получать весь жизненный цикл фьюча от и до. Пренебрежение теми или иными данными у меня вынесено на сторону инструмента, который читает архив.
avatar
СтОит ли оно таких заморочек?
avatar
Мейстор Эймон, однозначно стОит, на самом деле сама задача легко реализуется, а вот ответ на вопрос что брать за эталон — это реально вопрос. но я его и сам решу, если получу ответ на: 
Я в механике рынка фьючерсов пока только разбираюсь, и у меня возник вопрос, всегда ли фондовая секция и срочная торгуются одновременно? Есть же, например, праздничные дни. Я посмотрел календарь торгов фондовой и срочной секции на этот год, расхождения по торговым дням не нашел. Получается, что боли нет, и можно спокойно строить архив по «дате индекса»? Но ведь в то же время есть праздничные дни за бугром, и есть фьючи, данные по которым «зеркалятся» к нам. Получается если там выходной, а у нас торги идут, то передается ли то что мы наторговали у себя на след день за бугор?
avatar
Serj90, если срочная секция на МОЕХ  работает, то торгуются абсолютно все фьючи, вне зависимости от праздников за бугром. Просто те которые зеркалятся торгуются особенно вяло, но могут и пнуть куда-нибудь и шпильку нарисовать. 

avatar
Vkt, во! это уже хорошо! значит по идеи можно за «ключ» брать дату торгов любого фьюча!!! А дальше если и будут дырки, 0 и null это проблемы конкретных фьючей, которые мы можем допускать. Тогда увязать с индексами и акциями я смогу по датам торгов индекса, причем даты индекса будут приоритетнее, т.к. если торгуется фондовая секция, то срочка торгуется 100%, но не наоборот. Таким образом я смогу выполнить условия:
1) сравнение фьюча с индексом (допускаем что в выборку не попадут данные по дням когда фьюч торговался, а индекс нет, т.к. в таком сравнении в большинстве случаев важнее будет поведение индекса)
2) сравнение фьюча с любым другим фьючом, т.к. вся срочка котируется в день торгов
3) анализировать каждый фьюч отдельно, т.к. буду собраны данные за все дни торговли фьючерса.

Получается правильнее будет использовать решение №3 и брать за ключ торговые даты фьюча Ri! Супер!!! Спасибо!!!
avatar
Serj90, а какая глубина истории в этой базе и какой ТФ, если не секрет?
avatar
Vkt, да не секрет в общем-то, это же просто архив) в самом архиве лежать только дневки, но в ходе торговой сессии архив обновляется раз в 15 минут (регулируется), поэтому работа на более низких ТФ строится на уровне инструмента, который читает архив. Глубина истории может быть любая, ограничение только свободном месте диска. Но там логов пишется больше, чем формируется итоговых данных))) + для акций и индекса написал отдельный инструмент загрузки исторических данных за любой период. Для фьючерсов такой инструмент делать не стал, т.к. технически реализация трудоемкая, не было эталона и у фьючей имена динамические, значит пришлось бы писать блок генерации имен типа AFM9, собственно я из-за этих аргументов и не стал проверять, выдает ли вообще такую историю moex))) Тестировал на предмет производительности, она не падает даже на сохраненных в архиве >3000 дней по 70ти инструментам, фьючей же будет на первых парах 20. Ну а там дальше расширяемость списка инструментов.
avatar
Serj90, понятно, тогда попроще с фьючами. Я то думал, что в архиве интрадейние свечки.
avatar

А есть ли в вашей базе исторические данные по ГО на фьючерсы на каждый день?

Это не применительно к вашей задаче. Это я для себя интересуюсь)

avatar
Максим Иванов, хороший вопрос, сейчас посмотрю
avatar
Максим Иванов, INITIALMARGIN. Да у меня расширяемый список данных, подгружать ГО вообще не проблема если мы говорим про это значение (afm1):


пока что ГО я не собираю. Но это вопрос времени.
avatar

Serj90, да, это оно. 

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

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

Имхо, хранить данные надо в сыром виде — как вы видите их в таблице всех сделок. А уже представление этих данных и обработка — как захотите.
avatar
yurikon, мне нужен был ответ на вопрос, секция фортс когда торгуется, то торгуется по всему спектру фьючерсов или есть дни когда состав торгуемых фьючей различается + понять механику как торгуется зеркальный фьюч у нас, если у его основной биржи выходной. Собственно ответ получил, спасибо форумчанам выше, я уже скомпилировал загрузчик, всё работает.
Согласен с вами, гружу я их тоже в «сыром» виде, как биржа отдает, то и записываю, кручу верчу их уже в инструменте, который читает архив.  
avatar

теги блога Serj90

....все тэги



UPDONW
Новый дизайн