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

Комментарии (0)