Анализируем финансовые рынки с помощью Python. moex.. moex. pandas.. moex. pandas. yahoo finance.. moex. pandas. yahoo finance. анализ данных.. moex. pandas. yahoo finance. анализ данных. биржевые данные.. moex. pandas. yahoo finance. анализ данных. биржевые данные. временные ряды.. moex. pandas. yahoo finance. анализ данных. биржевые данные. временные ряды. котировки.. moex. pandas. yahoo finance. анализ данных. биржевые данные. временные ряды. котировки. тинькофф api.. moex. pandas. yahoo finance. анализ данных. биржевые данные. временные ряды. котировки. тинькофф api. финансовый анализ.

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

Анализируем финансовые рынки с помощью Python - 1

Когда простые индикаторы перестают объяснять рынок, приходится работать с признаками, шумом и моделями. На курсе по машинному обучению для финансового анализа разбираем, как превращать рыночные данные в работающие модели, а не в красивые, но бесполезные графики.

А если хотите копнуть тему глубже, можно начать с открытых уроков: на них разбирают и базовую работу с финансовыми данными, и более продвинутые методы анализа признаков.

  • 30 апреля в 20:00. «Yahoo Finance и не только — работа с российскими торговыми площадками». Записаться

  • 18 мая в 20:00. «Корреляция признаков. PCA». Записаться

Автор: Andrey_Biryukov

Источник