Как искать ликвидные облигации
Инвестразборы
15K
Обложка — Paul Taylor / Getty Images

Как искать ликвидные облигации

Находим выгодные варианты парковки рублей на нужный вам срок
46
Аватар автора

Михаил Шардин

ищет облигации

Страница автора

2022 год был сложным для инвесторов, в том числе из-за блокировки многих ценных бумаг. С рублевыми облигациями, впрочем, такой проблемы не возникло, а из-за роста ставки ЦБ их доходность сейчас выглядит довольно привлекательно.

По данным ЦБ, усредненная процентная ставка по депозитам в конце августа 2023 года была 9,66% годовых. В облигациях нельзя однозначно привести усредненное число, но по картам доходности облигаций на Московской бирже видно, что:

  1. Доходность гособлигаций (ОФЗ) сейчас — от 10 до 11,9% годовых.
  2. Доходность корпоративных облигаций — от 10 до 20% годовых. У отдельных выпусков доходность выше, но и риск, скорее всего, слишком большой.
Кривая бескупонной доходности ОФЗ на Московской бирже показывает зависимость доходности похожих инструментов от их дюрации — эффективного срока до погашения. Источник: smart⁠-⁠lab.ru
Кривая бескупонной доходности ОФЗ на Московской бирже показывает зависимость доходности похожих инструментов от их дюрации — эффективного срока до погашения. Источник: smart⁠-⁠lab.ru
Кривая бескупонной доходности корпоративных облигаций. Источник: smart⁠-⁠lab.ru
Кривая бескупонной доходности корпоративных облигаций. Источник: smart⁠-⁠lab.ru

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

Основной проблемой мне виделось, что на Мосбирже торгуется больше двух тысяч облигаций, но интересных вариантов, которые можно купить прямо сегодня, в лучшем случае пара десятков. Остальные не особенно ликвидны, то есть по ним нет или совсем мало предложений о продаже.

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

Что изменилось с прошлых двух статей

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

Например, есть облигация «Боржоми Финанс 001Р-01». По облигации предусмотрено 10 купонных периодов длительностью 182 дня каждый. Ставка первого купона устанавливается по итогам сбора заявок. Ставка второго — шестого купонов равна ставке первого купона, а ставка остальных купонов определяется эмитентом. Это фактически означает, что она может быть любой.

Правда, это также отсекает облигации, у которых доходность привязана к инфляции или ставке RUONIA, например ОФЗ серии 52 или ЕАБР 003Р-08. Но мне такие бумаги неинтересны: я хочу заранее видеть поток денег, который забираю от инвестиций, чтобы спрогнозировать поступления по месяцам, а там купон заранее неизвестен.

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

У облигации «Боржоми Финанс 001Р⁠-⁠01» заранее известна ставка только части купонов. Остальные эмитент может установить на свое усмотрение. Источник: moex.com
У облигации «Боржоми Финанс 001Р⁠-⁠01» заранее известна ставка только части купонов. Остальные эмитент может установить на свое усмотрение. Источник: moex.com

Добавился новый параметр фильтрации «Совокупный объем сделок за 15 дней больше N шт.». Он важен потому, что позволяет отсечь неликвидные облигации, которые не проходят заданный вами порог.

Так выглядит ввод параметров в гугл⁠-⁠таблице скрипта
Так выглядит ввод параметров в гугл⁠-⁠таблице скрипта

Важные для меня параметры

Вот какие параметры для автоматического отбора облигаций мне важнее всего.

Диапазон доходности. В Т⁠инькофф Журнале уже есть хорошая статья про доходность облигаций. При поиске для себя я указываю диапазон доходности 10—19%. Это эффективная доходность без учета налога с купонов и без поправки на комиссию при покупке.

Диапазон текущих цен. Обычно я ищу варианты именно для парковки денег до полутора лет и держу облигации до погашения. Для этого случая слишком высокая цена скорее отпугивает, ведь эмитент при погашении заплатит только 100% номинала. Поэтому при поиске указываю диапазон: 60—110% от номинала.

