Добро пожаловать обратно! Несколько недель назад я рассмотрел некоторые методы прогнозирования цен на акции с использованием машинного обучения и Python, мы также узнали, как, по сути, сделать то же самое с Doge Coin, теперь давайте попробуем сделать то же самое с биткойном. Это пошаговое руководство на довольно высоком уровне, это не полное руководство по обучению машинному обучению, тем более, что мы рассматриваем некоторые возможности, которые может иметь машинное обучение. Во-первых, мы собираемся использовать Google Colab для запуска этого кода, к счастью для нас, этот код в значительной степени уже разработан: Пожалуйста, отдайте должное этому веб-сайту за код, я добавил немного больше функциональности с прикрепленным кодом! Вот ссылка для доступа к проекту Google Colab, вы также можете скопировать код в свою Python IDE, если хотите.

Примечание. Это довольно сложное руководство. Я предполагаю, что вы знаете, что хорошо разбираетесь в Python / объектно-ориентированном программировании, немного разбираетесь в машинном обучении и знакомы с Pandas / Numpy. У меня есть учебные пособия, которые должны вас познакомить, но вот Основное введение в машинное обучение, которое я написал. Хорошо, давайте приступим!

Импорт / установка пакетов

Как всегда, нам придется импортировать эти пакеты, мы используем numpy, pandas, matplotlib и SciKit-Learn, а также финансовые пакеты Yahoo, вы можете установить их через pip, но поскольку мы используем Google Colab, они уже созданы. in. Мы устанавливаем эти пакеты следующим образом:

#INSTALL THESE PACKAGES IF NEEDED
!pip install yfinance
!pip install yahoofinancials

Теперь давайте импортируем все необходимые пакеты, мы делаем это с помощью следующих операторов:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import mean_absolute_error as mae
from sklearn.preprocessing import StandardScaler
import yfinance as yf
from yahoofinancials import YahooFinancials

Потрясающий! Далее нам нужно импортировать набор данных, мы делаем это с помощью финансового пакета Yahoo yf. , это позволит нам загрузить данные, используя символ билета и диапазон дат, для этого используется следующий код:

#CREATING THE DATAFRAME TO STORE DATA
df = yf.download('BTC-USD',
   start='2021-01-01',
   end='2021-04-01',
   progress=False)
df.head()

Мы можем распечатать эти данные с помощью функции df.head ():

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

series = df[‘Close’].values.reshape(-1, 1)

Здорово! Причина, по которой мы храним это в другой переменной, заключается в том, что мы собираемся подогнать нашу модель машинного обучения к этому конкретному значению. Затем нам нужно нормализовать данные, мы сначала начинаем с объявления нашего масштабатора, это позволит нам иметь среднее значение 0 при нашем стандартном отклонении 1, затем мы подгоним наши близкие данные, которые мы создали в приведенном выше коде для только что созданного средства масштабирования, затем мы объявляем переменную «series» обратно в преобразованный модуль масштабирования, который преобразуется в одномерный массив с помощью команды «.flatten» в Numpy. Кажется, много (и это так), но вот код для этого:

