Блог им. 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 г.

841 | ★5

Читайте на SMART-LAB:
Фото
Нефтяной рынок получил новый источник нестабильности
Европейские валюты во вторник оказались под давлением сразу с нескольких сторон: фондовые рынки снижаются, доллар укрепляется, а инвесторы...
Фото
Про нашу нейросеть ByteDog написали в Forbes
В середине апреля мы  рассказали , что с нуля создали собственную нейросеть для поиска вредоносов, которая читает файлы как текст. Мы сделали ее...
В Accent разработали сервис для оценки влияния недвижимости на портфель инвестора
Группа Accent запустила интерактивный инструмент для анализа инвестиционного портфеля. Сервис, доступный на сайте компании, позволяет оценить,...
Фото
Какой убыток мог быть у Магнита в 2025 году?
На этой неделе, вероятно, под занавес сезона годовых отчетов, свои результаты должен опубликовать Магнит. Что ждать и насколько все плохо?

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

....все тэги



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