Блог им. tradezen

Как скачать исторические котировки c yahoo finance и финама с помощью python

В одной из прошлых заметок мне нужно было скачать исторические котировки по 650 активам. Часть из них на российском рынке, часть крипта и большая часть на рынке США. Всё, что касается крипты, валют и американского рынка качал с yahoo finance. Российский рынок качал с финама. Естественно качал с помощью питона. Дальше расскажу как это можно повторить.

Yahoo finance и python


Пакет yfinance. Гитахб github.com/ranaroussi/yfinance Установка командой: pip install yfinance

Можно качать не только дневные данные. Интервалы из документации: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo На практике данные меньше дневных сильно ограничены. Например, часовые доступны за 60 последних дней.

Перейдём к делу, как качать котировки:

import yfinance as yf

data = yf.download(«TSLA», start=«2017-01-01», end=«2017-04-30»)

Как добавить интервал:

data = yf.download(«TSLA», start=«2017-01-01», end=«2017-04-30», interval='1h')

Данные скачиваются в датафрейм. Датафрейм можно сохранить в csv:

data.to_csv('tsla.csv')

Для тикеров с московской биржи нужно добавить постфикс .ME. То есть SBER и GAZP превращаются в SBER.ME и GAZP.ME Для валют тикеры выглядят вот так RUBUSD=X Для криптовалют BTC-USD

Finam и python


Нашёл замечательный пакет finam-export. Гитхаб github.com/ffeast/finam-export Установить можно командой: pip install finam-export

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

Сам пакет не так хорошо продуман, как предыдущий. Иногда приходится поломать голову.

Как тут качать? Минимальный набор:

from finam import Exporter, Market, Timeframe

exporter = Exporter()
ticker = 'SBER'
asset = exporter.lookup(name=ticker, market=Market.SHARES)
asset_id = asset[asset['name'] == ticker].index[0]
data = exporter.download(asset_id, market=Market.SHARES)

Ищем айдишник тикера в финаме и по нему скачиваем котировки.

Вот так можно задавать другие параметры:

data = exporter.download(asset_id, market=Market.SHARES, start_date=datetime.date(2017, 1, 1), end_date=datetime.date(2018, 1, 1), timeframe=Timeframe.DAILY)

Особенности finam-export


Тикер нужно искать в том рынке, где он есть. Фьючерсы во фьючерсах, акции в акциях. Если искать без рынка, то у одного тикера может найтись несколько айдишников. Константы по рынкам и таймфреймам можно посмотреть в файле: github.com/ffeast/finam-export/blob/master/finam/const.py

Иногда в строчке asset = exporter.lookup(name=ticker, market=Market.SHARES) нужно name заменить на code, будет вот так asset = exporter.lookup(code=ticker, market=Market.SHARES) Хрен его знает что от этого меняется, но иногда работает так иногда так.

В константах может не быть рынка, который вам нужен. Например для биткоина айдишник рынка 520. Его нет в константах. Я пробовал его добавлять руками, но котировки всё равно не качались. Если знаете как скачать, напишите.

Если качать много тикеров, то нужно задавать задержку между заросами в одном тикере и между тикерами, инче будет 403 ошибка. Я прописывал через рандом в запросе: data = exporter.download(asset_id, market=Market.SHARES, start_date=datetime.date(2017, 1, 1), end_date=datetime.date(2018, 1, 1), timeframe=Timeframe.DAILY, delay=random.randint(3,5)) И в цикле: time.sleep(random.randint(3,5))

Как скорость?


Да в целом норм. Дневные данные по 650 тикерам с января 2007 года вчера скачались примерно за час.

★31
16 комментариев
Какой размер примерно CSV выходит на один тикер для периода лет 5, интервал 1h? Думаю через colab на google drive попробовать загрузить.
avatar
smtg, примерно 600 кб
avatar
я хочу загрузить не только цену, но и финансовые показатели. Это реально?
Где то читал, что Яхо api загнулась, т.к. была бесплатной.
avatar
martnk, в яху финанс рельано, вот из примера на гитхабе:

import yfinance as yf

msft = yf.Ticker("MSFT")

# get stock info
msft.info

# get historical market data
hist = msft.history(period="max")

# show actions (dividends, splits)
msft.actions

# show dividends
msft.dividends

# show splits
msft.splits

# show financials
msft.financials
msft.quarterly_financials

# show major holders
msft.major_holders

# show institutional holders
msft.institutional_holders

# show balance sheet
msft.balance_sheet
msft.quarterly_balance_sheet

# show cashflow
msft.cashflow
msft.quarterly_cashflow

# show earnings
msft.earnings
msft.quarterly_earnings

# show sustainability
msft.sustainability

# show analysts recommendations
msft.recommendations

# show next event (earnings, etc)
msft.calendar

# show ISIN code - *experimental*
# ISIN = International Securities Identification Number
msft.isin

# show options expirations
msft.options

# get option chain for specific expiration
opt = msft.option_chain('YYYY-MM-DD')
# data available via: opt.calls, opt.puts
avatar
zenoftrading, жаль я не разбираюсь с Питоном) может ты мне и облучатель сбросишь по питону. 
avatar
martnk, судя по количествую вопросов в личку, уже задумываюсь сам такой обучатель сделать)
avatar
zenoftrading, с чего начать то пока ты «курс готовишь»? Какую книжку почитать ) 
avatar
martnk, да чё читать, делать нужно) вот можно курс посмотреть www.udemy.com/course/python-the-complete-python-developer-course/
avatar
zenoftrading, как загрузить цену закрытия на конкретную дату  ? 
 
avatar
Может с самой ММВБ брать?

ticker = 'LKOH'

from_ = '2020-12-30'

till = datetime.today().strftime('%Y-%m-%d')

interval = 24

query = f'http://iss.moex.com/iss/engines/stock/markets/shares/securities/{ticker}/candles.csv?from={from_}&till={till}&interval={interval}'  

df = pd.read_csv(query, sep=';', header=1)

df['ticker'] = ticker

df['month'] = pd.to_datetime(df['end']).dt.strftime('%Y-%m-01')

df.set_index('end', inplace=True)

О, эта статейка датакэмпа переживает ещё одну реинкарнацию)
И нормальные котировки получаются? Я одно время вел на яху портфель, так там если спускаешься на часовые и минутные фреймы, то на графиках огромные сопли появлялись для наших бумаг.
Upd. Тяну напрямую с moex
avatar
подскажи кокой версии питон подходит?
avatar
за
avatar
Замудренная тема но я разобрался за пол дня
avatar

теги блога zenoftrading

....все тэги



UPDONW
Новый дизайн