Современный финансовый анализ немыслим без качественных данных и для частного инвестора, трейдера или аналитика умение получать и обрабатывать рыночную информацию становится таким же базовым навыком, как когда‑то работа с Excel. Python с его экосистемой финансовых библиотек превратился в стандартный инструмент для решения этих задач. В этой статье мы поговорим о том, как работать с мировыми финансовыми данными через Yahoo Finance и как получать котировки с российских площадок — Московской биржи и Тинькофф Инвестиций.
Почему Python?
Прежде чем перейти к рассмотрению инструментов, давайте определимся с задачами. Для анализа рынков нам нужно:
Получать исторические и текущие котировки.
Обрабатывать и очищать данные.
Визуализировать результаты.
Строить торговые стратегии и их тестировать.
Знаменитые питоновские библиотеки Pandas и NumPy дают возможность работать с временными рядами, Matplotlib и Plotly — визуализировать, а специализированные библиотеки для работы с биржевыми API делают получение данных максимально простым.
Работа с Yahoo Finance через yfinance
Yahoo Finance — это глобальный источник финансовых данных, который предоставляет информацию об акциях, валютах, криптовалютах и индексах со всего мира. Библиотека yfinance — это неофициальный, но очень качественный Python‑клиент к API Yahoo Finance.
Установить его можно с помощью pip:
pip install yfinance
Библиотека предоставляет несколько способов получения данных:
Ticker — для работы с одним инструментом.
Tickers — для нескольких инструментов одновременно.
download() — быстрая загрузка исторических данных.
Market — информация о рынке в целом.
Работать с ней достаточно просто. Давайте в качестве примера получим данные по стоимости акций Apple (AAPL).
import yfinance as yf # Способ 1: через Ticker aapl = yf.Ticker("AAPL") # Исторические данные за последний год data = aapl.history(period="1y") print(data.head()) # Способ 2: через download data = yf.download("AAPL", period="6mo", interval="1d")
Несмотря на всю простоту работы, у yfinance есть и свои ограничения. Так, при запросе очень старых данных результаты могут быть неполными. Кроме того, бумаги с малым объёмом торгов часто не возвращают данные. Также, данные «в реальном времени» могут быть с задержкой и в случае сбоев на стороне Yahoo мы также получаем проблемы с доступностью.
Российские источники данных
С учетом ограничений доступа в последнее время, для получения финансовых данных лучше использовать отечественные источники. Рассмотрим наиболее известные из них и начнем с Московской биржи (MOEX). Московская биржа предоставляет официальный Информационно‑статистический сервер (ISS) — веб‑сервис для доступа к рыночным данным по всем рынкам биржи.
Здесь нам доступны следующие данные:
Статические данные (торговые режимы, инструменты).
Данные для построения свечных графиков.
Сделки (анонимно).
Лучшие котировки.
Исторические данные.
Здесь важно обратить внимание на следующий важный момент: бесплатно данные доступны с задержкой. Для получения данных в реальном времени требуется подписка.
Как получить данные из ISS MOEX на Python
ISS работает через веб интерфейс, поэтому данные можно получать обычными HTTP‑запросами. Пример получения котировок индекса МосБиржи:
import requests import pandas as pd # Получение данных по индексу МосБиржи (IMOEX) url = "https://iss.moex.com/iss/engines/stock/markets/index/securities/IMOEX/candles.json" params = { "from": "2025-01-01", "till": "2025-12-31", "interval": 24 # 24 = дневные свечи } response = requests.get(url, params=params) data = response.json() # Извлечение данных свечей candles = data['candles']['data'] columns = [col['name'] for col in data['candles']['columns']] df = pd.DataFrame(candles, columns=columns) df['begin'] = pd.to_datetime(df['begin']) print(df.head())
Интервалы для параметра interval:
|
1 — минута 10 — 10 минут 60 — час 24 — день 7 — неделя 31 — месяц |
На практике, при скачивании большого объёма исторических данных (например, минутных данных по индексам) процесс может занимать значительное время — до 20 минут для полной истории.
Тинькофф Инвестиции API
Т‑Банк предоставляет официальное OpenAPI для доступа к торговой платформе. Это полноценное решение для создания торговых роботов и аналитических систем.
Здесь нам для начала потребуется установить библиотеку:
pip install tinkoff‑investments
Далее нужно получить токен доступа. Токен — это ваш секретный ключ доступа к API. Для его получения необходимо перейти в раздел инвестиций в личном кабинете Т‑Инвестиций. Далее в настройках убедиться, что функция «Подтверждение сделок кодом» отключена. После этого выпустить токен для торговли на бирже. В лучших традициях Gitlab токен отображается только один раз, так что сохраните его сразу.
Посмотрим примеры работы с Tinkoff Invest API.
Синхронный клиент (REST):
import tinvest TOKEN = "ваш_токен" client = tinvest.SyncClient(TOKEN) # Получение портфеля response = client.get_portfolio() print(response.payload) # Получение операций response = client.get_operations( from_="2025-01-01", to="2025-12-31" )
Для высоких нагрузок мы можем воспользоваться асинхронным клиентом:
import asyncio import os from tinkoff.invest import AsyncClient TOKEN = os.environ["INVEST_TOKEN"] async def main(): async with AsyncClient(TOKEN) as client: print(await client.users.get_accounts()) if __name__ == "__main__": asyncio.run(main())
В качестве примера рассмотрим, получение и вывод в консоль свечей с часовым интервалом за год:
import os from datetime import timedelta from tinkoff.invest import CandleInterval, Client from tinkoff.invest.utils import now TOKEN = os.environ["INVEST_TOKEN"] def main(): with Client(TOKEN) as client: for candle in client.get_all_candles( figi="BBG004730N88", from_=now() - timedelta(days=365), interval=CandleInterval.CANDLE_INTERVAL_HOUR, ): print(candle) return 0 if __name__ == "__main__": main()
И здесь песочница
Важнейшая возможность Тинькофф API — песочница. По сути, это тестовое окружение с виртуальными деньгами, где можно проверять торговых роботов без риска потерять реальные средства. Правда, и заработать реальные деньги в песочнице тоже не получиться.
Для запуска в режиме песочницы необходимо включить SandboxClient:
import os from tinkoff.invest.sandbox.client import SandboxClient TOKEN = os.environ["INVEST_TOKEN"] def main(): with SandboxClient(TOKEN) as client: print(client.users.get_info()) if __name__ == "__main__": main()
Сравнение индексов
Теперь давайте решим простую аналитическую задачу: соберём код из предыдущих примеров вместе и создадим небольшой аналитический скрипт, который сравнивает динамику двух индексов — американского S&P 500 и российского IMOEX.
import yfinance as yf import pandas as pd import matplotlib.pyplot as plt import requests def get_imoex_data(start_date, end_date): """Получение данных индекса МосБиржи через ISS""" url = "https://iss.moex.com/iss/engines/stock/markets/index/securities/IMOEX/candles.json" params = { "from": start_date, "till": end_date, "interval": 24 # дневные свечи } response = requests.get(url, params=params) data = response.json() candles = data['candles']['data'] columns = [col['name'] for col in data['candles']['columns']] df = pd.DataFrame(candles, columns=columns) df['begin'] = pd.to_datetime(df['begin']) df.set_index('begin', inplace=True) df['close'] = df['close'].astype(float) return df[['close']].rename(columns={'close': 'IMOEX'}) def get_sp500_data(start_date, end_date): """Получение данных S&P 500 через yfinance""" sp500 = yf.Ticker("^GSPC") df = sp500.history(start=start_date, end=end_date) return df[['Close']].rename(columns={'Close': 'SP500'}) # Параметры анализа start = "2024-01-01" end = "2025-12-31" # Загрузка данных print("Загрузка данных S&P 500...") sp500_data = get_sp500_data(start, end) print("Загрузка данных IMOEX...") imoex_data = get_imoex_data(start, end) # Объединение и нормализация (приводим к 100% на начало периода) combined = pd.merge(sp500_data, imoex_data, left_index=True, right_index=True, how='inner') normalized = (combined / combined.iloc[0]) * 100 # Визуализация plt.figure(figsize=(12, 6)) plt.plot(normalized.index, normalized['SP500'], label='S&P 500', linewidth=2) plt.plot(normalized.index, normalized['IMOEX'], label='IMOEX (Московская биржа)', linewidth=2) plt.title('Сравнение динамики индексов (нормализовано к 100%)', fontsize=14) plt.xlabel('Дата') plt.ylabel('Изменение (%)') plt.legend() plt.grid(True, alpha=0.3) plt.show() # Расчёт корреляции correlation = combined['SP500'].corr(combined['IMOEX']) print(f"\nКорреляция между S&P 500 и IMOEX: {correlation:.3f}") # Расчёт доходности returns = combined.pct_change().dropna() print(f"\nСреднедневная доходность S&P 500: {returns['SP500'].mean()*100:.3f}%") print(f"Среднедневная доходность IMOEX: {returns['IMOEX'].mean()*100:.3f}%") print(f"Волатильность S&P 500: {returns['SP500'].std()*100:.3f}%") print(f"Волатильность IMOEX: {returns['IMOEX'].std()*100:.3f}%")
Обработка и очистка данных
В идеальном мире собранных данных нам было бы достаточно для дальнейшего использования, но в реальности полученные «сырые» данные почти всегда требуют предварительной обработки. Существуют библиотеки, которые объединяют функционал получения, очистки и визуализации данных.
Давайте рассмотрим основные операции с пропусками.
import pandas as pd def clean_stock_data(df): #Заполнение пропущенных дат df = df.asfreq('D') # Forward fill для пропусков (предполагаем, что цена не изменилась) df['close'] = df['close'].fillna(method='ffill') # Заполнение оставшихся пропусков (в начале) обратным fill df['close'] = df['close'].fillna(method='bfill') # Удаление выбросов (например, цены, отличающиеся более чем на 3 сигмы) mean = df['close'].mean() std = df['close'].std() df = df[(df['close'] > mean - 3*std) & (df['close'] < mean + 3*std)] return df
Для создания дополнительных признаков нам потребуется следующий код:
def add_technical_indicators(df): """Добавление технических индикаторов""" # Скользящие средние df['SMA_20'] = df['close'].rolling(window=20).mean() df['SMA_50'] = df['close'].rolling(window=50).mean() # Доходность df['returns'] = df['close'].pct_change() df['log_returns'] = np.log(df['close'] / df['close'].shift(1)) # Волатильность (20-дневная) df['volatility'] = df['returns'].rolling(window=20).std() * np.sqrt(252) return df
Таким образом, мы можем обеспечить качество обрабатываемых данных для последующего анализа.
|
? Перед углублением в тему можно пройти бесплатное вступительное тестирование — оно покажет, хватает ли текущей базы для работы с моделями. |
Заключение
Российский рынок финансовых данных за последние годы сильно изменился. Если раньше аналитики были вынуждены полагаться на зарубежные источники, то сегодня у нас есть полноценные отечественные решения: MOEX ISS — официальный и бесплатный (с задержкой) доступ к данным Московской биржи и Тинькофф Инвестиции API — современный инструмент с поддержкой торговли, стриминга и песочницы.
В комбинации с мировым источником Yahoo Finance, эти инструменты дают возможность проводить полноценный анализ как глобальных, так и российских рынков, не выходя из экосистемы Python.
Начните с малого — получите данные по одному инструменту, постройте график. Затем усложняйте: добавляйте индикаторы, стройте стратегии, подключайте real‑time данные. Финансовый анализ с Python — это навык, который окупается сторицей, независимо от того, торгуете вы или просто исследуете рынки.

Когда простые индикаторы перестают объяснять рынок, приходится работать с признаками, шумом и моделями. На курсе по машинному обучению для финансового анализа разбираем, как превращать рыночные данные в работающие модели, а не в красивые, но бесполезные графики.
А если хотите копнуть тему глубже, можно начать с открытых уроков: на них разбирают и базовую работу с финансовыми данными, и более продвинутые методы анализа признаков.
30 апреля в 20:00. «Yahoo Finance и не только — работа с российскими торговыми площадками». Записаться
18 мая в 20:00. «Корреляция признаков. PCA». Записаться