Что делает Free API Московской биржи в Google Таблицах

    Количество частных инвесторов на Московской бирже удвоилось за последний год и составило 3,86 млн: за 2019 счета на Мосбирже открыли 1,9 млн человек. Санкт-Петербургская биржа, специализирующаяся на торгах акциями иностранных компаний, в прошлом году зафиксировала трехкратный прирост счетов – с 910 000 до 3,06 млн шт.



    Это означает, что на рынок пришло почти 2 млн новичков, которые никогда не занимались трейдингом и не использовали специализированный софт для торгов и учета позиций.


    И если мобильные приложения брокеров для торгов постоянно обновляются и в целом достаточно удобны для пользователей, то учёт позиций, особенно при использовании нескольких брокеров (счёт от одного, а ИИС от другого) может вызывать вопросы. Бесплатным решением с автоматическим скачиванием котировок и параметров могут быть гугл таблицы с использованием бесплатного API Московской биржи.


    Ранее я уже описывал на Хабре возможности при использовании разных приложений (Intuit Quicken, KMyMoney, Microsoft Excel, Google Таблицы) для совокупного учета капитала “в одном окне”.


    А сейчас я бы хотел остановиться именно на программном интерфейсе к информационно-статистическому серверу Московской Биржи (ИСС / ISS).


    API Московской биржи в формулах Google Таблиц


    Вообще вариантов использования API Мосбиржи два:


    • формулы;
    • скрипты.

    Но скрипты в бесплатных документах скорее пугают людей, особенно, если у этих людей есть какие-то инвестиции. И особенно, если они не понимают код скрипта. Поэтому я остановлюсь только на формулах.


    В общем виде все запросы, которые можно отправить к API Мосбиржи можно узнать в справочнике. Но лично для меня этот справочник был не очень понятен и я далеко не сразу в нём разобрался, поэтому сделал простую Гугл таблицу с примерами, которые использую сам.


    Идентификатор режима торгов


    В API Московской биржи очень многое зависит от параметра “Идентификатор режима торгов” (primary_boardid), который можно посмотреть прямо у них на сайте через форму поиска.



    Идентификатор режима торгов для акций Сбербанка


    Также этот идентификатор можно посмотреть через обычный HTTP-запрос к API:


    https://iss.moex.com/iss/securities.xml?q=ТУТ ПИШЕМ НАЗВАНИЕ ИНСТРУМЕНТА ИЛИ ЕГО ЧАСТЬ


    Идентификатор режима торгов primary_boardid для акций Яндекс


    Автоматическое получение имени инструмента с Московской биржи по его идентификатору


    Очень удобно, что можно получить полное наименование инструмента. Также можно автоматически получать и краткое наименование инструмента, но полное название более понятно особенно для облигаций.



    Гугл таблица с примерами автоматического получения имени для разных классов активов


    Автоматическое получение цены инструмента с Московской биржи по его идентификатору


    Цены на российские активы можно получать с множества сайтов, но если мы говорим про API Московской биржи, то на этой вкладке представлены актуальные примеры.



    Гугл таблица с примерами автоматического получения цен для разных классов активов


    Автоматическое получение даты следующего купона и его значения с Московской биржи по идентификатору облигации


    По облигациям (не только корпоративным, но также ОФЗ и еврооблигациям) можно автоматически получать дату выплаты следующего купона и его значение.



    Гугл таблица с примерами автоматического получения дат и значений купонов


    Автоматическое получение дивидендной доходности на конкретную дату с Московской биржи по идентификатору облигации


    К сожалению, в одну формулу получить значение дивидендной доходности для облигации на конкретную дату можно получить только для ОФЗ, потому что их список короткий. Для корпоративных облигаций — можно перебирать в скрипте, например, или вручную указывать начальную позицию для поиска.



    Гугл таблица с примерами автоматического получение дивидендной доходности на конкретную дату


    Автоматическое получение дат оферт с Московской биржи по идентификатору облигации


    Очень удобно можно планировать собственные финансы, получая оферты по облигациям автоматически.



    Гугл таблица с примерами автоматического получения дат оферт


    Итог


    API Московской биржи предоставляет широкие возможности. В статье описал только те инструменты, которыми пользуюсь сам как долгосрочный частный инвестор.


    Также хочу отметить, что никак не связан с Московской биржей и использую ИСС Мосбиржи только в личных интересах.


    Автор: Михаил Шардин,
    4 февраля 2020 г.

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

    Вы знали что у Московской биржи есть бесплатное API?

    • 23,5%Да35
    • 55,0%Нет82
    • 21,5%Мне всё равно32
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 44

      +1

      Гм, даже больше, я не знал (хотя и не интересовался в общем-то), что в таблицах гугла можно так ловко использовать API. Интересный способ погонять с визуализацией.


      Интересно подумать, как выгрузить статистику по стоимости инструмента на каждый день, пусть за последние 10 лет.

        0

        Честно сказать именно выгрузкой истории я не интересовался, но такие пункты у них вроде есть.

          +1
          Попробуйте iss.moex.com/iss/history/engines/stock/markets/shares/boards/TQBR/securities/SBER.json?iss.json=extended&from=2000-01-01
          где SBER — тикер акции Сбербанк, TQBR — основной режим торгов. Цена закрытия на дату находится в поле CLOSE. Выборка ограничена 100 элементами, но можно запрашивать несколько раз, меняя from
            +1

            Спасибо!

          +2
          Стоимость акций умеет импортировать встроенная функция GOOGLEFINANCE (пример: =GOOGLEFINANCE(«SBER»)). Разве что задержка может быть разной.
          А вот с облигациями и правда так гораздо удобней. Спасибо за статью.
            0

            С облигациями да

            +1
            как получить последние выплаченные дивиденды на акцию
              0

              Все облигационные купоны есть сайте биржи, но в API их нет

                0

                Может быть Moscow_Exchange знает ответ?

                  +1
                  Посмотрите iss.moex.com/iss/securities/TATN/dividends.json?iss.json=extended
                  где TATN — тикер акции Татнефть
                    0

                    Спасибо!

                      +1

                      Удивительно, почему-то я не нашёл нигде информацию про запрос /dividends в API мосбиржи, где вы это узнали? У вас есть какой-то более полный справочник? Поделитесь!
                      Есть ли подобное для истории купонов по облигациям?
                      Есть ли подобное для истории амортизации облигаций?
                      Пишу себе инструмент для автоматического расчёта портфеля, не хватает этих данных.
                      PS. история дивидендов выдаётся не полная по некоторым акциям… По некоторым вообще не выдаётся… Странно. Мосбиржа не располагает информацией о том, что по акции выплачен дивиденд?

                        0

                        Поддерживаю. Здесь:



                        Ни слова про эту http://iss.moex.com/iss/securities/TATN/dividends.xml возможность получать дивиденды.

                          0

                          Подскажите, а инструмент для автоматического расчёта портфеля — на чем пишете?

                            +1

                            на php, можете затестить (но только для мосбиржи пока) https://izi-invest.ru

                              0

                              А отчет от брокера чем парсите? Вы автоматически его обрабатываете или вручную?

                                +1

                                автоматически… Отчёт брокера у quik сбера — это xls или html документ… не сложно парсится.

                                  0

                                  Вот здесь человек построил свою отчетную таблицу только на парсинге отчетов брокера через сервисы Amazon: https://habr.com/ru/post/426027/


                                  А вот я делаю свою отчетную таблицу в гугл таблицах: https://vc.ru/finance/92990-upravlencheskiy-uchet-lichnyh-aktivov

                                    +1

                                    Как говорится, хочешь сделать что то хорошо — сделай это сам…
                                    Я тоже свою систему писать начал, потому что готовые либо платные, либо не достаточно автоматизированы

                          0

                          Может быть и по облигациям через API есть возможность получать значения как в этой табличке у них на сайте?


                          image


                          Я из других мест получаю, но с API гораздо более удобный вариант бы был.

                      +1
                      Я вот ищу такое ПО для учета, которое бы учитывало необходимый заплатить НДФЛ.
                      Как это учитывать? Особенно если акции покупались в разное время по разным ценам.
                        0

                        Это ведь работа брокера?

                          +1
                          Я понимаю, что брокер по итогу года рассчитает налог и возьмет его сам.
                          Я про другое думаю. Вот я купил акцию по 100 рублей, потом по 120, потом по 130 рублей. Купленные акции складываются в фифо. Продажа акций осуществляется так же из фифо, то есть первыми продаются акции те, что по 100 рублей.
                          Потом они начинают расти и опускаться, колебания курса.
                          Я бы хотел продать подороже, а потом откупить их назад подешевле (спекуляция). Проблема в том, что продавая на пике я потом с трудом представляю по какой цене мне разумно откупать акцию назад.
                          Может так оказаться, что продав на некотором пике и дождавшись снижения, откупая акцию назад я оказываюсь не в выигрыше, а в проигрыше из-за предполагаемого ндфл от первой продажи. Разве не так? Может оказаться, что продав дороже и потом купив чуть дешевле я не получаю ничего кроме проигрыша и уплаты налога. Понятно, что на самом деле расчет и уплата ведется по итогу года, а не по каждой сделке, но тем не менее… Это место у меня в голове не складывается. Опять же такое: акция сильно выросла в цене и я ее продал. Я посчитал какой получится ндфл и пытаюсь рассчитать по какой цене имеет смысл откупать с учетом тех 13% налога, но на такую большую величину акции уже не падают даже при больших колебаниях… Как быть?
                          Возможно, расмышляя в таком ключе, я действую не верно. Некоторые говорят, что не нужно об этом думать вообще: купил-продал — остался в выигрыше, забудь об этой сделке, думай о следующей. Но вот мне это не дает покоя — как правильно? Мне кажется нужно ПО для учета фифо сделок и расчета ндфл по каждой сделке… Сейчас я пытаюсь это сделать в экселе, но получается не очень…

                            0

                            Понял о чём Вы, но я как долгосрочный инвестор такими вещами не интересовался — лично у меня нет решения.

                              +1
                              Долгосрочный инвестор — дело хорошее, но думаю его это тоже касается…
                              Например, вы ставите стопы на продажу?
                              Когда акция подросла вы же передвигаете наверное стоп на продажу повыше, так?
                              И если акция внезапно провалилась и по стопу была автоматически продана, чтобы зафиксировать прибыль и избежать убытков, вы потом хотите ее назад откупить или нет?
                                0

                                Раньше (давно) занимался трейдингом и торговыми системами, но сейчас уже много лет нет. Дело не особо благодарное — время тратится, результат не гарантирован.

                                  0
                          +1
                          По ссылке iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities.xml?iss.meta=off&iss.only=securities&securities.columns=SECID,PREVADMITTEDQUOTE же выдаются данные на конец предыдущего торгового дня. А есть ссылка для получения актуальных данных? Пусть с 15мин задержкой.
                            0

                            Измените PREVADMITTEDQUOTE на другое:


                            "BOARDID": {"type": "string", "bytes": 12, "max_size": 0},
                            "SHORTNAME": {"type": "string", "bytes": 30, "max_size": 0},
                            "PREVPRICE": {"type": "double"},
                            "LOTSIZE": {"type": "int32"},
                            "FACEVALUE": {"type": "double"},
                            "STATUS": {"type": "string", "bytes": 3, "max_size": 0},
                            "BOARDNAME": {"type": "string", "bytes": 381, "max_size": 0},
                            "DECIMALS": {"type": "int32"},
                            "SECNAME": {"type": "string", "bytes": 90, "max_size": 0},
                            "REMARKS": {"type": "string", "bytes": 24, "max_size": 0},
                            "MARKETCODE": {"type": "string", "bytes": 12, "max_size": 0},
                            "INSTRID": {"type": "string", "bytes": 12, "max_size": 0},
                            "SECTORID": {"type": "string", "bytes": 12, "max_size": 0},
                            "MINSTEP": {"type": "double"},
                            "PREVWAPRICE": {"type": "double"},
                            "FACEUNIT": {"type": "string", "bytes": 12, "max_size": 0},
                            "PREVDATE": {"type": "date", "bytes": 10, "max_size": 0},
                            "ISSUESIZE": {"type": "int64"},
                            "ISIN": {"type": "string", "bytes": 36, "max_size": 0},
                            "LATNAME": {"type": "string", "bytes": 90, "max_size": 0},
                            "REGNUMBER": {"type": "string", "bytes": 90, "max_size": 0},
                            "PREVLEGALCLOSEPRICE": {"type": "double"},
                            "PREVADMITTEDQUOTE": {"type": "double"},
                            "CURRENCYID": {"type": "string", "bytes": 12, "max_size": 0},
                            "SECTYPE": {"type": "string", "bytes": 3, "max_size": 0},
                            "LISTLEVEL": {"type": "int32"},
                            "SETTLEDATE": {"type": "date", "bytes": 10, "max_size": 0}```
                              +1
                              все доступные поля со значениями можно же увидеть по
                              iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities.xml?iss.meta=off&iss.only=securities
                              и тут нет текущей котировки (пусть с 15мин задержкой)

                              <row SECID="AFKS" BOARDID="TQBR" SHORTNAME="Система ао" PREVPRICE="18.7" LOTSIZE="100" FACEVALUE="0.09" STATUS="A" BOARDNAME="Т+: Акции и ДР - безадрес." DECIMALS="3" SECNAME="АФК "Система" ПАО ао" REMARKS="" MARKETCODE="FNDT" INSTRID="EQIN" SECTORID="EQ-N" MINSTEP="0.001" PREVWAPRICE="18.372" FACEUNIT="SUR" PREVDATE="2020-02-19" ISSUESIZE="9650000000" ISIN="RU000A0DQZE3" LATNAME="AFK Sistema" REGNUMBER="1-05-01669-A" PREVLEGALCLOSEPRICE="18.7" PREVADMITTEDQUOTE="18.7" CURRENCYID="SUR" SECTYPE="1" LISTLEVEL="1" SETTLEDATE="2020-02-25"/>

                              а только котировка на конец предыдущего торгового дня…
                                0

                                в другом разделе тогда посмотрите — у них достаточно запутанная структура API и текущая цена точно есть

                                  0

                                  https://iss.moex.com/iss/engines/stock/markets/shares/


                                  раздел marketdata вместо securities

                                    +1
                                    О, спасибо тебе, добрый человек! Не хватает репутации, чтобы поставить + тебе.

                                    Итак, для получения цены BID (лучшая котировка на покупку для оценки портфеля) для тикера, например, из ячейки C3, вместо кривой формулы:

                                    =GOOGLEFINANCE("MCX:" & C3)

                                    которая не работает с привелигированными акциями, ещё и округляет дробные значения (у ФСК, ТГК-1 и др.) до бесполезных значений, используем такую формулу:

                                    =SUBSTITUTE( IMPORTxml("https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities.xml?iss.meta=off&iss.only=marketdata&marketdata.columns=SECID,BID"; "//row[@SECID='" & C3 & "']/@BID") ;".";",")

                                    а в ваших примерах вместо CONCATENATE проще использовать &
                                      0

                                      Хорошо, спасибо!

                                        +1
                                        И ещё один способ как получить цену последней сделки, напр. для AFKS

                                        =IMPORTXML("https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities/AFKS.xml?iss.meta=off&iss.only=marketdata&marketdata.columns=LAST"; "//@LAST")

                                        это вариант для русской локали, а для американской вместо последей ";" ставим ","
                                        0
                                        тут вместо цены BID лучше использовать LAST. А то в выходные BID пустой, а цена последней сделки всегда непустая
                                +1
                                Ещё один способ, это на отедльном листе загрузить все котировки, например, цены последних сделкок:

                                =IMPORTHTML("http://iss.moex.com/iss/engines/stock/markets/shares/boards/tqbr/securities.html?iss.meta=on&iss.only=marketdata&marketdata.columns=SECID,LAST"; "table";1)

                                А потом на другом листе с помощью VLOOKUP находить по тикеру соответствующую цену.

                                И можно добавить макрос, который перезаписывает формулу, чтобы принудительно обновить котировки:

                                function CopyPaste() {
                                var spreadsheet = SpreadsheetApp.getActive();
                                var startsheet = spreadsheet.getActiveSheet();
                                spreadsheet.setActiveSheet(spreadsheet.getSheetByName('TICK'), true);
                                spreadsheet.getRange('E1').activate();
                                spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
                                Utilities.sleep(1000);
                                spreadsheet.getCurrentCell().setFormula('=IMPORTHTML("http://iss.moex.com/iss/engines/stock/markets/shares/boards/tqbr/securities.html?iss.meta=on&iss.only=marketdata&marketdata.columns=SECID,LAST"; "table";1)');
                                spreadsheet.setActiveSheet(startsheet);
                                spreadsheet.getRange('A16').activate();
                                };
                                  0

                                  Спасибо image

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                Самое читаемое