Все финансовые рынки мира в API Яху Финанс

    В этой статье я расскажу об API агрегатора финансовых данных Yahoo! Finance. В рассказе есть один нюанс — официальное API Яху Финанс было закрыто три года назад, однако практически сразу же появилась его недокументированная работоспособная версия, которая жива до сих пор. Хочу в исследовательских целях рассказать об использовании этой работоспособной версии подробнее.
    Тем более, что список рынков, данные с которых можно получать через Яху Финанс огромен. На текущий момент в нем 79 стран, включая и Россию.


    Apple Inc. (AAPL) на сайте и в API Яху Финанс

    Взгляд на данные с позиции долгосрочного частного инвестора


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

    1. Название бумаги
    2. Цена бумаги
    3. Доход с начала года
    4. Дивидендная доходность
    5. Дата предыдущего дивиденда
    6. Значение предыдущего дивиденда
    7. Годовая плата для фондов
    8. Категория бумаг

    API Яху Финанс предоставляет ответы в формате JSON. На скриншотах с использованием API я использую расширение для браузера Google Chrome: JSON-handle.

    Название бумаги / Name


    Имея только тикер всегда можно получить огромное число параметров, первым в списке, на мой взгляд стоит наименование инструмента. Сначала найдем его на сайте на примере SPDR S&P 500 ETF Trust (SPY):


    Имя ETF на сайте Яху Финанс

    После этого найдем имя уже через API — в формате JSON оно выводится в двух вариантах: shortName и longName. Ссылка на данные, включающая в себя имя выглядит следующим образом:

    https://query1.finance.yahoo.com/v10/finance/quoteSummary/SPY?modules=price


    Имя ETF через API Яху Финанс

    Свойство с именем longName содержит строковое значение SPDR S&P 500 ETF Trust.
    Путь для получения этого ключа: JSON.quoteSummary.result[0].price.longName

    Цена бумаги / Price


    Следующий важный параметр — конечно цена. Найдем её для акций Berkshire Hathaway Inc. (BRKA):


    Цена акций на сайте Яху Финанс

    Дальше получим цену через API. Раздел где содержится цена, аналогичен получению имени:

    https://query1.finance.yahoo.com/v10/finance/quoteSummary/BRKA?modules=price


    Цена акций через API Яху Финанс

    Ключ с именем raw для regularMarketPrice можно получить как с форматированием, так и без него. Путь для получения этого свойства: JSON.quoteSummary.result[0].price.regularMarketPrice.raw

    Доход с начала года / YTD Daily Total Return


    Этот параметр можно посмотреть только для фондов. На примере Vanguard Total Stock Market Index Fund ETF Shares (VTI):


    Доход с начала года на сайте Яху Финанс

    Посмотрим этот параметр через API. Раздел где содержится доход с начала года:

    https://query1.finance.yahoo.com/v10/finance/quoteSummary/VTI?modules=defaultKeyStatistics


    Доход с начала года через API Яху Финанс

    Свойство с именем fmt для ytdReturn можно получить как с форматированием, так и без. Путь для получения этого свойства: JSON.quoteSummary.result[0].defaultKeyStatistics.ytdReturn.fmt

    Дивидендная доходность / Dividend Yield


    Важный параметр, финансовые консультанты даже складывают доходность бумаги с дивидендной доходностью и показывают получившуюся цифру как потенциал роста бумаги. Найдем её для VanEck Vectors Russia ETF (RSX):


    Дивидендная доходность ETF на сайте Яху Финанс

    Получим этот параметр через API. Раздел где содержится дивидендная доходность:

    https://query1.finance.yahoo.com/v10/finance/quoteSummary/RSX?modules=defaultKeyStatistics


    Дивидендная доходность ETF через API Яху Финанс

    Свойство с именем fmt для yield можно получить как с форматированием, так и без. Путь для получения этого свойства: JSON.quoteSummary.result[0].defaultKeyStatistics.yield.fmt

    Дата предыдущего дивиденда / Dividend Date


    Найдем дату последней выплаты дивиденда. Для этого придется обращаться к истории и можно будет получить все дивидендные выплаты. На сайте эти данные в разделе Historical Data, возьмем например акции Microsoft Corporation (MSFT):


    Дата предыдущего дивиденда акции на сайте Яху Финанс

    Получить их через API задача уже немного сложнее, потому что ссылка будет иметь вид:
    https://query1.finance.yahoo.com/v8/finance/chart/MSFT?symbol=MSFT&period1=1559457037&period2=1591079437&interval=1mo&includePrePost=true&events=div%7Csplit

    Где:

    • period1 начальная дата в виде Unix Timestamp.
    • period2 — конечная дата в виде Unix Timestamp.
    • interval=1mo — укрупненные свечи, меня интересуют только дивиденды.
    • events=div%7Csplit — добавляет информацию о дивидендах и сплитах в вывод.


    Дата предыдущего дивиденда акции через API Яху Финанс

    Для получения даты возможны два варианта:

    1. Считывать ключи JSON.chart.result[0].timestamp и перебирать по этим ключам даты дивидендов.
    2. Более предпочтительный — получать массив значений перечисляемых свойств объекта JSON.chart.result[0].events.dividends.

    Значение предыдущего дивиденда / Next Dividend


    Полностью аналогично предыдущему разделу. Только ищем не дату, а значение. Найдем значение прошлого дивиденда для ETF iShares MSCI Mexico Capped ETF (EWW):


    Значение предыдущего дивиденда ETF на сайте Яху Финанс

    В API ссылка будет выглядеть:

    https://query1.finance.yahoo.com/v8/finance/chart/EWW?symbol=MSFT&period1=1559457037&period2=1591079437&interval=1mo&includePrePost=true&events=div%7Csplit

    Расшифровка запроса аналогична получению даты выше.


    Значение предыдущего дивиденда ETF через API Яху Финанс

    Годовая плата / Expense Ratio


    Годовая плата, которую все фонды или ETF взимают со своих акционеров. На сайте можно посмотреть в разделе Summary:

    Годовая плата, которую все фонды или ETF взимают со своих акционеров на сайте Яху Финанс

    В API ссылка будет выглядеть:

    https://query1.finance.yahoo.com/v10/finance/quoteSummary/HYD?modules=fundProfile


    Годовая плата, которую все фонды или ETF взимают со своих акционеров через API Яху Финанс

    Свойство с именем fmt для annualReportExpenseRatio можно получить как с форматированием, так и без. Путь для получения этого свойства: JSON.quoteSummary.result[0].fundProfile.feesExpensesInvestment.annualReportExpenseRatio.fmt

    Категория акций / Sector и Industry


    На сайте можно посмотреть в разделе Profile. Для примера возьмем Cisco Systems, Inc. (CSCO):


    Категория акции на сайте Яху Финанс

    Эти данные можно посмотреть только для акций и возможных вариантов секторов не так уж и много:

    1. Basic Materials
    2. Consumer Cyclical
    3. Financial Services
    4. Real Estate
    5. Consumer Defensive
    6. Healthcare
    7. Utilities
    8. Communication Services
    9. Energy
    10. Industrials
    11. Technology

    Подкатегории для секторов — Industry.

    В API ссылка будет выглядеть:

    https://query1.finance.yahoo.com/v10/finance/quoteSummary/CSCO?modules=assetProfile


    Категория акции через API Яху Финанс

    Свойство с ключом sector можно получить по следующему пути: JSON.quoteSummary.result[0].assetProfile.sector

    Общие правила работы с API Яху Финанс


    Хост


    query1.finance.yahoo.com для HTTP / 1.0

    query2.finance.yahoo.com для HTTP / 1.1

    Основные данные


    /v10/finance/quoteSummary/GOOGL?modules= (Полный список модулей ниже)

    (замените GOOGL на любой символ)

    Входные данные для ?modules= запроса:

    1. assetProfile
    2. incomeStatementHistory
    3. incomeStatementHistoryQuarterly
    4. balanceSheetHistory
    5. balanceSheetHistoryQuarterly
    6. cashflowStatementHistory
    7. cashflowStatementHistoryQuarterly
    8. defaultKeyStatistics
    9. financialData
    10. calendarEvents
    11. secFilings
    12. recommendationTrend
    13. upgradeDowngradeHistory
    14. institutionOwnership
    15. fundOwnership
    16. majorDirectHolders
    17. majorHoldersBreakdown
    18. insiderTransactions
    19. insiderHolders
    20. netSharePurchaseActivity
    21. earnings
    22. earningsHistory
    23. earningsTrend
    24. industryTrend
    25. indexTrend
    26. sectorTrend

    и возможно что-то ещё…

    Пример URL:

    https://query1.finance.yahoo.com/v10/finance/quoteSummary/GOOGL?modules=assetProfile%2CearningsHistory
    

    Запрос для: assetProfile и earningsHistory.

    История цен, сплитов и дивидендов


    /v8/finance/chart/GOOGL?symbol=GOOGL&period1=0&period2=9999999999&interval=3mo
    

    Интервалы:

    &interval=3mo это 3 месяца.

    &interval=1d это 1 день.

    &interval=5m это 5 минут, возвращает 80 дней.

    &interval=1m это 1 минута, возвращает 4-5 дней.

    period1= unix timestamp представление даты, с которой вы хотите начать. Значения ниже начальной торговой даты будут округлены до начальной торговой даты.

    period2= unix timestamp представление даты, на которой вы хотите закончить. Значения, превышающие последнюю торговую дату, будут округлены до последней доступной отметки времени.

    Добавить данные до и после рынка: &includePrePost=true

    Добавить дивиденды и сплиты: &events=div%2Csplit

    Пример полного запроса:

    https://query1.finance.yahoo.com/v8/finance/chart/GOOGL?symbol=AAPL&period1=0&period2=9999999999&interval=1d&includePrePost=true&events=div%2Csplit
    

    Приведенный выше запрос вернет все данные о цене тикера GOOGL с интервалом в 1 день, включая данные до и после рынка, а также дивиденды и сплиты.

    Всю информацию об API можно получить изучая код страницы Яху Финанс, но первоначально информация была взята с Stack Overflow и GitHub.

    Пример кода на Node.js



    const fetch = require('node-fetch');
    async function USAStockGetName(ID) { //получаем имя бумаги
        const url = `https://query1.finance.yahoo.com/v10/finance/quoteSummary/${ID}?modules=price`
        // console.log("USAStockGetName. url для %s: %s", ID, url);
        try {
            const response = await fetch(url)
            const json = await response.json()
            const value = json.quoteSummary.result[0].price.longName
            console.log("USAStockGetName. Название для %s: %s", ID, value)
            if (value == 0) return 'нет'
            return value
        } catch (e) {
            console.log('Ошибка в USAStockGetName')
        }
    }
    module.exports.USAStockGetName = USAStockGetName
    

    Пример кода на Python


    → Можно посмотреть на GitHub

    Итог


    Я написал эту статью, желая в исследовательских целях разобраться в работающем API Яху Финанс, содержащем подробные данные о десятках тысяч ценных бумаг по всему миру, включая Россию.

    Автор: Михаил Шардин,

    8 июня 2020 г.

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

    Используете финансовые API?

    • 67,2%Да45
    • 31,3%Нет21
    • 1,5%Что это?1

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

      +1
      Спасибо за статью, но в самом начале сформулирован вопрос, на который нет ответа в целой большой и полезной статье.
      официальное API Яху Финанс было закрыто три года назад, однако практически сразу же появилась его недокументированная работоспособная версия, которая жива до сих пор.
      Вопрос: что конспирологи и другие исследователи этого мира думают по поводу такого артефакта? Кто платит за этот банкет со стороны Яху и зачем они это делают?
      И т.п.
        0
        Скорее всего это баг — то что им можно пользоваться.
          +1
          Баг — это дыра, а вот платить 3+ года за поддержку офиц. закрытого — это не баг, а фича. Но заради чего или кого, Холмс?
            +1
            Вряд ли там какая-то поддержка в полном смысле слова. Скорее, оставили и больше не трогали. Это ж Яху, оно всегда так работало :) А может, оставили ради немногочисленных действующих клиентов, чтобы не ломать им процессы.
        +1
        Так же советую посмотреть тиньков инвестиции API. Тоже интересно, можно делать даже торговые боты с управление в ТГ (как пример).
          0
          Это другая тема конечно. Среди российских брокеров наверное по пальцам одной руки можно пересчитать кто имеет своё API. И Тинькофф банк один из них.
            0
            Вот обсуждение было: habr.com/ru/post/496722/#comment_21491254
              +1
              Не могу ответить там. Альфа-директ имеет своё API задолго до появления Тинькова
                0
                Вы имеете в виду для отчетов или что-то другое?
                  +1
                  Для всех операций, которые можно делать через терминал. В том числе, для подачи заявок.
                    0

                    Подскажите, а где подробнее можно про это почитать?

                      +1
                      А вот это сложный вопрос :))) Вроде, оно закопано где-то в глубинах их сайта. Это частый вопрос новичков в чате АД. Но текущей 4-й версией API я уже не интересовался и документацию не видел. Ну и в текущей версии они делают больше упор на программирование роботов и индикаторов внутри самого терминала, на каком-то C#-подобном языке.
                        0

                        А собственные позиции только в режиме чтения можно через апи в Альфа Директе получать?

                          +1
                          Опять же — документацию к текущей версии не видел, но уверен, что да. Это ж элементарная операция и в то же время, одна из важнейших.
                          Точно знаю, что у StockSharp есть коннектор через это API. А уж это полноценная торговая система, соответственно, все эти возможности в API АД есть.
            +1
            Спасибо за статью.
            Вопрос: Есть ли какие-нибудь ограничения на количество запросов? Если я, скажем, захочу сделать анализ всех акций сектора и запрошу параллельно несколько тысяч параметров?

            Я где-то встречал информацию, что этот API выдает агрегированную информацию за 15 (???) минут.
              0

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

              +1
              А запрос на получение списка всех ценных бумаг (symbols) есть?
                0

                Мне о таком неизвестно.

                  +1
                  я находил такой инструмент, который перебором бешеное количество выкачивает pypi.org/project/Yahoo-ticker-downloader
                  Понял, что проще брать то, что нужно (торгуется у брокера)
                    0

                    Спасибо!

                      0
                      Похоже в настоящий момент он устарел, потому что в коде используется отключенное АПИ.
                        +1
                        Но при этом работает

                        start
                        > python3 YahooTickerDownloader.py
                        Checking if we can resume a old download session
                        No old downloader found on disk
                        Starting a new session
                        Downloading generic
                        
                        req https://finance.yahoo.com/_finance_doubledown/api/resource/searchassist;searchTerm=b?device=console&returnMeta=true
                        Got 10 downloaded generic symbols:
                         Generic B NYQ Barnes Group Inc.
                         Generic BA NYQ The Boeing Company
                          ect...
                        Progress: Query 2/64.
                        10 unique generic entries collected so far.
                        
                        req https://finance.yahoo.com/_finance_doubledown/api/resource/searchassist;searchTerm=c?device=console&returnMeta=true
                        Got 9 downloaded generic symbols:
                         Generic C NYQ Citigroup Inc.
                         Generic CALT NMS Calliditas Therapeutics AB (publ)
                          ect...
                        Progress: Query 3/64.
                        19 unique generic entries collected so far.
                        
                        req https://finance.yahoo.com/_finance_doubledown/api/resource/searchassist;searchTerm=d?device=console&returnMeta=true
                        Got 10 downloaded generic symbols:
                         Generic D NYQ Dominion Energy, Inc.
                         Generic DADA NMS Dada Nexus Limited
                          ect...
                        Progress: Query 4/102.
                        29 unique generic entries collected so far.
                        
                        ................................
                        

                          0
                          Спасибо, очень полезно. С python не особо знаком, на node.js переделаю.

                          Скрипт получается перебирает просто буквы алфавита? Но при этом в выборку попадает только американский рынок?

                          Например просто буква g — но в результатах нет gazp.me например, однако если запрос gazp, то эта российская бумага уже в выборке.
                            +1
                            Я особо не вникал, оставил на ночь, и он собрал мне
                            150к строк, и там нет газпрома)
                            видимо возьмет его лишь когда дойдет до gazp.me
                            Поэтому такой перебор мне не понравился) Может там есть какие-то параметры… но я подумал, что иду не по тому пути)

                            finance.yahoo.com/_finance_doubledown/api/resource/searchassist;searchTerm=gazp.me?device=console&returnMeta=true
                              +1
                              Вот скрипт выборки всех бумаг с nasdaq — прямо с их ftp:

                              #!/bin/bash
                              
                              echo -n '["' > stocks.json
                              curl -o nasdaq.txt ftp://ftp.nasdaqtrader.com/symboldirectory/nasdaqtraded.txt
                              cat nasdaq.txt | grep -Eo '^\w\|\w*' | sed 's/^\w|//g' | sed 'H;1h;$!d;x;y/\n/,/' | sed 's/,/\",\"/g' >> stocks.json
                              echo '"]' >> stocks.json
                              sed -i ':a;N;$!ba;s/\n//' stocks.json
                              rm nasdaq.txt
                                0
                                Скрипт на каждой итерации получается добавляет +1 букву?
                                буква
                                буква+буква
                                буква+буква+буква
                                  +1
                                  ага(
                                  еще точку, цифры, %

                                  Возможно там чуть умнее перебор, и не возможные комбинации этого дела собираются, но все равно очень долго и много)
                                  0
                                  Кстати, если вы ищите просто общий список акций с мосбиржи, то вот он. Можно перебирать еще группы.
                                0
                                А можете последовательность как он перебирает символы сбросить?
                          +1
                          Занятно, что Yahoo.Finance выдаёт Sector и Industry для компаний, торгующихся только в России, тоже. Например:

                          query1.finance.yahoo.com/v10/finance/quoteSummary/OBUV.ME?modules=assetProfile

                          industry: "Footwear & Accessories",
                          sector: "Consumer Cyclical",
                            0
                            Да, но только для акций. Очень удобно кстати.
                            +1
                            Вообще получение истории цен это супер возможность, спасибо! А то у меня функция GOOGLEFINANCE в Google Spreadsheets периодически глючит, либо начиная выдавать ошибку N/A, либо зависая в Loading… Может, перейду на использование скриптов (Google App Scripts), откуда буду дёргать Yahoo.Finance.

                            Жаль конечно, что информации о российских облигациях в Yahoo.Finance, видимо, нет, так же как в GOOGLEFINANCE. Остаёмся на API Московской биржи.
                              0
                              Там нет и американских облигаций, и европейских. С получаем параметров облигаций вообще не очень радужная ситуация.
                              +1
                              Где вы раньше были)
                              не так давно требовалось скачать историю акций которые есть в Тинькофф, случайно наткнулся на Yahoo.
                              Заметил, что по российским акциям можно лишь к тикеру .ME прилепить

                              сгенерил для bash такой скрипт скачивания csv (да, можно было бы и цикл на тикер для красоты)
                              only_rus.sh
                              PERIOD_FROM=`date -d '01/01/2015 00:00:00' +"%s"` # mm/dd/yy
                              PERIOD_TO=`date -d '01/01/2030 00:00:00' +"%s"` # mm/dd/yy
                              INTERVAL=1d
                              SLEEP_SECONDS=1.1
                               curl -s "https://query1.finance.yahoo.com/v7/finance/download/ABRD.ME?period1=$PERIOD_FROM&period2=$PERIOD_TO&interval=$INTERVAL&events=history" -o ABRD.ME.csv && date && echo "     1 / 122 -  ABRD.ME" &&
                              sleep $SLEEP_SECONDS
                               curl -s "https://query1.finance.yahoo.com/v7/finance/download/AFKS.ME?period1=$PERIOD_FROM&period2=$PERIOD_TO&interval=$INTERVAL&events=history" -o AFKS.ME.csv && date && echo "     2 / 122 -  AFKS.ME" &&
                              sleep $SLEEP_SECONDS
                               curl -s "https://query1.finance.yahoo.com/v7/finance/download/AFLT.ME?period1=$PERIOD_FROM&period2=$PERIOD_TO&interval=$INTERVAL&events=history" -o AFLT.ME.csv && date && echo "     3 / 122 -  AFLT.ME" &&
                              sleep $SLEEP_SECONDS
                              #и т.д.


                              Заметил, что:
                              — все же нужна задержка, т.к. запросы повисали наглухо, и как будто банился ip на время
                              — иногда странные данные, типа 0-е объемы, хотя бумага явно торговалась в этот день, или цена в какие-то дни якобы падала раз в 10. Но по данным другим источников такого не было
                              прим.: посмотрите график за 5 лет finance.yahoo.com/quote/BANEP.ME
                              — не показывается данные текущего дня по «американским» акциям, до начала захода Америки, хотя мы уже вовсю торгуем ими. Или я не туда смотрю?
                              +1

                              Вообще, оптимальнее воспользоваться апи Московской биржи для этой задачи.

                                +1
                                Очень полезная статья, спасибо! Забил основные метрики с яху финас в ibreoffice calc, работает нормально.
                                Однако, есть претензии к самому яхуфинанс — цифры зачастую не совпадают с информацией с других сайтов, и/или помечена как полученная из сторонних источников различными неназванными методиками. Другими словами, зачастую на яху финанс лежит неверная информация. Отсюда вопрос
                                А что есть еще, бесплатное, по американским акциям, в формате XML/JSON?

                                парсить html — не вариант, очень быстро банят айпи, буквально 500-1000 запросов, и все.
                                  0
                                  Прямо бесплатно не так много вариантов.
                                    +1
                                    Дайте хотя бы один такой бесплатный вариант, если не сложно.
                                    Пока самое полезное что я нашел, это alpha vantage, там доступны вся база данных, но совершенно конские ограничения на число запросов (5 в минуту, 500 в день, если не путаю) — использую только чтобы дополнить или проверить отдельные поля с яхуу.
                                    Еще, вроде бы пишут, что гугл финас до сих пор както работает, но я не нашел их базы данных.

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

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