Блог им. SergeyTunkin

Изучаем и парсим биржевую информацию с сайта Мосбиржи. Разбор кода на Python.

Информационно-статистический сервер Московской Биржи (ИСС или ISS) – это сервис, предоставляющий разнообразную биржевую информацию в режиме реального времени, а также итоги торгов и статистические данные.

Основные возможности ИСС:

  • Получение потоковых данных о ходе торгов.
  • Просмотр и экспорт итогов торгов.
  • Доступ к историческим данным по итогам торгов, ценам и прочим показателям.
  • Выгрузка списков всех инструментов, режимы торгов и их группы.
  • Мониторинг рыночной информации в различных разрезах.

Данные о ходе торгов в режиме online и итоги торгов доступны только по подписке, естественно платной.

На сайте мосбиржи есть специальный раздел “Программный интерфейс к ИСС“, на котором выложено Руководство разработчика (v.1.4), Описание метаданных и Описание методов.

С этих документов и надо начинать изучать ИИС. Кстати говоря Правила использования биржевой информации Московской Биржи четко определены и наглядно представлены в презентации.

Запросы к ИСС для получения информации формируются в виде URL с параметрами (или без), список всех доступных URL перечислен на странице Описание методов.

Получать информацию можно в форматах: XML, CSV, JSON, HTML

И давайте решим задачу по получению, к примеру:

Давайте перейдем на страницу  http://iss.moex.com/iss/index

Изучаем и парсим биржевую информацию с сайта Мосбиржи. Разбор кода на Python.

рамкой выделен первый блок “engines”.

Давайте посмотрим эту страницу с расширением xml

Изучаем и парсим биржевую информацию с сайта Мосбиржи. Разбор кода на Python.

В ответах в форматах XML, HTML и JSON каждый блок информации отделен тегом data и содержит две секции: метаданные (описывают тип и длину полей с данными) и непосредственно рыночную информацию. Мы будем загонять эту информацию в табличный вид, где секция метаданные определит колонки, а секция с информацией заполнит ряды таблицы.

Ниже я предлагаю для внимания и использования листинг программы, благодаря которой можно спарсить информацию почти по любой ссылке на странице методов ISS Queries.

Общая идеология программы такая:

  1. Загрузка данных
  2. Парсинг XML
  3. Формирование DataFrame (таблицы)
  4. Сохранение в БД SQLite
  5. Сохранение (дублирование) в CSV файле с расширением txt

В программе используем библиотеки:

os – работа с файловой системой – создание директорий, получение путей к файлам и т.д.

sqlite3 – работа с базами данных SQLite – подключение, выполнение SQL-запросов, transaction и т.д.

xml.etree.ElementTree (ET) – парсинг и конвертация XML в древовидную структуру элементов для удобного доступа в коде Python.

pandas (pd) – работа с табличными данными, их обработка и анализ – DataFrame. Загрузка/запись данных в CSV и другие форматы.

requests – отправка HTTP запросов и получение ответов от веб-ресурсов. Используется для веб-скрейпинга и работы с API. Веб-скрейпинг – получения веб-данных путём извлечения их с веб-страниц. 
Изучаем и парсим биржевую информацию с сайта Мосбиржи. Разбор кода на Python.

Листинг программы
Запускаем программу, она отрабатывает за несколько секунд. Можем в программе закомментировать первый url и раскоментировать второй, снова запустить, и т.д. при необходимости.

В каталоге с программой появилась папка “moexmetadata” с многочисленными файлами.

Изучаем и парсим биржевую информацию с сайта Мосбиржи. Разбор кода на Python.

вот пример содержания

Изучаем и парсим биржевую информацию с сайта Мосбиржи. Разбор кода на Python.

также у нас создалась БД с таблицами

Изучаем и парсим биржевую информацию с сайта Мосбиржи. Разбор кода на Python.

и если совсем погружаться.., то теоретически можно между таблицами настроить логичные связи. Если конечно Вы сможете сначала разобраться во всем этом “хаосе” информации. Надо ли только это?

Идем далее

