Как автоматически скачивать котировки любой ценной бумаги в «Экселе»
Инвестиции для начинающих
16K
Фотография — Sally Anscombe / Getty Images

Как автоматически скачивать котировки любой ценной бумаги в «Экселе»

Статья для пользователей Windows
37
Аватар автора

Михаил Шардин

скачивает котировки в «Экселе»

Страница автора

Часто индивидуальные инвесторы не доверяют онлайн-сервисам и по старинке ведут учет собственных инвестиций в Microsoft Excel или его свободных аналогах вроде LibreOffice Calc.

Если бумаг не очень много, ведение учета в «Экселе» оправданно:

  • не нужно никому платить за хранение данных;
  • вся информация хранится только на вашем компьютере — это безопасно, никто не удалит ее, например, за неактивность;
  • отчеты можно оформить так, как хочется.

У такого учета есть и недостатки — в основном они связаны с тем, что приходится вручную обновлять котировки. Делать это раз в квартал несложно, но чтобы поддерживать актуальность чаще, придется потратить много времени: зайти на сайт, где публикуют текущую цену, найти ее, скопировать и вставить в таблицу. И так для каждой бумаги в портфеле.

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

Сразу уточню: речь пойдет только о формулах для эксель-таблиц. Для учета в гугл-таблицах или в Numbers они не подойдут. Про учет в гугл-таблицах в Т⁠—⁠Ж есть отдельная статья.

А еще эти формулы будут работать только в «Экселе» для операционной системы Windows. К сожалению, с версией для macOS они несовместимы: в них есть функция ФИЛЬТР.XML, которая использует особенности Windows.

Зачем скачивать цены финансовых активов автоматически

Во-первых, это позволит удобно управлять всеми ценными бумагами. Можно отслеживать стоимость портфеля в режиме реального времени и принимать обоснованные решения о покупке, продаже или ребалансировке инвестиций. А еще — анализировать риски и оценивать волатильность разных типов активов.

Во-вторых, это важно для финансового моделирования. Автоматическая загрузка цен дает пользователю возможность включить в свою модель актуальные рыночные данные.

Где искать актуальные цены

Котировки публикуют на сайтах бирж и в финансовых агрегаторах, например на Мосбирже, Yahoo Finance или Investing.com. Мы писали, как пользоваться готовыми сервисами, если не хочется разбираться в формулах.

Вот несколько ценных бумаг разных видов и авторитетные источники, которые публикуют их цены:

  1. Цену российской акции «Лукойл» (тикер LKOH) публикуют на сайте Московской биржи.
  2. Цену российской государственной облигации ОФЗ 26226 (код НРД SU26226RMFS9) также публикует Московская биржа.
  3. Официальный курс доллара к рублю можно найти на сайте Центробанка.
  4. Цену иностранной акции Alphabet (тикер GOOGL, ISIN US02079K3059) удобно смотреть на сайте Yahoo Finance.
  5. Цену иностранного ETF iShares MSCI Europe ex-UK UCITS ETF (тикер IEUX, ISIN IE00B14X4N27) можно посмотреть на сайте Morningstar.

Еще недавно автозагрузка котировок для некоторых иностранных акций была доступна прямо в «Экселе» — с подпиской Microsoft 365. Но в марте 2024 года компания объявила о блокировке доступа к этому и другим облачным сервисам для пользователей в России.

Есть несколько удобных способов сделать так, чтобы актуальные цены из этих источников сами подгружались в «Эксель». Расскажу о двух наиболее простых и эффективных — парсинге и API. Дальше в статье я на примерах покажу, как применить их для учета инвестиций, и поделюсь собственными формулами для тех, кто не хочет погружаться в программирование. Мои формулы можно брать и подставлять в любую таблицу.

Чтобы было понятнее, о чем я рассказываю, скачайте и откройте в «Экселе» вот эту мою таблицу.

Для каждой ценной бумаги я укажу в таблице две формулы. Первая подойдет, если хотите получить текущую цену — максимум с 15-минутной задержкой. Но когда биржа закрыта, формула будет выдавать ошибку. Вторая формула показывает цену всегда, в любое время, но только на момент закрытия последних торгов.

Как в «Экселе» получать цены акций через API Мосбиржи

Московская биржа предоставляет API, стоимость ценных бумаг можно получать с помощью ее программного интерфейса: либо по подписке и быстро, либо бесплатно, но с небольшой задержкой — примерно 15 минут.

Что такое API

Формулы в этом блоке подходят только для котировок акций. Для ETF и других активов понадобятся другие формулы — они будут дальше в статье.

Например, получать сегодняшнюю цену акций «Лукойла» с Мосбиржи можно с такой формулой:

=ПОДСТАВИТЬ(@ ФИЛЬТР.XML(ВЕБСЛУЖБА("https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities.xml?iss.meta=off&iss.only=marketdata&marketdata.columns=SECID,LAST");"//document//data//rows//row[@SECID='"&A3&"']/@LAST");".";",")

В ячейке A3 в таблице надо указать тикер нужной вам акции.

Как посмотреть тикер акции

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

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

Следующая формула более универсальна. С ее помощью можно скачать цену акций с Мосбиржи даже в нерабочее время — на момент ее закрытия. Не забудьте снова подставить тикер нужной вам акции:

=ПОДСТАВИТЬ(@ ФИЛЬТР.XML(ВЕБСЛУЖБА("https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities.xml?iss.meta=off&iss.only=securities&securities.columns=SECID,PREVLEGALCLOSEPRICE");"//document//data//rows//row[@SECID='"&A3&"']/@PREVLEGALCLOSEPRICE");".";",")

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

Как в «Экселе» получать цены облигаций через API Мосбиржи

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

Например, чтобы получать стоимость российской облигации ОФЗ 26226 (код НРД SU26226RMFS9), можно использовать такую формулу:

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

В ячейке A8 надо указать код нужного вам НРД — его тоже можно найти на сайте Мосбиржи.

Эта формула будет работать только для облигаций ОФЗ и только в рабочее время Московской биржи.

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

Следующая формула позволит получать цены и в нерабочее время — на момент закрытия последних торгов:

=ПОДСТАВИТЬ(@ ФИЛЬТР.XML(ВЕБСЛУЖБА("https://iss.moex.com/iss/engines/stock/markets/bonds/boards/TQOB/securities.xml?iss.meta=off&iss.only=securities&securities.columns=SECID,PREVLEGALCLOSEPRICE");"//document//data//rows//row[@SECID='"&A8&"']/@PREVLEGALCLOSEPRICE");".";",")

Формула позволяет загружать цены гособлигаций всегда — независимо от дня недели и рабочих часов
Формула позволяет загружать цены гособлигаций всегда — независимо от дня недели и рабочих часов

Как в «Экселе» получать курсы валют через API Банка России

У Центробанка тоже есть удобный API, через который можно получать курсы любых валют. На сайте ЦБ опубликована подробная инструкция, как это сделать.

Так выглядит готовая формула, которая позволит автоматически загрузить в «Эксель» курс доллара США на сегодня:

=@ФИЛЬТР.XML(ВЕБСЛУЖБА("http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1="&ТЕКСТ(СЕГОДНЯ();"дд.ММ.гггг")&"&date_req2="&ТЕКСТ(СЕГОДНЯ();"дд.ММ.гггг")&"&VAL_NM_RQ=R01235");"//Value")

Курс доллара можно отображать в любой выбранной ячейке
Курс доллара можно отображать в любой выбранной ячейке

Как в «Экселе» получать цены любых бумаг через парсинг сайтов

Не у всех ресурсов есть открытый доступ к API, как у Московской биржи или Центрального банка. А для части иностранных инвестиций, например облигаций или фондов, вообще сложно найти котировки в открытом доступе.

Поэтому одной формулы для получения котировок будет недостаточно. Потребуется VBA — это внутренний язык программирования Microsoft Office. С его помощью придется написать макрос, мини-программу, которая выполняет сразу несколько действий. Я уже написал код — достаточно будет заменить в нем пару строк под ваши потребности и вставить в таблицу.

Чтобы использовать VBA, сначала необходимо включить в «Экселе» режим разработчика:

  1. Нажмите «Файл» → «Параметры».
  2. Выберите «Настроить ленту» в левой боковой панели.
  3. Установите флажок «Разработчик» в правом столбце.
  4. Нажмите «ОК», чтобы применить изменения.
Так выглядит страница с настройками режима разработчика в «Экселе» версии 2021 года
Так выглядит страница с настройками режима разработчика в «Экселе» версии 2021 года

Парсинг Yahoo Finance. Получать котировки иностранных акций проще всего с помощью парсинга в сервисе Yahoo Finance. Покажу, как это делается, на примере акции Alphabet (тикер GOOGL, ISIN US02079K3059).

