Comments 74
Предыдущие комментарии: https://habr.com/ru/post/486716/#comment_21227328
Контанго-бэквордацию хочу считать.
Хороший вопрос, но немного не по теме статьи похоже.
В API есть секция срочного рынка.
Если Вы хотите делать подобные расчёты, то надо брать цены из разных секций.
Контанго называется превышение цены дальних фьючерсов над ближним, бэквордация — наоборот. Считается, что бычьей фазой рынка является состояние бэквордации, а медвежьей — контанго.
QUIK — программа для суровых профи, они пользуются короткими кодами
Добавлю инфы:
- Если в запросе к API убрать расширение .xml, то результат выдаст в удобочитаемом html. Так же поддерживаются форматы .json и .csv
- Дивиденды мосбиржа выдаёт не все. Например по МРСК Урала история дивидендов у них пустая. По каким-то бумагам вроде не полная.
3.В истории купонов и амортизаций не верно выдаёт значения номинала бумаги на определенную дату (FACEVALUE), во всех строках почему-то стоит текущее значение, а не то которое было на указанную дату.
Короче говоря API у мосбиржи очень крутое, но как будто сырое.
Короче говоря API у мосбиржи очень крутое, но как будто сырое.
Но оно хотя бы без смс и регистрации доступно.
Тут дело вот в чём. Если не фильтровать узлы, то замечал ли, что там есть узел securities, узел marketdata и ещё какие-то?
Так вот, securities — это _статические_ данные они неизменны в течение дня. (Чтоб их было достаточно один раз выкачать, а потом не указывать в последующих запросах.)
Если нужны какие-то динамические данные: текущая цена, исторические данные, etc. то они точно не будут в узле securities. То есть надо смотреть аналог колонки FACEVALUE в других узлах (history, или как он там, не помню точно).
Поэтому, скажем, «стабильная» цена PREVADMITTEDQUOTE находится в securities, а «переменная» цена LCURRENTPRICE в marketdata, например:
https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQTF/securities.json?iss.meta=off&iss.only=marketdata,securities&marketdata.columns=SECID,LCURRENTPRICE&securities.columns=SECID,PREVADMITTEDQUOTE,FACEVALUE&securities=FXRL
Просто я пользуюсь history для получения facevalue по ОФЗ-ИН и там вроде как всё работало
Да, я и говорю, нужно взять FACEVALUE из history, не из securities.
https://iss.moex.com/iss/history/engines/stock/markets/bonds/boards/TQOB/securities/SU52001RMFS3?history.columns=TRADEDATE,FACEVALUE&from=2020-01-10
Да, по этой ссылке выдаёт верную информацию.
Я пользовался вот этой https://iss.moex.com/iss/statistics/engines/stock/markets/bonds/bondization/RU000A0JVSY3
для получения купонов и амортизаций и от туда же FACEVALUE тянул… Вот там оно всегда текущее, не смотря на даты.
Мне из всего этого больше всего интересен вывод текущей цены в Excel
Что мне не понятно или смущает:
- Почему-то цена не обновляется автоматически. Как её обновить?
- Очень сложная и не универсальная формула… Т.е. надо для каждой бумаги вручную узнать её board_id и подставить в запрос.
Думаю можно сделать как-то универсальней. Например получать цену не по этой ссылке
https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities?iss.dp=comma&iss.meta=off&iss.only=securities&securities.columns=SECID,PREVADMITTEDQUOTE
где выдаются цены всех бумаг на доске TQBR, а по этой
https://iss.moex.com/iss/engines/stock/markets/shares/securities/SBER/?iss.only=marketdata&marketdata.columns=SECID,BOARDID,LAST
где выдаются цены по конкретной бумаге. Подразумеваем, что тикер SECID нам известен, осталось только выбрать данные по нужной нам доске TQBR. Это наверное тоже можно автоматизировать.
Через запрос
https://iss.moex.com/iss/securities/SBER?iss.only=boards&boards.columns=secid,boardid,is_primary
выбрать все доски бумаги, и из полученного списка получить ту, у которой is_primary = 1
Либо как в посте через ссылку
https://iss.moex.com/iss/securities?q=sber&iss.meta=off&securities.columns=secid,primary_boardid
Получить все бумаги по запросу q= и выбрать из результата ту, у которой SECID совпадает с нашим. Так или иначе мы можем получить primary_board_id и записать его в промежуточную ячейку, а потом уже из неё наверное можно взять значение, что бы отфильтровать предыдущую выборку с ценами.
Я не разбираюсь в формулах Excel, но мне кажется это возможно сделать…
Если в формулу ВЕБСЛУЖБА забивать не заранее подготовленный адрес, а сформированный из значений ячеек.
Всё, нашёл решение:
В ячейку А1 записываем тикер бумаги (например SBER)
Во второй столбец записываем BOARDID. Просто вставляем формулу
=ПОДСТАВИТЬ(ФИЛЬТР.XML(ВЕБСЛУЖБА("https://iss.moex.com/iss/securities/"&A1&".xml?iss.meta=off&iss.only=boards&boards.columns=secid,boardid,is_primary");"//document//data//rows//row[@is_primary=1]/@boardid");".";",")
В третий столбец пишем цену, просто вставляем формулу
=ПОДСТАВИТЬ(ФИЛЬТР.XML(ВЕБСЛУЖБА("https://iss.moex.com/iss/engines/stock/markets/shares/securities/"&A22&".xml?iss.meta=off&iss.only=marketdata&marketdata.columns=SECID,BOARDID,LAST");"//document//data//rows//row[@BOARDID='"&B1&"']/@LAST");".";",")
Дальше просто протягиваем эти формулы вниз по всем тикерам и получаем все цены.
Я молодец, и ты молодец… мы молодцы.
Вопрос с обновлением цены при открытии файла для меня остаётся открытым.
ошибка во второй формуле вместо A22 должно A1 быть.
API Мосбиржи в Microsoft Excel.xlsx
» вместе с Вашим решением.https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities.xml?iss.dp=comma&iss.meta=off&iss.only=securities&securities.columns=SECID,PREVADMITTEDQUOTE
такой вариант:
https://iss.moex.com/iss/engines/stock/markets/shares/boardgroups/57/securities.xml?iss.dp=comma&iss.meta=off&iss.only=securities&securities.columns=SECID,PREVADMITTEDQUOTE
В первом варианте необходимо по каждому борду проверять, а во втором по группе бордов. Группа 57 объединяет весь основной режим Т+, скорее всего там будут все нужные вам акции и одним запросом, точно также, думаю и для облигаций можно
Группа 57 объединяет весь основной режим Т+, скорее всего там будут все нужные вам акции и одним запросом, точно также, думаю и для облигаций можно
Но для облигаций это не работает или ссылка должна быть другая:
https://iss.moex.com/iss/engines/stock/markets/bonds/boardgroups/57/securities.xml?iss.dp=comma&iss.meta=off&iss.only=securities&securities.columns=SECID,PREVADMITTEDQUOTE
В общем виде ведь ссылка
https://iss.moex.com/iss/engines/stock/markets/${markets}/boards/${boardID}/securities.json?iss.meta=off&iss.only=${section}&${section}.columns=${columns}
https://iss.moex.com/iss/engines/stock/markets/bonds/boardgroups/7/securities.xml?iss.dp=comma&iss.meta=off&iss.only=securities&securities.columns=SECID,PREVADMITTEDQUOTE
https://iss.moex.com/iss/engines/stock/markets/bonds/boardgroups/58/securities.xml?iss.dp=comma&iss.meta=off&iss.only=securities&securities.columns=SECID,PREVADMITTEDQUOTE
Но как ее подключить в экселе? Ведь там уже идет не xml и нужен другой обвес…
Нашёл отноительно простой способ обновления данных в формулах ВЕБСЛУЖБА
(CTRL+ ALT + F9)
Думаю можно добавить эту комбинацию в виде подсказки на листах
API Мосбиржи в Microsoft Excel.xlsx
».Настроил эту фишку у себя на сайте при экспорте в Excel. Теперь портфель в excel можно импортировать с этими формулами внутри. Кто хочет — затестите:
https://izi-invest.ru/10 ссылка — Экспорт в Excel [Auto]
Столкнулся с проблемой, которую пока не знаю как решить.
Иногда (что странно) функция ФИЛЬТР.XML не верно распознаёт значения цены с дробной частью. Некоторые значения распознаёт верно, некоторые заменяет каким-то произвольным большим целым числом.
Проверка показала, что если бы API мосбиржи выдавало добрые числа с запятой, а не с точкой — проблема бы исчезла.
Пробовал применить функцию ПОДСТАВИТЬ до функции ФИЛЬТР.XML, но тогда замена точек на запятую приводит xml в негодное для этой функции состояние.
В инструкции к API мосбиржи сказано, что можно изменить знак разделителя, но только для csv формата. Короче я в тупике.
Пробовал применить функцию ПОДСТАВИТЬ до функции ФИЛЬТР.XML, но тогда замена точек на запятую приводит xml в негодное для этой функции состояние.
Нарушается структура xml, если менять все точки на запятые:
Оригинал:
<?xml version=""1.0"" encoding=""UTF-8""?>
Если менять все точки на запятые:
<?xml version=""1,0"" encoding=""UTF-8""?>
Вот решение:
=ФИЛЬТР.XML( ПОДСТАВИТЬ( ПОДСТАВИТЬ(ВЕБСЛУЖБА("xxx");".";",");"1,0";"1.0");"ххх")
Столкнулся с этой же проблемой и выяснил, что это результат неправильной интерепретации функцией ФИЛЬТР.XML значения как... даты.
Возьмем пример значения 7.95.
Если просто ввести это число в ячейку Excel, то в ячейке появится текст июл.95, а в поле редактирования будет стоять 01.07.1995. Это потому, что в Excel сработал механизм автоматического "угадывания" формата значения, и он решил, что пользователь ввёл дату.
Теперь, если поменять формат ячейки на "Общий" (там сначала будет стоять (все форматы)), то в поле появится... целое число 34881.
Именно это происходит в функции ФИЛЬТР.XML для некоторых котировок (т.е. когда сервис MOEX возвращает, например, LAST="7.95"). Функция возвращает неправильно интерпретируемое значение уже в общем формате, как целое число.
К сожалению, с этим целочисленным результатом ничего не получится сделать, изменение формата ячейки не помогает. Как заставить саму функцию ФИЛЬТР.XML НЕ интерпретировать подобные значения как даты, я пока так не нашёл. Временно прикрутил "костыль", похожий на предложенный вами - заменяю точки на запятые в исходном xml-респонсе, безопасно обходя version="1.0":=ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A2;"version=""1.0""";"%version%");".";",");"%version%";"version=""1.0""")
(A2 содержит xml-респонс сервиса)
Вот ещё вопрос для размышления, может найдётся ответ когда-нибудь:
Есть ли способ через API мосбиржи узнать, работает ли она сегодня… Или работала ли она в определённую дату? Ну или просто работает ли она прямо сейчас?
Чтоб в выходные показывала, что не работает, и после закрытия дня тоже показывала что не работает…
Если надётся ответ, отпишитесь
Было бы интересно почитать похожую статью про получение финансовых прогнозов с рбк и технического анализа с investing com.
Также интересно почитать как вы применяете данные знания для аналитики: позволяет ли это анализировать акции «на потоке», возможно образовались какие-нибудь удачные паттерны анализа?
Формула выглядит так:
=ПОДСТАВИТЬ( ФИЛЬТР.XML(ВЕБСЛУЖБА("https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities.xml?iss.dp=comma&iss.meta=off&iss.only=securities&securities.columns=SECID,PREVADMITTEDQUOTE");"//document//data//rows//row[@SECID='"&A1&"']/@PREVADMITTEDQUOTE");".";",")
В ячейке A1 указывается LSNG
<row SECID="LSNG" PREVADMITTEDQUOTE="6.03"/>
Формула ещё заменяет точку на запятую. А какая у вас локаль установлена?
Если подставить «GAZP» или «SBER» — всё корректно. Именно на этой бумаге почему-то не так. Причём название он её правильно определил, а в качестве цены выставил «43896». Вот файл: yadi.sk/i/dJ2I3hJRINEJBw
Не могу понять где зарылся ответ.
Возможно, что-то с форматами не так указано. На вид как будто дата. Как будто он распознаёт это число как дату.
=ПОДСТАВИТЬ(ФИЛЬТР.XML(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ВЕБСЛУЖБА("https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities.xml?iss.dp=comma&iss.meta=off&iss.only=securities&securities.columns=SECID,PREVADMITTEDQUOTE");".";"ю");"ю";".";1);"//document//data//rows//row[@SECID='"&A1&"']/@PREVADMITTEDQUOTE");"ю";",")*1
Например так,
A1 = LSNG
A2 = ВЕБСЛУЖБА(«iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities.xml?iss.meta=off&iss.only=securities&securities.columns=SECID,PREVADMITTEDQUOTE»)
A3 = ПОДСТАВИТЬ(A2;".";",")
A4 = ЗАМЕНИТЬ(A3;17;1;".")
A5 = ФИЛЬТР.XML(A4;"//document//data//rows//row[@SECID='"&A1&"']/@PREVADMITTEDQUOTE")
Но я не могу через API получит доступ к курсу бумаг.
Использовал и board FQBR и другие — Мосбиржа знает о бумаге (MSFT-RM), но данные по торгам пустые. Возможно не там ищу.
Если кто разбирался, подскажите, пожалуйста.
iss.moex.com/iss/securities.xml?q=MSFT-RM
Использовал board:
iss.moex.com/iss/engines/stock/markets/shares/boards/FQBR/securities.xml?
но тут поля rows пустые, хотя другая информация присутствует.
Для интереса прошелся по некоторым board из:
iss.moex.com/iss/engines/stock/markets/shares
но в них так же поле rows пустое.
А может быть информация доступна только по подписке.
Путь вроде правильный, но там пусто: iss.moex.com/iss/engines/stock/markets/shares/boards/FQBR/securities
Две бумаги кстати находит: iss.moex.com/iss/securities.xml?q=MSFT
К концу года обещают 30, и каждый квартал добавлять, но без api не представляю что делать.
iss.moex.com/iss/engines/stock/markets/foreignshares/boards/FQBR/securities
А была тут информация: iss.moex.com/iss/engines/stock/markets
Спасибо! Пишу коммент благодарности, т.к. не могу проголосовать за ответ.
В S&P500 Apple на первом месте с 7.3%
В документе Мосбиржи «Презентация „Торги иностранными ценными бумагами“» apple есть — fs.moex.com/files/21231
У вас есть интерес к СПб бирже?
А у СПб разве есть апи?
Ссылкой поделитесь?
query1.finance.yahoo.com/v8/finance/chart/AAPL?symbol=AAPL&period1=1560193200&period2=1585150003&interval=1d&includePrePost=true&events=div%7Csplit%7Cearn&
Free API Мосбиржи в формулах Microsoft Excel