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

Начнем... :)

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

import yfinance as yf
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt

Затем загрузите биржевые данные Google с помощью API yfinance.

data = yf.download("GOOGL" , start = "2019-01-01" , interval = '1d')
data.head()

Проверка более подробной информации о наборе данных, таких как типы данных функций, а также проверка наличия нулевых значений.

data.info()

Набор данных содержит 6 признаков. Эти функции описаны ниже:

  • open – означает цену, по которой акции были на момент начала торгов в конкретный день.
  • Максимум – максимальное значение, которое достигает акция в течение торгового дня.
  • Минимум – наименьшее значение, которое достигает акция в течение торгового дня.
  • закрытие – последняя цена, по которой акции торгуются в течение торгового дня.
  • Adj Close – это цена закрытия этой акции после учета любых корпоративных действий.
  • Объем — количество акций, проданных за определенный период времени.

Например, Нью-Йоркская фондовая биржа (NYSE) работает с понедельника по пятницу с 9:30 до 16:00. По восточному времени. Таким образом, цена открытия (open) будет ценой начала торгов, то есть в 9:30 утра, а ценой закрытия (close) будет цена, когда торги закончатся, то есть в 16:00. Например, Нью-Йоркская фондовая биржа (NYSE) работает с понедельника по пятницу с 9:30 до 16:00. По восточному времени. Таким образом, цена открытия (open) будет ценой начала торгов, то есть в 9:30 утра, а ценой закрытия (close) будет цена, когда торги закончатся, то есть в 16:00.

Далее мы собираемся проверить, имеет ли функция «Закрыть» какое-либо нечисловое значение, и если оно есть, мы собираемся изменить его на Nan. а также проверьте, имел ли набор данных какие-либо нечисловые значения.

data["Close"]=pd.to_numeric(data.Close,errors='coerce')
data.isnull().sum().sum()

Функция «Закрыть» не имеет значений Nan. Далее давайте построим «закрытие» и соответственно проверим рост акции в зависимости от времени.

plt.plot(data.index, data['Close'], color='green', label='Close')
plt.show()

Обработка данных

В этом уроке мы будем использовать только функцию «Закрыть» из набора данных. Поэтому мы собираемся создать новый фрейм данных dataV1 только с функцией «Закрыть».

dataV1 = data.iloc[:,3:4]
dataV1 = dataV1.values

Импортируйте MinMaxScaler из библиотеки sklearn и используйте его для нормализации наших данных. Нам нужна нормализация, чтобы убедиться, что данные одинаковы во всех записях, MinMaxScaler делает это, преобразуя функцию, масштабируя ее до заданного диапазона, в этом случае только функция «Закрыть».

from sklearn.preprocessing import MinMaxScaler
Scaler = MinMaxScaler(feature_range=(0,1))
dataV1 = Scaler.fit_transform(dataV1)

давайте объявим длину функции

feature_length = 100

Перед построением модели мы должны разделить наши данные на переменные X и Y, для этого мы напишем функцию Create_Features_and_Targets для разделения наших данных.

# Function to create x and y data
def Create_Features_and_Targets(data, feature_length):
  X = list()
  Y = list()
  for i in range(len(data) - feature_length -1):
    X.append(data[i:(i + feature_length), 0])
    Y.append(data[i + feature_length, 0])
  X = np.array(X)
  Y = np.array(Y)
  return X,Y
# calling the function
X_train,y_train= Create_Features_and_Targets(dataV1,feature_length)

Создание трехмерных данных, поскольку LSTM принимает трехмерные данные в качестве входных данных.

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

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

Импортируйте необходимые библиотеки для создания модели

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense , Dropout , LSTM

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

Что такое LSTM?

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

# model
model = Sequential([
   LSTM(100,return_sequences=True,input_shape=(X_train.shape[1],1)),
   Dropout(0.3),
   LSTM(100, return_sequences = False),
   Dropout(0.3),
    
   Dense(1),
])
model.compile(optimizer='adam',loss="mean_squared_error")
model.summary()

На данный момент мы подготовили ваши данные, а также создали модель. Итак, теперь пришло время обучить модель с помощью функции model.fit. Мы будем обучать нашу модель, используя размер партии 12 до 100 эпох.

# Training the model
history = model.fit(
    X_train, 
    y_train, 
    epochs = 100, 
    batch_size = 12, 
    verbose=1,
)

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

Тестирование и прогнозирование

Соберите необходимые данные из двух наборов данных для запуска тестов. возьмите функцию «Закрыть» из набора данных и создайте из нее две переменные: одну для построения реальных данных y_real, а другую для создания переменной x_test для прогнозирования. Чтобы создать переменную x_test, мы получим все значения из функции «Закрыть», масштабируем данные с помощью функции Scaler.transform и преобразуем форму данных в трехмерную. и для создания переменной y_real мы можем получить все значения из функции «Закрыть», начиная со 101-го значения. (пропустите первую «feature_length», так как модель предсказывает следующую)

testData = data.iloc[:,3:4] # Get 'Close' feature
y_real=testData.iloc[feature_length+1:,0:].values #Actual values
x_test = testData.iloc[:,0:].values # data to test
# normalizing the Data using Scaler.transform function
x_test = Scaler.transform(x_test)
x_test, y_test = Create_Features_and_Targets(x_test, feature_length)
# Making data 3 dimensional
x_test = np.reshape(x_test,(x_test.shape[0],x_test.shape[1],1))

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

давайте запустим тест прогнозирования и построим преобразование данных

y_pred = model.predict(x_test)
predicted_price = Scaler.inverse_transform(y_pred)

график прогнозируемых результатов и фактических данных о запасах

plt.plot(y_real, color = 'red', label = 'Actual')
plt.plot(predicted_price, color = 'green', label = 'Predicted')
plt.xlabel('Time')
plt.ylabel('Stock')
plt.legend()
plt.show()

Прогнозы в реальном времени

Что ж, давайте попробуем сделать некоторые прогнозы в реальном времени. Мы собираемся создать функцию для прогнозирования цены акций на заданную дату.

def predict_given_date(data, date, feature_length):
  if date not in data.index:
     data.loc[pd.Timestamp(date)] = 0
  idx = data.index.get_loc(date)
  close_col = data.iloc[:,3:4]
  close_col = close_col.iloc[idx - feature_length : idx,:].values
  close_col = np.expand_dims(Scaler.transform(close_col) , axis = 0)
  Prediction = model.predict(close_col)
  Prediction = Scaler.inverse_transform(Prediction)
  return Prediction
# calling the function
predict_given_date(data, '2022-09-20', feature_length)

Здесь мы можем видеть, что наша модель предсказала «101,7007» на заданную дату, то есть 2022-09-20, что ж, давайте проверим, ближе ли она к фактическому значению цены на эту дату. Следующий фрагмент кода делает именно это. это дает правильный результат только в том случае, если указанная дата уже существует в наборе данных. :)

# only gives the dates that already exists in the dataset
l = data.index.get_loc('2022-09-20')
data.iloc[l: l+1,:]['Close']
# well we can see the predicted value is very close

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

Попробуйте это в качестве практики, попробуйте предсказать следующие 10 дней.

ссылка на репозиторий github: https://github.com/nafiu-dev/stock_prediction_using_LSTM

Вы можете связаться со мной здесь:



другие сообщения: