Блог им. VDV

Как обойтись без склейки фьючей при тестировании и оптимизации торговой стратегии в ТСЛаб

Всю жизнь тестировал и оптимизировал торговые стратегии для фьючерсов используя так называемый «склеенный» фьючерс с сайта Финама. Я понимал и понимаю, что в момент «умирания» старого фьюча и соответственно перетекания ликвидности на новый фьючерс происходит ценовой ГЭП. Или контанго (когда цена нового фьюча больше чем цена уходящего в небытие) или бэквордация (обратная ситуация).

Как выяснилось, склейку фьючей Финам проводит по методу «Панама» (или проводил), а как будет проводить — кто его знает. Да и что за «Панама» — яндекс в помощью интересующимся. Смысл в том, что на стыке двух фьючей идут недостоверные котировки.

Из-за наличия такого ценового разрыва в склеенных фьючерсах результаты тестирования стратегии искажаются и как результат в процессе оптимизации находятся неоптимальные параметры.

Я считал, что это несущественные искажения, но если учесть, что оптимизацию иногда провожу на промежутке времени до 10 лет и каждый год происходит как минимум 4 склейки (поквартально) — получается около 40 сделок дают искаженный финансовый результат, которого можно не достичь в реальной торговле. Если же использовать фьючи на нефть — склейки могут доходить до 12 раз в году.

Поискал, что думают об этой теме трейдеры, которые используют ТСЛаб. Вот результаты поиска на форуме по ключевым словам «фьючерс и склейка»:

Как обойтись без склейки фьючей при тестировании и оптимизации торговой стратегии в ТСЛаб

Как видим, вопрос возник не только у меня. Многие, кто сталкивался с этой проблемой задавались аналогичным вопросом. При этом технического решения так нигде не увидел. Только небезызвестный Родион Скуратовский написал, что можно заморочиться и сделать это в коде (Кстати, почему-то Родион перестал писать на тслабовском форуме — неужели разочаровался в системной торговле?).

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

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

Именно такую логику удалось реализовать в коде торговой стратегии. Пришлось позаморачиваться, но в результате получилось, что стратегии я могу подсовывать не склеенный фьючерс с нереальными ценами в момент стыка, а серию реальных фьючей (например, SIH8, SIM8, SIU8, SIZ8, SIH9) c фактическими котировками.

Затем я указываю стратегии, за сколько дней до «смерти» старого фьюча нужно закрывать позиции по старому. Сразу после закрывания позиций по старому фьючу идёт открытие (в соответствии с логикой торговой стратегии) по новому. Причём индикаторы к моменту закрытия позы по старому фьючу уже считаются по новому фьючу, поэтому искажений не происходит.

Вот как это выглядит на картинке (на примере SIH8 и SIM8):
Как обойтись без склейки фьючей при тестировании и оптимизации торговой стратегии в ТСЛаб

В общем, появилась возможность ответить на два вопроса:

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

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

Ваши варианты ответа жду в комментариях. Завтра расскажу о результатах своего эксперимента.

Мне было бы любопытно узнать — как поступаете Вы? Используете склейку и не заморачиваетесь? Или есть какие-то свои наработки по этому вопросу (может поделитесь опытом?)


  • обсудить на форуме:
  • TSLab
★19
47 комментариев
Как вычисляете дату последнего дня торговли фьючерса?
avatar
Oleg Only Algo, дата последней свечи «умирающего» фьючерса. С помощью кода в ТСЛаб.
Как — то вот так: DateTime lastTimeOfFutures = symbol_SIM8.Bars[symbol_SIM8.Bars.Count — 1].Date;
avatar
Дмитрий Власов, непонял. В текущий момент как определить дату последнего дня обращения текущего фьючерса? То есть информацию справа от текущей даты?
avatar
Oleg Only Algo, У нас на входе серия фьючерсов. У каждого нового фьючерса есть дата первой свечи. Мы можем узнать последовательность серии, сделав сортировку по дате первой свечи. А затем по дате последней свечи узнаём дату «смерти» текущего фьючерса. И чётко знаем, какой фьюч за ним следует. Вкратце так.
avatar
Дмитрий Власов, понял. Вы наверно файлы в определенной директории держите и добавляете туда просто новый файл и програмно все ищете считаете опреляете? Или кубики Источник польщуете?
avatar
Oleg Only Algo, Да, правильно. Просто указываю каждый фьюч как источник
avatar
Так как мои системы торгуют внутри дня, то для получения корректных результатов в тесте добавляю в код советника фильтр, запрещающий торговлю в определенные дни (дни склейки). 
Как показала практика подобные действия не сильно изменяют итоговые показатели тестов, за исключением брента.

