Получение данных фондового рынка через Python с помощью yfinance

К чему этот материал
Цель — показать рабочие шаги для загрузки рыночных данных, их трансформации и сохранения. Подходит для аналитиков, дата‑саентистов и разработчиков, которым нужны исторические и текущие цены без сложной настройки API.
Важно: yfinance использует публичные данные Yahoo Finance и не требует API‑ключа. Для больших объёмов или коммерческого использования рассмотрите платные сервисы.
Быстрые определения
- Тикер — короткое обозначение акции на бирже (например, GOOGL).
- OHLC — Open, High, Low, Close — основные поля для цен.
- Adj Close — скорректированная цена с учётом делений и дивидендов.
Установка библиотек
Установите yfinance через pip:
pip install yfinanceДля работы удобно иметь pandas и matplotlib:
pip install pandas matplotlibПримечание: yfinance бесплатен и не требует ключа API.
Получение текущей цены акции
Ниже пример получения текущей рыночной цены и предыдущего закрытия для тикера GOOGL:
import yfinance as yf
ticker = yf.Ticker('GOOGL').info
market_price = ticker['regularMarketPrice']
previous_close_price = ticker['regularMarketPreviousClose']
print('Ticker: GOOGL')
print('Market Price:', market_price)
print('Previous Close Price:', previous_close_price)Этот код использует свойства regularMarketPrice и regularMarketPreviousClose. Библиотека возвращает множество других полей, которые можно просмотреть так:
import yfinance as yf
ticker = yf.Ticker('GOOGL').info
print(list(ticker.keys()))
Получение исторических данных
Чтобы скачать историю цен, укажите тикер, дату начала и конца:
import yfinance as yf
start_date = '2020-01-01'
end_date = '2022-01-01'
ticker = 'GOOGL'
data = yf.download(ticker, start_date, end_date)
print(data.tail())Вы можете загрузить сразу несколько тикеров, перечислив их через пробел:
import yfinance as yf
start_date = '2020-01-01'
end_date = '2022-01-01'
ticker = 'GOOGL MSFT TSLA'
data = yf.download(ticker, start_date, end_date)
print(data.tail())
Совет: для интерактивной работы используйте меньшие интервалы и частоту запросов, чтобы не перегружать источник.
Преобразование данных для анализа
По умолчанию индексом DataFrame выступает столбец Date. Для многих задач удобнее иметь дату как обычную колонку:
import yfinance as yf
start_date = '2020-01-01'
end_date = '2022-01-01'
ticker = 'GOOGL'
data = yf.download(ticker, start_date, end_date)
data['Date'] = data.index
data = data[['Date', 'Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume']]
data.reset_index(drop=True, inplace=True)
print(data.head())
После такой трансформации строки можно фильтровать, объединять и сохранять как обычный DataFrame.
Сохранение в CSV
Экспорт в CSV выполняется через метод to_csv:
import yfinance as yf
start_date = '2020-01-01'
end_date = '2022-01-01'
ticker = 'GOOGL'
data = yf.download(ticker, start_date, end_date)
# Сохранить на диск
data.to_csv('GOOGL.csv')Совет: добавляйте параметр index=True/False в to_csv по необходимости, и используйте compression=’gzip’ для больших объёмов.
Визуализация данных
Простой пример построения графика закрытий за период:
import yfinance as yf
import matplotlib.pyplot as plt
data = yf.download('GOOGL', '2020-01-01', '2022-01-01')
plt.figure(figsize=(10,5))
plt.plot(data.index, data['Close'], label='Close')
plt.title('GOOGL Close Price')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()Для более сложных визуализаций используйте seaborn, plotly или bokeh. PyScript позволяет отображать графики прямо в браузере.
Быстрый набор полезных сниппетов
- Получить ежедневные доходности:
data['Daily Return'] = data['Adj Close'].pct_change()- Ресемплинг до месячной средней цены закрытия:
monthly = data['Adj Close'].resample('M').mean()- Проверить наличие пропусков:
print(data.isna().sum())- Сохранить несколько тикеров в отдельные CSV:
tickers = ['GOOGL','MSFT','TSLA']
for t in tickers:
yf.download(t, '2020-01-01','2022-01-01').to_csv(f'{t}.csv')Когда yfinance может не подойти
Важно понимать ограничения:
- Данные Yahoo могут быть неполными для редких тикеров или рынков.
- Для низкой частоты запросов yfinance подходит, но для большого потока данных лучше платный API.
- Данные не гарантированы для торгов в реальном времени при высокочастотной торговле.
- Может меняться формат полей; проверяйте ключи в ticker.info.
Альтернативы yfinance
- pandas_datareader — простая интеграция с разными источниками.
- Alpha Vantage — бесплатный план есть, нужен API‑ключ.
- IEX Cloud, Tiingo — платные/граничные бесплатные слои, подходят для продакшена.
- yahooquery — более низкоуровневая работа с Yahoo API.
Мини‑методология для проекта по рыночному анализу
- Определите цель и набор тикеров.
- Выберите временные интервалы и частоты (день, час).
- Загрузите и сохраните сырые данные.
- Очистите и нормализуйте (таймзоны, пропуски).
- Рассчитайте метрики (доходности, волатильность).
- Визуализируйте и валидируйте.
- Автоматизируйте регулярные обновления и бэкапы.
Ролевые чек‑листы
- Data Scientist: проверка корректности колонок, расчёт метрик, валидация на выбросы.
- Data Engineer: организация хранения, сжатие CSV/Parquet, расписание загрузок, мониторинг ошибок.
- Разработчик: обработка ошибок сети, повторные попытки, логирование.
Критерии приёмки
- Набор данных содержит колонки Date, Open, High, Low, Close, Adj Close, Volume.
- Данные покрывают запрошенный период полностью без пропусков в ключевых датах.
- Экспорт в CSV/Parquet проходит без ошибок и размеры файлов согласованы.
Тесты и проверки
- Тест 1: загрузка за одну неделю возвращает не менее 3 строк.
- Тест 2: нет отрицательных объёмов в колонке Volume.
- Тест 3: Adj Close при ресэмплинге даёт ожидаемые значения для ручной выборки.
Безопасность и соответствие требованиям конфиденциальности
- Если храните портфели пользователей, шифруйте данные в покое и при передаче.
- Убедитесь, что логирование не записывает персональные данные.
- Для пользователей из ЕС соблюдайте требования GDPR при обработке персональных данных.
Частые ошибки и их исправление
- Пустая таблица после download — проверьте правильность тикера и даты.
- KeyError при доступе к ticker.info — вызвано отсутствующей меткой, проверяйте наличие ключа через in или try/except.
- Разные часовые пояса — приведите все даты к UTC или нужной локальной зоне.
Итоговый пример рабочего сценария
- Скачайте данные через yf.download.
- Преобразуйте индекс в колонку Date.
- Рассчитайте доходности и месячные агрегаты.
- Сохраните результаты в csv и parquet.
- Постройте графики и проверьте аномалии.
Краткое резюме:
- yfinance — быстрый способ начать работу с данными Yahoo Finance.
- Подходит для анализа и визуализаций, но не для высокочастотной торговли.
- Всегда валидируйте данные и предусмотрите обработку ошибок.
Важно: этот материал даёт практические шаги и шаблоны. Подбирайте инструменты под свои требования и масштаб.