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

Что такое данные временных рядов и их анализ?

Данные временного ряда представляют собой набор наблюдений или измерений, записанных в течение последовательности равноотстоящих интервалов времени.

Анализ временных рядов включает методы анализа данных временных рядов для извлечения значимой статистики и других характеристик данных. Прогнозирование временных рядов — это использование модели для прогнозирования будущих значений на основе ранее наблюдаемых значений.

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

Анализ фондового рынка

Акция — это доля в собственности компании. Компании продают ценные бумаги людям, чтобы получить деньги, необходимые им для роста. Люди покупают ценные бумаги как инвестиции или способ возможного заработка.

В целом анализ фондового рынка делится на фундаментальный анализ и технический анализ.

  • Фундаментальный анализ включает анализ будущей прибыльности компании на основе ее текущей бизнес-среды и финансовых показателей.
  • Технический анализ, с другой стороны, включает в себя чтение графиков и использование статистических данных для определения тенденций на фондовом рынке.

Наше внимание будет сосредоточено на части технического анализа. Начнем с краткого изложения теоретической части.

Рекуррентная нейронная сеть (RNN)

Рекуррентная нейронная сеть (RNN) является расширением обычной нейронной сети с прямой связью, которая может обрабатывать входные последовательности переменной длины.

Рекуррентные нейронные сети отличаются своей «памятью», поскольку они берут информацию из предыдущих входов, чтобы влиять на текущий ввод и вывод.

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

Градиент — это частная производная его входных данных. Если вы не знаете, что это значит, подумайте об этом так: градиент измеряет, насколько изменится результат функции, если вы немного измените входные данные.

ВЗРЫВНЫЕ ГРАДИЕНТЫ. Взрывные градиенты — это когда алгоритм без особых причин приписывает слишком большое значение весам. Эту проблему можно легко решить, усекая или сжимая градиенты.

ИСЧЕЗАЮЩИЕ ГРАДИЕНТЫ.Исчезающие градиенты возникают, когда значения градиента слишком малы. Поскольку градиенты контролируют, насколько сеть учится во время обучения, если градиенты минимальны или равны нулю, то обучение практически не может происходить, что приводит к плохой прогнозирующей эффективности.

Теперь давайте обсудим самый популярный и эффективный способ решения проблемы исчезающего градиента: LSTM (долговременная память).

Долгосрочная кратковременная память (LSTM)

Сети долговременной кратковременной памяти являются расширением рекуррентных нейронных сетей, расширяющих память. Следовательно, он хорошо подходит для обучения на осмысленном опыте, который имеет очень большие временные задержки. Давайте возьмем базовый пример для лучшего понимания.

Предположим, вы хотите предсказать последнее слово в тексте: «Облака находятся в ______».

Самый очевидный ответ на этот вопрос — небо. Нам не нужен дополнительный контекст, чтобы предсказать последнее слово в приведенном выше предложении.

Рассмотрите это предложение: «Я живу в Испании последние 10 лет… я свободно говорю на ______».

Слово, которое вы угадаете, будет зависеть от нескольких предыдущих слов в контексте. Здесь нам нужен контекст Испании, чтобы предсказать последнее слово в тексте, и наиболее подходящий ответ на это предложение — «испанский». Разрыв между релевантной информацией и моментом, когда она необходима, может стать очень большим. Здесь на помощь приходит LSTM.

LSTM содержат информацию в памяти, которую можно рассматривать как закрытую ячейку. Есть три ворот: ворота входа, забывания и ворот выхода.

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

Достаточно теории, теперь давайте начнем программировать; Я буду предоставлять объяснение кода со скриншотами, я дам ссылку на исходный код в конце блога:

Мы будем использовать набор данных с веб-сайта «https://www.tiingo.com/». Все, что вам нужно сделать, это:

1. Зарегистрируйтесь на сайте

2. Нажмите на API

3. Нажмите «Перейти к документации».

4. Найдите свой личный сгенерированный ключ API.

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

import pandas_datareader as pdr
import pandas as pd
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 tensorflow as tf
import matplotlib.pyplot as plt
import math
from sklearn.metrics import mean_squared_error

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

key = '43210fb49481145203f782ffa978dcaeb618e051'
df = pdr.get_data_tiingo('AAPL', api_key=key)
df.to_csv('AAPL.csv')
df = pd.read_csv('AAPL.csv')

Анализ набора данных:

· Open: Стартовая цена акции в течение дня

· High: максимальная цена акции за день

· Низкий: самая низкая цена акции за день

· Закрытие: окончательная цена, по которой акции были проданы.

Мы будем использовать adjClose в качестве метки цели для нашей модели. Поскольку некоторые корпоративные действия, такие как дробление акций, выплата дивидендов или выпуск прав, влияют на фактическую цену акций, но не отражаются на ежедневной цене закрытия. Скорректированная цена закрытия учитывает все эти факторы.

Выбор и разделение целевой переменной с остальными данными:

df1 = df.reset_index()['adjClose']

Выполните масштабирование функций для преобразования данных:

scaler=MinMaxScaler(feature_range=(0,1))
df1=scaler.fit_transform(np.array(df1).reshape(-1,1))

Разделение Train-Test:

training_size=int(len(df1)*0.67)
test_size=len(df1)-training_size
train_data,test_data=df1[0:training_size,:],df1[training_size:len(df1),:1]

Создание данных с временными шагами:

LSTM ожидают, что наши данные будут в определенном формате, обычно в формате 3D. Здесь мы преобразуем массив значений в матрицу набора данных.

import numpy
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 numpy.array(dataX), numpy.array(dataY)
time_step = 100
X_train, y_train = create_dataset(train_data, time_step)
X_test, ytest = create_dataset(test_data, time_step)

Изменение данных:

X_train =X_train.reshape(X_train.shape[0],X_train.shape[1] , 1)
X_test = X_test.reshape(X_test.shape[0],X_test.shape[1] , 1)

Создание модели LSTM:

Последовательный для инициализации нейронной сети

Dense для добавления плотно связанного слоя нейронной сети.

LSTM для добавления слоя долговременной кратковременной памяти.

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

После составления прогнозов мы используем inverse_transform, чтобы вернуть цены акций в нормальном читаемом формате.

train_predict=scaler.inverse_transform(train_predict)
test_predict=scaler.inverse_transform(test_predict)

График результатов:

look_back=100
trainPredictPlot = numpy.empty_like(df1)
trainPredictPlot[:, :] = np.nan
trainPredictPlot[look_back:len(train_predict)+look_back, :] = train_predict
# shift test predictions for plotting
testPredictPlot = numpy.empty_like(df1)
testPredictPlot[:, :] = numpy.nan
testPredictPlot[len(train_predict)+(look_back*2)+1:len(df1)-1, :] = test_predict
# plot baseline and predictions
plt.plot(scaler.inverse_transform(df1))
plt.plot(trainPredictPlot)
plt.plot(testPredictPlot)
plt.show()

RMSE for training data set: 43.69506227497433
RMSE for test data set: 107.13154705315813

Заключение:

Есть несколько других методов прогнозирования цен на акции, таких как скользящие средние, линейная регрессия, K-ближайший сосед, ARIMA и Prophet. Вы можете протестировать эти методы и сравнить их производительность с Keras LSTM.

КОД ССЫЛКА:Нажмите здесь

Использованная литература:

https://www.simplilearn.com/tutorials/deep-learning-tutorial/rnn

https://www.analyticsvidhya.com/blog/2018/10/predicting-stock-price-machine-learningnd-deep-learning-techniques-python/

https://www.youtube.com/watch?v=H6du_pfuznE