Блог им. elogunov

О склеивании фьючерсов

В этой статье я рассмотрю один из важных вопросов, который возникает при построении алгоритмических торговых стратегий на фьючерсах.

Когда время существования некоторого фьючерсного контракта подходит к концу — мы должны переходить на следующий фьючерс. При этом в момент перехода цены фьючерсов могут отличаться (вспоминаем futures-spot parity: О склеивании фьючерсов или О склеивании фьючерсов ). Если просто взять куски истории фьючерсов за то время, которое мы планируем ими торговать, т.е. примерно от экспирации предыдущего примерно до экспирации следующего, и записать их друг за другом — в полученной истории цены возникнут гэпы. Эти гэпы мешают корректному расчёту сигналов, а также расчёту доходностей торговых стратегий. Возникает необходимость в неких методах склеивания фьючерсов, которые позволяют построить исторические данные, пригодные для разных задач.

Во-первых, следует определиться с принципом выбора момента, когда мы переходим в следующий фьючерс. Если делать это слишком рано — следующий фьючерс может быть ещё не достаточно ликвиден. Ждать до самой экспирации тоже можно не всегда: если фьючерс предусматривает физическую поставку — брокер может попросить вас его закрыть за некоторое время до даты first notice, либо закрыть вас принудительно (тык, тык). Чтобы не было сюрпризов — всегда внимательно изучайте спецификацию торгуемых вами инструментов и условия вашего брокера, т.к. дата first notice может отстоять от даты экспирации аж на 30 дней. Также при больших объемах позиций следует оставлять запас времени для перекладывания их в новый контракт.

Перейдём к способам склеивания фьючерсных данных и рассмотрим, для чего они годятся.

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

1) (+) Способ очень простой;
2) (+) Нет перерисовки истории по мере поступления новых данных;
3) (+) В построенной истории не будет отрицательных цен;
4) (-) Делать бэктесты по такой истории НЕЛЬЗЯ — гэпы будут искажать результаты;
5) (-) Считать сигналы по такой истории НЕЛЬЗЯ — они тоже будут испорчены гэпами;
6) (-) При расчёте некоторых типов сигналов нужно будет учитывать время до экспирации.

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

1) (+) В построенной истории будут отсутствовать гэпы;
2) (+) По такой истории можно делать бэктесты в терминах доходностей вида О склеивании фьючерсов;
3) (+) Многие типы сигналов можно считать по такой истории;
4) (-) Опираться на абсолютный уровень цен при построении сигналов на такой истории нельзя;
5) (-) В истории могут получиться отрицательные цены;
6) (-) При переходе в новый контракт вся предыдущая история перерисовывается;
7) (-) При расчёте некоторых типов сигналов нужно будет учитывать время до экспирации.

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

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

1) (+) В построенной истории будут отсутствовать гэпы;
2) (+) По такой истории можно делать бэктесты в терминах доходностей вида О склеивании фьючерсов;
3) (+) Многие типы сигналов можно считать по такой истории;
4) (+) В истории НЕ могут получиться отрицательные цены;
5) (-) Опираться на абсолютный уровень цен при построении сигналов на такой истории нельзя;
6) (-) При переходе в новый контракт вся предыдущая история перерисовывается;
7) (-) При расчёте некоторых типов сигналов нужно будет учитывать время до экспирации.

Способ 4: Склеивание фьючерсов путём интерполяции цен.
Выберем некую константу О склеивании фьючерсов — некое целевое время до экспирации. Возьмем время до экспирации текущего фьючерса О склеивании фьючерсов и время до экспирации следующего фьючерса О склеивании фьючерсов. Найдём такие веса фьючерсов, в сумме дающие единицу, чтобы взвешенное время до экспирации было равно целевому времени до экспирации: О склеивании фьючерсовО склеивании фьючерсовО склеивании фьючерсовО склеивании фьючерсов. И, наконец, запишем в историю очередную точку равную О склеивании фьючерсов. Веса нужно пересчитывать для каждой точки (если склеиваете дневные данные — раз в день, если склеиваете минутные данные — раз в минуту).

1) (+) В построенной истории будут отсутствовать гэпы;
2) (+) Многие типы сигналов можно считать по такой истории;
3) (+) В истории НЕ могут получиться отрицательные цены;
4) (+) Опираться на абсолютный уровень цен при построении сигналов на такой истории МОЖНО;
5) (+) История не перерисовывается при переходе на новый контракт;
6) (±) При расчёте сигналов можно не учитывать время до экспирации (хотя способ на самом деле не очень точный);
7) (-) Делать бэктесты по такой истории цен НЕЛЬЗЯ.

