Дата актуализации: , 20:46:19
Содержание
- Данные и их подготовка
- Фичи: технические индикаторы и новостной анализ
- Модели машинного обучения
- Метрики оценки
- Практическая реализация в Python
- Типичные ошибки и подводные камни
- Лучшие практики
- Перспективы и новые направления
- Список использованных источников
Прогнозирование цен акций – одна из самых востребованных задач в финансовой аналитике. Традиционно для этой цели использовались статистические модели (ARIMA, GARCH) и фундаментальный анализ. С начала 2010‑х годов машинное и глубокое обучение стали новой эффективной стратегией, которую применяют инвестиционные фонды, хедж‑фонды и отдельные трейдеры.
В статье рассматриваются:
- Какие типы данных нужны для построения модели;
- Как извлекать полезные признаки из цены, объёма и новостей;
- Какие алгоритмы машинного обучения показывают наилучшие результаты;
- Как правильно оценивать качество прогноза.
Данные и их подготовка
Для построения модели обычно используют два основных источника:
Рыночные данные (тайм‑серии)
- Открытие, максимум, минимум, закрытие (OHLC);
- Объём торгов (volume);
- Тиковые данные (если нужен микроскопический прогноз).
Фундаментальные и новостные данные
- Отчёты компаний (EPS, revenue, debt);
- Экономические индикаторы (инфляция, ставки ЦБ);
- Тексты новостей и твитов, преобразованные в sentiment‑score.
Пример реального проекта из НИУ ВШЭ показывает, что комбинирование тайм‑серий с новостными признаками позволяет достичь MSE = 0,00015, MAE = 0,0096 и RMSE = 4,56 при прогнозе цены на следующий день, а отклонение от реального значения составило всего 0,34 %.
Шаги предобработки
- Очистка от выбросов и шума. Часто используют адаптивные фильтры или скользящие медианные фильтры (см. статья в РБК 2016).
- Заполнение пропусков. Методы: линейная интерполяция, K‑Nearest Neighbors (KNN) (см. Хабр 2018).
- Нормализация/стандартизация. Для нейронных сетей предпочтительнее Min‑Max scaling до диапазона [0,1].
- Разделение на обучающую, валидационную и тестовую выборки. При работе с тайм‑сериями важно сохранять хронологический порядок (no shuffling).
Фичи: технические индикаторы и новостной анализ
Технические индикаторы
Классические индикаторы, которые легко вычисляются из OHLC‑данных:
- Moving Average (MA) – простое и экспоненциальное скользящее среднее;
- Relative Strength Index (RSI) – измеряет перекупленность/перепроданность;
- MACD – разность двух EMA;
- Bollinger Bands – верхняя/нижняя граница вокруг MA;
- ATR (Average True Range) – волатильность.
Исследования показывают, что включение от 5 до 15 индикаторов повышает точность прогноза на 3‑7 %.
Анализ новостей и сентимент
Тексты новостей преобразуются в числовые признаки двумя основными способами:
- Bag‑of‑Words / TF‑IDF. Простой, но иногда недостаточно информативный.
- Эмбеддинги. Предобученные модели (BERT, FinBERT, RoBERTa) дают векторные представления, которые затем можно усреднить по дню.
В работе студентов НИУ ВШЭ использовался sentiment‑score от 0 (негатив) до 1 (позитив) и он оказался одним из самых сильных предикторов краткосрочного движения цены.
Модели машинного обучения
Классические модели
- Линейная регрессия – базовый уровень, часто используется как «бенчмарк».
- Random Forest и Gradient Boosting (XGBoost, LightGBM) – хорошо работают с табличными данными и умеют учитывать нелинейные взаимодействия.
- Support Vector Regression (SVR) – полезна при небольшом объёме данных.
Временные модели
- ARIMA / SARIMA – традиционный статистический подход.
- Prophet (Facebook) – учитывает сезонность и праздники.
Глубокие нейронные сети
- LSTM / GRU – рекуррентные сети, способные «запоминать» долгосрочные зависимости. В статье на Хабре (2020) показано, что LSTM‑модель на TensorFlow достигает RMSE ≈ 4,2 для акций S&P 500.
- 1‑D CNN – быстрый способ извлекать локальные паттерны из цены.
- Transformer‑based модели (Temporal Fusion Transformer, Informer) – последние исследования демонстрируют лучшую точность при работе с мультивариантными временными рядами.
- Гибридные модели – комбинация 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 месяцев.
Лучшие практики
- Разделяйте данные по времени. Тестовая выборка должна быть «будущей» относительно обучающей.
- Аугментация признаков. Комбинируйте технические индикаторы, волатильность и новостной сентимент.
- Энсамблирование. Стеккинг из LSTM + Gradient Boosting часто даёт прирост 1‑2 % в DA.
- Регулярный мониторинг. Следите за drift‑ом распределения входных признаков.
- Интерпретируемость. Используйте 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) для реального времени.
Список использованных источников
- Вивек Паланиаппан, «Машинное обучение: прогнозируем цены акций на фондовом рынке», Хабр, 2020.
- Студенты НИУ ВШЭ, «Применение методов машинного обучения для прогнозирования цен акций», 2024.
- Себастьян Хайнц, «Разрабатываем простую модель глубокого обучения для прогнозирования цен акций с помощью TensorFlow», Хабр, 2020.
- Полина Кабирова (перевод), «Машинное обучение: прогнозируем цены акций», Хабр, 2024.
- RBC, «Гадание на нейронах», 2016.
- Vatsal Shah, «Техники машинного обучения для прогнозирования цен акций», 2016.
- Документы проекта «Разработка модели движения рынка ценных бумаг на основе характеристик новостных сообщений», НИУ ВШЭ, 2017.