Как я ищу ликвидные облигации на Московской бирже в 2022 году

С учетом налоговых изменений
201
Аватар автора

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

любит автоматизировать процессы

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

Я уже рассказывал о том, как написал скрипт для поиска ликвидных облигаций. Но в 2021 году ситуация поменялась.

Раньше действовал п. 25 ст. 217 налогового кодекса — по нему проценты по государственным и муниципальным облигациям РФ освобождались от НДФЛ. А сейчас этот пункт прекратил свое действие. Теперь и ОФЗ, и муниципальные, и корпоративные облигации оказались на одном уровне в плане налогов.

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

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

Моя таблица в «Гугл-документах»
Моя таблица в «Гугл-документах»

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

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

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

Добавились данные о месяцах выплат купонов. На сайте Мосбиржи для каждой облигации опубликован график выплаты купонов — там есть информация о месяцах выплат.

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

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

Какие параметры для меня важны

Мне было важно иметь возможность указать определенные параметры. Какие-то — диапазоном, какие-то — минимальным порогом.

Диапазон текущей доходности. В Т⁠—⁠Ж уже есть хорошая статья про доходность облигаций. При поиске для себя я указываю диапазон доходности 7—13%.

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

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

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

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

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

Если посложнее: таблица работает за счет программного интерфейса к информационно-статистическому серверу Московской биржи (ИСС, ISS). По ссылке есть описание работы сервиса.

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

Открытый исходный код работы скрипта
Открытый исходный код работы скрипта

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

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

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

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

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

По ссылке откроется сразу ваша копия таблицы — можно редактировать данные прямо в ней.

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

Далее скрипту потребуется дать разрешение для того, чтобы он смог работать в вашем аккаунте.

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

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

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

Далее потребуется разрешить такие действия:

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

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

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

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

Запомнить надо две вещи

  1. Скрипт делает предварительную механическую работу по подбору подходящих облигаций.
  2. Решение о дальнейшей покупке конкретных найденных бумаг должен принимать сам человек после знакомства с эмитентом.