Согласно Руководства разработчика для некоторых запросов в конце файла также доступен специальный блок данных “cursor”.

например здесь http://iss.moex.com/iss/history/engines/stock/markets/shares/securities/MOEX он выглядит так

Изучаем и парсим биржевую информацию с сайта Мосбиржи. Разбор кода на Python.

здесь INDEX – начало текущего набора данных в выдаче (номер строки), в запросе
задаётся параметром start; TOTAL – общий объём данных (количество строк), доступных по этому запросу;
PAGESIZE – объём текущего набора данных в выдаче (количество строк), в
запросе задаётся параметром limit (по умолчанию – 100, возможны значения 50,
20, 10, 5, 1).

Т.е. чтобы загрузить полный (очевидно, что большой) объём данных, нужно последовательно производить загрузку:
http://iss.moex.com/iss/history/engines/stock/markets/shares/securities/MOEX
http://iss.moex.com/iss/history/engines/stock/markets/shares/securities/MOEX?start=100
http://iss.moex.com/iss/history/engines/stock/markets/shares/securities/MOEX?start=200
и т.д.пока (INDEX + PAGESIZE) < TOTAL.

Кстати говоря также можно выгрузить все новости сайта мосбиржи со страницы https://iss.moex.com/iss/sitenews/ – порядка 43тысяч штук, только здесь каждый шаг будет содержать PAGESIZE=”50” записей.

Этот механизм вполне понятен и логичен, реализовать можно.

Но не все так однозначно, и как оказалось самый же первый URL на странице ISS Queries для получения списка всех бумаг торгуемых на московской бирже не имеет этого блока “cursor”. И очевидно, что на странице iss.moex.com/iss/securities выгружен далеко не полный список.

выгружать его надо также последовательно:

https://iss.moex.com/iss/securities.xml?start=0

https://iss.moex.com/iss/securities.xml?start=100

https://iss.moex.com/iss/securities.xml?start=200 и так далее. Только вот значения TOTAL у нас нет…, т.к. отсутствует раздел “cursor”.

Уже после написания второй версии программы обратил внимание, что в описании метода /iss/securities есть аргументы start и limit. По моему мнению необходимо было либо помещать раздел “cursor” везде, где подразумевается цикличный парсинг больших объемов – все как описано в руководстве, либо в руководстве предусмотреть все эти нюансы и упор делать на проверку наличия у метода аргументов start и limit.

Наверняка на мосбирже есть еще и другие подобные адреса с большим объемом данных и без указания  общего объема TOTAL в блоке “cursor”.

Итак, чтобы сильно не усложнять задачу для этого случая, я решил просто немного модифицировать программу. Мы принимаем, что нас интересует только один первый блок данных data (для таких больших страниц без блока “cursor” блок data будет единственным) и крутим цикл до тех пор, пока значение в  <rows> </rows> не будет пустым.

Вот измененный код программы:

Изучаем и парсим биржевую информацию с сайта Мосбиржи. Разбор кода на Python.

Листинг программы
Запускаем, программа работает часа 3. В итоге получены внушительные данные

Изучаем и парсим биржевую информацию с сайта Мосбиржи. Разбор кода на Python.

В базе данных “Список бумаг торгуемых на московской бирже” состоит из 595 тысяч записей.

Изучаем и парсим биржевую информацию с сайта Мосбиржи. Разбор кода на Python.

На этом все. Первый результативный опыт получен. Есть общее понимание того, как устроена ISS MOEX. Получен первый опыт парсинга, get запросов, записи в файлы и БД.

А на очереди теперь изучение алгопака.

Telegram-канал Алготрейдинг на Python

ВИДЕО по теме:

?si=5zp607HGDFKlnWBl