Диапазон дюрации. Дюрация — это эффективный срок до погашения облигации. Учитываю диапазон так, чтобы видеть только те облигации, погашение которых будет в нужные мне сроки. Обычно указываю диапазон 3—15 месяцев.

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

Минимальное количество сделок в каждый из 15 последних календарных дней. Это самый важный параметр, из-за которого я вообще писал скрипт. Неприятно, когда ты выбираешь облигацию, а только потом понимаешь, что торгов по ней нет.

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

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

Все эти критерии я учел в своей таблице со встроенным поиском.

Как работает таблица

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

Сам код скрипта можно посмотреть через панель «Расширения» → Apps Script. Расскажу вкратце, что делает скрипт:

  1. Подключается к внешнему сервису Московской биржи, перебирая укрупненные группы разных режимов торгов облигациями  . Это дает около 2,5 тысячи бумаг на входе без фильтрации.
  2. Далее скрипт ищет внутри этих ответов с сервера Мосбиржи бумаги, удовлетворяющие заданным диапазонам доходности и цены, а также происходит фильтрация по дюрации. Когда такие бумаги найдены, это сразу уменьшает выборку с 2,5 тысячи всех доступных на Мосбирже облигаций до нескольких десятков максимум.
  3. Среди найденных вариантов происходит дальнейшая фильтрация по оборотам в каждый из 15 последних торговых дней.
  4. После этого идет фильтр известности купонов до погашения: все даты будущих платежей с известным значением выплат или без него.
  5. После этого массив найденных бумаг записывается в таблицу на вкладку «Результат», а перед этим вся вкладка очищается от любых записей.
  6. Разрешение на отображение и выполнение внешнего веб-контента требуется, только чтобы через дополнительный пункт меню отобразить ссылку на статьи в Т⁠инькофф Журнале.

Работа скрипта полностью зависит от серверов Московской биржи

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

Пошаговое руководство по использованию

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

После корректировки параметров скрипту надо авторизоваться для работы. Для этого перейдите на вкладку меню «Расширения» → «Макросы» и выберите любой из двух пунктов: «Открыть описание работы таблицы» или «Искать по параметрам».

Инициализация работы скрипта
Инициализация работы скрипта

Далее потребуется авторизация в вашем аккаунте, чтобы скрипт мог начать работу. Не бойтесь, что скрипт может как-то повредить вам: Т⁠—⁠Ж его проверил. К тому же в любой момент вы можете посмотреть список выданных вами разрешений на специальной странице и в один клик их отозвать.

Окошко запроса авторизации
Окошко запроса авторизации

Далее выберите аккаунт, с которого вы хотите запускать скрипт.

Диалоговое окно «Гугл⁠-⁠таблиц»
Диалоговое окно «Гугл⁠-⁠таблиц»
Диалоговое окно
Диалоговое окно

«Гугл-таблицы» предупреждают, что приложение не проверено, но если нажать на ссылку «Дополнительные настройки», то появится еще одна ссылка — переход на страницу. Жмем на нее.

Предупреждение о конфиденциальности
Предупреждение о конфиденциальности

Далее появится сообщение, что приложение «Т⁠—⁠Ж. Поиск ликвидных облигаций на Мосбирже 2023 🔎» сможет выполнять следующие действия:

  1. Создание, просмотр, изменение и удаление ваших таблиц.
  2. Подключение к внешнему сервису.
  3. Отображение и выполнение внешнего веб-контента в уведомлениях и на боковых панелях гугл-приложений.

После этого ниже будет кнопка «Разрешить». Нажмите на нее, и все будет готово — скрипт авторизован.

В меню этой гугл-таблицы появится новый пункт «Поиск облигаций v. 102023», а в нем — кнопка «Искать по параметрам». Она запустит работу скрипта, который закончит свою работу примерно за две минуты, вставив результаты работы на лист «Результат».