Что такое парсинг

Чтобы настроить парсинг цен с сайта Yahoo Finance, придется выполнить несколько действий:

  1. Откройте мою таблицу в «Экселе» в режиме разработчика — она содержит сценарии VBA.
  2. «Эксель» предложит включить макросы — нажмите «Включить макросы» или «Включить контент», чтобы разрешить запуск сценариев VBA.
  3. После этого выберите любую ячейку и воспользуйтесь функцией =GetQuoteFinanceYahooCom("GOOGL"). Котировка появится в этой же ячейке.

Для другой иностранной акции подставьте на место GOOGL нужный тикер.

Я добавил в таблицу цены популярных иностранных бумаг: Alphabet, Dell Technologies и SPDR S&P. Они находятся на листе «Мир»
Я добавил в таблицу цены популярных иностранных бумаг: Alphabet, Dell Technologies и SPDR S&P. Они находятся на листе «Мир»

Где искать котировки редких акций. Иногда в портфеле могут оказаться экзотические активы, цены которых особенно сложно отыскать. Можно воспользоваться поиском по ISIN, International Securities Identification Number, — международному идентификационному коду.

Например, эта формула позволит получить котировки не очень известного иностранного ETF iShares MSCI Europe ex-UK UCITSvETF (тикер IEUX, ISIN IE00B14X4N27) с сайта агентства Morningstar. Если хотите настроить получение цены с любого сайта, этот VBA-скрипт может стать образцом. Без кода VBA-скрипта формула ниже работать не будет:

=GetQuoteMorningstarCoUkETF(B9)

Невозможно дать универсальный шаблон: для каждого сайта нужен отдельный скрипт. И его придется переписать, если на сайте источника поменяется выдача или формат данных. Но этот шаблон точно может стать отправной точкой — немного изменив его, получите рабочую формулу.

Так выглядит котировка ETF iShares MSCI, автоматически загруженная с сайта morningstar.co.uk
Так выглядит котировка ETF iShares MSCI, автоматически загруженная с сайта morningstar.co.uk

Запомнить

  1. В «Экселе» можно автоматически скачивать котировки не только большинства российских активов, но и множества иностранных.
  2. Часть котировок российских активов удобно скачивать с помощью формул из этой статьи. А для иностранных понадобится скрипт, который позволит загрузить котировки через кастомную формулу.
  3. Внутренний язык программирования Microsoft Office дает возможность брать из интернета цены любых ценных бумаг, и они будут автоматически обновляться.

Новости, которые касаются инвесторов, — в нашем телеграм-канале. Подписывайтесь, чтобы быть в курсе происходящего: @investnique

