Прогнозирование цен акций с помощью машинного обучения

Дата актуализации: , 20:46:19


Содержание

  1. Данные и их подготовка
  2. Фичи: технические индикаторы и новостной анализ
  3. Модели машинного обучения
  4. Метрики оценки
  5. Практическая реализация в Python
  6. Типичные ошибки и подводные камни
  7. Лучшие практики
  8. Перспективы и новые направления
  9. Список использованных источников

Прогнозирование цен акций – одна из самых востребованных задач в финансовой аналитике. Традиционно для этой цели использовались статистические модели (ARIMA, GARCH) и фундаментальный анализ. С начала 2010‑х годов машинное и глубокое обучение стали новой эффективной стратегией, которую применяют инвестиционные фонды, хедж‑фонды и отдельные трейдеры.

В статье рассматриваются:

  • Какие типы данных нужны для построения модели;
  • Как извлекать полезные признаки из цены, объёма и новостей;
  • Какие алгоритмы машинного обучения показывают наилучшие результаты;
  • Как правильно оценивать качество прогноза.

Данные и их подготовка

Для построения модели обычно используют два основных источника:

Рыночные данные (тайм‑серии)

  • Открытие, максимум, минимум, закрытие (OHLC);
  • Объём торгов (volume);
  • Тиковые данные (если нужен микроскопический прогноз).

Фундаментальные и новостные данные

  • Отчёты компаний (EPS, revenue, debt);
  • Экономические индикаторы (инфляция, ставки ЦБ);
  • Тексты новостей и твитов, преобразованные в sentiment‑score.

Пример реального проекта из НИУ ВШЭ показывает, что комбинирование тайм‑серий с новостными признаками позволяет достичь MSE = 0,00015, MAE = 0,0096 и RMSE = 4,56 при прогнозе цены на следующий день, а отклонение от реального значения составило всего 0,34 %.

Шаги предобработки

  1. Очистка от выбросов и шума. Часто используют адаптивные фильтры или скользящие медианные фильтры (см. статья в РБК 2016).
  2. Заполнение пропусков. Методы: линейная интерполяция, K‑Nearest Neighbors (KNN) (см. Хабр 2018).
  3. Нормализация/стандартизация. Для нейронных сетей предпочтительнее Min‑Max scaling до диапазона [0,1].
  4. Разделение на обучающую, валидационную и тестовую выборки. При работе с тайм‑сериями важно сохранять хронологический порядок (no shuffling).

Фичи: технические индикаторы и новостной анализ

Технические индикаторы

Классические индикаторы, которые легко вычисляются из OHLC‑данных:

  • Moving Average (MA) – простое и экспоненциальное скользящее среднее;
  • Relative Strength Index (RSI) – измеряет перекупленность/перепроданность;
  • MACD – разность двух EMA;
  • Bollinger Bands – верхняя/нижняя граница вокруг MA;
  • ATR (Average True Range) – волатильность.

Исследования показывают, что включение от 5 до 15 индикаторов повышает точность прогноза на 3‑7 %.

Анализ новостей и сентимент

Тексты новостей преобразуются в числовые признаки двумя основными способами:

  1. Bag‑of‑Words / TF‑IDF. Простой, но иногда недостаточно информативный.
  2. Эмбеддинги. Предобученные модели (BERT, FinBERT, RoBERTa) дают векторные представления, которые затем можно усреднить по дню.

В работе студентов НИУ ВШЭ использовался sentiment‑score от 0 (негатив) до 1 (позитив) и он оказался одним из самых сильных предикторов краткосрочного движения цены.

Модели машинного обучения

Классические модели

  • Линейная регрессия – базовый уровень, часто используется как «бенчмарк».
  • Random Forest и Gradient Boosting (XGBoost, LightGBM) – хорошо работают с табличными данными и умеют учитывать нелинейные взаимодействия.
  • Support Vector Regression (SVR) – полезна при небольшом объёме данных.

Временные модели

  • ARIMA / SARIMA – традиционный статистический подход.
  • Prophet (Facebook) – учитывает сезонность и праздники.

Глубокие нейронные сети

  1. LSTM / GRU – рекуррентные сети, способные «запоминать» долгосрочные зависимости. В статье на Хабре (2020) показано, что LSTM‑модель на TensorFlow достигает RMSE ≈ 4,2 для акций S&P 500.
  2. 1‑D CNN – быстрый способ извлекать локальные паттерны из цены.
  3. Transformer‑based модели (Temporal Fusion Transformer, Informer) – последние исследования демонстрируют лучшую точность при работе с мультивариантными временными рядами.
  4. Гибридные модели – комбинация LSTM + Gradient Boosting (stacking) часто даёт наилучший результат.

Бинарные классификаторы

Для задач «вверх/вниз» часто используют классификаторы (Logistic Regression, XGBoost, Deep Neural Network). Такой подход удобен, когда цель – определить направление движения, а не точную цену.

Метрики оценки

Выбор метрики зависит от бизнес‑цели:

  • MSE (Mean Squared Error) – штрафует большие отклонения.
  • MAE (Mean Absolute Error) – более интерпретируемая, измеряется в тех же единицах, что и цена.
  • RMSE (Root Mean Squared Error) – часто используется в финансовых конкурсах.
  • MAPE (Mean Absolute Percentage Error) – удобна для сравнения разных акций.
  • Directional Accuracy (DA) – процент правильных предсказаний направления.

