Кто не слышал о самых известных цифровых деньгах в мире, криптовалюте десятилетия? Правильно, я говорю о Биткойн. Все говорят о Биткойне и о том, что будет с его рекордно высокой ценой, включая известные финансовые бренды, такие как JPMorgan и Morgan Stanley. В этом году Биткойн сообщил о своей рекордно высокой цене в 61 556,59 долларов в марте 2021 года, согласно CoinDesk 20.

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

К концу статьи вы узнаете о:

  • Глубокое обучение (RNN, LSTM)
  • Предварительная обработка данных
  • Оценка модели прогнозирования цен на биткойны

О биткойнах

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

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

Исторические данные о ценах на биткойны

Для обучения нашей модели ценообразования мы используем общедоступные данные о ценах на биткойн за период 2016–2020 гг., Финансовые данные за 5 лет, загруженные из Yahoo Finance. Для оценки наших В модели мы используем данные о ценах на биткойны за период с января 2021 года по март 2021 года. Мы используем модель для прогнозирования цен на биткойны за этот период и сравниваем их с реальными ценами, чтобы понять, насколько хорошо модель смогла спрогнозировать цены.

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

Шаг 1: Нормализация Наша модель основана на RNN со слоями LSTM, в которой используется сигмовидная функция активации для преобразования входных векторов в векторы с записями, значение которых находится в диапазоне [0, 1]. Поэтому мы используем нормализацию для масштабирования функций модели, учитывая, что знаменатель всегда будет больше, чем знаменатель, выходное значение всегда будет числом от 0 до 1.

from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range=(0,1))
training_set_scaled = sc.fit_transform(training_set)

Шаг 2. Преобразование данных. Для RNN мы делаем предположение относительно количества периодов времени, на которые модель должна вернуться во времени, чтобы узнать о текущем периоде времени. Учитывая, что в месяце обычно 30 дней, 3 месяца, то есть 90 дней, период времени кажется разумным предположением для нашей модели RNN, чтобы учиться на ценах на биткойны в прошлом. Следовательно, для каждой цены X_train будет содержать цены на биткойны за последние 60 дней, а Y_train будет ценой биткойнов на этот день, и это будет сохраняться для всех периодов времени.

import numpy as np
X_train = []
y_train = []
X_test  = []
for i in range(90,training_set_scaled.size):
    X_train.append(training_set_scaled[i-90:i, 0])
    y_train.append(training_set_scaled[i, 0])
X_train, y_train = np.array(X_train), np.array(y_train)
for i in range(90,inputs.size):
    X_test.append(inputs[i-90:i, 0])
X_test = np.array(X_test)

Шаг 3. Формирование данных. Добавление дополнительного измерения к модели, которое позволит использовать дополнительные индикаторы, помогающие прогнозировать цену (например, внешние события, вызывающие беспокойство общественности). Таким образом мы преобразуем данные из 2D в 3D.

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

Загрузите данные обучения и тестирования биткойнов здесь: https://github.com/TatevKaren/recurrent-neural-network-stock-price-predicition/tree/main/bitcoin_data

Глубокое обучение

Вся идея Глубокого обучения состоит в том, чтобы имитировать функциональные возможности человеческого мозга. Если искусственные нейронные сети (ИНС) отвечают за долговременную память, как височная доля нашего мозга, и если сверточные нейронные сети (CNN) отвечают за распознавание изображений и визуальную интерпретацию, как затылочная доля наш мозг, а затем рекуррентные нейронные сети (РНС), как и лобная доля нашего мозга, отвечают за кратковременную память.

Рекуррентные нейронные сети (RNN)

С одной стороны, информация течет от входных слоев к выходному слою, а с другой стороны, вычисленная ошибка распространяется обратно по сети для обновления весов. В отличие от ANN и CNN, в случае RNN, скрытые слои не только обеспечивают вывод, но и сами себя питают.

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

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

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

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

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

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

Построение модели ценообразования биткойнов

Цель состоит в том, чтобы спрогнозировать цены акций, которые представляют собой непрерывную стоимость выпуска, поэтому у нас есть проблема регрессии, а не классификации. Мы инициализируем этот регрессор как объект с последовательными слоями, для чего используем модуль Sequential из Keras, позволяющий создать объект нейронной сети с последовательными слоями. Затем мы добавляем слои LSTM и, учитывая, что прогнозирование цены финансового продукта - довольно сложная задача, нам нравится иметь модель с высокой размерностью, которая может фиксировать восходящие и нисходящие тенденции в цене акций, поэтому мы используем большое количество LSTM. единиц на уровень LSTM, и мы используем несколько уровней LSTM. Кроме того, мы добавляем слой Dropout для регуляризации, чтобы игнорировать часть нейронов в слоях LSTM. Наконец, мы используем модуль Dense, чтобы добавить выходной слой.

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
regressor = Sequential()
# LSTM layer 1
regressor.add(LSTM(units = 50, return_sequences=True, input_shape = (X_train.shape[1], 1)))
regressor.add(Dropout(0.2))
# LSTM layer 2,3,4
regressor.add(LSTM(units = 50, return_sequences=True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50, return_sequences=True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50, return_sequences=True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50, return_sequences=True))
regressor.add(Dropout(0.2))
# LSTM layer 5
regressor.add(LSTM(units = 50))
regressor.add(Dropout(0.2))
# Fully connected layer
regressor.add(Dense(units = 1))
# Compiling the RNN
regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
#Fitting the RNN model
regressor.fit(X_train, y_train, epochs = 120, batch_size = 32)

Прогнозы модели ценообразования биткойнов

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

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

import matplotlib.pyplot as plt
predicted_stock_price= regressor.predict(X_test)
predicted_stock_price= sc.inverse_transform(predicted_stock_price)
plt.plot(real_stock_price, color = '#ffd700', label = "Real Price January - March 2021")
plt.plot(predicted_stock_price, color = '#4782B4', label = "Predicted Price January - March 2021")
plt.title("Bitcoin Price Prediction")
plt.xlabel("Time")
plt.ylabel("Bitcoin Price")
plt.legend()
plt.show()

Ресурсы

Код: https://github.com/TatevKaren/recurrent-neural-network-stock-price-predicition/blob/main/Bitcoin_Pricing_Model.py

Данные: https://github.com/TatevKaren/recurrent-neural-network-stock-price-predicition/tree/main/bitcoin_data

Более

Модель ценообразования акций Google с RNN: https://github.com/TatevKaren/recurrent-neural-network-price-predicition

Модель прогнозирования оттока клиентов с ИНС: https://github.com/TatevKaren/artificial-neural-network-business_case_study

Модель распознавания изображений с CNN: https://github.com/TatevKaren/convolutional-neural-network-image_recognition_case_study