Главная Синтетические облигации в алго №3: SyntheticBondsCurveArbitrage — арбитраж по кривой

Синтетические облигации в алго №3: SyntheticBondsCurveArbitrage — арбитраж по кривой

Синтетические облигации в алго №3: SyntheticBondsCurveArbitrage — арбитраж по кривой
  • Источник smart-lab Вчера
  • 32
  • Нейтральная окраска записи

Продолжаем цикл «Синтетические облигации в алго».

Сегодня разбираем робота SyntheticBondsCurveArbitrage — старшего брата классического арбитража из прошлой статьи. Каркас тот же: десять пар, те же деплои, лоты, LQDT-ветка, YearSummary. Разница одна, но принципиальная: робот торгует две серии фьючерсов на каждую бумагу и выбирает точку на кривой доходности.

 

1) Торговая идея

На одну ликвидную акцию на MOEX обычно торгуется несколько серий фьючерсов с разными датами экспирации. Их контанго образует кривую, а точки на этой кривой дают разную годовую доходность. Ближняя серия может давать 8% годовых, а следующая — 14%. Почему бы не взять вторую?

Именно это и делает робот:

по каждой бумаге смотрит две серии: ближайшую (до 120 дней) и следующую за ней (до 180 дней);

выбирает претендента с максимальной годовой доходностью среди всех двадцати комбинаций «бумага x серия»;

держит одну позицию за раз — параллельных облигаций нет, весь капитал в лучшей точке кривой.

 

ВАЖНО!

Метрика решений здесь — только годовая доходность. Абсолютное контанго в логике не используется совсем. Причина простая: у дальней серии сырое контанго систематически больше просто потому, что до экспирации больше времени. Сравнивая серии по абсолютным процентам, дальняя будет выигрывать всегда, даже когда её годовая доходность хуже. Годовые всё ставят на место:

доходность % годовых = контанго % × 365 / дней до экспирации

 

2) Источники робота

BotTabSimple — вкладка под базовую акцию. Десять пар, как у классического арбитража.

BotTabScreener — скринер серий фьючерсов. Теперь из него берутся две ближайшие серии вместо одной.

BotTabSimple под LQDT — парковка свободных денег. В этом роботе под LQDT выделяется до 100% депозита в простое.

Авто-деплой, мультипликаторы, комиссии при деплое — всё как у SyntheticBondsArbitrage, повторяться не будем.

 

3) Индикаторы

Индикаторов по-прежнему нет — только цены и календарь экспираций, но появилось понятие второй серии, и с ним раздельные настройки.

Вторая серия — равноправный претендент на вход и перенос, но со своим гейтом: для неё порог превышения над LQDT ниже (по умолчанию 2.5% против 3.5% у первой серии). Логика такая: дальняя серия менее ликвидна и даёт меньший годовой спред, поэтому и планку для неё имеет смысл опустить, иначе она никогда не победит.

 

4) Логика робота

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

Шаг 2. Вход. Позиции нет — робот входит, если доходность претендента выше LQDT + соответствующий гейт: Min yield diff over LQDT %. Series 1 (по умолчанию 3.5) для первой серии или Series 2 (по умолчанию 2.5) для второй.

Шаг 3. Перенос. Позиция есть, но претендент лучше по годовой доходности больше, чем на Min Yield Diff To Move % ann — позиция переносится. Порог здесь заметно выше, чем у классического арбитража: по умолчанию 5.5 против 0.7. Причина — те же издержки: перенос между сериями — это четыре сделки, и мелкая разница в доходности их не окупает.

Шаг 4. Выход. Как у классики: за 7 дней до экспирации, при бэквордации — досрочно, плюс весь набор аварийных выходов (одна нога, ноги в разные дни, нога до 10:00, закрытие худшей при двух позициях).

Шаг 5. LQDT-ветка. В простое свободные деньги в LQDT, доходность трейлингом за 10 дней, в новом году позиция перекрывается. Под LQDT по умолчанию выделяется 100% депозита.

Деталь кода, которую стоит увидеть своими глазами, — таблица монитора. Теперь у каждой пары две колонки серий: Series 1 и Series 2. Обе — кнопки-чарты, обе показывают доходность, обе подсвечивают позицию с объёмом в контрактах. Вся кривая перед глазами: видно, где робот сидит и почему.

И ещё одна тонкость из кода. Претендент внутри робота несёт флаг IsSecondSeries — по нему логика понимает, какой гейт применять и какую колонку подсвечивать. Маленький штрих, но именно он делает две серии равноправными кандидатами, а не «основной и запасной».

 

5) Исходный код в проекте

Робот лежит в открытом доступе на ГитХабе:

https://github.com/AlexWan/OsEngine/blob/master/project/OsEngine/Robots/SyntheticBond/SyntheticBondsCurveArbitrage.cs

 

6) Настройки робота

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

 

Вкладка Base:

Regime — On/Off, запуск и остановка логики робота. По умолчанию Off.

Volume type — способ задания объёма позиции: Deposit percent, Contracts или Contract currency. По умолчанию Deposit percent.

Volume — объём позиции. По умолчанию 85, то есть 85% депозита на синтетическую облигацию.

