В постоянно развивающемся мире финансов точное предсказание движения фондового рынка долгое время было труднодостижимой задачей как для инвесторов, так и для трейдеров. Хотя за эти годы появилось бесчисленное множество стратегий и моделей, один из подходов недавно получил значительное распространение благодаря своей способности фиксировать сложные закономерности и зависимости в исторических данных: долговременная кратковременная память (LSTM). Используя возможности глубокого обучения, LSTM предлагает многообещающий путь для раскрытия информации о непредсказуемой природе фондового рынка. В этой статье мы углубимся в область прогнозов фондового рынка на основе LSTM и исследуем, как этот инновационный подход может изменить инвестиционные стратегии.

По своей сути LSTM — это вариант рекуррентных нейронных сетей (RNN), разработанный специально для решения проблемы исчезающего градиента, от которой страдают традиционные RNN. Проблема исчезающего градиента относится к явлению, когда градиенты ранних слоев в сети становятся все меньше, что препятствует их способности фиксировать долгосрочные зависимости. LSTM преодолевает это ограничение за счет включения ячеек памяти, вентилей и тщательно спроектированных соединений, что позволяет выборочно сохранять и распространять информацию в течение длительных интервалов времени. Эта уникальная архитектура позволяет моделям LSTM фиксировать сложные временные отношения в последовательных данных, что делает их особенно подходящими для прогнозирования данных временных рядов, таких как цены на акции.

Чтобы узнать больше о LSTM, посетите:



Давайте перейдем к нашему анализу биржевых данных и прогнозам.

Импорт необходимых библиотек

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
import math
from sklearn.metrics import mean_squared_error

Здесь мы импортируем pandas, matplotlib для построения графиков, numpy, sklearn для предварительной обработки, настройки масштаба и расчета ошибок, а также tensorflow для построения модели.

Импорт набора данных

Вы можете найти набор данных, который я использовал, в следующем репозитории GitHub.



df = pd.read_csv('D:/stockprice-master/NSE-TATAGLOBAL.csv')
df.head()

Анализ данных

df2 = df.reset_index()['Close']
plt.plot(df2)

Мы будем делать прогнозы акций в колонке Close.

Предварительная обработка данных

scaler = MinMaxScaler()
df2 = scaler.fit_transform(np.array(df2).reshape(-1,1))
df2.shape

(2035, 1)

Здесь мы уменьшаем значения между (0,1).

Сплит-тестирование

train_size = int(len(df2)*0.65)
test_size = len(df2) - train_size
train_data,test_data = df2[0:train_size,:],df2[train_size:len(df2),:1]

Здесь мы взяли 65% данных для обучения, а остальные 35% для тестирования.

def create_dataset(dataset, time_step = 1):
    dataX,dataY = [],[]
    for i in range(len(dataset)-time_step-1):
                   a = dataset[i:(i+time_step),0]
                   dataX.append(a)
                   dataY.append(dataset[i + time_step,0])
    return np.array(dataX),np.array(dataY)

Создается функция create_dataset(), которая разбивает набор данных на 2 в зависимости от выбранного временного шага. Первый набор данных, т.е. dataX принимает значения в качестве входных данных, а второй набор данных dataY принимает значения в качестве выходных данных. По сути, он создает матрицу набора данных из вышеуказанного набора данных.

# calling the create dataset function to split the data into 
# input output datasets with time step 100
time_step = 100
X_train,Y_train =  create_dataset(train_data,time_step)
X_test,Y_test =  create_dataset(test_data,time_step)
# checking values
print(X_train.shape)
print(X_train)
print(X_test.shape)
print(Y_test.shape)

(1221, 100)
[[0.62418301 0.62214052 0.62622549 … 0.83455882 0.86213235 0.85273693]
[0.62214052 0.62622549 0.63378268 … 0.86213235 0.85273693 0.87111928]
[0.62622549 0.63378268 0.62234477 … 0.85273693 0.87111928 0.84497549]

[0.34517974 0.31781046 0.33047386 … 0.2816585 0.27001634 0.26531863]
[0.31781046 0.33047386 0.32128268 … 0.27001634 0.26531863 0.27389706]
[0.33047386 0.32128268 0.34007353 … 0.26531863 0.27389706 0.25347222]](612, 100)
(612,)

