Найти тему
Записки айтишника

Анализ инструментов Тинькофф.Инвестиции на Finviz.com

Оглавление

Дисклеймер и цель статьи

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

Автор не является профессиональным программистом и можно сказать, что видит Postman второй раз в жизни. Многие вещи наверняка можно было сделать правильнее и лучше. Но главное – конечная цель была достигнута, и наработки из данной статьи можно использовать для реализации других задач. Если есть конструктивная критика – welcome в личку или в комментарии.

Немного контекста и постановка задачи

Сервис Тинькофф.Инвестиции (для удобства дальше буду называть его Т.И) появился сравнительно недавно, но уже обрёл большую популярность. Ребята – молодцы, пилят платформу и регулярно добавляют новые функции. Но как обычно бывает у команд молодых продуктов, задач у них сильно больше, чем ресурсов, поэтому появления многих возможностей ещё придётся подождать.

Казалось бы, даже если текущих возможностей скринера не хватает, то можно воспользоваться другим сервисом. Например, Finviz.com. Но если с анализом инструмента, найдённом в Т.И, проблем не возникает: просто вводим его тикер на Finviz и смотрим нужные нам показатели, то как быть в ситуации, когда нужно отобрать в скринере на Finviz инструменты по ряду критериев, чтобы потом заключать по ним сделки в Т.И? Тем более, что в скринере Finviz на момент написания этой статьи представлено более 7,5 тысяч инструментов, в то время как в Т.И – чуть менее 1,5 тысяч. А значит, далеко не со всеми инструментами, которые отберёт нам Finviz, получится работать в Т.И.

Итак, конечная цель: получить возможность отбирать в Finviz только те инструменты, с которыми можно работать в Т.И.

Список инструментов Тинькофф.Инвестиций

И тут же встаёт вопрос: а с какими инструментами в принципе можно работать в Т.И?

На сайте Т.И находим декларацию, что поддерживается список NASDAQ, NYSE, LSE, представленный на московской бирже и бирже СПБ:

Перечень бирж в Тинькофф.Инвестиции
Перечень бирж в Тинькофф.Инвестиции

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

Компания LGEN на LSE есть
Компания LGEN на LSE есть
Но в Тинькофф.Инвестиции она не торгуется
Но в Тинькофф.Инвестиции она не торгуется

Нет, мы хотим получить список инструментов именно от Т.И. Находим раздел в справке:

Список инструментов в Тинькофф.Инвестиции
Список инструментов в Тинькофф.Инвестиции

Коротко, но неясно. Ок, жмём на ссылку справа, открывается список… в 123 страницы… Круто, а можно как-то одним списком на одной странице?

Список инструментов в Тинькофф.Инвестиции
Список инструментов в Тинькофф.Инвестиции

На самом деле можно, нужно только в адресную строку вбить запрос:

https://www.tinkoff.ru/invest/stocks/?country=All&orderType=Asc&sortType=ByName&start=0&end=1600

start=0&end=1600 и обозначает, что мы хотим получить все инструменты с первого по 1600-й (напомню, что всего их на ноябрь 2020 – около 1500).

Хорошо, с получением списка инструментов разобрались. Надеюсь, что ребята из Т.И не обидятся на такие запросы и не прикроют лавочку, а ещё лучше – дадут возможность получать такой список без подобных поисков и экспериментов.

Копируем список со страницы в Excel и путём нехитрых манипуляций получаем итоговый список тикеров инструментов:

Список тикеров в Excel
Список тикеров в Excel

Разбираемся с Finviz

Теперь как нам это поможет в работе с Finviz. А просто: в скринере есть встроенный фильтр. Вбиваем в него один или несколько тикеров и на выходе получаем данные только по выбранным компаниям. Можно копировать прямо из столбца Excel:

Поле для ввода тикеров находится в правом верхнем углу скринера
Поле для ввода тикеров находится в правом верхнем углу скринера

У него есть только одно ограничение: за один раз в него можно вбить не более 400-450 тикеров. Если указать немногим больше, то после обновления страницы поле фильтра будет пустым, а в поле Total будет показано явно большее число инструментов, чем мы ожидали увидеть.

Страница скринера при чрезмерном количестве инструментов
Страница скринера при чрезмерном количестве инструментов

А если вбить полный список полученных инструментов, то Finviz просто вернёт ошибку:

 Страница скринера при слишком чрезмерном количестве инструментов
Страница скринера при слишком чрезмерном количестве инструментов

Вроде всё? Разделяем список на несколько групп и просто смотрим их по отдельности? Да, но есть ещё одна проблема: оказывается не все тикеры Т.И есть на Finviz. Обратная проблема :)

И как нам убрать лишние? Каким образом финально синхронизировать список инструментов Т.И с Finviz?

Возможно, у вас есть свои варианты, но я решил пойти таким путём:

Если вбить в Finfiz несуществующий тикер, то на выходе мы получим значение Total = 0

Поиск несуществующей компании в Finviz
Поиск несуществующей компании в Finviz