Asset in portfolio — позиция в портфеле. По умолчанию Prime.

Min days to expiration — минимум дней до экспирации у претендента. По умолчанию 18: серии ближе к экспирации в выборку не берутся.

Days before expiration to exit — выход из позиции за столько дней до экспирации фьючерса. По умолчанию 7.

Exit on backwardation is on — досрочный выход, если пара ушла в бэквордацию. По умолчанию включён.

Min Yield Diff To Move % ann — порог переноса позиции на более доходную комбинацию «бумага × серия». По умолчанию 5.5 — заметно выше, чем у классики (0.7): перенос между сериями — это четыре сделки, и мелкая разница в доходности их не окупает.

Table update interval, sec — период обновления таблицы монитора. По умолчанию 5 секунд.

Non trade periods — кнопка настроек неторговых периодов. Из коробки: утро до 10:05, вечер с 18:30, без выходных.

Full log is on — подробное логирование. По умолчанию выключено.

 

Вкладка Trade pairs:

Trade pair 1–10— включение пары в торговлю, все десять по умолчанию включены. Состав тот же, что у классического арбитража: SBER, SBERP, GAZP, ROSN, LKOH, VTB, GMKN, ALRS, AFLT, MGNT.

 

Вкладка Second series:

Trade second series 1–10 — разрешение второй серии фьючерса по каждой паре. По умолчанию включена для пар 1–7 и выключена для 8–10.

 

Вкладка LQDT:

LQDT regime is on — парковка свободных денег в фонд ликвидности. По умолчанию включена.

Min yield diff over LQDT %. Series 1 — гейт входа для первой серии: годовая доходность претендента должна превышать доходность LQDT минимум на столько процентов. По умолчанию 3.5.

Min yield diff over LQDT %.Series 2 — тот же гейт для второй серии. По умолчанию 2.5: планка ниже, иначе дальняя серия никогда не победит ближнюю.

LQDT yield days — окно трейлинга доходности LQDT. По умолчанию 10 дней.

LQDT volume % of free money — доля свободных денег, выделяемая под фонд ликвидности в простое. По умолчанию 100%.

 

Вкладка Fut mults:

Mult regime — Auto или Manual. В Auto робот сам проставляет мультипликаторы при деплое по бумаге и дате: VTB — 20 до 15.07.2024 и 100 после, GMKN — 100 до 04.04.2024 и 10 после, MGNT — 1, у остальных — по числу знаков после запятой в цене акции.

Fut mult 2, 4, …, 20 — мультипликаторы фьючерсов по парам для режима Manual. Особенность кода: параметры названы чётными номерами — Fut mult 2 отвечает первой паре, Fut mult 4 — второй и так до Fut mult 20 для десятой.

 

Вкладка Auto deploy:

Portfolio number — номер портфеля для деплоя в реале.

Deploy time frame — таймфрейм источников в реале. По умолчанию Min5.

Deploy standard securities — кнопка авто-развёртывания в реале: прописывает десять пар и LQDT-вкладку по бумагам коннектора, с диалогом подтверждения.

Tester deploy time frame — таймфрейм источников в тестере. По умолчанию Min15.

Deploy tester securities — деплой из выбранного в тестере сета; комиссия 0.04% на источники проставляется автоматически.

 

7) Запуск робота в тестере

Сет тот же, что у классического арбитража, плюс убедитесь, что в него входят вторые серии фьючерсов — без них роботу просто не из чего выбирать.

Авто-деплой с диалогом подтверждения развернёт пары и LQDT-вкладку.

Таймфрейм тестера — Min15 по умолчанию.

Гоняйте тест на длинной истории и смотрите YearSummary: интересно сравнить с классикой на тех же годах — где кривая дала преимущество, а где нет.

 

8) Один из вариантов тестирования

Штатные настройки робота, 10 пар с двумя сериями + LQDTMOEX, тест за 10 лет:

*Средняя альфа к LQDT 9%, с учётом комиссий. Но, без учёта проскальзываний, что важно! Посмотрим вместе на лекциях.

Следующая статья — SyntheticBondsCurveMonitor: тот же взгляд на кривую, но без автоматики. Монитор, сигналы и ручные кнопки для тех, кто любит управлять сам. Подписывайтесь!

Удачных алгоритмов!

P.S. Если читаете значительно позже её выхода, по этой серии уже должны выйти лекции. Получить их можно в наших чатах.

https://smart-lab.ru/company/os_engine/blog/1024149.php

Скачать OsEngine: https://github.com/AlexWan/OsEngine Официальная поддержка OsEngine в MAX: https://max Канал Научный трейдинг в MAX: https://max.ru/ Поддержка OsEngine в Телеграм: https://t.me/osengine_official_support  Канал Научный трейдинг (Bad Quant) в Телеграм: https://t.me/bad_quant

https://www.tbank.ru/invest/

 

Вам также может понравиться

Актуальные новости на 03.09

Актуальные новости на 03.09

  • Источник smart-lab
  • Сегодня 01:21
  • 75
Зачем трейдеру статистика?

Зачем трейдеру статистика?

  • Источник smart-lab
  • Вчера
  • 101

НОВОСТНАЯ РАССЫЛКА

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

отписаться