Результат работы скрипта
Результат работы скрипта

Запомнить

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

Новости, которые касаются инвесторов, — в нашем телеграм-канале. Подписывайтесь, чтобы быть в курсе происходящего: @investnique

Михаил ШардинА как вы ищете облигации?
  • Tchevengourвыглядит круто! спасибо, что поделились10
  • Михаил ШардинTchevengour, 🙏4
  • ДмитрийМожно добавить параметр в поиск "Бумаги для квалифицированных инвесторов" с опцией "Да" / "Нет"? Или вывести в результаты эту колонку?5
  • Михаил ШардинДмитрий, да, если биржа транслирует эту информацию.2
  • Михаил ГородиловШардин - человек будущего.6
  • Михаил ШардинМихаил, 🙏😂3
  • Александр Андреев@Михаил, а рейтинг эмитента можно выводить в таблицу?1
  • Михаил ШардинАлександр, скрипт берёт только те данные которые транслирует Мосбиржа. Насколько я помню рейтинга там нет1
  • Рафис Аглиуллинсделал пошагово как написано, но отсутствует новый пункт "поиск облигации" в чем причина?1
  • Михаил ШардинРафис, перейдите расширение-искать по параметрам. Что пишет?1
  • Рафис АглиуллинМихаил, выполняется скрипт1
  • Михаил ШардинРафис, то есть поиск работает? Просто нет пункта меню? Попробуйте обновить страницу с таблицей в браузере1
  • Рафис Аглиуллин0
  • Михаил ШардинРафис, обновить страницу Ctrl+F51
  • Рафис Аглиуллин0
  • Михаил ШардинРафис, а вы скопировали таблицу в свой аккаунт?1
  • Рафис АглиуллинМихаил, когда скачиваешь там сразу автоматом выходит создать копию0
  • Михаил ШардинРафис, и дали разрешения?1
  • Рафис Аглиуллин0
  • Рафис Аглиуллин0
  • Михаил ШардинРафис, у вас пункта меню нет, но сам поиск-то идёт если через «Расширения» → «Макросы» → «Искать по параметрам»?0
  • Даниил ЯнченкоРаньше пользовался данной таблицей, очень удобно было Но сейчас гугл блокирует работу скрипта Есть решение этой проблемы?1
  • Михаил ШардинДаниил, а вы скопировали к себе в аккаунт?0
  • Даниил ЯнченкоМихаил, Да0
  • Михаил ШардинДаниил, у меня всё работает. Если вы разбираетесь в программировании создайте новую таблицу, скопируйте скрипты из этого репозитория и у вас тоже всё заработает: https://github.com/empenoso/SilverFir-Investment-Report/tree/master/Google%20Apps%20Script%20Release/2023_bond_search0
  • Maxim LunegovМихаил, а вариант Node.js тоже ведь работает? Раньше им пользовался, судя по хронологии именно там была более актуальная версия. P.S. На Гитхабе описание можно обновить. То, что появилась v3 на GAP (и ссылка на ТЖ), видно только из описания папки.1
  • Михаил ШардинMaxim, да, именно на базе Node.js была сделана Google Apps Script версия - они равнозначны сейчас на октябрь 2023 года. Описание обновил там, спасибо.1
  • Maxim LunegovМихаил, спасибо. Если что, у меня GAP сработала, только что проверял. Фильтра включеннного по умолчанию не хватает. Возможно, он сохранится после первого запроса. Или Google Spreadsheet обновляет лист "Результаты"?1
  • Михаил ШардинMaxim, да, вкладка "Результат" полностью стирается и заново записывается новыми данными.0
  • Maxim LunegovМихаил, ну, мне почему-то кажется, что в конец кода можно дописать включение фильтра..=) По-моему, файлик, который генерировал Node.js был с ней. Ещё интересно было смотреть за запросами, которые в командной строке отображались. Но, наверное, в бесплатном GAP это было бы лишней нагрузкой.1
  • Михаил ШардинMaxim, Node.js и Google Apps Script одинаково бесплатны потому что open source. Чтобы просмотреть журнал выполнения скрипта Google Apps, выполните следующие действия: 1. Откройте редактор сценариев Google Apps, перейдя на сайт script.google.com или открыв файл Google Sheets, Docs или Slides и выбрав «Расширения» > «Скрипт приложений». 2. В редакторе Apps Script щелкните меню «Просмотр» и выберите «Журналы» или нажмите Ctrl + Enter (Cmd + Enter на Mac), чтобы открыть журналы. 3. Журналы появятся на отдельной панели внизу редактора. Вы можете пролистать журналы, чтобы просмотреть детали выполнения.0
  • Maxim LunegovМихаил, я имел в виду, что GAP ресурсы Гугла использует, а Node.js - моего компьютера. Вопрос не в журналах, а в дизайне, если можно так выразится. Во время работы GAP мы просто видим "скрипт выполняет", а в Node.js были по-своему красивые строчки кода..=)1
  • Михаил ШардинMaxim, если перейти в файл Google Sheets и выбрать «Расширения» > «Apps Script», то там как раз будет то что вы ищете - логи, текущее исполнение и по-своему красивые строчки кода..=)0
  • Maxim LunegovМихаил, понял теперь, если оттуда же и запустить выполнение. Ну да, оно. Но это уже не для рядового пользователя. Хотя, приложение на Node.js запустить - тоже не для него..=)1
  • Михаил ШардинMaxim, ну это же опенсорс - вроде работает, но если начать ковырять - чёрт ногу сломит :)1
  • Даниил ЯнченкоМихаил, В таблицах так и не удалось запусти, а вот Node.js работает, спасибо!1
  • Михаил ШардинДаниил, отлично!0
  • Александр Р.Михаил, здравствуйте. Спасибо за ваш труд - таблица принесла много пользы. Я не смог разобраться с колонкой "Дюрация, месяцев". В ней либо закралась ошибка, либо я чего-то не понимаю :) Например, по одной из отобранных облигаций выводится значение = "28,8". Я решил его перепроверить на сайте Мосбиржи. Там на карточке облигации указан параметр "Дней до погашения" = "1039". Я эти дни делю на "30", чтобы получить что-то похожее на месяцы. Получаю значение "34,63", что прям сильно отличается от значения из Таблицы (28,8). Пожалуйста, помогите разобраться.0
  • Михаил ШардинАлександр, особенности дюрации. Обозначает среднее время (в годах или днях), за которое вкладчик полностью вернёт свои вложения в облигацию. Дюрация — это не то же самое, что срок погашения. По количеству дней она может быть равна сроку погашения, а может быть короче него. https://journal.tinkoff.ru/guide/duration/0
  • Михаил СафоновКак вы обошли ограничение на работу в 6 минут? Скрипт не успевает переварить все данные и завершается по таймауту.0
  • Михаил ШардинМихаил, запустите в рабочий день, обычно весь поиск занимает около минуты0
  • Роман ГалушкоМихаил, давно искал подобный инструмент. Для первичного анализа самое то! Спасибо за труд, ниже писали уже, возможно будет добавить в скрипт опцию "Квалифицированный инвестор ДА или НЕТ " было бы очень удобно.1
  • Nikможно ли в таблицу добавить параметр: величина премии к ruoni или ключевой ставки ?0
  • MSNGRСпасибо большое, за то, что потратили на это своё время и поделились бесплатно. Уважаемо!0
  • AmigostanМихаил, браво! Спасибо!!1
  • Михаил ШардинAmigostan, если Вы хоть немного знакомы с программированием, то вышла новая версия на Хабре https://habr.com/ru/articles/835202/0