Дисклеймер: конкретно приведённый программный код определённо НЕ следует использовать для прогнозирования данных торгов и/или построения финансовых рекомендаций; он приведён исключетельно в целях ознакомления с научным подходом. Это только шаблонная теоретическая реализация. В реальности, используемые модели ИИ гораздо более комплексные.
Преамбула
Временные ряды представляют собой последовательности значений, измеренных через регулярные интервалы времени. Прогнозирование подобных данных может быть существенно важным для аналитиков. Одним из современных подходов к моделированию временных рядов является использование нейронных сетей на основе авторегрессионных моделей.
Традиционные статистические методы, такие как ARIMA (Авторегрессия – интегрированное Скользящее среднее), используются для прогнозирования временных рядов. Однако они имеют свои ограничения, особенно при обработке больших объемов данных и нелинейных зависимостей. ИИ на основе нейронных сетей может превосходить статистические методы за счет своей способности захватывать сложные нелинейные зависимости в данных.
Авторегрессионная модель (AR) основывается на предположении, что текущее значение временного ряда зависит от его предыдущих значений.
Нейронные сети
Нейронные сети, такие как LSTM (Long Short-Term Memory) и GRU (Gated Recurrent Units), часто используются для обработки временных рядов. Эти сети могут запоминать долгосрочные зависимости и эффективно справляться с проблемами, связанными с градиентным затуханием. В силу своих особенностей, при обучении нейронных сетей на основе LSTM или – в меньшей степени – GRU, большая нагрузка приходится на центральный процессор компьютера (CPU), задействованного в обучении, в отличии от многих других нейронный сетей, который предъявляют высокие требования к графическому процессору (GPU). В случае, когда компьютер заточен под вторую ситуацию, а CPU не достаточно мощный, исследователи применяют CNN (Convolutional Neural Networks – свёрточные нейронные сети) в качестве прокси-подхода, который даёт почти одинаковые результаты с первыми двумя; в остальном, они обычно используются для задач компьютерного зрения.
Пример на Python с использованием TensorFlow 2
Для иллюстрации рассмотрим возможную реализацию ИИ на основе LSTM с применением авторегрессии первого порядка – AR(1) – для прогнозирования временных рядов. В этом примере мы будем использовать библиотеку TensorFlow 2.
Шаг 1: Загрузка и предобработка данных
Для примера будем использовать исторические данные. Предполагается, что в окружении существует файл data.csv с таблицей данных по одной сущности, где есть столбцы Date и Close, и уже установлены нужные внешние библиотеки (pandas, numpy, matplotlib, scikit-learn, tensorflow).
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
# Загрузка данных
data = pd.read_csv('data.csv')
data = data[['Date', 'Close']]
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)
# Нормализация данных
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data)
# Подготовка данных для обучения
def create_dataset(data, time_step=1):
X, y = [], []
for i in range(len(data) - time_step - 1):
a = data[i:(i + time_step), 0]
X.append(a)
y.append(data[i + time_step, 0])
return np.array(X), np.array(y)
time_step = 60
# Датасет для AR(1) – авторегрессии первого порядка
X, y = create_dataset(scaled_data, time_step)
# Решейп данных для LSTM
X = X.reshape(X.shape[0], X.shape[1], 1)
Шаг 2: Создание и обучение модели ИИ
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
# Создание модели
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(time_step, 1)))
model.add(LSTM(50, return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))
# Компиляция модели
model.compile(optimizer='adam', loss='mean_squared_error')
# Обучение модели
model.fit(X, y, batch_size=1, epochs=10)
Шаг 3: Прогнозирование и визуализация результатов
# Прогнозирование на тестовых данных
train_size = int(len(scaled_data) * 0.67)
test_size = len(scaled_data) - train_size
train_data, test_data = scaled_data[0:train_size, :], scaled_data[train_size:len(scaled_data), :]
X_test, y_test = create_dataset(test_data, time_step)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)
predictions = model.predict(X_test)
predictions = scaler.inverse_transform(predictions)
# Визуализация
train = data[:train_size]
valid = data[train_size:]
valid['Predictions'] = predictions
plt.figure(figsize=(16, 8))
plt.title('Модель LSTM')
plt.xlabel('Дата')
plt.ylabel('Цена закрытия')
plt.plot(train['Close'])
plt.plot(valid[['Close', 'Predictions']])
plt.legend(['Train', 'Val', 'Predictions'], loc='lower right')
plt.show()
Заключение
Использование нейронных сетей, таких как LSTM, для моделирования временных рядов биржевых данных в теории предоставляет мощные инструменты для прогнозирования. Подобные модели способны описывать сложные нелинейные зависимости и по скорости обработке и эффективности использования вычислительных мощностей превосходить традиционные статистические методы в условиях большого объема данных – в этом их ключевое преимущество. Однако стоит учитывать, что для достижения наилучших результатов необходима тщательная предобработка данных, настройка гиперпараметров модели, не говоря уже о подборе дополнительных (экзогенных) данных, ведь одной авторегрессией многие временные ряды просто не описать.