Ars Analysis
Ars Analysis личный блог
31 января 2024, 08:33

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

Нам понадобится сам сайт мосбиржи с данными по котировкам. Еще нам пригодится сайт 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, кто интересуется — добро пожаловать
20 Комментариев
  • Eldar Shaymardanov
    31 января 2024, 08:57
    Вот мне бы ленту сделок по определенному инструменту выгружать периодически. Возможно или это по дополнительной подписке?
      • Eldar Shaymardanov
        31 января 2024, 10:47
        Ars Analysis, а мне не гугл нужен, а возможность получить данные с ммвб. чем забрать — я уже найду.
  • Alexide
    31 января 2024, 10:01
    У меня весь портфель в таблице LibreOffice Calc (бесплатная альтернатива MS Office). Данные точно также подтягиваются с сайта Мосбиржи из XML файлов. Также подтягиваю курсы валют с сайта ЦБ.
      • Alexide
        31 января 2024, 13:18

        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

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

          • Alexide
            31 января 2024, 15:17
            Ars Analysis, я выше написал, что там две доски — одна для ОФЗ, другая для корпоратов.
          • fondov-net
            27 февраля 2024, 08:47
            Ars Analysis, а какая ссылка для акций?
          • Alexide
            31 января 2024, 15:19
            Ars Analysis, я так специально переделал для ускорения. Дело в том, что в LibreOffice похоже есть кэширование и когда подобный скрипт выполняется для десятков бумаг, то видимо он загружает XML с сайта Мосбиржи один раз.
            А вот если вы будете получать индивидуальный XML для каждой ценной бумаги, то это будет 10-20-100 разных страниц. И загрузка замедлится и сервер Мосбиржи может обрабатывать с задержкой кучу разных запросов. 
  • Denis K
    31 января 2024, 16:00
    А чем вам формат CSV для импорта в таблицы или СУБД не нравится?
    Мосбиржа даже генерит в таком виде данные сильно быстрее.
    PS Для себя лично по облигациям данные вытягиваю так доходность рассчитывать. JSON у них тоже есть, но он криво построен, по сути они не парились от слова совсем и тот же CSV засунули по-быстрому внутрь оболочки от JSON (не рекомендую его использовать).
      • Denis K
        31 января 2024, 16:32
        Ars Analysis, дело не в личных предпочтениях, а во времени генерации данных по запросу к бирже, универсальности формата для разных субд, а также скорости парсинга на стороне клиента. Лично мне вообще JSON нравится больше, но он у них крайне кривой/косой.
    • Alexide
      31 января 2024, 16:08
      Denis K, а можете поделиться примером как забирать CSV данные с сервера Мосбиржи, для Excel или LibreOffice?

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

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

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн