Блог им. 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 года вчера скачались примерно за час.

9.9К | ★33
16 комментариев
Какой размер примерно CSV выходит на один тикер для периода лет 5, интервал 1h? Думаю через colab на google drive попробовать загрузить.
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

Читайте на SMART-LAB:
Фото
Что такое преимущественное право?
📌 Преимущественное право — это установленная законом возможность для текущих акционеров компании первыми приобрести новые ценные бумаги,...
Фото
Почему падает российский рынок акций?
Чуть больше месяца назад на Ближнем Востоке вновь разгорелся конфликт. Сначала Индекс МосБиржи позитивно отреагировал на рост углеводородов, что...
X5 и Русагро подписали меморандум о стратегическом партнерстве
🔹 27–28 марта «Русагро» провела стратегическую сессию с генеральными и коммерческими директорами ключевых федеральных сетей, а также...
Фото
Мозговой штурм. Традиционно: коротко и по делу, о чем говорили аналитики в офисе
Доброго дня! Традиционно делаю вашу любимую рубрику = конспект нашего обсуждения в офисе Мозговика. Кстати, напомню, что 11 апреля у нас...

теги блога zenoftrading

....все тэги



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