Парсинг финансовой информации с Yahoo Finance

Для анализа финансовых данных необходимо их получить. Near realtime данные проще забирать с Yahoo Finance, нежели с Bloomberg. Видимо из-за новостной ориентации Bloomberg защита от web scraping значительно серьезнее. Если неосторожно забирать данные, то легко получить страницу с запросом captcha.

Ниже я приведу пример получения данных валюты и индексов с сайта Yahoo Finance на Python с использованием Chrome движка и Yahoo Finance API. Google Colab код здесь. Я забирал и парсил данные из JSON в html коде страниц, а не парсил страницы, хотя в коде есть небольшой пример как это делать с помощью библиотеки BeautifulSoup.

Код получения данных с Yahoo Finance

Для работы необходимы библиотеки Selenium, драйвер Chrome и библиотека для парсинга страниц BeautifulSoup.

!pip install selenium
!apt-get update # to update ubuntu to correctly run apt install
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin
import sys
sys.path.insert(0,'/usr/lib/chromium-browser/chromedriver')
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

import pandas as pd
#import chromedriver_binary
from bs4 import BeautifulSoup

import re
import string
import time
from google.colab import files
from json import loads

После загрузки библиотек подгружается драйвер Chrome:

wd = webdriver.Chrome('chromedriver', chrome_options=chrome_options)

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

wd.get('https://finance.yahoo.com/currencies')
time.sleep(10)
currencies_html = wd.execute_script('return document.body.innerHTML;')

currencies_soup = BeautifulSoup(currencies_html,'lxml')

currencies_script = currencies_soup.find("script",text=re.compile("root.App.main")).text
data = loads(re.search("root.App.main\s+=\s+(\{.*\})", currencies_script).group(1))
#print(data)

info = []
stores = data["context"]["dispatcher"]["stores"]["StreamDataStore"]["quoteData"]
print("Number of currencies:", len(stores))
for store in stores:
  name = data["context"]["dispatcher"]["stores"]["StreamDataStore"]["quoteData"][store]

  nm = ""
  value = ""
  symbol = ""
  if 'shortName' in name.keys(): 
    nm = name["shortName"]
    value = name["regularMarketPrice"]["raw"]
    symbol = name["symbol"]
  elif 'quoteSourceName' in name.keys(): 
    nm = name["quoteSourceName"]
    value = name["regularMarketPrice"]["raw"]
    symbol = name["symbol"]

  info.append([nm, symbol, value])

df = pd.DataFrame(data = info, columns=['Name', 'Symbol', 'Value'])
df['Value'] = df['Value'].map('{:,.2f}'.format)
df

Пример результата:

Парсинг HTML страниц Yahoo Finance

Хотя особого смысла парсить HTML страницы Yahoo Finance нет, поскольку в коде есть JSON файл, но для примера приведу небольшой кусок кода для получения названий индексов со страницы индексов.

symbols = ['\^GSPC', '\^DJI', '\^IXIC', '\^NYA', '\^XAX', '\^BUK100P', ]
for symbol in symbols:
  indexes = [entry for entry in indexes_soup.find_all('tr', {'class': re.compile('data-row'+symbol)})] #'data-row^DJI Bgc($extraLightBlue):h BdT Bdc($tableBorderGray) Bdc($tableBorderBlue):h H(33px) Bgc($altRowColor)'})]
  for index in indexes:
    tds = index.find_all('td', {'class':'data-col0 Ta(start) Pstart(6px)'})
    for td in tds: 
      a = td.find_all('a', {'class':'Fw(b)'})
      print(a[0].attrs['data-symbol'], a[0].attrs['title'])

Ну и незамысловатый результат работы кода:

^GSPC S&P 500
^DJI Dow Jones Industrial Average
^IXIC NASDAQ Composite
^NYA NYSE COMPOSITE (DJ)
^XAX NYSE AMEX COMPOSITE INDEX
^BUK100P Cboe UK 100 Price Return

Получение данные через Yahoo API

Данные индексов можно получить через Yahoo API, используя библиотку yFinance https://github.com/ranaroussi/yfinance.

Загрузка библиотеки с подавлением вывода информации о прогрессе.

#@title Загрузка библиотеки yFinance https://github.com/ranaroussi/yfinance
# to hide output of this cell
%%capture
!pip install yfinance
import yfinance as yf

Получение финансовых данных. Наименование индексов можно посмотреть на скриншоте выше. Можно также воспользоваться скриптом https://pypi.org/project/Yahoo-ticker-downloader/.

#@title Код получения финансовых данных
ticker = yf.Ticker("GBPUSD=X")#("RUB=X")#("IDR=X")#(MSFT")

# get stock info
print(ticker.info)

# get historical market data
hist = ticker.history(period="5d")

#@title Код для вывода
#hist.dtypes
hist['Open'] = hist['Open'].astype(float)
hist['Close'] = hist['Close'].astype(float)
hist['High'] = hist['High'].astype(float)
hist['Low'] = hist['Low'].astype(float)

hist['Open'] = hist['Open'].map('{:,.2f}'.format)
hist['Close'] = hist['Close'].map('{:,.2f}'.format)
hist['High'] = hist['High'].map('{:,.2f}'.format)
hist['Low'] = hist['Low'].map('{:,.2f}'.format)
hist

Альтернативные источники финансовой информации

Помимо Yahoo Finance есть другие источники финансовой информации. Исторические данные по некоторым курсам и индексам с интервалом в 1 минуту удобно взять https://www.histdata.com/category/quotes-update/.

Google Financehttps://finance.google.com/finance/historical?q=AAPL&
startdate=01-Jan-2010&output=csv
Quandlhttps://www.quandl.com/api/v3/datasets/WIKI/AAPL.csv?
start_date=2010-01-01&api_key=...
Stooqhttps://stooq.com/q/d/l/?s=AAPL.US&i=d
Alpha Vantagehttps://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED
&symbol=AAPL&outputsize=full&apikey=...&datatype=csv
BarCharthttps://marketdata.websol.barchart.com/getHistory.csv?apikey=...&symbol=AAPL&
startDate=20100101&splits=true&dividends=true&volume=sum&nearby=1&jerq=true
IEXhttps://api.iextrading.com/1.0/stock/aapl/chart/5y?format=csv

Полезные ссылки:

Spread the love
Запись опубликована в рубрике IT рецепты с метками , , , , , , . Добавьте в закладки постоянную ссылку.

Обсуждение закрыто.