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

Что вы получите из этой статьи
- Быстрый старт: установка yfinance и получение текущей цены и предыдущего закрытия.
- Как скачать исторические данные для одного или нескольких тикеров.
- Как преобразовать данные для анализа и сохранить в CSV.
- Практические советы, возможные ошибки и альтернативы.
Установка необходимых библиотек
Для работы с Yahoo Finance в Python мы используем библиотеку yfinance. Она бесплатна и не требует API-ключа. Рекомендуется также установить pandas и matplotlib для анализа и визуализации.
Откройте терминал и выполните:
pip install yfinance pandas matplotlibВажно: используйте виртуальное окружение (venv или conda) для изоляции зависимостей.
Быстрый пример: получить текущую цену акции
Ниже пример, который получает метаданные тикера и извлекает текущую цену и цену предыдущего закрытия. Замените ‘GOOGL’ на нужный вам тикер.
import yfinance as yf
# Создаём объект тикера и получаем словарь info
ticker = yf.Ticker('GOOGL').info
market_price = ticker.get('regularMarketPrice')
previous_close_price = ticker.get('regularMarketPreviousClose')
print('Ticker: GOOGL')
print('Market Price:', market_price)
print('Previous Close Price:', previous_close_price)Примечание: структура ticker.info — это обычный словарь Python с множеством полей (sector, fullTimeEmployees, longBusinessSummary и др.). Для безопасного извлечения ключей используйте метод get(), чтобы избежать KeyError.
Загрузка исторических данных
Чтобы получить исторические котировки за диапазон дат, используйте yf.download. По умолчанию возвращается pandas.DataFrame с индексом DatetimeIndex.
import yfinance as yf
start_date = '2020-01-01'
end_date = '2022-01-01'
ticker = 'GOOGL'
data = yf.download(ticker, start=start_date, end=end_date)
# Показать последние 5 строк
print(data.tail())Пара важных замечаний:
- Параметры start и end принимают строки в формате YYYY-MM-DD или объекты datetime.
- yf.download автоматически агрегирует данные в дневные свечи (Open, High, Low, Close, Adj Close, Volume).
Загрузка данных для нескольких тикеров
Передайте строку с несколькими тикерами, разделёнными пробелом. В результате будет многомерный DataFrame с уровнями столбцов для каждого тикера.
import yfinance as yf
start_date = '2020-01-01'
end_date = '2022-01-01'
# Несколько тикеров через пробел
tickers = 'GOOGL MSFT TSLA'
data = yf.download(tickers, start=start_date, end=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=start_date, end=end_date)
# Переносим индекс 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())После этого можно легко объединять таблицы, сохранять, группировать по периоду (неделя/месяц) и т.д.
Сохранение в CSV
Экспорт DataFrame в CSV очень прост:
import yfinance as yf
start_date = '2020-01-01'
end_date = '2022-01-01'
ticker = 'GOOGL'
data = yf.download(ticker, start=start_date, end=end_date)
# Сохраняем в файл
data.to_csv('GOOGL.csv')Советы:
- Укажите параметр index=False, если вы уже добавили столбец Date и не хотите сохранять индекс.
- Для больших датасетов рассматривайте форматы Parquet для лучшей компрессии и быстрого чтения.
Визуализация данных
Для быстрой визуализации используйте matplotlib или seaborn. Пример простого графика закрытия:
import yfinance as yf
import matplotlib.pyplot as plt
data = yf.download('GOOGL', start='2020-01-01', end='2022-01-01')
plt.figure(figsize=(10, 5))
plt.plot(data.index, data['Close'], label='Close')
plt.title('GOOGL — Закрытие')
plt.xlabel('Дата')
plt.ylabel('Цена')
plt.legend()
plt.grid(True)
plt.show()Для интерактивных графиков используйте Plotly, Bokeh или вывод на веб-страницу через PyScript.
Альтернативные подходы и библиотеки
Если yfinance не подходит (например, капризный парсинг, изменения в сайте Yahoo), рассмотрите альтернативы:
- pandas_datareader — умеет работать с разными источниками, но требует настройки.
- Alpha Vantage — имеет бесплатный тариф с API-ключом и ограничениями по частоте запросов.
- IEX Cloud, Tiingo, Quandl — коммерческие и частично бесплатные сервисы.
Выбор зависит от требований к надёжности, частоте обновления и лицензированию данных.
Когда это может не работать (ограничения и ошибки)
Important: yfinance парсит публичные данные Yahoo. Это удобно, но:
- Источники могут менять формат, тогда код сломается.
- Есть лимиты по количеству запросов; массовые загрузки могут привести к блокировке.
- Некоторые поля ticker.info иногда отсутствуют или имеют другие имена.
Типичные ошибки и как их решать:
- NetworkError или ConnectionError — проверьте интернет, прокси, VPN.
- Empty DataFrame — проверьте правильность тикера и диапазона дат.
- ValueError при парсинге дат — используйте datetime-объекты или стандартный формат YYYY-MM-DD.
Мини‑методология для воспроизводимого извлечения данных
- Определите набор тикеров и частоту (daily/weekly).
- Настройте виртуальное окружение и фиксацию зависимостей (requirements.txt).
- Загружайте данные партиями и логируйте время выполнения.
- Сохраняйте исходные CSV/Parquet с метаданными (timestamp, версия скрипта).
- Добавьте тесты целостности (например, нет пропусков дат) и алерты при изменениях объёма данных.
Ролевые чек-листы
Аналитик:
- Убедиться, что колонка Date в правильном формате.
- Проверить пропуски и аномалии в объёмах и ценах.
- Сохранить данные с отметкой времени.
Разработчик/инженер данных:
- Настроить кэширование и retry на сетевые ошибки.
- Расписать cron/airflow задачу для регулярной загрузки.
- Контролировать квоты и логировать исключения.
Отладка и частые приёмы
- Используйте ticker.history(period=’1mo’) для быстрой проверки данных за месяц.
- При группировке по неделям/месяцам применяйте resample(‘W’).agg({…}).
- Для проверки отсутствия данных: data.isna().sum().
Безопасность и приватность
- Данные котировок публичны, но при работе с закрытыми портфелями избегайте логирования чувствительной информации.
- Если сохраняете данные на удалённом хранилище, шифруйте доступ и используйте IAM-практики.
Критерии приёмки
- Скрипт скачивает данные за указанный период без ошибок.
- Дата присутствует в виде столбца и упорядочена по возрастанию.
- Файл CSV/Parquet содержит ожидаемый набор столбцов (Date, Open, High, Low, Close, Adj Close, Volume).
- Наличие базовых тестов: проверка пропусков и совпадение числа строк с ожидаемым числом торговых дней.
Глоссарий (одна строка)
- Тикер — короткий код ценной бумаги на бирже (например, GOOGL).
- Close/Adj Close — цена закрытия/скорректированная цена закрытия.
- Volume — объём торгов за период.
Короткое резюме
yfinance — быстрый и удобный инструмент для получения исторических и текущих котировок без API-ключа. Для продакшна добавьте кэширование, обработку ошибок, логирование и проверку целостности данных. Рассмотрите коммерческие API при высоких требованиях к SLA и объёмам.
Важно: всегда тестируйте скрипты на небольшом наборе тикеров перед массовой загрузкой.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone