Блог им. arsanalysis

Как утащить с сайта Мосбиржи разные котировки к себе в гугл-таблицы

Нам понадобится сам сайт мосбиржи с данными по котировкам. Еще нам пригодится сайт xpather.com/
Погнали -
1. Надо где-то найти код бумаги, посмотрите у брокера в приложении, для примера — пусть мы хотим затащить в Google таблицу фонд недвижимости сбера, находим что код у СФНАрБиз7 будет RU000A1034U7. Если в приложении не видно, гляньте в отчетах, или на сайте мосбиржи есть страничка вашего актива, для этого фонда вот она www.moex.com/ru/issue.aspx?board=TQPI&code=RU000A1034U7

2. Находим данные в XML, не всегда это просто, если не удается нагуглить, то идем сюда iss.moex.com/iss/engines/stock/markets/
и пытаемся понять к какому рынку это относится, что не всегда очевидно. Допустим опытным путем определили что это в shares/securitues, добавляем к URL iss.moex.com/iss/engines/stock/markets/shares/securities/RU000A1034U7
Ну и чтобы получить XML добавим в конце xml:
iss.moex.com/iss/engines/stock/markets/shares/securities/RU000A1034U7.xml

3. Получили всё в формате XML, визуально нашли в каком разделе находится то что мы ищем и видим что это в rows, PREVPRICE=«87500» это то что нам надо

4. В таблицы Google это вставляется с помощью функции IMPORTXML. Вот её описание support.google.com/docs/answer/3093342?hl=en видим что у нее два аргумента, которые нам нужны — это url и xpath_query. URL мы уже нашли, нам нужно понять как по xml сделать нужный нам xpath. Идём на сайт xpather.com/ ,
вставляем слева наш xml  и сверху вбиваем xpath, нам не нужно ничего сложного городить как в их примере, нам просто нужно достать вложенные данные. Наш PREVPRICE лежит в разделе document-->data-->rows-->row, соответственно вбиваем /document/data/rows/row/@PREVPRICE и видим как нужное значение подсветилось в XML — мы всё правильно сделали, составим формулу для получения цены этого фонда =IMPORTXML(«iss.moex.com/iss/engines/stock/markets/shares/securities/RU000A1034U7.xml», "/document/data/rows/row/@PREVPRICE")

5. Можно опционально улучшить, сделать формулу универсальной — подставить в формулу код бумаги из другой ячейки (пусть в B45 лежит RU000A1034U7):
=IMPORTXML(«iss.moex.com/iss/engines/stock/markets/shares/securities/»&B45&".xml", "/document/data/rows/row/@PREVPRICE")

Если кто-то знает как находить xml данные на moex быстрее — пишите в комменты, может справочник где-то есть

Оставлю ссылку на телеграм канал t.me/i_will_retire там всякие полезности про FIRE, кто интересуется — добро пожаловать
★5
20 комментариев
Вот мне бы ленту сделок по определенному инструменту выгружать периодически. Возможно или это по дополнительной подписке?
avatar
Eldar Shaymardanov, Чего-то я сомневаюсь что у гугла есть такие данные, может у брокера API какое-то найдется?
avatar
Ars Analysis, а мне не гугл нужен, а возможность получить данные с ммвб. чем забрать — я уже найду.
avatar
У меня весь портфель в таблице LibreOffice Calc (бесплатная альтернатива MS Office). Данные точно также подтягиваются с сайта Мосбиржи из XML файлов. Также подтягиваю курсы валют с сайта ЦБ.
avatar
Alexide, Поделитесь формулами?
avatar

Ars Analysis, 

Например для облигаций ОФЗ, получение рыночной цены:

=ПОДСТАВИТЬ( ФИЛЬТР.XML(ВЕБСЛУЖБА(«iss.moex.com/iss/engines/stock/markets/bonds/boards/TQOB/securities.xml?»);"//document//data//rows//row[@SECID='"&A7&"']/@PRICE");".";",")

Тикер эмитента читается из ячейки A7, например там записано:

SU52003RMFS9 (это ОФЗ-ИН 52003)

Для корпоративных облигаций:

=ПОДСТАВИТЬ( ФИЛЬТР.XML(ВЕБСЛУЖБА(«iss.moex.com/iss/engines/stock/markets/bonds/boards/TQOB/securities.xml?»);"//document//data//rows//row[@SECID='"&A7&"']/@PRICE");".";",")

Тикер эмитента читается из ячейки A7, например там записано:

RU000A105A95

Смартлаб искажает кавычки — нужно заменить все кавычки елочки и заменить на обычные двойные кавычки.

avatar
Alexide, кажется я нашел опечатку по второй облигации
iss.moex.com/iss/engines/stock/markets/bonds/boards/TQCB/securities.xml

доска нужна TQCB
avatar
Ars Analysis, я выше написал, что там две доски — одна для ОФЗ, другая для корпоратов.
avatar
Alexide, все верно две, но в формулах стояла (и сейчас тоже) одна на оба случая
avatar
Ars Analysis, а какая ссылка для акций?
avatar
fondov-net, 
=IMPORTXML(«iss.moex.com/iss/engines/stock/markets/shares/securities/SBER.xml», "/document/data[@id="«marketdata»"]/rows/row[@BOARDID="«TQBR»"]/@MARKETPRICE")
avatar
Alexide, И еще, кажется что не требуется грузить большую xml, можно только нужную облигацию

=ПОДСТАВИТЬ( ФИЛЬТР.XML(ВЕБСЛУЖБА(«iss.moex.com/iss/engines/stock/markets/bonds/boards/TQCB/securities/RU000A105A95.xml»);"//document//data//rows//row/@PREVPRICE");".";",")
avatar
Ars Analysis, я так специально переделал для ускорения. Дело в том, что в LibreOffice похоже есть кэширование и когда подобный скрипт выполняется для десятков бумаг, то видимо он загружает XML с сайта Мосбиржи один раз.
А вот если вы будете получать индивидуальный XML для каждой ценной бумаги, то это будет 10-20-100 разных страниц. И загрузка замедлится и сервер Мосбиржи может обрабатывать с задержкой кучу разных запросов. 
avatar
А чем вам формат CSV для импорта в таблицы или СУБД не нравится?
Мосбиржа даже генерит в таком виде данные сильно быстрее.
PS Для себя лично по облигациям данные вытягиваю так доходность рассчитывать. JSON у них тоже есть, но он криво построен, по сути они не парились от слова совсем и тот же CSV засунули по-быстрому внутрь оболочки от JSON (не рекомендую его использовать).
avatar
Denis K, ничего не имею против CSV:)
бесплатное API, лаги гарантируются:)
avatar
Ars Analysis, дело не в личных предпочтениях, а во времени генерации данных по запросу к бирже, универсальности формата для разных субд, а также скорости парсинга на стороне клиента. Лично мне вообще JSON нравится больше, но он у них крайне кривой/косой.
avatar
Denis K, а можете поделиться примером как забирать CSV данные с сервера Мосбиржи, для Excel или LibreOffice?

У меня сейчас открытие документа занимает около 4-5 секунд пока данные не подтянутся с сервера.

Даже просто открытие одного XML файла Мосбиржи в браузере занимает значительное время (3-4 секунды).
avatar
Alexide, я лично немного сложнее анализ делаю через mysql прогоняю со своими справочниками, но про импорт в офис здесь же на смартлабе уже выкладывали пример использования CSV.
В плане ускорения генерации не забывайте еще фильтры накладывать через ?iss.only=securities или ?iss.only=marketdata
avatar
Denis K, спасибо
avatar
Denis K, может быть поделитесь, как в mysql данные подтягивать?
avatar

теги блога Ars Analysis

....все тэги



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