В этой статье я рассмотрю один из важных вопросов, который возникает при построении алгоритмических торговых стратегий на фьючерсах.
Когда время существования некоторого фьючерсного контракта подходит к концу — мы должны переходить на следующий фьючерс. При этом в момент перехода цены фьючерсов могут отличаться (вспоминаем
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 / расчет сигнала, для которого важен абсолютный уровень цен / расчёт сигнала, для которого важно время до экспирации / требования к быстродействию системы) следует выбирать правильный способ склеивания фьючерсов. Иногда, чтобы не создавать себе проблем, проще построить несколько вариантов склеенной истории, чем пытаться сосчитать всё из одного-самого-правильного :)
Разумеется, если вы выполняете вычисления по отдельным фьючерсным контрактам, со склеиванием можно не заморачиваться. Но это лишает вас возможности векторизовать вычисления и может чрезмерно усложнять обвязку логики принятия решений, ради которой, вообще-то, мы и мучаемся.
Уважаемый Коллега, я — староват и туповат. Но НЕСКОЛЬКО вариантов склейки — мне кажется, это уж слишком...
Быть может, линейная склейка (ну, скажем, третьего дня от конца). И всё?
Московский Лоссбой
Eugene Logunov
Если в алгоритме можно заменить ряды цен рядами приращений, это вообще очень удобно.
SergeyJu
А мне довелось испытать боль и страдания от зоопарка фьючерсов, которые торгуются на разных площадках, в разных валютах, в разных временных зонах, с разными расписаниями first notice / last trade / expiry и нюансами брокера (т.е. где-то переход можно делать за 3 дня, а где-то нужно за 33). К тому же, часть исследований выполняли стажеры, которые (на тот момент) не всегда задумывались о влиянии типа склеивания на результаты, так что в какой-то момент подготовке качественных данных было уделено очень много внимания.
Eugene Logunov
А. Г.
Самый правильный вариант — это 5 (IMHO).
Склеивание фьючерсов путем интерполяции ставок дисконтирования.
Но я бы при этом использовал (кроме целевого фьючерса, ессно) ВСЕ фьючерсы действующие/торгуемые на дату расчета/склейки.
С уважением
Мальчик Buybuy
Или фьючерсы, где базовый актив неторгуемый — там вообще futures-spot parity не работает.
Но я с вами согласен: где нюансы этого способа не всплывают — это лучший вариант интерполяции!
Eugene Logunov
Для себя не вижу никакого смысла в склейке фьючерсов.
Eldar Shaymardanov
SergeyJu
meat
Eugene Logunov
meat
Кроме того, есть инструменты по которым spot является неторгуемым, либо его торговля невозможна т.к. требует физической поставки товара.
Если инфа по споту есть — лишней она не будет. Но если стратегия торгует фьючи, в первую очередь, надо грамотно обрабатывать данные по ним.
Eugene Logunov
на мой взгляд анализировать график и цены это чистая угадайка
в нефти вообще основной фактор сейчас это геополитика и ее предсказать невозможно
если уж и делать системы на основе анализа цен, то что-то вроде высокочастотным и там уже неважно в какую сторону цена пойдет и поэтому смысла в склейках нет :)
meat
ch5oh
я так понял тут нет людей кто торгует хотя бы среднесрок
вот хочу я купить индекс, посмотрю где лучше сделать, потом смотрю какой контракт торгуется сейчас и потом уже ставлю заявки :)
meat
meat, видимо, мы из разных миров. Интрадей алго трудно найти взаимопонимание со «среднесроком».
С уважением.
ch5oh
ну и теханализ внутри дня работать не будет :)
meat
ch5oh
позиции же не переносятся?
meat
ch5oh
meat
ch5oh
meat
ch5oh
также плохо работает ТВ и МС
имхо, работает только buy & hold на фондовой рынке :)
meat
ch5oh
Eugene Logunov
meat
Jonah
Eugene Logunov
Андрей К
Eugene Logunov
Для HFT вообще нет проблем, там юзаются тики, в принципе там даже каждый день может быть отрезком.
chizhan
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Залогиниться
Зарегистрироваться