Открыть брокерский счет

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

+14311 ноября 2019, 13:14Eugene Logunov
В этой статье я рассмотрю один из важных вопросов, который возникает при построении алгоритмических торговых стратегий на фьючерсах.

Когда время существования некоторого фьючерсного контракта подходит к концу — мы должны переходить на следующий фьючерс. При этом в момент перехода цены фьючерсов могут отличаться (вспоминаем 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 / расчет сигнала, для которого важен абсолютный уровень цен / расчёт сигнала, для которого важно время до экспирации / требования к быстродействию системы) следует выбирать правильный способ склеивания фьючерсов. Иногда, чтобы не создавать себе проблем, проще построить несколько вариантов склеенной истории, чем пытаться сосчитать всё из одного-самого-правильного :)

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