В примере из ВШЭ DA = 71 % при использовании LSTM + новостных эмбеддингов.

Практическая реализация в Python

Библиотеки

  • pandas, numpy – работа с данными;
  • ta‑lib – готовые функции технических индикаторов;
  • scikit‑learn – классические модели и метрики;
  • xgboost / lightgbm – градиентный бустинг;
  • tensorflow / keras или pytorch – нейронные сети;
  • transformers (HuggingFace) – предобученные языковые модели для новостного анализа.

Минимальный пример: LSTM + технические индикаторы

import pandas as pd
import numpy as np
import ta
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout

df = pd.read_csv('AAPL.csv', parse_dates=['Date'], index_col='Date')
df = df[['Open','High','Low','Close','Volume']]

df['SMA_10'] = ta.trend.sma_indicator(df['Close'], window=10)
df['RSI_14'] = ta.momentum.rsi(df['Close'], window=14)
df['MACD'] = ta.trend.macd_diff(df['Close'])

df.dropna(inplace=True)

scaler = MinMaxScaler
scaled = scaler.fit_transform(df)

def create_sequences(data, n_steps=60):
 X, y = [], []
 for i in range(len(data)-n_steps):
 X.append(data[i:i+n_steps, :])
 y.append(data[i+n_steps, df.columns.get_loc('Close')])
 return np.array(X), np.array(y)

X, y = create_sequences(scaled, n_steps=60)

train_size = int(0.7len(X))
val_size = int(0.15len(X))
X_train, y_train = X[:train_size], y[:train_size]
X_val, y_val = X[train_size:train_size+val_size], y[train_size:train_size+val_size]
X_test, y_test = X[train_size+val_size:], y[train_size+val_size:]

model = Sequential([
 LSTM(64, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])),
 Dropout(0.2),
 LSTM(32),
 Dropout(0.2),
 Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.fit(X_train, y_train, epochs=30, batch_size=32,
 validation_data=(X_val, y_val), verbose=1)

pred = model.predict(X_test)
pred_rescaled = scaler.inverse_transform(
 np.concatenate([np.zeros((len(pred), df.shape[1]-1)), pred], axis=1)
)[..., -1]

mae = np.mean(np.abs(pred_rescaled ⎯ df['Close'].values[-len(pred):]))
print(f'MAE on test: {mae:.4f}')

Добавление новостного сентимента

Для каждого дня собираем заголовки, пропускаем их через FinBERT и получаем средний sentiment‑score. Затем добавляем столбец Sentiment в датафрейм и переобучаем модель. По результатам исследований, такой подход улучшает MAE примерно на 5‑8 %.

Типичные ошибки и подводные камни

  • Ликвидность и спред. Для малоактивных акций шум может превышать сигнал.
  • Переподгонка (overfitting). Глубокие сети легко «запоминают» исторические аномалии. Используйте dropout, early stopping и кросс‑валидацию.
  • Ложный «look‑ahead». Не допускайте использования будущих данных в обучающей выборке.
  • Неоднородность данных. Разные тайм‑фреймы (минутные, дневные) требуют отдельного моделирования.
  • Смена рыночных режимов. Периоды кризисов могут полностью изменить корреляции; рекомендуется переобучать модель каждые 3‑6 месяцев.

Лучшие практики

  1. Разделяйте данные по времени. Тестовая выборка должна быть «будущей» относительно обучающей.
  2. Аугментация признаков. Комбинируйте технические индикаторы, волатильность и новостной сентимент.
  3. Энсамблирование. Стеккинг из LSTM + Gradient Boosting часто даёт прирост 1‑2 % в DA.
  4. Регулярный мониторинг. Следите за drift‑ом распределения входных признаков.
  5. Интерпретируемость. Используйте SHAP или LIME, чтобы понять, какие признаки влияют на предсказание.

Перспективы и новые направления

В 2024‑2025 годах наблюдается рост интереса к следующим технологиям:

  • Graph Neural Networks (GNN) – моделируют взаимосвязи между разными акциями (корреляционные графы).
  • Large Language Models (LLM) в финансовом контексте: GPT‑4/5, LLaMA‑2, адаптированные под финансовый язык, позволяют генерировать «интеллектуальные» факторы из новостей и аналитических отчетов.
  • Reinforcement Learning (RL) для построения торговых стратегий, где предсказание цены – лишь один из компонентов.
  • Edge‑computing и streaming‑модели (Kafka + Flink) для реального времени.

Список использованных источников

  1. Вивек Паланиаппан, «Машинное обучение: прогнозируем цены акций на фондовом рынке», Хабр, 2020.
  2. Студенты НИУ ВШЭ, «Применение методов машинного обучения для прогнозирования цен акций», 2024.
  3. Себастьян Хайнц, «Разрабатываем простую модель глубокого обучения для прогнозирования цен акций с помощью TensorFlow», Хабр, 2020.
  4. Полина Кабирова (перевод), «Машинное обучение: прогнозируем цены акций», Хабр, 2024.
  5. RBC, «Гадание на нейронах», 2016.
  6. Vatsal Shah, «Техники машинного обучения для прогнозирования цен акций», 2016.
  7. Документы проекта «Разработка модели движения рынка ценных бумаг на основе характеристик новостных сообщений», НИУ ВШЭ, 2017.