Способ 5: Склеивание фьючерсов путём интерполяции ставок дисконтирования.
Основная идея та же самая, что и в предыдущем способе, однако вместо цен мы используем ставки дисконтирования, извлекаемые для каждого фьючерса с учётом базового актива и времени до экспирации: О склеивании фьючерсов. Получив некую средневзвешенную ставку дисконтирования мы можем вновь воспользоваться соотношением futures-spot parity и получить цену фьючерса с некоторым фиксированным временем до экспирации: О склеивании фьючерсов. У этого способа может быть очень много нюансов из-за дивидендов и convenience yield; они выходят за рамки этой статьи.


1) (+) В построенной истории будут отсутствовать гэпы;
2) (+) Многие типы сигналов можно считать по такой истории;
3) (+) В истории НЕ могут получиться отрицательные цены;
4) (+) Опираться на абсолютный уровень цен при построении сигналов на такой истории МОЖНО;
5) (+) История не перерисовывается при переходе на новый контракт;
6) (±) При расчёте сигналов можно не учитывать время до экспирации (точность будет лучше, чем в предыдущем способе);
7) (-) Делать бэктесты по такой истории цен НЕЛЬЗЯ.

Заключение
В зависимости от задачи (расчёт PnL / расчет сигнала, для которого важен абсолютный уровень цен / расчёт сигнала, для которого важно время до экспирации / требования к быстродействию системы) следует выбирать правильный способ склеивания фьючерсов. Иногда, чтобы не создавать себе проблем, проще построить несколько вариантов склеенной истории, чем пытаться сосчитать всё из одного-самого-правильного :)

Разумеется, если вы выполняете вычисления по отдельным фьючерсным контрактам, со склеиванием можно не заморачиваться. Но это лишает вас возможности векторизовать вычисления и может чрезмерно усложнять обвязку логики принятия решений, ради которой, вообще-то, мы и мучаемся.
★35 | ₽ 1
чтобы не создавать себе проблем, проще построить несколько вариантов склеенной истории, чем пытаться сосчитать всё из одного-самого-правильного :)

     Уважаемый Коллега, я — староват и туповат. Но НЕСКОЛЬКО вариантов склейки — мне кажется, это уж слишком... 

     Быть может, линейная склейка (ну, скажем, третьего дня от конца). И всё? 
Московский Лоссбой, Увы, всё не так просто. Некоторые типы склейки годятся для расчёта PnL, но по ним нельзя считать интересные сигналы. А для других типов склейки — всё наоборот. :(
avatar

Eugene Logunov

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

SergeyJu

SergeyJu, Везёт вам :)

А мне довелось испытать боль и страдания от зоопарка фьючерсов, которые торгуются на разных площадках, в разных валютах, в разных временных зонах, с разными расписаниями first notice / last trade / expiry и нюансами брокера (т.е. где-то переход можно делать за 3 дня, а где-то нужно за 33). К тому же, часть исследований выполняли стажеры, которые (на тот момент) не всегда задумывались о влиянии типа склеивания на результаты, так что в какой-то момент подготовке качественных данных было уделено очень много внимания.
avatar

Eugene Logunov

Eugene Logunov, так как в алгоритмах я использую только приращения логарифмов цен, то вообще нет проблем: меняешь одно последнее приращение логарифмов цен после перевкладки на приращение логарифмов цен нового фьючерса и вперед. А потом просто перевод статистик от приращений логарифмов в цены для заявок и стоп-заявок начинаешь считать от цен нового фьюча.
avatar

А. Г.

Очень важная и нужная тема.

Самый правильный вариант — это 5 (IMHO).
Склеивание фьючерсов путем интерполяции ставок дисконтирования.
Но я бы при этом использовал (кроме целевого фьючерса, ессно) ВСЕ фьючерсы действующие/торгуемые на дату расчета/склейки.

С уважением
avatar

Мальчик Buybuy

Мальчик Buybuy, У пятого варианта слишком много нюансов. Взять хотя бы term structure фьючерсов на газ: сезонность! convenience yield! помогите!
Или фьючерсы, где базовый актив неторгуемый — там вообще futures-spot parity не работает.

Но я с вами согласен: где нюансы этого способа не всплывают — это лучший вариант интерполяции!
avatar

Eugene Logunov

Перехожу на новый контракт, как только он становится более-менее ликвидным.
Для себя не вижу никакого смысла в склейке фьючерсов.
avatar

Eldar Shaymardanov

Интересно, что дивидендные выплаты в акциях приводят к схожим проблемам. Пока дивы были мизерными, я их игнорировал. А сейчас я применяю тот же подход, что и с фьючами. Приращение на первую дату после отсечки считаю с дисконтированным дивами. Например, на налог. Этим устраняется основная величина разрыва. Можно усложнить тему, учитывая задержку в поступлении средств… но, имхо, это все усложняет, не принося практических плюсов. 
avatar

SergeyJu

можно взять базовый актив и ничего склеивать не надо
avatar

