Ранее уже писал про получение данных с Московской биржи через формулы Google Таблиц. Однако остался вопрос — можно ли получать эти же данные при локальном использовании Microsoft Excel или его свободного аналога LibreOffice Calc? Без использования скриптов или ручного копирования.
Microsoft Excel с формулами получения данных с Мосбиржи
И на этот вопрос можно дать положительный ответ. Это даже более удобно, поскольку не приходится ожидать загрузки результатов работы функции IMPORTXML в Гугл Таблицах.
Аналогом этой функции в Excel и Calc выступает связка формул: WEBSERVICE (ВЕБСЛУЖБА) + FILTERXML (ФИЛЬТР.XML).
При работе с Microsoft Excel есть некоторые нюансы:
- Эти функции доступны только в Excel 2013 и более поздних версиях для Windows.
- Эти функции не будет возвращать результаты на компьютере Mac.
Для LibreOffice Calc подобных ограничений меньше:
Собрал работоспособный пример «API Мосбиржи в Microsoft Excel.xlsx
» с функциями, которые описаны в программном интерфейсе к информационно-статистическому серверу Московской Биржи (ИСС / ISS). Плюс добавил некоторые функции, которые были найдены читателями первой части статьи про гугл таблицы.
Протестировал этот файл в Microsoft Excel 2019 под Windows 10 и в LibreOffice Calc 6.4 под Linux Mint 19.3. Под Mac OS у меня возможности протестировать не было.
API Московской биржи в формулах MS Excel
В общем виде все запросы, которые можно отправить к API Мосбиржи есть в справочнике. Но лично для меня этот справочник до сих пор не особо понятен.
Идентификатор режима торгов
В API Московской биржи очень многое зависит от параметра «Идентификатор режима торгов» (primary_boardid), который можно посмотреть прямо у них на сайте через форму поиска.
Идентификатор режима торгов для акций Тинькофф
Также этот идентификатор можно посмотреть через обычный HTTP-запрос к API:
https://iss.moex.com/iss/securities.xml?q=ТУТ ПИШЕМ НАЗВАНИЕ ИНСТРУМЕНТА ИЛИ ЕГО ЧАСТЬ&iss.meta=off&securities.columns=name,emitent_inn,isin,secid,primary_boardid
Поиск через HTTP-запрос к API Мосбиржи по слову Пермь
Автоматическое получение имени акций, облигаций и ETF
Очень удобно, что можно получить полное или краткое наименование инструмента. Для облигаций полное название особенно понятно.
Файл «API Мосбиржи в Microsoft Excel.xlsx
» с примерами автоматического получения имени для разных классов активов. Корректно работает и в LibreOffice Calc
Автоматическое получение текущих цен
На этой вкладке представлены актуальные примеры для получения цен акций, облигаций и ETF с Московской биржи.
Цена предыдущего дня берётся через PREVADMITTEDQUOTE, а не LAST с 15 минутной задержкой, поскольку по некоторым низко ликвидным инструментам через LAST цены может просто не быть.
Файл «API Мосбиржи в Microsoft Excel.xlsx
» с примерами автоматического получения имени для разных классов активов. Корректно работает и в LibreOffice Calc
Автоматическое получение дивидендных выплат для акций
Очень удобная функция Мосбиржи, которая позволяет получать не только значение текущей выплаты, но и историю выплат дивидендов вместе с датами и значениями.
Файл «API Мосбиржи в Microsoft Excel.xlsx
» с примерами автоматического получения имени для разных классов активов. Корректно работает и в LibreOffice Calc
Автоматическое получение облигационных выплат
По облигациям (не только корпоративным, но также ОФЗ и еврооблигациям) можно автоматически получать дату выплаты следующего купона и его значение.
Файл «API Мосбиржи в Microsoft Excel.xlsx
» с примерами автоматического получения имени для разных классов активов. Корректно работает и в LibreOffice Calc
Автоматическое получение дат оферт
Удобно планировать собственные финансы, получая даты оферт (дата, в которую инвестор или эмитент имеют право досрочно погасить облигацию по цене номинала) автоматически.
Файл «API Мосбиржи в Microsoft Excel.xlsx
» с примерами автоматического получения имени для разных классов активов. Корректно работает и в LibreOffice Calc
UPD. Пользователь mixei подсказывает, что автоматическое обновление настраивается через Параметры — Центр управления безопасностью — вкладка Внешнее содержимое — там надо поставить все флажки где не рекомендуется Но это на страх и риск пользователей.
Итог
API Московской биржи предоставляет широкие возможности, которые гораздо шире чем описанные в данной статье. Это статья своеобразная шпаргалка для долгосрочного частного инвестора, который ведёт учёт в локальном файле на собственном компьютере.
Также хочу отметить, что я никак не связан с Московской биржей и использую ИСС Мосбиржи только в личных интересах.
Автор: Михаил Шардин,
21 апреля 2020 г.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Microsoft Excel или LibreOffice Calc для локального использования?
22.22%
LibreOffice Calc
20
Проголосовали 90 пользователей.
Воздержались 11 пользователей.
ВНИМАНИЕ! КОММЕНТАРИИ ПЕРВОГО УРОВНЯ В ВОПРОСАХ УПОРЯДОЧИВАЮТСЯ ПО ЧИСЛУ ПЛЮСИКОВ, А НЕ ПО ВРЕМЕНИ ПУБЛИКАЦИИ.
Почитайте статью на habr.com/ru/post/498268/, есть еще новые возможности в Excel для Microsoft 365. Если нужно могу то же скинуть пример получение котировок и много чего другого.
- 12 июня 2022, 09:46
-
Ответить
Андрей, страница не найдена(
- 12 июня 2022, 09:56
-
Ответить
Сергей Кузнецов, в ссылку добавилась запятая. Попробуйте так:
- 12 июня 2022, 10:16
-
Ответить
Yury Agasiev, спасибо, открылось!
- 12 июня 2022, 10:31
-
Ответить
Yury Agasiev, затрахали ссылки давать дайте формулу видел все эти ссылки открывается гугл страница по ссылкам там другая формула
- 12 июня 2022, 11:44
-
Ответить
Андрей, Страница не найдена
- 12 июня 2022, 11:41
-
Ответить
импортируйте туда csv файл, или вам онлайн надо ??
- 12 июня 2022, 02:01
-
Ответить
квик умеет экспортировать в excel
- 12 июня 2022, 06:42
-
Ответить
Проще простого)) конкретизируйте источник и состав данных, и половина задачи уже будет решена
- 12 июня 2022, 10:18
-
Ответить
- 12 июня 2022, 12:01
-
Ответить
в виде тьекста есть у когонить эта формула
- 12 июня 2022, 11:48
-
Ответить
В excel есть шикарный инструмент, power query. А у мосбиржи есть инструкция по api. Формируя разные ссылки, в соответствии с инструкцией по api и скармливая эти ссылки в качестве источника в power query можно добиться многого.
- 12 июня 2022, 23:18
-
Ответить
Только зарегистрированные и авторизованные пользователи могут оставлять ответы.
Залогиниться
Зарегистрироваться
Файлы к уроку:
- Для спонсоров Boosty
- Для спонсоров VK
Ссылки:
- Страница курса
- Плейлист YouTube
- Плейлист ВК
Описание
В этом уроке мы научимся получать прямо в Excel котировки разных ценных бумаг с сайта Московской биржи.
Решение
Московская биржа предоставляет возможность скачивать котировки и другую информацию по ценным бумагам при помощи специальных ссылок.
Если мы введем такую ссылку в Power Query, создав запрос из интернета, то получим интересующие нас котировки прямо в Excel.
Вот ссылка на сайте Московской биржи https://iss.moex.com/iss/reference/ На этой странице вы можете увидеть какую именно информацию вы можете получить с сайта Московской биржи. Котировками дело не ограничивается.
Все ссылки конструируются примерно по одному шаблону. В этом примере мы разберем получение котировок при помощи Power Query, но если вам нужна какая-то другая информация, то вы по аналогии сможете создать похожую ссылку.
Наша ссылка будет выглядеть так — https://iss.moex.com/iss/history/engines/stock/markets/shares/securities/SBER/securities.xml
В том месте, где написано SBER нужно вставить тикер интересующей вас ценной бумаги. Далее, развернув таблицу, вы получите таблицу с котировками, но только 100 строк. Это максимальное количество, которое позволено выгружать. Нам нужно что-то придумать, чтобы выгружать больше строк.
Что делать, чтобы получить много строк? Нужно использовать параметр start. Мы создадим столбец с числами с инкрементом 100 и в каждой строке будем запрашивать информация по ссылке.
Примененные функции
- Xml.Tables
- Web.Contents
- List.Numbers
- Table.FromList
- Splitter.SplitByNothing
- ExtraValues.Error
- Table.AddColumn
- Text.From
- Table.SelectColumns
- Table.ExpandTableColumn
- Table.TransformColumnNames
- Text.AfterDelimiter
Код
Пример получения 100 строк:
let
source = Xml.Tables(
Web.Contents(
"http://iss.moex.com/iss/history/engines/stock/markets/shares/securities/SBER/securities.xml?start=300"
)
){0}[Table]{0}[rows]{0}[row]
in
source
Пример получения 4000 строк:
let
source = List.Numbers(1, 40, 100),
to_table = Table.FromList(
source,
Splitter.SplitByNothing(),
null,
null,
ExtraValues.Error
),
table_add_col = Table.AddColumn(
to_table,
"Пользовательская",
each Xml.Tables(
Web.Contents(
"http://iss.moex.com/iss/history/engines/stock/markets/shares/securities/SBER/securities.xml?start="
& Text.From([Column1])
)
){0}[Table]{0}[rows]{0}[row]
),
cols_select = Table.SelectColumns(table_add_col, {"Пользовательская"}),
col_expand_table = Table.ExpandTableColumn(
cols_select,
"Пользовательская",
{
"Attribute:BOARDID",
"Attribute:TRADEDATE",
"Attribute:SHORTNAME",
"Attribute:SECID",
"Attribute:NUMTRADES",
"Attribute:VALUE",
"Attribute:OPEN",
"Attribute:LOW",
"Attribute:HIGH",
"Attribute:LEGALCLOSEPRICE",
"Attribute:WAPRICE",
"Attribute:CLOSE",
"Attribute:VOLUME",
"Attribute:MARKETPRICE2",
"Attribute:MARKETPRICE3",
"Attribute:ADMITTEDQUOTE",
"Attribute:MP2VALTRD",
"Attribute:MARKETPRICE3TRADESVALUE",
"Attribute:ADMITTEDVALUE",
"Attribute:WAVAL"
},
{
"Attribute:BOARDID",
"Attribute:TRADEDATE",
"Attribute:SHORTNAME",
"Attribute:SECID",
"Attribute:NUMTRADES",
"Attribute:VALUE",
"Attribute:OPEN",
"Attribute:LOW",
"Attribute:HIGH",
"Attribute:LEGALCLOSEPRICE",
"Attribute:WAPRICE",
"Attribute:CLOSE",
"Attribute:VOLUME",
"Attribute:MARKETPRICE2",
"Attribute:MARKETPRICE3",
"Attribute:ADMITTEDQUOTE",
"Attribute:MP2VALTRD",
"Attribute:MARKETPRICE3TRADESVALUE",
"Attribute:ADMITTEDVALUE",
"Attribute:WAVAL"
}
),
types = Table.TransformColumnNames(
col_expand_table,
each Text.AfterDelimiter(_, ":")
)
in
types
Этот урок входит в курс Веб-запросы в Power Query
Номер урока | Урок | Описание |
---|---|---|
1 | Котировки Yahoo Finance | Вы хотите получить историю котировок акций MCD с 2000 года по текущий день с сайта Yahoo Finance. Вы копируете ссылку на раздел с историческими данными, вставляете ссылку в Power Query и получаете только 100 строк. |
2 | HTML, получение данных по облигациям | Мы хотим получить данные по всем облигациям со страницы bonds.finam.ru |
3 | Многостраничное извлечение | На разных страницах находятся сайта находятся котировки золота на каждый год. Нужно соединить все данные в одну таблицу. |
4 | JSON, Котировки Yahoo Finance 2 | В этом уроке мы разберем еще один способ скачивания котировок с Yahoo Finance. Этот способ намного удобнее и быстрее. Здесь мы научимся обрабатывать формат JSON. |
5 | Котировки Московской биржи | В этом уроке мы научимся получать прямо в Excel котировки разных ценных бумаг с сайта Московской биржи. Московская биржа предоставляет возможность скачивать котировки и другую информацию по ценным бумагам при помощи специальных ссылок. Если мы введем такую ссылку в Power Query, создав запрос из интернета, то получим интересующие нас котировки прямо в Excel. |
6 | Неразмеченный текст | Вы делаете запрос к Web-странице и сталкиваетесь с неразмеченным текстом. Вы хотите при помощи Power Query этот неразмеченный текст преобразовать в нормальную красивую таблицу. |
7 | Текстовый документ, веб-страница, List.Zip | В этом запросе мы научимся получать нужную информацию из текста веб-страницы. |
8 | Youtube Data API | В этом уроке мы научимся получать данные из Youtube Data API. Узнаем как получить данные о Youtube канале: список видео и плейлистов, названия, описания, длительность, тэги, количество лайков, дизлайков, просмотров и комментариев. |
9 | Личный OneDrive — подключаемся напрямую к файлам и папкам | В этом уроке мы разберем как напрямую подключиться к файлам и папкам на личном OneDrive. |
10 | Подключение Google Spreadsheets, Google Drive (Excel.Workbook, Web.Contents) | В этом уроке мы научимся подключаться к xlsx файлам, которые находятся в вашем Google Drive. |
11 | Получить все станции метро | Получим таблицу с перечнем станций метрополитена даже с координатами широты и долготы. |
12 | Получить ссылки с веб-страницы (Html.Table) | Получить URL с веб-страницы. Сделать запрос к каждому URL, получить таблицы и объединить их всех по вертикали. |
13 | Получить все URL с веб-страницы | Получим нужные URL с веб-страницы в Excel. Сделать запрос к каждому URL, получить таблицы и объединить их по вертикали. |
14 | Ищем работу через API Head Hunter (hh.ru) | Получим таблицу с перечнем вакансий с сайте HH. Получим вакансии, в названии или описании которых встречаются слова SQL, Pandas, Power Query, Power Pivot, Power BI. |
15 | Запрос к XML Sitemap | Сделаем запрос к sitemap.xml, чтобы извлечь список всех веб-страниц сайта. |
Я уже неоднократно разбирал способы импорта данных в Excel из интернета с последующим автоматическим обновлением. В частности:
- В старых версиях Excel 2007-2013 это можно было сделать с помощью прямого веб-запроса.
- Начиная с 2010 года это можно очень удобно делать с помощью надстройки Power Query.
К этим способам в последних версиях Microsoft Excel теперь можно добавить ещё один — импорт данных из интернета в формате XML с помощью встроенных функций.
XML (eXtensible Markup Language = Расширяемый Язык Разметки) – это универсальный язык, созданный для описания любых данных. По сути, он представляет собой обычный текст, но с добавленными в него специальными тегами для разметки структуры данных. Многие сайты совершенно бесплатно предоставляют всем желающим потоки своих данных в XML-формате для загрузки. На сайте Центрального Банка России (www.cbr.ru), в частности, с помощью подобной технологии отдаются данные по курсам различных валют. С сайта Московской Биржи (www.moex.com) таким же образом можно загрузить котировки акций, облигаций и множество другой полезной информации.
Начиная с версии 2013 в Excel появились две функции для прямой загрузки XML-данных из интернета в ячейки листа: ВЕБСЛУЖБА (WEBSERVICE) и ФИЛЬТР.XML (FILTERXML). Работают они в паре — сначала функция ВЕБСЛУЖБА выполняет запрос к нужному сайту и возвращает его ответ в формате XML, а затем с помощью функции ФИЛЬТР.XML мы «разбираем» этот ответ на составляющие, извлекая из него нужные нам данные.
Давайте рассмотрим работу этих функций на классическом примере – импорте курса любой нужной нам валюты на заданный интервал дат с сайта Центробанка России. В качестве заготовки будем использовать вот такую конструкцию:
Здесь:
- В жёлтых ячейках находятся даты начала и окончания интересующего нас периода.
- В синей сделан выпадающий список валют при помощи команды Данные — Проверка — Список (Data — Validation — List).
- В зеленых ячейках мы будем использовать наши функции, чтобы создать строку запроса и получить ответ сервера.
- Таблица справа — справочник по кодам валют (потребуется нам чуть позже).
Поехали!
Шаг 1. Формируем строку запроса
Чтобы получить от сайта требуемую информацию, его нужно правильно спросить. Заходим на www.cbr.ru и в подвале главной страницы открываем ссылку Технические ресурсы - Получение данных, используя XML (http://cbr.ru/development/SXML/). Проматываем чуть ниже и во втором примере (Example 2) будет то, что нам нужно — получение курсов валюты на заданный интервал дат:
Как видно из примера, строка запроса должна содержать даты начала (date_req1) и окончания (date_req2) интересующего нас периода и код валюты (VAL_NM_RQ), курс которой мы хотим получить. Коды основных валют вы можете найти в таблице ниже:
Валюта |
Код |
Валюта |
Код |
|
Австралийский доллар | R01010 |
Литовский лит |
R01435 |
|
Австрийский шиллинг |
R01015 |
Литовский талон |
R01435 |
|
Азербайджанский манат |
R01020 |
Молдавский лей |
R01500 |
|
Фунт стерлингов |
R01035 |
Немецкая марка |
R01510 |
|
Ангольская новая кванза |
R01040 |
Нидерландский гульден |
R01523 |
|
Армянский драм |
R01060 |
Норвежская крона |
R01535 |
|
Белорусский рубль |
R01090 |
Польский злотый |
R01565 |
|
Бельгийский франк |
R01095 |
Португальский эскудо |
R01570 |
|
Болгарский лев |
R01100 |
Румынский лей |
R01585 |
|
Бразильский реал |
R01115 |
Сингапурский доллар |
R01625 |
|
Венгерский форинт |
R01135 |
Суринамский доллар |
R01665 |
|
Гонконгский доллар |
R01200 |
Таджикский сомони |
R01670 |
|
Греческая драхма |
R01205 |
Таджикский рубл |
R01670 |
|
Датская крона |
R01215 |
Турецкая лира |
R01700 |
|
Доллар США |
R01235 |
Туркменский манат |
R01710 |
|
Евро |
R01239 |
Новый туркменский манат |
R01710 |
|
Индийская рупия |
R01270 |
Узбекский сум |
R01717 |
|
Ирландский фунт |
R01305 |
Украинская гривна |
R01720 |
|
Исландская крона |
R01310 |
Украинский карбованец |
R01720 |
|
Испанская песета |
R01315 |
Финляндская марка |
R01740 |
|
Итальянская лира |
R01325 |
Французский франк |
R01750 |
|
Казахстанский тенге |
R01335 |
Чешская крона |
R01760 |
|
Канадский доллар |
R01350 |
Шведская крона |
R01770 |
|
Киргизский сом |
R01370 |
Швейцарский франк |
R01775 |
|
Китайский юань |
R01375 |
Эстонская крона |
R01795 |
|
Кувейтский динар |
R01390 |
Югославский новый динар |
R01804 |
|
Латвийский лат |
R01405 |
Южноафриканский рэнд |
R01810 |
|
Ливанский фунт |
R01420 |
Вон Республики Корея |
R01815 |
|
Японская иена |
R01820 |
Полный справочник по кодам валют есть там же, на сайте ЦБ – см. http://cbr.ru/scripts/XML_val.asp?d=0
Теперь сформируем строку запроса в ячейке на листе с помощью:
- оператора склейки текста (&), чтобы собрать воедино;
- функции ВПР (VLOOKUP), чтобы найти код нужной нам валюты в справочнике;
- функции ТЕКСТ (TEXT), преобразующей дату по заданному шаблону день-месяц-год через косую черту.
="http://cbr.ru/scripts/XML_dynamic.asp?date_req1="&ТЕКСТ(B2;"ДД/ММ/ГГГГ")& "&date_req2="&ТЕКСТ(B3;"ДД/ММ/ГГГГ")&"&VAL_NM_RQ="&ВПР(B4;M:N;2;0)
Шаг 2. Выполняем запрос
Теперь используем функцию ВЕБСЛУЖБА (WEBSERVICE) с созданной строкой запроса в качестве единственного аргумента. Ответом будет длинная строка XML-кода (лучше включить перенос по словам и увеличить размер ячейки, если хочется увидеть её целиком):
Шаг 3. Разбираем ответ
Чтобы легче было разобраться в структуре данных ответа, лучше воспользоваться одним из онлайн-парсеров XML (например, http://xpather.com/ или https://jsonformatter.org/xml-parser), которые умеют наглядно форматировать XML-код, добавляя к нему отступы и подсвечивая цветом синтаксис. Тогда всё станет существенно понятнее:
Теперь хорошо видно, что значения курса обрамлены у нас тегами <Value>…</Value>, а даты являются атрибутами Date в тегах <Record>.
Чтобы их извлечь курс, выделим на листе столбец из десяти (или более — если делать с запасом) пустых ячеек (т.к. был задан 10-дневный интервал дат) и введём в строку формул функцию ФИЛЬТР.XML (FILTERXML):
Здесь первый аргумент – это ссылка на ячейку с ответом сервера (B8), а второй – строка запроса на XPath – специальном языке, с помощью которого можно обращаться к нужным фрагментам XML-кода и извлекать их. Подробнее о языке XPath можно почитать, например, тут.
Важно после ввода формулы нажать не Enter, а сочетание клавиш Ctrl+Shift+Enter, т.е. ввести её как формулу массива (фигурные скобки вокруг будут добавлены автоматически). Если же у вас последняя версия Office 365 с поддержкой в Excel динамических массивов, то хватит и простого Enter, да и выделять заранее пустые ячейки не требуется — функция сама займет столько ячеек, сколько ей нужно.
Для извлечения дат поступим аналогично – выделим несколько пустых ячеек в соседнем столбце и используем ту же функцию, но с другим запросом XPath, чтобы получить все значения атрибутов Date из тегов Record:
=ФИЛЬТР.XML(B8;»//Record/@Date»)
Теперь в будущем при изменении дат в исходных ячейках В2 и В3 или выборе другой валюты в выпадающем списке ячейки B3, наш запрос будет автоматически обновляться, обращаясь к серверу ЦБ за новыми данными. Чтобы форсировать обновление вручную, можно дополнительно использовать сочетание клавиш Ctrl+Alt+F9.
Ссылки по теме
- Импорт курса биткойна в Excel через Power Query
- Импорт курса валют из интернета в старых версиях Excel
Программа предназначена для импорта котировок в Excel с сервера РБК.
Загружаются котировки ММВБ СЭЛТ (realtime) по активным инструментам.
Поскольку штатными средствами Excel (веб-запрос) загрузить данные в Excel не удаётся, — и был написан этот макрос.
Кроме того, преимущество макроса (программной загрузки данных с сайта) перед веб-запросом — отсутствие уведомлений об ошибке доступа
(если сайт недоступен, или доступ в интернет осуществляется с перебоями)
Программа берёт данные не с самой веб-страницы, а выполняет запрос напрямую к серверу
(ответ приходит в формате JSON)
Макрос анализирует ответ сервера, формирует таблицу, и выводит её на лист,
заменяя ранее вставленные данные.
Обновление котировок происходит автоматически, с интервалом в 30 минут
(время можно задать в настройках программы)