Михаил ШардинА как вы ищете российские облигации?
  • Sergey ArzumanovКасательно налога с купонов встречал мнение, что теперь можно быть наказанным при покупке облигации прямо перед выплатой. Мы отдаём НКД продавцу, а наш купон облагается налогом в полной мере. При этом излишне уплаченный налог не вернуть. Может есть смысл ещё дату ближайшего купона в таблицу добавить или отношение НКД к купону на текущий момент?14
  • Михаил ШардинSergey, в этой статье я больше сосредоточился на технических аспектах поиска.2
  • Алексей Малахов 🦣Ого, монументальная работа, спасибо за таблицу!58
  • Михаил ШардинАлексей, 🙏15
  • Karl HungusSergey, по брокерским счетам в конце года (по ИИС - при закрытии) осуществляется подсчет прибыли/убытков и сумм уплаченных/неоплаченных налогов. Поэтому уплата НДФЛ за весь купон будет учтена8
  • тьфунатебя ¯\_(ツ)_/¯Главное обходить Дядю Донера :)4
  • Михаил Шардинтьфунатебя, ¯\_(ツ)_/¯2
  • Egor ErohinКогда уже Т–Ж выкатит виджет на основе вашей таблицы?4
  • Михаил ШардинEgor, Когда вы пользуетесь сами для себя это один подход, а когда организация - мне кажется могут возникнуть юридические вопросы.3
  • ТраблшутерНичего не понял, но в закладки добавил! Спасибо!12
  • Михаил ШардинИгорь, 🙏2
  • Денис СуховерховСпасибо большое за приложение. Неплохо бы еще показывать кредитный ретинг ато так можно накупить мусорных облигаций, имхо5
  • Михаил ШардинДенис, биржа не передает этих данных, их нет в API.1
  • Mr ZombieБольшое спасибо. В основном ориентировался на звездочки рейтинга и узнаваемость крупной компании, теперь станет интереснее и доходнее. Добавьте, пожалуйста, ссылку на эту статью в вашу таблицу. Пройдет время, и уже не вспомнить, откуда эта таблица, как ее обновить2
  • Юрий ФроловДоходность просто берется с биржи или как-то рассчитывается? Много раз сталкивался, что на бирже и в квике доходность отображается некорректно.2
  • Aleksey PanteleevСпасибо, интересно. Я тоже самое (поиск) делаю в квике. Фильтры +- те же самые выставляются.3
  • Михаил ШардинAleksey, разве суммарные обороты через Квик можно посчитать на периоде?1
  • Aleksey PanteleevМихаил, думаю нет, но это особо не имеет смысла, если мне налили на проколе какого- нибудь неликвидного безрискового субфедерала с купоном 14% годовых типа Оренбурга (есть у меня такая) мне не важно ничего. Купилась - будет до погашения лежать, хоть там 1 сделка в месяц на рубль будет и в стакане никого , я не продаю такое. Часть высокодоходного облигационного портфеля неприкосновенна и генерирует денежный поток и не продается. А для всего остального есть короткие 26е офз, короткие корпоративы типа Сбера , альфы, итд. Там мне важно чтобы когда мамба будет 2000 чтобы я мог продать их пусть с небольшим даже убытком, или чтобы на тот момент погашение подошло каких нибудь выпусков. У меня довольно широкий портфель облигационный около 40 эмитентов(выпусков) , сейчас большая часть это короткие 1-2.5 летки ликвидные крупных эмитентов. В общем суть какая, если я лезу куда-то за доходностью, ну допустим: самолёт, брусника, русаква все это будет 2-3 года лежать до погашения и мне не важен оборот по ним за период, взял , забыл, на замесе процентов на 10 сходят вниз и ладно ) Все остальное в фильтрах Квик есть11
  • Михаил ШардинAleksey, весь скрипт направлен на то, чтобы выбрать бумаги с оборотом и купить их прямо сейчас. Если нет оборота или он минимален даже на 50 т.р. войти не получится.2
  • Aleksey PanteleevМихаил, каждый день у меня выставлено(через карман на автомате по сути) в покупку около 70 заявок по бондам (на плечи) на небольшие объёмы (сколько позволяет статус КПУРа, УДС, портфель)итд. Все заявки стоят ниже рыночной цены (в зависимости от движения ставки, время приближения к погашению итд) уровни на которых я стою мной корректируются (обычно раз в 3-4мес). Там где неделями нет объёма, а вы стоите условно говоря на 5% ниже текущей среди заявок-ботов, в один прекрасный момент кому-то все равно нужно будет выйти, или за него это сделает брокер (типа маржина по какой-то другой бумаге). Именно там то и могут налить со скидками хорошую доходность. Так пару раз мне наливали РДЖ какие-то выпуски полу мертвые. Все зависит от стратегии. НО! если говорить просто про стандартные подходы и людей кому нужно что-то подкупить и он выбрал одну облигу среди высокодоходного неликвида, то да, ваш скрипт очень хороший. Я вообще не спорю ни как и отмечу еще раз что вы сделали классную штуку. Просто почти все в квике это делается) ну почти все13
  • Михаил ШардинAleksey, хорошая стратегия и спасибо за отзыв!2
  • Aleksey PanteleevМихаил, спасибо и вам! кстати, если кто не сталкивался то в неликвидных облигах очень классно работают боты-алгоритмы, такая интересная "околорыночная-полууголовщина". Стоишь ты на 5% ниже текущей в стакане допустим на покупку 100 бумаг перед тобой выставлено еще 10 заявок по разным ценам с объёмами в разы превышающими твой, то есть прям на миллионы рублей куча заявок стоит 1000шт 300шт итд и тут в какой-то момент происходит прокол вниз и у тебя исполняется покупка 1шт из 100шт) при этом все заявки стоящие перед тобой убираются на доли секунду, далее ползунком "жирные" (маркет мейкеры или хозяева - не знаю кто) видимо прощупывают стакан (не знаю зачем это в облигах делается) и при встрече с реальным встречным объёмом заявка на продажу в момент исполнения убирается. Ты смотришь в стакан, заявки перед тобой как стояли так и стоят, смотришь на график видишь соплю вниз до твоей цены, смотришь объём а там реально 1шт или типа того) То есть ты понимаешь что ты сидишь там где нет людей)))12
  • Михаил ШардинAleksey, спасибо что делитесь опытом - это отлично, когда приходят люди по теме статьи и она обрастает новыми подробностями, про которых в статье нет ни слова.3
  • Aleksey PanteleevМихаил, как пример на тему покупок с дисконтом. В неликвидах бывают интересные движухи, хоть потом и можно не выйти2
  • Игорь Гречаныйспасибо большое, какое облегчение в поиске))))5
  • Михаил ШардинИгорь, 🙏1
  • Вячеслав ГорбатенкоСпасибо! Вы большой молодец 👍🏻2
  • Виктор БеловМихаил, спасибо за таблицу, возможно дополнительную информацию получится (кредитный рейтинг и прочее полезные данные) взять например у сервиса Доход облигации или ему подобного2
  • Михаил ШардинВиктор, есть ли у них открытое API?1
  • Александр ДеревягинСпасибо за таблицу. А как можно Еврооблигации только найти ?2
  • Aleksey PanteleevAndrew, это как раз обычные лимитные заявки, когда в случае прокола исполняется сразу если объёма хватает, а не выбрасывается с задержкой как это бывает с тейк профитами которые могут проскальзывать на этих полоуголовных кратковременных (0.0001сек) манипуляциях с проколами (толстые пальцы )2
  • Вадим ГуревичНадо как-то учитывать близость выплаты купона к покупке облигаций. Чем ближе эти даты, тем меньше доходность (теряете на НДФЛ, т.к. увеличивается НКД)2
  • Кирилл АбрамовДенис, уж это можно самому посмотреть перед покупкой) имхо, это меньшая из проблем, которая остаётся после работы скрипта)4
  • Михаил ШардинSergei, Гугл блокирует неавторизованные им самим скрипты, когда число пользователей одного скрипта переходит определенный порог. Как можно выйти из ситуации? Без копирования моего файла создайте файл с таблицей, скопируйте туда условия и зайдите в редактор скриптов. В редакторе скриптов скопируйте мой код в ваш файл. Все. Теперь ко мне скрипт не будет иметь отношения. И будет работать.2
  • КракатуковKarl, имеете в виду, НКД будет учтен до продажи/погашения? Вот тут https://journal.tinkoff.ru/ofz-nalog/ речь о том, что все не так однозначно, но интересна конкретика насчет того, как сейчас на самом деле дела обстоят.0
  • ОлегСпасибо автору за обновления скрипта. Для удобства развернул скрипт на своем веб-сервере, чтобы можно было оперативно сформировать выборку с телефона и добавил пару фильтров - https://bonds.olegen.ru/3
  • Михаил ШардинОлег, это хорошо, но я не поддерживаю идею сделать из этого публичный сервис с закрытым исходным кодом. В первую очередь из-за того, что Мосбиржа берет плату за предоставление данных с публичных сервисов и это может привести к судебным разбирательствам. А когда каждый использует сам лично для себя он волен делать что хочет.1
  • Denis KПозвольте парочку пожеланий по полугодичному опыту использования вашей первой версии скрипта (во 2й как я погляжу до сих пор актуально): 1. Добавить в критерий отбора и отображать в таблице ИНТЕРВАЛ выплат купонов и вовсе не текстом как ту описано, а натуральными числами (в месяцах) пригодными для сортировки. 2. Добавить в итоговую таблицу текущий НКД по каждой бумажке. PS Спасибо за ваш труд!5
  • Михаил ШардинDenis, 🙏1
  • Vladimir VidavskiyМихаил, добавите столбцы «Рейтинг эмитента» и «Дата выпуска»?1
  • Михаил ШардинVladimir, автор не может править уже вышедшую статью. Рейтинг эмитента биржа НЕ транслирует.3
  • ВалентинКак добавить в скрипт дату до погашения?Очень нужно2
  • 14 14Олег, благодарю вас за сервис я как начинающий инвестор очень помогли.0
  • 14 14Михаил, доброе время благодарю вас за прекрасную работу очень помогает для начинающих инвесторов0
  • Антон М.Почему-то скрипт перестал выдавать результат, выводит только заголовок таблицы и дату обновления внизу2
  • Роман ТАлександр, просто замените путь в bat файле на папку где лежит ваша папка со скриптом pushd C:\Portable\SilverFir-Investment-Report-master\Node.js Release\bond_search_v2 cmd /q /k node index.js > C:\Portable\SilverFir-Investment-Report-master\Node.js Release\bond_search_v2\log\log_%ldt%.txt1
  • Bad SantaЗдравствуйте Михаил! Ваш скрипт, действительно, очень удобен и реализован отлично! Вот, что заметил - проблема с дюрацией, в параметрах поставил от 6 до 18 мес, в результате пишет 8, а когда просматриваю на rusbonds свойства облигации, у нее погашение через 2 года. И ещё, есть ли фильтр внутри, который отбрасывает облигации с офертой? У меня проскочила одна, ТатнхимР01, даже купил, а потом смотрю, у них оферта безотзывная в 2023 г., надо их продать от греха подальше... Вот бы фильтр, чтобы весь этот шлак отбрасывал.1
  • Bad SantaМихаил, только я отчаялся и... получилось! Вот, что надо делать - архив bond_search_v2 распаковывается в папку, где установлен Node, в 64й версии это c:\Program Files\nodejs\, в файле bond_search_v2_start_windows.bat изменить директории для команд pushd и cmd на данную папку. Тогда результата появился, лога нет, но он мне и не нужен. Все, спасибо.1
  • Олег НасреддиновДоработка скрипта дает еще больше возможностей. Михаил, удачи Вам в совершенствовании скрипта, он действительно полезен и удобен. Супер!1
  • gvgДобрый день, спасибо за работу. Когда и где ждать продолжение?1