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

1. Введение

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

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

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

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

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

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

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

- Мой список рассылки всего за 5 секунд: https://seralouk.medium.com/subscribe

- Станьте участником и поддержите меня: https://seralouk.medium.com/membership

2. Модель LSTM

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

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

Другими словами, у них есть объем памяти. Помните, что LSTM означает модель долгосрочной краткосрочной памяти.

Эта характеристика чрезвычайно полезна, когда мы имеем дело с временными рядами или последовательными данными. При использовании модели 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 Prophet, которую я использовал для предсказания курса акций GOOGLE в другой статье.



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



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

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

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

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

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

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

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















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