scaler = StandardScaler()
scaler.fit(series[:len(series) // 2])
series = scaler.transform(series).flatten()

Потрясающий! Теперь мы должны создать несколько новых фреймов данных, которые помогут нам хранить данные, давайте пойдем строка за строкой (почти), давайте продолжим и начнем с создания этих переменных / пустых фреймов данных:

T = 10
D = 1
X = []
Y = []

Потрясающий! теперь мы собираемся использовать «T» в качестве нашей прошлой переменной, то есть на сколько дней мы вернемся, чтобы предсказать будущее. Далее мы собираемся использовать цикл for для просмотра данных нашей серии, поэтому давайте начнем с объявления нашего цикла for, мы будем использовать следующую строку:

for t in range(len(series) — T):

Обратите внимание, что мы используем строчную букву «t», которая является нашим счетчиком в этом конкретном примере. Далее давайте заполним наш цикл for, так что теперь мы хотим сохранить данные нашей серии, используя наш счетчик, в другую переменную (x в этом примере) с помощью разрезая набор данных, затем добавьте эти данные в наш фрейм данных X в верхнем регистре, который мы объявили выше, вот эти строки в нашем цикле for:

x = series[t:t+T]
 X.append(x)

Теперь мы делаем то же самое, но вместо того, чтобы нарезать набор данных, мы собираемся просто использовать его в качестве счетчика в наборе данных серии, а затем добавляем те же данные во фрейм данных Y, который мы создали ранее.

y = series[t+T]
Y.append(y)

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

X = np.array(X).reshape(-1, T)
Y = np.array(Y)
N = len(X)
print(“X.shape”, X.shape, “Y.shape”, Y.shape)

Потрясающий! Теперь нам нужно создать класс для нашей модели машинного обучения, это самое интересное! Давайте начнем с создания класса с именем BaselineModel, а затем определим функцию с помощью следующего кода:

class BaselineModel:
 def predict(self, X):
 return X[:,-1] # return the last value for each input sequence

Далее нам нужно разделить наши данные на набор для обучения и тестирования. Мы делаем это, создавая переменные Xtrain & Train, затем мы используем переменные «X» и «N», которые мы использовали раньше, чтобы заполнить эти переменные данными, мы, по сути, делаем то же самое с нашими переменными «Xtest» и «Ytest» с другая половина данных для нашего тестового набора:

Xtrain, Ytrain = X[:-N//2], Y[:-N//2]
Xtest, Ytest = X[-N//2:], Y[-N//2:]

Потрясающий! Далее, давайте продолжим и настроим нашу модель, мы собираемся создать переменную «модель», которая содержит наш класс «BaselineModel», мы собираемся создать несколько новых переменных для передачи наших обучающих и тестовых фреймов данных, мы делаем это используя следующий код:

model = BaselineModel()
Ptrain = model.predict(Xtrain)
Ptest = model.predict(Xtest)

Здорово! Теперь мы собираемся изменить форму наших массивов еще раз и сохранить их в другую переменную, а также создать одномерный массив с помощью Numpy:

Ytrain2 = scaler.inverse_transform(Ytrain.reshape(-1, 1)).flatten()
Ytest2 = scaler.inverse_transform(Ytest.reshape(-1, 1)).flatten()
Ptrain2 = scaler.inverse_transform(Ptrain.reshape(-1, 1)).flatten()
Ptest2 = scaler.inverse_transform(Ptest.reshape(-1, 1)).flatten()

Почти готово! Теперь мы собираемся пойти дальше и отправить наши данные для большей части прогнозов, будущие данные будут добавлены в нашу переменную «прогноз», а затем наши данные будут построены с использованием пакета matplotlib! Вот код для этого:

# right forecast
forecast = []
input_ = Xtest[0]
while len(forecast) < len(Ytest):
 f = model.predict(input_.reshape(1, T))[0]
 forecast.append(f)
 # make a new input with the latest forecast
 input_ = np.roll(input_, -1)
 input_[-1] = f
plt.plot(Ytest, label=’target’)
plt.plot(forecast, label=’prediction’)
plt.legend()
plt.title(“Right forecast”)
plt.show()

И это наш результат!

Поздравляю! Вы только что предсказали будущее Биткойна с помощью машинного обучения! Я настоятельно рекомендую не использовать это как финансовый совет, это просто проект, направленный на развитие ваших навыков. Хотя мы смогли предсказать будущее, вы можете видеть, что оно не было полностью точным. Я думаю, что одна из причин, по которой, возможно, так и произошло, - это крайняя волатильность Биткойна в последнее время. Эти предположения очень важно учитывать при разработке проектов машинного обучения.

Как всегда

Как всегда, если у вас есть какие-либо предложения, мысли или вы просто хотите пообщаться, не стесняйтесь связаться / подписаться на меня в Twitter! Кроме того, ниже приведены ссылки на некоторые из моих любимых ресурсов по изучению программирования, Python, R, Data Science и т. Д.