Четыре года назад я написал систему поиска поиска недооцененных американских акций, используя данные Яху Финанс, ведь на американском рынке торгуется больше 10 тысяч бумаг, из которых около 4 тысяч бумаг имеют рекомендации аналитиков о прогнозируемой цене. Это большие цифры, с которыми сложно работать. Но что по России?
Я вялотекуще пытался найти систему которая бы также отдавала рекомендации аналитиков по российским компаниям, пока недавно не нашёл такой API. Вот например какие рекомендации для оператора аренды электросамокатов WUSH:
{
"targets": [
{
"uid": "b993e814-9986-4434-ae88-b086066714a0",
"ticker": "WUSH",
"company": "SberCIB Investment Research",
"recommendation": "RECOMMENDATION_HOLD",
"recommendationDate": "2024-10-02T00:00:00Z",
"currency": "rub",
"currentPrice": {
"units": "192",
"nano": 0
},
"targetPrice": {
"units": "250",
"nano": 0
},
"priceChange": {
"units": "58",
"nano": 0
},
"priceChangeRel": {
"units": "30",
"nano": 210000000
},
"showName": "Whoosh"
},
{
"uid": "b993e814-9986-4434-ae88-b086066714a0",
"ticker": "WUSH",
"company": "Финам",
"recommendation": "RECOMMENDATION_HOLD",
"recommendationDate": "2024-09-26T00:00:00Z",
"currency": "rub",
"currentPrice": {
"units": "192",
"nano": 0
},
"targetPrice": {
"units": "250",
"nano": 0
},
"priceChange": {
"units": "58",
"nano": 0
},
"priceChangeRel": {
"units": "30",
"nano": 210000000
},
"showName": "Whoosh"
},
{
"uid": "b993e814-9986-4434-ae88-b086066714a0",
"ticker": "WUSH",
"company": "Газпромбанк",
"recommendation": "RECOMMENDATION_HOLD",
"recommendationDate": "2024-09-24T00:00:00Z",
"currency": "rub",
"currentPrice": {
"units": "192",
"nano": 0
},
"targetPrice": {
"units": "355",
"nano": 0
},
"priceChange": {
"units": "163",
"nano": 0
},
"priceChangeRel": {
"units": "84",
"nano": 900000000
},
"showName": "Whoosh"
}
],
"consensus": {
"uid": "b993e814-9986-4434-ae88-b086066714a0",
"ticker": "WUSH",
"recommendation": "RECOMMENDATION_HOLD",
"currency": "rub",
"currentPrice": {
"units": "192",
"nano": 0
},
"consensus": {
"units": "285",
"nano": 0
},
"minTarget": {
"units": "250",
"nano": 0
},
"maxTarget": {
"units": "355",
"nano": 0
},
"priceChange": {
"units": "93",
"nano": 0
},
"priceChangeRel": {
"units": "48",
"nano": 440000000
}
}
}
Правда есть один нюанс в количестве. На московской бирже представлено 170 бумаг, из которых имеют рекомендации всего 89 акций.
Гораздо меньшее количество бумаг, зато API выдаёт конкретные имена компаний, которые давали рекомендации, а также дату дачи прогноза и прогнозную цену. Теоретически можно составлять списки самых точных аналитиков, через какое-то время собирая цены и сопоставляя их с прогнозными.
Но мне было больше интересно составить сводную таблицу по всем доступным 89 акциям.
Что делает код?
Я написал свой код на на Node.js и обращался к T‑Bank Invest API для получения данных. Вот его функциональность:
-
Инициализация и настройка:
-
Скрипт начинает с импорта необходимых модулей, таких как конфигурация (
secrets
), утилиты ведения журнала (logService
) и клиент Tinkoff (tinkoffClient
), что облегчает взаимодействие с API Tinkoff Invest. -
API_TOKEN
из файла конфигурации используется для аутентификации запросов API.
-
Шаг 1: Получение данных по акциям:
-
Функция
getStockData
запрашивает у InstrumentsService Tinkoff список доступных акций. Она фильтрует эти данные, чтобы отобрать акции, котирующиеся на бирже MOEX (REAL_EXCHANGE_MOEX
). -
Отфильтрованный список и полный список акций регистрируются и возвращаются. Ключевые данные акций, такие как
figi
,ticker
,uid
иlogoName
, извлекаются для дальнейшей обработки.
-
Шаг 2: Извлечение прогнозов аналитиков:
-
Функция
getForecastsForStocks
проходит по отфильтрованному списку акций и извлекает прогнозы аналитиков с помощью конечной точкиInstrumentsService/GetForecastBy
. -
Для каждой акции она проверяет, есть ли доступные прогнозы. Если они есть, данные прогноза (текущая цена, консенсусная цена, изменение цены и количество рекомендаций) сохраняются в массиве. Если прогнозы не найдены, это увеличивает счётчик бумаг без рекомендаций на плюс один.
-
Система обеспечивает задержку в 600 мс между вызовами API для соблюдения ограничений по частоте (100 запросов в минуту).
-
Прогнозы сортируются на основе потенциального изменения цены, с наибольшим ростом цены вверху.
-
Шаг 3: Генерация HTML-таблицы:
-
Функция
generateHTMLTable
создает HTML-файл для визуального отображения данных в таблице. -
Она использует Google Charts для визуализации таблицы с логотипами акций, цен, консенсусных цен и количества рекомендаций аналитиков.
-
Таблица сохраняется как HTML-файл, что позволяет пользователю легко просматривать ее в браузере.
-
Окончательное выполнение:
-
Код оборачивает все в асинхронную функцию, которая сначала извлекает данные по акциям, затем получает прогнозы и, наконец, генерирует HTML-таблицу, обобщающую рекомендации аналитиков.
-
На выходе получается HTML-файл с данными об акциях в реальном времени из API Т-Банк: Т‑Инвестиции, отсортированных по потенциальному изменению цены, а ещё добавил логотипы акций и страну риска.
Подводя итог, можно сказать, что этот скрипт представляет собой инструмент аналитики, который извлекает актуальные данные по акциям из API Т-Банк - Т‑Инвестиции, обрабатывает рекомендации аналитиков и формирует понятный, наглядный отчет для принятия решений.
Какие результаты работы скрипта?
С логом работы можно познакомиться на GitHub. Готовую таблицу можно скачать с него же.
-
Каждый заголовок столбца можно отсортировать.
-
Для числовых столбцов, таких как текущая цена, консенсусная цена и потенциальное изменение цены, сортировка проста: по возрастанию или по убыванию.
-
Для текстовых столбцов, таких как имя и тикер, сортировка будет алфавитной.
-
Процентная сортировка (например, потенциальное изменение цены) помогает быстро определять акции с самым высоким потенциалом роста.
Итоги
Скрипт позволяет находить компании у которых есть рекомендации аналитиков. Однако эта выборка не является индивидуальной инвестиционной рекомендацией и может не соответствовать вашим инвестиционным целям. Это связано с тем, что скрипт - всего лишь инструмент, а решение о покупке конкретных бумаг принимает уже сам человек после изучения эмитента.
Проект полностью представлен на Гитхабе: https://github.com/empenoso/SilverFir-TradingBot. Новые модули будут загружаться по мере написания и тестирования.
Автор: Михаил Шардин
14 октября 2024 г.
Автор: empenoso