А если указать реальную компанию, то в Total будет указано "1".

Возврат существующей компании
Возврат существующей компании

Ок, значит нам просто нужно спросить Finviz о каждой компании. Если обратить внимание, то тикер компании, указанный в фильтре, в момент запроса переходит в адресную строку.

Тикер компании в адресной строке
Тикер компании в адресной строке

Так что нужно просто сформировать 1467 запросов к Finviz, и мы получим ответ по каждой компании.

Готовим инструменты

Чтобы не делать всё это руками, воспользуемся приложением Postman. Оно позволяет динамически генерировать запросы к сайтам и анализировать ответы.

Для анализа ответа Postman нам потребуется узнать CSS-селектор элемента Total. Это такой сокращенный адрес элемента на странице. Он нужен для того, чтобы Postman надо было обрабатывать не весь текст ответа, а значение только конкретно этого элемента. Получить его просто: открываем страницу Finviz в браузере (я использую Firefox), нажимаем F12, чтобы открылась панель разработчика и дальше делаем всё как на картинке:

Копирование CSS-селектора в буфер обмена
Копирование CSS-селектора в буфер обмена

В результате в буфере обмена окажется примерно вот такое значение: «td.count-text:nth-child(1)». Сохраняем его где-нибудь неподалёку.

Теперь скачиваем и устанавливаем Postman. Открываем его, создаём новую коллекцию, а в ней – GET-запрос:

Окно GET-запроса в Postman
Окно GET-запроса в Postman

Обратите внимание – в качестве тикера компании указано {{company}}. Вместо этого значения будут подставляться тикеры нужных нам компаний.

Переходим на вкладку Tests и вбиваем туда следующий код:

Текст скрипта для анализа результата
Текст скрипта для анализа результата

К сожалению, Дзен не даёт сохранить текст самого кода. Добавлю его ниже в комментарии.

Открываем проводник (explorer), создаём файл t.json и в него помещаем тикеры из списка Т.И в следующем формате:

В реальности список будет несколько больше. Тут он показан в сокращённом виде, чтобы было видно квадратные скобки в начале и в конце списка
В реальности список будет несколько больше. Тут он показан в сокращённом виде, чтобы было видно квадратные скобки в начале и в конце списка

Для редактирования файла я использую Visual Studio Code, но вы можете использовать и обычный текстовый редактор.

Сохраняем файл.

Запускаем процедуру

Возвращаемся в Postman, наводим мышкой на коллекцию и открываем панель Collection Runner:

Открытие панели
Открытие панели

В открывшейся панели наживаем кнопку Run.

Вызов Collection Runner
Вызов Collection Runner

В открывшемся окне нажимаем Select file, выбираем json-файл, в который мы сохранили список тикеров инструментов. Проверяем, что поле Iterations указано нужно нам количество компаний, устанавливаем небольшой Delay (100 мс.) и жмём кнопку Run.

Настройки запуска коллекции
Настройки запуска коллекции

Если всё было настроено правильно, то в открывшемся окне мы увидим процесс выполнения запросов и их результаты.

Процесс выполнения запросов
Процесс выполнения запросов

Обрабатываем результаты

После завершения процесса нажимаем в правом верхнем углу кнопку Export Results и сохраняем результаты в отдельный файл.

Экспорт результатов
Экспорт результатов

Открываем полученный файл и копируем в Excel всё содержимое раздела allTests.

Результаты запросов в файле
Результаты запросов в файле

Путём нехитрых манипуляций оставляем только строки с результатами запросов:

Excel-файл с результатами запросов
Excel-файл с результатами запросов

Фильтруем список по содержимому (true/false) и получаем список актуальных тикеров:

Итоговый рабочий список тикеров
Итоговый рабочий список тикеров

Пользуемся

С этим списком уже можно идти в Finviz и использовать его для отбора тикеров, присутствующих в Т.И. Только не забываем про ограничение в 400-450 тикеров и необходимость разбивать их в отдельные группы. Эту проблему я пока не решил, но она и не входит в основную тематику данной статьи.

Всё?

Ну на самом деле – нет :)

В результате такого отбора мы из начального списка в 1467 тикеров получили 1312 живых и 154 мёртвых. В идеале ещё нужно пойти посмотреть, что там с мёртвыми. Какие-то компании (в моём случае – AXE) действительно пропали и из инструментов в терминале Т.И, у каких-то просто могли не сойтись тикеры. Но это уже опять же разбор этой проблемы лежит вне рамок тематики данной статьи. Основной целью было показать, как с помощью Postman можно решать подобные задачи, ну и может кому-то реально пригодится актуальный список рабочих инструментов Т.И для его анализа в Finviz :)

Сами списки приводить тут не буду. Если будут нужны – обращайтесь в личку или попробуйте получить их самостоятельно по данной инструкции. Если всё сделать правильно, то вам потребуется не более 20 минут.

Вот теперь всё. Спасибо за внимание и успехов вам в решении ваших задач :)