★32
21 комментарий
Если указать в строке запроса ".json?iss.json=extended&iss.meta=off", то будет удобный json. Пример.
avatar
чтобы работала не 3 часа используйте потоки или асинхронную библиотеку. Код надо рефакторить. На хабре есть пара статей про API мосбиржи, можно не изобретать колесо. Да и на ютюбе тоже. Ну и работать лучше в джисоне конечно.
avatar
Да, согласен. но по итогу результат тот же. xml в браузере наглядней для меня выглядит. Хотя на пайтоне может было и проще разобрать json. Это практически первая моя программа. Изучать пайтон только начал и нет эффекта от одной теории — все сразу вылетает, а вот когда конкретная задача появилась, то на результат стало все получаться, причем ни одну библиотеку не изучал специально, чисто интуиция и конкретная задача помогли.
avatar
Автору за тему -Спасибо! Вот кто бы сделал готовый продукт для подкачки данных торгов! Вместо финамовской бызы- те ожлобились в последнее время!
avatar
А полученные данные идут с запаздыванием? Или онлайн?
avatar
Eugene Bright, в моем примере в статье парсится общая биржевая информация. Конкретно котировки OHLCV я не тянул. В принципе можно это делать с запаздыванием, онлайн — по платной подписке мосбиржи. Сейчас переключусь изучение Алгопака, чтобы тянуть именно котировки с мосбиржи. Обязательно вскоре сделаю обзор по этой теме. 
avatar
Beekeeper-algo, я напитонил себе утилитку для подготовки файлов для загрузки в Метасток. Полный функционал от ISS задействовал. Хотел, конечно, транслировать он-лайн, но — фиг вам…
avatar
Beekeeper-algo, именно котировки в формате тиковых данных интересует!) Раньше были на фтп сервере биржи full order log на каждой торговый день. Такие котировки можно тянуть через апи? Вес одного ордер лога за день достигал нескольких гигабайт
avatar
А работаете только через Квик-Луа-Питон? Финам-трейда нет?
avatar
broker25, если говорить о данной статье, то в ней речь не об этом. А если говорить именно обо мне, то я пользуюсь в основном Тинькоф приложением. Автоматизации реальной пока нет. Изучал вопрос в каком направлении двигаться, в т.ч. и квик. Выбор сделал в пользу изучения Python + Backtrader для тестирования стратегии и запуска торгового робота + связка с Финам или Алор + историчекие и онлайн данные брать с Moex.  Это стратегическая задача. Буду все изучать, ну и для самодисциплины публиковать выжимку по приобретенным знаниям.
avatar
Beekeeper-algo, лучше найдите QuickPy коннектор и будет вам счастье — напрямую у брокера будете получать информацию и отправлять ордера.
avatar
Илья Нечаев, спасибо! да, нашел это решение. Как дойду до этого этапа после изучения Backtrader — попробую такую связку тоже. Но сначала алгопак, как минимум исторические данные вытянуть пожалуй лучший вариант. 
avatar
Кто знает куда делись тиковые котировки с фтп сервера биржи? Full order logs назвали их. Это формат всех тиковых заявок с указанием до микросекунд
avatar
Ares Stallone, похоже просто мотивируют платную подписку брать!
avatar
Александр non, так может скинуться толпой на одну подписку, сделать смартлабовскую базу и захостить где-нибудь?
avatar
DrManhattan, кстати говоря биржа какие-то конские штрафные санкции обещает за любое нарушение правил использования данных для личного пользования. 
Сергей Алготрейдер, так не будем нарушать.
Только история и только накопление данных — никакого использования.
avatar
DrManhattan, да понятно. Но на самом деле биржу вообще не понимаю. Давно бы сделали и настольное приложение с выгрузкой всего что только можно из истории и онлайн поток бы прикрутили к чему только можно. Больше алгосделок — больше маржи и технологического развития в среде трейдеров. 
avatar
Beekeeper-algo, )) у них уже два года как мануал не обновляется. Куча незадокументируемых запросов, которых нет в мануале, но они работают. Да блин они даже дивиденды еще нормальную выгрузку не сделали. На каком-нибудь строннем «Доходъ» история выплат дивиков глубже чем через апи мосбиржи. Одна радость — быстрый ответ от сервиса и на том огромное спасибо! ))
avatar
Под quik если брокер сбер подскажите где можно глянуть api?
avatar
а где найти описание всех метаданных, например изменение в процентах или в рублях за день?
avatar

теги блога Beekeeper-algo

....все тэги



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