Блог им. empenoso

Как я написал скрипт поиска рекомендаций аналитиков по российским компаниям

Четыре года назад я написал систему поиска поиска недооцененных американских акций, используя данные Яху Финанс, ведь на американском рынке торгуется больше 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": {
        "u <a name="cut"></a> nits": "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 акциям.

Код представлен на GitHub.

Что делает код?

Я написал свой код на Node.js и обращался к T‑Bank Invest API для получения данных. Вот его функциональность:

  1. Инициализация и настройка:
    • Скрипт начинает с импорта необходимых модулей, таких как конфигурация (secrets), утилиты ведения журнала (logService) и клиент Tinkoff (tinkoffClient), что облегчает взаимодействие с API Tinkoff Invest.
    • API_TOKEN из файла конфигурации используется для аутентификации запросов API.
  2. Шаг 1: Получение данных по акциям:
    • Функция getStockData запрашивает у InstrumentsService Tinkoff список доступных акций. Она фильтрует эти данные, чтобы отобрать акции, котирующиеся на бирже MOEX (REAL_EXCHANGE_MOEX).
    • Отфильтрованный список и полный список акций регистрируются и возвращаются. Ключевые данные акций, такие как figi, ticker, uid и logoName, извлекаются для дальнейшей обработки.
  3. Шаг 2: Извлечение прогнозов аналитиков:
    • Функция getForecastsForStocks проходит по отфильтрованному списку акций и извлекает прогнозы аналитиков с помощью конечной точки InstrumentsService/GetForecastBy.
    • Для каждой акции она проверяет, есть ли доступные прогнозы. Если они есть, данные прогноза (текущая цена, консенсусная цена, изменение цены и количество рекомендаций) сохраняются в массиве. Если прогнозы не найдены, это увеличивает счётчик бумаг без рекомендаций на плюс один.
    • Система обеспечивает задержку в 600 мс между вызовами API для соблюдения ограничений по частоте (100 запросов в минуту).
    • Прогнозы сортируются на основе потенциального изменения цены, с наибольшим ростом цены вверху.
  4. Шаг 3: Генерация HTML-таблицы:
    • Функция generateHTMLTable создает HTML-файл для визуального отображения данных в таблице.
    • Она использует Google Charts для визуализации таблицы с логотипами акций, цен, консенсусных цен и количества рекомендаций аналитиков.
    • Таблица сохраняется как HTML-файл, что позволяет пользователю легко просматривать ее в браузере.
  5. Окончательное выполнение:
    • Код оборачивает все в асинхронную функцию, которая сначала извлекает данные по акциям, затем получает прогнозы и, наконец, генерирует HTML-таблицу, обобщающую рекомендации аналитиков.
    • На выходе получается HTML-файл с данными об акциях в реальном времени из API Т-Банк: Т‑Инвестиции, отсортированных по потенциальному изменению цены, а ещё добавил логотипы акций и страну риска.

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

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

С логом работы можно познакомиться на GitHub. Готовую таблицу можно скачать с него же.

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

Итоги

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

Проект полностью представлен на Гитхабе: https://github.com/empenoso/SilverFir-TradingBot.

Новые модули будут загружаться по мере написания и тестирования.

Автор:Михаил Шардин

14 октября 2024 г.

837 | ★5

Читайте на SMART-LAB:
Фото
Как устроен рынок высоколиквидных товаров
📦 Рынок высоколиквидных товаров — это сегмент, где ключевую роль играет скорость оборота. Речь идёт о вещах, которые можно быстро оценить,...
Фото
Высокие ставки прошли пик давления, но кредитный отбор стал жестче
По оценке аналитиков Газпромбанка, 2025 год стал периодом ухудшения кредитного профиля некоторых российских корпоративных заемщиков, хотя...
Рентабельность на рынке МФО и в Займере
Банк России в своем ежеквартальном обзоре  ключевых показателей МФО указывает на важную тенденцию: на рынке растет разрыв в рентабельности...
Фото
ДВМП: результаты в рамках прогноза, но и цена близка к целевой - будет ли выкуп миноров из-за объединения Росатома с DP World?
ДВМП отчитался за 2025 год: 2,3 млрд рублей убытка для акционеров за 2025 год Традиционно сравниваю со своим прогнозом и делюсь...

теги блога Михаил Шардин

....все тэги



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