meat

meat, Вперёд и с песней. Будем тогда на смартлабе обсуждать, какие танкеры покупать.
avatar

Eugene Logunov

Eugene Logunov, что в этом плохого? почему нужно анализировать только фьючерс?
avatar

meat

meat, Цены spot по некоторым инструментам публикуются раз в день. Если мы ждем конца дня, чтобы пересчитать стратегию — это непозволительная медлительность в ситуации, когда рынок быстро движется на каких-то новостях.

Кроме того, есть инструменты по которым spot является неторгуемым, либо его торговля невозможна т.к. требует физической поставки товара.

Если инфа по споту есть — лишней она не будет. Но если стратегия торгует фьючи, в первую очередь, надо грамотно обрабатывать данные по ним.
avatar

Eugene Logunov

Eugene Logunov, все индивидуально

на мой взгляд анализировать график и цены это чистая угадайка

в нефти вообще основной фактор сейчас это геополитика и ее предсказать невозможно

если уж и делать системы на основе анализа цен, то что-то вроде высокочастотным и там уже неважно в какую сторону цена пойдет и поэтому смысла в склейках нет :)
avatar

meat

meat, «торговать» по индексу RTSI и пторговать по фьючерсу RIZ9 — две большие разницы.
avatar

ch5oh

ch5oh, фьючерс это всего лишь инструмент, а что ты сделать хочешь это другой вопрос

я так понял тут нет людей кто торгует хотя бы среднесрок

вот хочу я купить индекс, посмотрю где лучше сделать, потом смотрю какой контракт торгуется сейчас и потом уже ставлю заявки :)
avatar

meat

meat, видимо, мы из разных миров. Интрадей алго трудно найти взаимопонимание со «среднесроком».

 

С уважением.

avatar

ch5oh

ch5oh, внутри дня разве важна склейка фьючерсов? там вход-выход в течение дня, поэтому достаточно анализировать стакан и ленту

ну и теханализ внутри дня работать не будет :)
avatar

meat

meat, хотя бы элементарная склейка «вариант 1» нужна, конечно. Как ещё протестировать Ваш интрадей за 10 лет?
avatar

ch5oh

ch5oh, я не понимаю, что значит интрадей тестировать на истории, он же внутри дня и не зависит от предыдущих дней

позиции же не переносятся?
avatar

meat

meat, в окно расчета индикатора могут соседние дни попадать. Поэтому нужна длинная и желательно непрерывная история.
avatar

ch5oh

ch5oh, если этот индикатор из технического анализа, то он бесполезен :)
avatar

meat

meat, а если это ашви? Разрешаете?
avatar

ch5oh

ch5oh, вроде этот тот же теханализ, hv зависит от iv, значит индикатор построенный на hv будет зависеть от iv (по аналогии индикатор в та зависит от цены)
avatar

meat

meat, я вообще сомневаюсь, что «ТА работает». Коротко могу сформулировать свои сомнения как «ошибка малой выборки».
avatar

ch5oh

ch5oh, ТА мне кажется вообще не работает, процент выигрыша будет не выше, чем от подбрасывания монетки

также плохо работает ТВ и МС

имхо, работает только buy & hold на фондовой рынке :)
avatar

meat

meat, =) имхо, на рынке работает только ТВ и МС.
avatar

ch5oh

ch5oh, Эвристические решения в алготрейдинге тоже работают :) Другое дело, что за ними обычно стоит куча опыта, но в принципе к тем же самым идеям можно подойти гораздо более строго с точки зрения математики.
avatar

Eugene Logunov

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

meat

все проще: торгуя в реале, вы должны иметь твердые параметры перекладки в новый контракт: вот эти самые параметры и следует использовать при склейке фьючерсов, чтобы себя не обманывать
avatar

Jonah

Jonah, Никто себя и не обманывает. Принцип роллирования на бэктесте должен быть идентичным тому, что делается на счетах, иначе просто совпадения не будет (если на бэктесте лучше — нафига торговать по-другому в реальности? если в реальности лучше — так может бэктест надо исправить?)
avatar

Eugene Logunov

На бектесте можно просто период перехода не торговать =)
avatar

Андрей К

Андрей К, Вот ещё — постоянно в модели добавлять-убирать инструменты! Как будто мало нам проблем :D
avatar

Eugene Logunov

Нужно переходить к парадигме неполных данных. Фьючерс живет лишь в отрезке приемлемой ликвидности. Соответственно, МТС следует проектировать в пределах этого отрезка. Но так как отрезков будет много, то следует потом оценивать статистику результатов по ним. 

Для HFT вообще нет проблем, там юзаются тики, в принципе там даже каждый день может быть отрезком.
avatar

chizhan


Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.

Залогиниться

Зарегистрироваться
....все тэги
UPDONW