Дата публикации: 23:13:29 ()
Прогнозирование цен акций остаётся одной из самых сложных и одновременно востребованных задач в финансовой аналитике. Инвесторы и трейдеры стремятся понять, будет ли цена расти или падать в ближайшие часы, дни или недели, основываясь на исторических данных, новостях и макроэкономических показателях.
В данной статье мы рассмотрим:
- классические статистические подходы;
- методы машинного обучения (Random Forest, Gradient Boosting);
- нейросетевые архитектуры, в частности LSTM и её модификации;
- как добавить эмбеддинги тикеров в LSTM‑модель, следуя туториалу Lilian Weng;
- практические шаги по подготовке данных, обучению и оценке модели.
Классические статистические методы
Скользящие средние и экспоненциальное сглаживание
Простейший способ – вычислить простое скользящее среднее (SMA) или экспоненциальное скользящее среднее (EMA) за определённый период (например, 20, 50, 200 дней). Пересечение короткой и длинной SMA часто используется как сигнал покупки/продажи.
Авторегрессионные модели (AR, ARIMA, SARIMA)
Эти модели описывают текущее значение временного ряда как линейную комбинацию его прошлых значений и случайных шумов. Для акций, где присутствуют сезонные эффекты (например, квартальные отчёты), применяют SARIMA.
Индикаторы технического анализа
RSI, MACD, полосы Боллинджера, осциллятор Стохастик и др. – этоderived признаки, которые часто подаются на вход моделей машинного обучения.
Машинное обучение без нейросетей
Случайный лес (Random Forest)
Ансамбль деревьев решений, устойчивый к переобучению и способный работать с heterogeneous признаками (цены, объёмы, настроения из новостей, макроэкономические индикаторы).
Градиентный бустинг (XGBoost, LightGBM, CatBoost)
Обеспечивают высокую точность на структурированных данных, позволяют учитывать нелинейные взаимодействия и работать с пропущенными значениями.
Подготовка признаков
- Исторические цены (open, high, low, close) за N последних дней;
- Объёмы торгов;
- Технические индикаторы (SMA, EMA, RSI, MACD);
- Новостные эмбеддинги (например, TF‑IDF или BERT‑векторы заголовков);
- Макроэкономические показатели (ВВП, инфляция, процентные ставки).
Нейросетевые подходы
Почему RNN/LSTM?
Временные ряды акций обладают последовательной структурой, где важна не только текущая величина, но и порядок наблюдений. Рекуррентные нейронные сети (RNN) способны «запоминать» информацию из прошлых шагов, а LSTM (Long Short‑Term Memory) решает проблему исчезающего градиента благодаря ячейкам с управляемыми воротами.
Базовая архитектура LSTM для одной акции
model = Sequential([
LSTM(64, input_shape=(window_size, n_features), return_sequences=False),
Dropout(0.2),
Dense(1) # прогноз цены закрытия на следующий шаг
])
model.compile(optimizer='adam', loss='mse')
Расширение на множество акций: эмбеддинги тикеров
В туториале Lilian Weng предложено дополнить входной вектор одним‑hot или обученным эмбеддингом тикера, чтобы одна сеть могла обучаться одновременно на десятках или сотнях акций.
Формирование входных данных
- Для каждой акции формируем скользящее окно длиной
window_size(например, 60 дней). - К каждому временному шагу добавляем вектор эмбеддинга тикера размером
emb_dim(например, 8).
Пример кода (Python, Keras)
import numpy as np
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, LSTM, Dense, Dropout, Embedding, Concatenate
window_size = 60
n_features = 5 # open, high, low, close, volume
n_tickers = 100 # количество уникальных тикеров
emb_dim = 8
price_input = Input(shape=(window_size, n_features), name='price_input')
ticker_input = Input(shape=(1,), name='ticker_input')
ticker_emb = Embedding(input_dim=n_tickers, output_dim=emb_dim)(ticker_input)
ticker_emb_repeated = tf.keras.layers.Lambda(lambda x: tf.repeat(x, window_size, axis=1))(ticker_emb)
merged = Concatenate(axis=-1)([price_input, ticker_emb_repeated]) # (batch, window, n_features+emb_dim)
x = LSTM(64)(merged)
x = Dropout(0.2)(x)
output = Dense(1, name='price_pred')(x)
model = Model(inputs=[price_input, ticker_input], outputs=output)
model.compile(optimizer='adam', loss='mse')
model.summary
После обучения модель способна выдавать прогноз цены закрытия для любого тикера, подавая на вход соответствующий индекс тикера и его историческое окно.
Пошаговая инструкция по построению модели
- Сбор данных – загрузите исторические цены (например, через Yahoo Finance, Alpha Vantage или MOEX) за последние 5‑10 лет.
- Очистка – удалите дни с отсутствием торгов, заполните пропуски методом forward fill или линейной интерполяции.
- Формирование признаков – вычислите технические индикаторы, нормализуйте цены и объёмы (например, MinMaxScaler к диапазону [0,1]).
- Создание скользящих окон – для каждого дня формируйте X[t‑window_size:t] и y[t] (цена закрытия на следующий день).
- Подготовка эмбеддингов тикеров – присвойте каждому тикеру целочисленный ID и создайте маппинг.
- Разделение на train/val/test – обычно 70%/15%/15% по времени, чтобы избежать утечки будущей информации.
- Обучение – используйте Adam optimizer, функцию потерь MSE, раннюю остановку по validation loss.
- Оценка – метрики: MAE, RMSE, MAPE; additionally, направление движения (accuracy of sign prediction).
- Инференс – подавайте последнее доступное окно и получаете прогноз на следующий день/неделю.
Практические советы и ограничения
- Регуляризация – dropout, L2‑регуляция весов помогают избежать переобучения на шумных финансовых данных.
- Ансамбли – комбинируйте прогнозы LSTM, Random Forest и линейных моделей (например, через средневзвешенное голосование).
- Внешние факторы – новостные сентименты, отчёты о прибылях, изменения в процентных ставках могут существенно улучшить качество.
- Режим работы рынка – учитывайте торговые часы, праздники и сессии иначе влияния, не отражённые в исторических ценах.
- Переобучение к конкретному периоду – финансовые рынки нестационарны; регулярно переобучайте модель (например, ежемесячно) на свежих данных.
Предсказание цены акции – задача на стыке статистики, машинного обучения и предметной области. Классические методы (ARIMA, технические индикаторы) дают быструю интерпретируемую базу, тогда как модели машинного обучения (Random Forest, Gradient Boosting) способны сложные нелинейные зависимости. Нейросетевые подходы, особенно LSTM с эмбеддингами тикеров, позволяют построить единую модель, обучающуюся одновременно на множестве активов и использующую временную структуру данных.
Следуя предложенной пошаговой инструкции, вы сможете создать рабочий пайплайн для прогнозирования цен, экспериментировать с различными наборами признаков и оценивать качество модели на реальных данных. Помните, однако, что финансовые рынки обладают высокой степенью шума и неопределённости, поэтому любые прогнозы следует использовать как один из инструментов принятия решения, дополняя их фундаментальным анализом и управлением рисками.
Автор: ваш помощник, основанный на информации из открытых источников и туториале Lilian Weng.