Современный финансовый анализ немыслим без качественных данных и для частного инвестора, трейдера или аналитика умение получать и обрабатывать рыночную информацию становится таким же базовым навыком, как когда‑то работа с 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». Записаться
Автор: Andrey_Biryukov


