22 Сентября 2026 · фьючерсы

Ваш график непрерывных фьючерсов показывает контракт, которым никто не мог торговать

Ваш график непрерывных фьючерсов показывает контракт, которым никто не мог торговать

Непрерывный ряд фьючерсов объединяет последовательные истекающие контракты в одну историю. Эту историю можно использовать для изучения сигналов, но расчёт торгового P&L напрямую по изменениям её цены может создавать прибыль и убытки при каждом переносе. Из самого ряда не понять, каким контрактом вы владели.

Возьмём особенно суровый пример: нефть WTI на NYMEX 20 апреля 2020 года. Расчётная цена майского контракта составила −$37.63 за баррель. Июньского — $20.43. Обе цены были реальными. Реальной была и разница в $58.06. Но переключение графика с мая на июнь не принесло длинной позиции эту разницу.

Разберём эту склейку. Это исторические расчётные цены; приведённые ниже условные примеры учёта используют их, чтобы показать арифметику, а не утверждать, что ордер мог исполниться по этим ценам.

CLK20 и CLM20: идентификаторы, отброшенные графиком

ПараметрМайский контрактИюньский контракт
Идентификатор контрактаCLK20CLM20
Месяц поставкиМай 2020Июнь 2020
Расчётная цена 20 апреля, долларов за баррель−37.6320.43
Размер контракта1,000 баррелей1,000 баррелей

Код месяца важнее префикса тикера. K означает май, M — июнь. У этих контрактов были разные обязательства по поставке и разные цены. До истечения майского контракта оставалось немного времени, а давление из-за нехватки хранилищ было чрезвычайным. Июньский давал ещё один месяц.

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

Единого универсального непрерывного ряда тоже нет. Поставщик может переносить позицию за фиксированное число рабочих дней до истечения контракта, при пересечении объёмов или по другому расписанию. Многие ряды уже перешли с майского контракта до 20 апреля. В нашем примере мы намеренно склеиваем эти две расчётные цены, чтобы показать ошибку; это не утверждение о расписании переносов какого-либо конкретного поставщика.

1,000 баррелей: множитель для каждой цены

Стандартный фьючерсный контракт на нефть WTI на NYMEX — это 1,000 баррелей. Поэтому движение цены на $1 меняет стоимость длинной позиции по одному контракту на $1,000. Один тик в $0.01 равен $10.

Для неизменной позиции по одному контракту базовый расчёт выглядит так:

gross_pnl = contracts × 1,000 × (ending_price − starting_price)

Эта формула работает и при отрицательных ценах. Процентная доходность, рассчитанная по котировке фьючерса, становится гораздо менее полезной: при переходе через ноль она может стать неопределённой или изменить кажущийся смысл. Доходность стратегии нужно считать по капиталу счёта и принятому способу учёта денежных потоков. Котировка барреля — не капитал, вложенный в стратегию.

$58.06: разрыв в точке склейки

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

invented_pnl = 1 × 1,000 × (20.43 − (−37.63))
             = $58,060

В этом сравнении ничто не двигалось во времени. Это цены двух контрактов за одну сессию. Движок принял разницу между ценами разных контрактов за прибыль за период владения.

В обычном ежедневном переходе на новый контракт цена старого контракта за вчера и цена нового за сегодня также включают обычное рыночное движение. Поэтому ошибку заметить сложнее. Записанное изменение объединяет движение старого контракта с разницей цен между контрактами в момент перехода.

Вычесть $58,060 как якобы денежные «издержки переноса» — тоже не выход. Фьючерсы не покупают, уплачивая всю их котируемую номинальную стоимость. Закрытие одного контракта и открытие другого меняют позиции, реализованный или рассчитанный P&L, комиссии, результаты исполнения и требования к марже. Разница уровней цен не становится автоматически денежным списанием.

+58.06: обратная корректировка истории

При одном распространённом способе построения непрерывного ряда разницу при переносе прибавляют к более ранним ценам. При таком подходе цена майского контракта −37.63 становится 20.43, и скачок при переходе к июньскому исчезает. Более ранние наблюдения в том же историческом сегменте также повышаются на 58.06.

Способ построенияЧто происходит в этой точке склейкиПоследствие для исследований
Без корректировкиРазница в $58.06 сохраняетсяИндикаторы могут принять смену контракта за движение рынка
Аддитивная обратная корректировкаК более раннему сегменту прибавляется 58.06Изменения в долларах внутри сегмента сохраняются; исторические уровни и процентные изменения сдвигаются
Мультипликативная обратная корректировкаБолее ранний сегмент умножается на 20.43 / −37.63, то есть примерно на −0.543Отрицательный множитель меняет знак изменений цены внутри сегмента

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

У аддитивной корректировки есть и свои последствия. Сигнал, который покупает ниже абсолютного порога в $30, может измениться, когда последующие переносы переписывают прежние уровни. Сигнал на разнице быстрой и медленной скользящих средних может быть инвариантен к общему аддитивному сдвигу, если оба окна получают одинаковую корректировку. Окна, пересекающие границу корректировки, нужно проверять отдельно.

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

Две строки ордеров, которых нет на графике непрерывного ряда

Вот намеренно упрощённая запись операций. Допустим, перед переносом один майский контракт оценивался по цене −30.00. Допустим также, что майский контракт закрывается, а июньский открывается по приведённым выше историческим расчётным ценам, после чего июньский оценивается по цене 21.00. Эти предполагаемые цены исполнения нужны лишь для примера учёта.

Операция в журналеРасчётВаловый P&L
Закрытие одной длинной позиции по майскому контракту по −37.631,000 × (−37.63 − (−30.00))−$7,630
Открытие одной длинной позиции по июньскому контракту по 20.43Изменения цены при входе нет$0
Оценка июньского контракта по цене 21.001,000 × (21.00 − 20.43)+$570
ИтогоДо издержек исполнения и комиссий−$7,060

Разница в $58.06 нигде не учитывается как отдельный доход или расход. Ежедневные вариационные маржинальные платежи определяют, когда P&L по фьючерсам поступает на счёт; они не создают копию этого P&L.

Реальный перенос можно исполнить календарным спредом вместо двух отдельных ордеров. Симулятор должен моделировать выбранный им способ, включая исполнения и сборы, сохраняя при этом отдельные позиции по каждому контракту.

Моя простая проверка: каждый доллар торгового P&L по фьючерсам должен быть сопоставлен с конкретным контрактом, количеством, множителем и двумя ценами этого контракта. Ещё мне нужны время принятия решения о переносе и использованные для него данные. Правило переноса по объёму, которому нужны данные за завершённую сегодняшнюю сессию, не должно незаметно совершать сделку раньше в ту же сессию.

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

непрерывные фьючерсыбэктестингперенос фьючерсных позицийрыночные данныеучет P&L
ПоделитьсяXLinkedInFacebookRedditHacker NewsWhatsAppTelegramEmail
← Все статьи