Визуализация данных, Глубокое обучение

Прогнозирование временных рядов: прогнозирование цен на акции с использованием модели LSTM

В этом посте я покажу вам, как прогнозировать цены на акции, используя модель прогнозирования LSTM.

1. Введение

1.1. Временные ряды и модели прогнозирования

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

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

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

Временной ряд - это последовательность наблюдений, сделанных последовательно во времени.

Наблюдение: временные ряды записываются в дискретном временном масштабе.

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

2. Модель LSTM

Долгая краткосрочная память (LSTM) - это архитектура искусственной рекуррентной нейронной сети (RNN), используемая в области глубокого обучения. В отличие от стандартных нейронных сетей с прямой связью, LSTM имеет обратную связь. Он может обрабатывать не только отдельные точки данных (например, изображения), но и целые последовательности данных (например, речь или видеовходы).

Модели LSTM могут хранить информацию в течение определенного периода времени.

Другими словами, у них есть объем памяти. Помните, что LSTM расшифровывается как Long-Short-Term Memory Model.

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

3. Получение данных истории курсов акций.

Благодаря Yahoo Finance мы можем получать данные бесплатно. Воспользуйтесь следующей ссылкой, чтобы получить историю курсов акций TESLA: https://finance.yahoo.com/quote/TSLA/history?period1=1436486400&period2=1594339200&interval=1d&filter=history&frequency=1d

Вы должны увидеть следующее:

Нажмите Загрузить и сохраните файл .csv локально на своем компьютере.

Данные с 2015 по настоящее время (2020)!

4. рабочий пример Python

Необходимые модули: Keras, Tensorflow, Pandas, Scikit-Learn и Numpy

Мы собираемся построить многоуровневую рекуррентную нейронную сеть LSTM, чтобы предсказывать последнее значение последовательности значений, т. Е. Акции TESLA. цена в этом примере.

Давайте загрузим данные и проверим их:

import math
import matplotlib.pyplot as plt
import keras
import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from keras.layers import *
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
from keras.callbacks import EarlyStopping
df=pd.read_csv("TSLA.csv")
print(‘Number of rows and columns:’, df.shape)
df.head(5)

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



Прогнозируемое целевое значение будет значением цены акции «Close».

training_set = df.iloc[:800, 1:2].values
test_set = df.iloc[800:, 1:2].values

Перед подгонкой модели рекомендуется нормализовать данные. Это повысит производительность. Подробнее о Min-Max Scaler можно прочитать здесь:



Давайте создадим входные функции с временным лагом в 1 день (лаг 1):

# Feature Scaling
sc = MinMaxScaler(feature_range = (0, 1))
training_set_scaled = sc.fit_transform(training_set)
# Creating a data structure with 60 time-steps and 1 output
X_train = []
y_train = []
for i in range(60, 800):
    X_train.append(training_set_scaled[i-60:i, 0])
    y_train.append(training_set_scaled[i, 0])
X_train, y_train = np.array(X_train), np.array(y_train)
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
#(740, 60, 1)

Теперь мы преобразовали данные в следующий формат (# значения, # временные шаги, # 1-мерный вывод).

Теперь пора построить модель. Мы построим LSTM с 50 нейронами и 4 скрытыми слоями. Наконец, мы назначим 1 нейрон в выходном слое для прогнозирования нормализованной цены акций. Мы будем использовать функцию потерь MSE и оптимизатор стохастического градиентного спуска Adam.

Примечание: это займет некоторое время (~ 5 минут).

model = Sequential()
#Adding the first LSTM layer and some Dropout regularisation
model.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
model.add(Dropout(0.2))
# Adding a second LSTM layer and some Dropout regularisation
model.add(LSTM(units = 50, return_sequences = True))
model.add(Dropout(0.2))
# Adding a third LSTM layer and some Dropout regularisation
model.add(LSTM(units = 50, return_sequences = True))
model.add(Dropout(0.2))
# Adding a fourth LSTM layer and some Dropout regularisation
model.add(LSTM(units = 50))
model.add(Dropout(0.2))
# Adding the output layer
model.add(Dense(units = 1))
# Compiling the RNN
model.compile(optimizer = 'adam', loss = 'mean_squared_error')
# Fitting the RNN to the Training set
model.fit(X_train, y_train, epochs = 100, batch_size = 32)

Когда примерка закончена, вы должны увидеть что-то вроде этого:

Подготовьте тестовые данные (измените их):

# Getting the predicted stock price of 2017
dataset_train = df.iloc[:800, 1:2]
dataset_test = df.iloc[800:, 1:2]
dataset_total = pd.concat((dataset_train, dataset_test), axis = 0)
inputs = dataset_total[len(dataset_total) - len(dataset_test) - 60:].values
inputs = inputs.reshape(-1,1)
inputs = sc.transform(inputs)
X_test = []
for i in range(60, 519):
    X_test.append(inputs[i-60:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
print(X_test.shape)
# (459, 60, 1)

Делайте прогнозы с помощью набора тестов.

predicted_stock_price = model.predict(X_test)
predicted_stock_price = sc.inverse_transform(predicted_stock_price)

Давайте теперь визуализируем результаты:

# Visualising the results
plt.plot(df.loc[800:, ‘Date’],dataset_test.values, color = ‘red’, label = ‘Real TESLA Stock Price’)
plt.plot(df.loc[800:, ‘Date’],predicted_stock_price, color = ‘blue’, label = ‘Predicted TESLA Stock Price’)
plt.xticks(np.arange(0,459,50))
plt.title('TESLA Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('TESLA Stock Price')
plt.legend()
plt.show()

5. Результаты

Используя отставание в 1 (т. е. с шагом в один день):

Наблюдение: огромный спад в марте 2020 года из-за изоляции от COVID-19!

Мы ясно видим, что наша модель работала очень хорошо. Он способен точно следовать за большинством беспрецедентных прыжков / падений; однако для самых последних штампов даты мы можем видеть, что модель ожидала (предсказывала) более низкие значения по сравнению с реальными значениями цены акций.

Замечание о задержке

Изначально выбранная задержка в этой статье равнялась 1, т. е. с шагом в 1 день. Это можно легко изменить, изменив код, создающий трехмерные входные данные.

Пример: можно изменить следующие 2 блока кода:

X_train = []
y_train = []
for i in range(60, 800):
    X_train.append(training_set_scaled[i-60:i, 0])
    y_train.append(training_set_scaled[i, 0])

а также

X_test = []
y_test = []
for i in range(60, 519):
    X_test.append(inputs[i-60:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

со следующим новым кодом:

X_train = []
y_train = []
for i in range(60, 800):
    X_train.append(training_set_scaled[i-50:i, 0])
    y_train.append(training_set_scaled[i, 0])

и

X_test = []
y_test = []
for i in range(60, 519):
    X_test.append(inputs[i-50:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

В этом случае результаты выглядят так:

Вот и все, ребята! Надеюсь, вам понравилась эта статья!

Взгляните на мою модель Пророка в Facebook, которую я использовал для предсказания курса акций GOOGLE в другой статье.



Также посмотрите мою недавнюю статью с использованием модели ARIMA:



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

[1] https://colah.github.io/posts/2015-08-Understanding-LSTMs/

[2] https://en.wikipedia.org/wiki/Long_short-term_memory

Следите за обновлениями и поддержите эти усилия

Если вам понравилась эта статья, и вы нашли ее полезной, подпишитесь на меня, и я буду видеть все мои новые сообщения.

Вопросов? Отправьте их как комментарий, и я отвечу как можно скорее.

Последние посты















Свяжись со мной