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




В этой статье я расскажу об 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?

  • 46,2%Да12
  • 50,0%Нет13
  • 3,8%Что это?1




Комментарии (22):

  1. pamef
    /#21714308 / +1

    Спасибо за статью, но в самом начале сформулирован вопрос, на который нет ответа в целой большой и полезной статье.

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

    • empenoso
      /#21714320

      Скорее всего это баг — то что им можно пользоваться.

      • pamef
        /#21714744 / +1

        Баг — это дыра, а вот платить 3+ года за поддержку офиц. закрытого — это не баг, а фича. Но заради чего или кого, Холмс?

        • OnvogSGN
          /#21722294 / +1

          Вряд ли там какая-то поддержка в полном смысле слова. Скорее, оставили и больше не трогали. Это ж Яху, оно всегда так работало :) А может, оставили ради немногочисленных действующих клиентов, чтобы не ломать им процессы.

  2. n1k_ivanov
    /#21714316 / +1

    Так же советую посмотреть тиньков инвестиции API. Тоже интересно, можно делать даже торговые боты с управление в ТГ (как пример).

    • empenoso
      /#21714330

      Это другая тема конечно. Среди российских брокеров наверное по пальцам одной руки можно пересчитать кто имеет своё API. И Тинькофф банк один из них.

    • empenoso
      /#21714510

      Вот обсуждение было: habr.com/ru/post/496722/#comment_21491254

      • OnvogSGN
        /#21721234 / +1

        Не могу ответить там. Альфа-директ имеет своё API задолго до появления Тинькова

        • empenoso
          /#21721476

          Вы имеете в виду для отчетов или что-то другое?

          • OnvogSGN
            /#21722246 / +1

            Для всех операций, которые можно делать через терминал. В том числе, для подачи заявок.

            • empenoso
              /#21722312

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

              • OnvogSGN
                /#21722428 / +1

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

                • empenoso
                  /#21723004

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

                  • OnvogSGN
                    /#21723078

                    Опять же — документацию к текущей версии не видел, но уверен, что да. Это ж элементарная операция и в то же время, одна из важнейших.
                    Точно знаю, что у StockSharp есть коннектор через это API. А уж это полноценная торговая система, соответственно, все эти возможности в API АД есть.

  3. vrangel
    /#21715460 / +1

    Спасибо за статью.
    Вопрос: Есть ли какие-нибудь ограничения на количество запросов? Если я, скажем, захочу сделать анализ всех акций сектора и запрошу параллельно несколько тысяч параметров?

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

    • empenoso
      /#21716254

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

  4. stepmex
    /#21717568

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

  5. mrShadow
    /#21731230 / +1

    Занятно, что Yahoo.Finance выдаёт Sector и Industry для компаний, торгующихся только в России, тоже. Например:

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

    industry: "Footwear & Accessories",
    sector: "Consumer Cyclical",

    • empenoso
      /#21731414

      Да, но только для акций. Очень удобно кстати.

  6. mrShadow
    /#21731268 / +1

    Вообще получение истории цен это супер возможность, спасибо! А то у меня функция GOOGLEFINANCE в Google Spreadsheets периодически глючит, либо начиная выдавать ошибку N/A, либо зависая в Loading… Может, перейду на использование скриптов (Google App Scripts), откуда буду дёргать Yahoo.Finance.

    Жаль конечно, что информации о российских облигациях в Yahoo.Finance, видимо, нет, так же как в GOOGLEFINANCE. Остаёмся на API Московской биржи.

    • empenoso
      /#21731422

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