1. Сбор, очистка и предварительная обработка финансовых временных рядов
Сбор, очистка и предварительная обработка финансовых временных рядов
Добро пожаловать на курс «Разработка 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):
Очистка данных: подводные камни
Сырые данные редко бывают идеальными. Вот основные проблемы, с которыми вы столкнетесь.
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).
Два основных метода:
Формула стандартизации:
Где: * — стандартизированное значение. * — исходное значение. * — среднее значение выборки (мю). * — стандартное отклонение выборки (сигма).
Разделение данных: Осторожно, будущее!
В классическом ML мы часто используем функцию train_test_split с перемешиванием (shuffle=True). В финансах это строго запрещено.
Если вы перемешаете данные, модель может обучиться на данных из 2022 года, чтобы предсказывать 2021 год. Это называется Look-ahead bias (подглядывание в будущее).
Данные нужно делить строго хронологически:
Заключение
Мы разобрали первый этап построения ML-системы. Теперь у вас есть понимание того, как собрать данные, почему важен Adjusted Close, зачем нужны логарифмические доходности и как правильно делить выборку. В следующих статьях мы перейдем к созданию признаков (Feature Engineering) и выбору моделей.