惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
S
Security @ Cisco Blogs
S
Secure Thoughts
Attack and Defense Labs
Attack and Defense Labs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Hacker News: Front Page
博客园 - 叶小钗
H
Heimdal Security Blog
Microsoft Security Blog
Microsoft Security Blog
Forbes - Security
Forbes - Security
AI
AI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Troy Hunt's Blog
罗磊的独立博客
Application and Cybersecurity Blog
Application and Cybersecurity Blog
爱范儿
爱范儿
GbyAI
GbyAI
The Last Watchdog
The Last Watchdog
TaoSecurity Blog
TaoSecurity Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
D
DataBreaches.Net
Recent Announcements
Recent Announcements
Schneier on Security
Schneier on Security
C
Cisco Blogs
美团技术团队
D
Docker
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
月光博客
月光博客
雷峰网
雷峰网
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
H
Hackread – Cybersecurity News, Data Breaches, AI and More
A
Arctic Wolf
B
Blog RSS Feed
Cisco Talos Blog
Cisco Talos Blog
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
V2EX - 技术
V2EX - 技术
Y
Y Combinator Blog
N
News and Events Feed by Topic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
W
WeLiveSecurity
Security Archives - TechRepublic
Security Archives - TechRepublic
G
GRAHAM CLULEY
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
The Hacker News
The Hacker News

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Анализируем финансовые рынки с помощью Python
Andrey_Biryu · 2026-04-27 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение9 мин

Охват и читатели371

Туториал

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