Создание и настройка модели LSTM

model = Sequential()
model.add(LSTM(50,return_sequences = True,input_shape = (X_train.shape[1],1)))
model.add(LSTM(50,return_sequences = True))
model.add(LSTM(50))
model.add(Dense(1))
model.compile(loss = 'mean_squared_error',optimizer = 'adam')

Здесь мы добавили 4 слоя LSTM с 1 в качестве входного слоя, 2 в качестве скрытых слоев и 1 для выходного слоя как Dense. В первых3слоях мы взяли 50 нейронови 1для вывода.

Мы скомпилировали модель с помощью Оптимизатора Адама, который будет рассчитывать потери, используя среднеквадратичную ошибку.

model.summary()

model.fit(X_train,Y_train,validation_data = (X_test,Y_test),epochs = 100,batch_size = 64,verbose = 1)

Здесь модель была обучена для 100 эпох, каждая с размером пакета 64.

Матрица прогнозирования и проверки эффективности

train_predict = model.predict(X_train)
test_predict = model. Predict(X_test)
# transform to original form
train_predict = scaler.inverse_transform(train_predict)
test_predict = scaler.inverse_transform(test_predict)

Поскольку мы уменьшили значения набора данных в 0 и 1, нам нужно снова обратить преобразование, чтобы получить точные прогнозируемые значения на графике, следовательно, здесь мы инвертируем преобразование обоих прогнозов.

Теперь пришло время рассчитать матрицу эффективности rmse.

print(math.sqrt(mean_squared_error(Y_train,train_predict)))
print(math.sqrt(mean_squared_error(Y_test,test_predict)))

166.74853517776896
116.51567464682968

Здесь оба рассчитанных значения очень близки, т.е. in разница меньше 50, что указывает на хорошую точность модели.

Построение графика

look_back = 100
trainPredictPlot = np.empty_like(df2)
trainPredictPlot[:,:] = np.nan
trainPredictPlot[look_back : len(train_predict)+look_back,:] = train_predict

Переменная Lookback принимает количество значений после текущего значения, т.е.; запоминание предыдущих 100 значений, что совпадает с LSTM. Здесь каждый раз при построении графика trainPredictionPlot будет брать 100 значений позади них и строить их. и график идет от предыдущего 100-го значения и продолжается до длины trainpredict + ретроспективный взгляд, т.е.; 100.

testPredictPlot = np.empty_like(df2)
testPredictPlot[:,:] = np.nan
testPredictPlot[len(train_predict)+(look_back)*2 + 1 : len(df2) - 1,:] = test_predict

То же самое касается TestPredictionPlot, но на этот раз он принимает значения рядом с Train_predict. Здесь возврат начнется с того места, где заканчивается прогноз поезда.

plt.plot(scaler.inverse_transform(df2))
plt.plot(trainPredictPlot)
plt.plot(testPredictPlot)
plt.show()

Здесь оранжевый цвет — это график TrainPredictionPlot,зеленый – TestPredictionPlot, асиний – фактический набор данных. Следовательно, мы видим, что наша модель очень хорошо предсказала цены акций.

Модель предназначена только для учебных целей и не рекомендуется для каких-либо будущих инвестиций.

Заключение

В заключение, использование долговременной краткосрочной памяти (LSTM) для прогнозов фондового рынка представляет собой значительный шаг вперед в области финансового прогнозирования. Этот инновационный подход, основанный на силе глубокого обучения, продемонстрировал свой потенциал для выявления сложных закономерностей и зависимостей в исторических данных фондового рынка. Включая модели LSTM в инвестиционные стратегии, трейдеры и инвесторы могут получить ценное преимущество в навигации по непредсказуемому характеру фондового рынка.

Чтобы узнать больше о таких работах, посетите:



До тех пор,

Удачного кодирования :D