Подкину вам еще тему для размышления по поводу брента. 
В моих системах брент не торгуется вечером в среду, т.е. день, когда выходит отчет о запасах. Но отчет не всегда выходит в среду! (праздники, выходные и пр.) И если в реальном режиме работы время торговли можно и нужно исправлять руками, то что делать с тестером?
Дмитрий Овчинников, Да, это самый лёгкий способ — взять склеенный фьюч и запретить входить в новые сделки за n дней до склейки и за n дней после сделки. Но при этом проблема — мы должны точно знать — где была склейка (даты в разные годы и периоды отличаются) и метод этой склейки. Некоторые склеивают без ГЭПа, а «постепенно» беря часть цены от старого фьюча и часть от нового и всё это усредняя или как-то ещё математически сглаживая.
avatar
Дмитрий Власов, 
так как я использую MT5, то у меня нет возможности использовать никакой другой вариант котировок кроме того, который склеен  брокером. Найти абсолютно точно все даты склеек в интернете дело 15 минут, да и на графике их видно невооруженным глазом. 
Дмитрий Овчинников, Можно и в MT5. Либо прямо в советнике прописать выбор фьючерса в зависимости от даты (дата экспирации прописана в свойствах фьючерса). Это, конечно, усложнит советник.
Либо завести Custom Symbol и загрузить в него какую хотите склейку.
avatar
Jame Bonds, 
прямо в советнике прописать выбор фьючерса в зависимости от даты
можно, но не нужно. Трудозатрат много, а экономического смысла мало.
Либо завести Custom Symbol и загрузить в него какую хотите склейку.

Custom Symbol совсем не про это.

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

Дмитрий Овчинников, заводите всю историю фактических дат в виде массивчика и в тестере просто проверяете «сегодня день выхода АПИ или нет?»

 

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

 

В ТСЛаб примерно так хранится фактическое расписание торговых и праздничных дней для рынка ФОРТС.

avatar
ch5oh, 
спасибо, это очевидное решение. Видимо все же придется перебороть свою лень и прописать такую функцию.

Дмитрий Овчинников, если оно того стоит на Ваш взгляд.

 

А почему не торгуете в среду вечером? Там сильно дергает и ситуация становится слишком непредсказуемой?

avatar
ch5oh, 
поведение цены существенно отличается от стандартного, фактически для меня это другой инструмент. 

Тут все просто: если эти искажения влияют в разные стороны на результаты систем — это одно, если в одну сторону (например, всегда улучшают) — тогда надо как-то лечить, ну или делать реалистичную поправку.

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

avatar
Когда у меня возникло такое же острое возбуждение по поводу склейки, я добавил в роботов модули создания исторических данных. Данные за каждый день записывались в файлы. Как только переходил на новый контракт (за 1 день до экспирации), данные начинали записываться с нового контракта. И так далее.

В дальнейшем, данные из файлов заливались в массив без всякой склейки и подавались на вход оптимизатору.

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

Но решать, конечно, вам))
avatar

Начнём с главного.

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

Вы задавали прямой вопрос Финаму или это догадка некоего uuzzeerr с форума http://forum.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=20824&page=all ?

Тарас Громницкий, Я не знаю, про метод склейки, главное — что при любом методе тесто не совпадает с «жизнью». Ведь индикаторы по склеенному фьючу строятся в момент перехода частично по старому и частично по новому. А в жизни сразу же строятся по новому, игнорируя старый. У меня эта проблема решена, т.к. новый индикатор по новому фьючу строится заранее, и как только позиция по старому фьючу закрывается — сразу же начинается торговля по правилам системы по всем новым индикаторам.
avatar
Дмитрий Власов, Вы в кубике Источник склеиваете все за историю трехмесячные фьючи? а в бренте за каждый месяц это надо склеить за 10 лет аж 120 файлов…
avatar
Oleg Only Algo, В том то и дело, что у меня не один источник, а столько источников, сколько фьючей входит в серию. Я их никак не склеиваю, а просто «скармливаю» программе в виде источника
avatar

Дмитрий Власов, а как с тем, что в последние дни на старом фьючерсе падает ликвидность ?

Могут появляться пробелы в данных.

Ну и по мере падения ликвидности разница с новым фьючерсом увеличивается.

