Сбор, очистка и предварительная обработка финансовых временных рядов
Сбор, очистка и предварительная обработка финансовых временных рядов
Добро пожаловать на курс «Разработка ML-моделей для прогнозирования цен на фондовом рынке». Это первая и, пожалуй, самая важная статья нашего цикла. Почему? Потому что в мире Data Science существует золотое правило: «Garbage In, Garbage Out» (Мусор на входе — мусор на выходе).
Даже самая сложная нейронная сеть не сможет предсказать движение рынка, если вы «скормите» ей грязные, некорректные или неправильно обработанные данные. В этой статье мы разберем фундамент: откуда брать данные, как их чистить от ошибок и как превратить сырые цифры в топливо для алгоритмов машинного обучения.
Что такое финансовый временной ряд?
Временной ряд — это последовательность данных, измеренных через равные промежутки времени. В финансах это обычно история цен на активы (акции, валюты, криптовалюты).
В отличие от классических задач машинного обучения (например, классификации изображений), здесь критически важен порядок данных. Цена сегодня зависит от цены вчера, а цена завтра будет зависеть от цены сегодня. Мы не можем просто перемешать эти данные, как колоду карт.
Формат данных OHLCV
Стандартом де-факто для финансовых данных является формат OHLCV. Это агрегированные данные за определенный период (таймфрейм: минута, час, день).
| Атрибут | Расшифровка | Описание |
|---|---|---|
| Open | Цена открытия | Цена первой сделки за период |
| High | Максимум | Самая высокая цена сделки за период |
| Low | Минимум | Самая низкая цена сделки за период |
| Close | Цена закрытия | Цена последней сделки за период (наиболее важна для анализа) |
| Volume | Объем | Количество акций/контрактов, проданных за этот период |
Сбор данных
Для начала работы нам нужен источник данных. В профессиональной среде используются платные терминалы (Bloomberg, Refinitiv), но для обучения и разработки собственных моделей отлично подходят открытые API и библиотеки.
Популярные источники:
- Yahoo Finance (
yfinance) — самый популярный бесплатный источник. Отлично подходит для дневных данных. - Alpha Vantage — предоставляет API для получения исторических данных.
- Биржевые API (Binance, MOEX) — если вы работаете с конкретной биржей.
Пример того, как выглядит загрузка данных на Python (библиотека yfinance):
import yfinance as yf
# Загрузка данных Apple с 2020 по 2023 год
data = yf.download("AAPL", start="2020-01-01", end="2023-01-01")
print(data.head())
Очистка данных: подводные камни
Сырые данные редко бывают идеальными. Вот основные проблемы, с которыми вы столкнетесь.
1. Пропуски в данных (Missing Values)
Финансовые рынки не работают 24/7 (кроме крипты). Есть выходные и праздники. В данных могут появляться «дыры» (NaN).
Важно: В финансах нельзя просто удалять строки с пропусками или заполнять их средним значением по всему датасету, так как это нарушит временную структуру.
Лучшая стратегия — Forward Fill (ffill). Мы берем последнее известное значение и переносим его вперед. Логика проста: если цена не менялась (биржа закрыта), значит, она осталась такой же, как в момент закрытия.
2. Корпоративные события (Splits & Dividends)
Это самая коварная ловушка для новичков. Представьте, что акция стоила 100 долларов. Компания провела сплит (дробление) 2 к 1. Теперь у вас две акции по 50 долларов.
Для алгоритма это выглядит как обвал цены на 50% за один день! Чтобы избежать этого, нужно использовать Adjusted Close (Скорректированная цена закрытия). Она пересчитывает исторические цены так, будто сплит произошел в прошлом, сохраняя процентные изменения.
Предварительная обработка (Preprocessing)
Модели машинного обучения плохо работают с «сырыми» ценами. Акция может стоить 10 долларов, а через год — 2000. Такой разброс значений мешает обучению нейросетей.
Переход к доходностям (Returns)
Вместо абсолютной цены мы используем относительное изменение цены — доходность. Это делает ряд более стационарным (его статистические свойства, такие как среднее и дисперсия, меньше меняются со временем).
Простая доходность (Simple Return)
Формула простой доходности выглядит так:
Где:
- — доходность в момент времени .
- — цена в текущий момент времени .
- — цена в предыдущий момент времени .
Логарифмическая доходность (Log Return)
В ML чаще используют логарифмическую доходность. Она обладает свойством аддитивности (доходности за периоды можно складывать) и часто имеет распределение, близкое к нормальному.
Где:
- — логарифмическая доходность.
- — натуральный логарифм.
- — цена в текущий момент.
- — цена в предыдущий момент.
Масштабирование (Scaling)
Нейронные сети работают эффективнее, когда входные данные находятся в небольшом диапазоне (например, от 0 до 1 или имеют среднее 0 и дисперсию 1).
Два основных метода:
- Min-Max Scaling (нормализация): сжимает данные в диапазон [0, 1].
- Standardization (Z-score): делает среднее значение равным 0, а стандартное отклонение равным 1.
Формула стандартизации:
Где:
- — стандартизированное значение.
- — исходное значение.
- — среднее значение выборки (мю).
- — стандартное отклонение выборки (сигма).
Разделение данных: Осторожно, будущее!
В классическом ML мы часто используем функцию train_test_split с перемешиванием (shuffle=True). В финансах это строго запрещено.
Если вы перемешаете данные, модель может обучиться на данных из 2022 года, чтобы предсказывать 2021 год. Это называется Look-ahead bias (подглядывание в будущее).
Данные нужно делить строго хронологически:
- Train: (например, 2010–2018 гг.) — учим модель.
- Validation: (2019–2020 гг.) — подбираем параметры.
- Test: (2021–2022 гг.) — проверяем финальное качество.
Заключение
Мы разобрали первый этап построения ML-системы. Теперь у вас есть понимание того, как собрать данные, почему важен Adjusted Close, зачем нужны логарифмические доходности и как правильно делить выборку. В следующих статьях мы перейдем к созданию признаков (Feature Engineering) и выбору моделей.