Михаил ШардинВедете учет в «Экселе»? Как скачиваете котировки?
  • denisБыло бы удобно заполнить весь первый лист списком A:Тикер B:Цена, а затем искать уже в нем. Тогда можно брать цены из простых текстовых файлов скаченных откуда удобно, или сохраненных из программ, с любым порядком и списком тикеров.4
  • Михаил Шардинdenis, хорошая идея! Может быть в следующей версии так и будет1
  • Alexander>> Как в «Экселе» получать цены облигаций через API Мосбиржи В примере режим торгов TQOB -- для гособлигаций, для обычных заменить TQOB на TQCB Справка по режимам https://iss.moex.com/iss/engines/stock/markets/bonds/boards.xml1
  • Благоустройство со сносомАааааааа котировки котировки1
  • АнтонЕсли у вас excel 365, котировки акций с мосбиржы и частично бпифы грузятся по-прежнему. С акциями после IPO есть задержка добавления, но в течении месяца и новые тикеры появляются.0
  • Андрей С.Почему то не удается таким образом получить котировки фонда GOLD (БПИФ Золото.Биржевой УК ВИМ) хотя он торгуется на Мосбирже :(0
  • Михаил ШардинАндрей, все эти инструменты очень сильно зависят от секций0
  • Алексейdenis, эту очевидную хотелку никто не может сделать уже много лет. :)1
  • Юрий ДурицкийДобрый день. Есть формула котировок корп.облигаций? заранее благодарен.1
  • Михаил ШардинЮрий, попробуйте использовать секцию TQCB: iss.moex.com/iss/engines/stock/markets/bonds/boards/TQCB/securities/0
  • Михаил ЛебедевКогда функция ФИЛЬТР.XML получает значение вида "1.2345" она может в соответствии с региональными стандартами подумать что это дата, в итоге вы получите безумно большое число вместо "1.2345" На такой случай может понадобится ещё одно преобразование: =ТЕКСТ(@ФИЛЬТР.XML(ВЕБСЛУЖБА("https://iss.moex.com/iss/engines/stock/markets/shares/boards/"&B2&"/securities.xml?iss.meta=off&iss.only=marketdata&marketdata.columns=SECID,LAST");"//document//data//rows//row[@SECID='"&C2&"']//@LAST");"#,#")2
  • LOnlyМихаил, огромное спасибо за Exсel файл с примерами! Искал. Теперь есть с чего начать свои собственные эксперименты.1
  • Михаил ШардинLOnly, рад что смог помочь2
  • Владимир Т.Добрый день! Для получения данных по корпоративным облигациям по Вашей формуле замена режима торгов на TQCB ничего не дает. При запросе купона выходит #ЗНАЧ! =ПОДСТАВИТЬ(@ ФИЛЬТР.XML(ВЕБСЛУЖБА("https://iss.moex.com/iss/engines/stock/markets/bonds/boards/TQCB/securities.xml?iss.meta=off&iss.only=securities&securities.columns=SECID,COUPONVALUE");"//document//data//rows//row[@SECID='"&D19&"']/@COUPONVALUE");".";",") Если же формулу поменять на =ПОДСТАВИТЬ(@ФИЛЬТР.XML(ВЕБСЛУЖБА("https://iss.moex.com/iss/engines/stock/markets/bonds/boards/TQCB/securities/"&D19&"/securities.xml?iss.meta=off&iss.only=securities&securities.columns=COUPONVALUE");"//document//data//rows//row/@COUPONVALUE");".";",") данные по купону выдает, но при разных ISIN может выдать адекватные данные, а может типа 16681. То же и с НКД. Остальные данные (дата погашения, дата купона, доходность, ...) получаются правильные. При этом запросы в ГУГЛ таблицах выдают правильную информацию. =IMPORTxml("https://iss.moex.com/iss/engines/stock/markets/bonds/boards/TQCB/securities.xml?iss.meta=off&iss.only=securities&securities.columns=SECID,COUPONVALUE", СЦЕПИТЬ("//row[@SECID='",A7,"']/@COUPONVALUE")) С чем это может быть связано и как решить проблему?1
  • Михаил ШардинВладимир, в статье нет примера с корпоративными облигациями0
  • Михаил ШардинВладимир, я Вам подскажу. Например для корпоративной облигации RU000A106946 получение цены на вчера в Экселе: =ПОДСТАВИТЬ(@ ФИЛЬТР.XML(ВЕБСЛУЖБА("https://iss.moex.com/iss/engines/stock/markets/bonds/boards/TQCB/securities/"&D19&"/securities.xml?iss.meta=off&iss.only=securities&securities.columns=SECID,PREVLEGALCLOSEPRICE");"//document//data//rows//row/@PREVLEGALCLOSEPRICE");".";".")0
  • Владимир Т.Спасибо, Михаил! Я обратил внимание, что про корпоратов Вы не писали. Пытался разобраться почему формула из статьи, подходящая для ОФЗ, не срабатывает для других облигаций и надо использовать другой ее вид. И удивило, что запросы из Excel и Google к API Мосбиржи могут выдавать разные результаты. Возможно, проблема в Excel.1
  • Алексей ДемченкоСегодня перестали работать функции Ексель 365 по работе с акциями( Попробовал методами, описанными в статье - получилось! Спасибо! Как водится, но... Не работает с ETF. Н-р SBMX, TMOS. Также необъяснимый косяк с получением котировок IRAO, SVCB и UPRO, причем очень выборочно (в отношении более 50 позиций моего списка в целом корректно работает). Акции Тикер Цена сегодня Цена вчера LKOH 7269 7393 SBER 318,82 320,29 IRAO 2507451 33298 SVCB 17,965 45340 UPRO 45293 2,0182
  • Елена ДемидоваРаньше в Office 365 данные подтягивались через встроенные функции excel. Но с введением санкций в отношении Мосбиржи (с этих выходных), возможность пропала. И тут вопрос уже не ВПН, а что просто больше нет связи Office и Мосбиржи. Вот, ищу альтернативные пути. Ваш (импорт в Excel из XML Мосбиржи) очень интересен. Тем более он может подтащить всё, что мне раньше грузил Office, и даже немного больше. Давно смотрю в сторону Tinkoff.API, чтобы ещё автоматизировать и информацию о сделках, и выставление приказов (у меня в Excel зашита логика покупки/продажи). Но пока нет времени на изучение.1
  • Елена ДемидоваАлексей, да, аналогичный косяк замечен по: IRAO LSNG NMTP CNTL CNTLP PRFN А UPRO и SVCB у меня нормально отрабатывает...1
  • Елена ДемидоваАлексей, кстати, вон, выше решение вопроса от Михаила Лебедева.0
  • Елена ДемидоваЕдинственный момент, я не люблю когда параметры задаются внутри формулы. Думаю, как вытащить вот так (в заголовки столбцов накидала все параметры из XML подряд, просто чтобы посмотреть, что есть что и как работает):0
  • Елена ДемидоваАлексей, это реально проблема преобразования числа с точкой в дату и потом обратного её преобразования в число. При чём: - числа с точками, которые датами быть не могут, возвращаются как значения с точками; - числа с точками, которые могут быть датами, преобразуются в даты в двух вариантах - ДД.ММ или ММ.ГГГГ; - числа без точек возвращаются как обычные числа. Итого мы имеем четыре варианта значений в ряду, для которых достаточно сложно придумать единую логику преобразования в корректные значения. В целом, автор начал логику по устранению этой ошибки, но его вариант просто меняет точку на запятую в уже преобразованных значениях. А менять точку на запятую после того, как произошло преобразование число/дата/число - поздно, надо лечить на более раннем этапе. Примерно так: =ФИЛЬТР.XML(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ВЕБСЛУЖБА("https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities.xml?iss.meta=off&iss.only=marketdata&marketdata.columns=SECID,LAST");".";",");",";",";1);"//document//data//rows//row[@SECID='"&A3&"']/@LAST") Т.е. всё-таки сначала в полученном XML меняем точки на запятые, потом возвращаем первое вхождение запятой на точку (оно относится к версии XML и без точки ничего работать не будет) и только потом уже забираем нужные нам данные.0
  • Алексей ДемченкоЕлена, добрый день. Понял, но ваша формула у меня не сработала. А3 - это ячейка с тикером, верно? выдает "#ЗНАЧ"0
  • Алексей ИвановКурс валют в воскресенье и в понедельник выдает ЗНАЧ! Как решить эту проблему ?0
  • Андрей ДрабенкоНа Mac почему то выдает ошибку #ИМЯ? с чем может быть связано? На винде вытаскивает значения.0
  • Михаил ШардинАндрей, на маке работать не будет, статья для пользователей Windows0
  • Дмитрий ГавриловМихаил, Здравствуйте! Нет ли рецепта для мака?0
  • Михаил ШардинДмитрий, там по другому надо писать - если переписать код то тоже будет работать1
  • Эльмирав старых версиях эксель я так понимаю не работает ? (2007)0
  • Михаил ШардинЭльмира, а пробовали?0
  • ЭльмираМихаил, да, выдает ошибку в формуле, ругается на @ ФИЛЬТР.XML0
  • Essa SaВести свой учёт обязательно надо, после разнообразных мировых событий и делистингов тинькоф брокер просто удалил историю событий по некоторым бумагам. Вот тут то и пригодился файлик, где было записано сколько чего и почем покупалось! Текущие котировки не исследую, пока не вижу для себя смысла. Но информация очень полезная, спасибо. Наверняка когда нибудь дойду до этого уровня анализа😀1
  • Вячеслав ПМихаил, подскажите, как нужно переписать код, чтобы котировки акций работали в Excel для macOS. Заранее спасибо!1
  • Михаил ШардинВячеслав, проблема в том что функции FILTERXML и WEBSERVICE доступны только в Excel для Windows и не поддерживаются в Excel для Mac. Можно попробовать использовать внешние инструменты например, Python или VBA. Но это надо целый скрипт писать, который будет делать всё тоже самое но по другому. Работа.0
  • user602892Алексей, Елена просто во второй замене оба раза поставила запятую, а надо сначала запятую , а потом точку, тогда все ок будет. Вот так ".";",");",";".";10
  • user602892Михаил, Если вдруг у кого то не заработает, то надо исправить ;".";".") на ;".";",")1