Тарас Громницкий, я начинаю закрвать за 3 дня до истечения. Проблем с ликвидностью в это время ещё нет.
avatar
в момент смены (зф 2 нед до экспиры) отключить робот от фьючей и открыть небольшой стренгл или стреддл в новых контрактах, или направленную позицию с ограниченным риском.
avatar
baron_samedi, Кстати, интересная тема. Я вообще думал при наборе позиций трендовыми системами постепенно менять эти позиции направленными опционными позами. Но тут нужно посчитать — что затратнее — траты на тетту или на периодическое срабатывание стопов. Хотя если во флэт попадаем, то наличие опционов позволяет несколько попыток входа в позу осуществлять.
avatar
Дмитрий Власов, 
я не считал — но точно пользоваться можно, если не допускать перегрузки го.
можно и покупать и продавать.
Если направленно (спред ) то тетта не опасна.
avatar
Я склеиваю сам. Имитируя продажу старого и покупку нового фьюча за день-два до экспиры. Так и тестирую. 
avatar
SergeyJu, а день экспиры как определяете? Склеиваете в файле одном друг к другу? А даты экспиры забиваете в файл И оттуда берете?
avatar
Для того чтобы результаты при тестировании не искажались существует специальный способ склейки фьючерсов который используют многие поставщики котировок с мировых бирж. Back adjusted называется.
avatar
все проще...
1 битые данные с финама — это стресс тест для бота... 
2 просто запрещаешь торговлю в неудобные дни…  если дата==ТТТТ, то закрываешь позицию и не открываешь сделки… ну вылетят у тебя 5-6 дней из торговли… имхо на статеистике не отразится никак
3 насколько помню… тслаб2 позволяет самому клеить
avatar
ves2010, можно склеить и в тслаб2.0. Но вот в нефти за 10 лет — это аж 120 файлов. Не знаю как тс лаб будет при таком количесве работать, ла и геморно это. Как вот определять даты склейки и от них уже плясать? Я не встречал битые данные с финама. Есть пример, где данные битые там?
avatar
Oleg Only Algo, битые данные увидеть легко… там шипы в обе стороны на каждой свечке в +-2 % на дистанции 10-20 свечей… и обычно если бот трендовый то в этот день рисуетя слив, а если контртрендовый то эпичный профит

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

 но перестала это использовать, так как уже пару лет, не вижу сильных гэпов при склейке.
avatar
Мария, Да, Гэпов визуально не видно, но по факту фин результат может искажаться. На примере из моего графика — сделка, открытая по старому фьючу закрылась бы на «склейке» по цене большей на величину ГЭПа. И в системе отобразилась бы дополнительная нереальная прибыль.
avatar
Дмитрий Власов, не сильно искажается. в любом случае, что бы тесты не показали выбираем более менее адекватные параметры. историчекие данные в реале никогда не повторятся, поэтому думаю на этот ньюанс можно не смотреть. ну например вы тестируете год. 4 склейки. а сделок в году сколько?)) ну не сильно исказит. ну и при красивом тесте если положить на период 5 лет например, вот про 10 тоже смысла не вижу, рынок очень сильно изменился ну вы же будете смотреть что бы без сильных провалов был график и зеленый. потому что этот результат ну как бы подтверждение вашего теста, его актуальность на длительном периоде.  а смысл смотреть какая том точно доходность в процентах, тоже лишнее.
avatar
Мария, Да, я с Вами согласен. Сам так и делаю. Здесь просто интерес свой удовлетворил.
avatar
Дмитрий Власов, в wealth-lab я тестирую по портфелю фьючерсов с перекладкой.
За 1 день до экспиры идет перекладка (если есть поза) в новый фьюч.
Фьючи переименованы, чтобы были по порядку: 

SiH2008 — SI11

SiM2008 — SI12

SiU2008 — SI13

И т.д.

avatar
robot_bsk, А как процесс «Перекладки» организован? График эквити в итоге один получается? или несколько на каждый инструмент отдельно и все показатели — едины для всех систем?
avatar
Дмитрий Власов, Процесс «Перекладки» в комментарии лучше не писать, т.к. слишком много букв. Напишу пост и сюда ссылку выложу.
Да, график эквити в итоге получается один, тоже в посте выложу.
avatar
Дмитрий Власов, Как обойтись без склейки фьючей при тестировании и оптимизации торговой стратегии в Wealth-lab smart-lab.ru/blog/523180.php
avatar
1 день до склейки запрещаю открытие сделок и вечером закрываю те, что были. Руками в блоке указываю дни склейки. Не думаю что сильно влияет.
А автор статьи напишет свои результаты тестирования ??
avatar

теги блога Дмитрий Власов

....все тэги



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