Ethereum – это децентрализованный блокчейн с открытым исходным кодом и функциями смарт-контрактов. Эфир (ETH или Ξ) — это собственная криптовалюта платформы. Среди криптовалют он уступает только биткойнам по рыночной капитализации. Ethereum был задуман в 2013 году программистом Виталиком Бутериным. [Источник: Википедия]

Здесь, в этом блоге, мы упомянем шаги по созданию моделей машинного обучения (линейная регрессия и SVR) для прогнозирования будущей цены Ethereum.

Давайте начнем!!!

Я предполагаю, что вы знакомы с основными командами таких инструментов, как Pandas, Numpy, Matplotlib.pyplot и Sklearn.

Шаг 1. Импорт библиотек Python

from datetime import datetime
from datetime import timedelta
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
from yahoofinancials import YahooFinancials
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.svm import SVR
import warnings
warnings.filterwarnings('ignore')

Шаг 2. Загрузите данные из источника

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

start_date = '2019-09–08'
today = datetime.today().strftime('%Y-%m-%d')

Теперь давайте загрузим данные.

eth_df = yf.download("ETH-USD", start_date, today)
eth_df.tail()

В приведенном выше разделе кода мы загрузили данные ETH (Ethereum) с 08.09.2019 по настоящее время (08.09.2021), когда я писал этот блог. Теперь мы сохраним данные в формате .csv. Посмотри …

eth_df.to_csv("./datasets/ether.csv")

Мы сохранили данные в формате .csv в папке datasets.

Шаг 3. Загрузите данные

Теперь загрузите сохраненные данные в переменную «данные», и мы установили индекс столбца «Дата».

data = pd.read_csv("./datasets/ether.csv")
data = data.set_index(pd.DatetimeIndex(data['Date'].values))
data.head()

Шаг 4. Создайте переменную для прогнозирования n дней в будущем и создайте новый столбец

future_days = 15

Здесь мы взяли n дней как 15 и установили их в переменную future_days. Теперь создайте новый столбец.

data[str(future_days)+'_Day_Price_Forecast'] = data[['Close']].shift(-future_days)
print(data)

Если мы сейчас увидим кадр данных, то увидим, что был создан новый столбец '15_Day_Price_Forecast'. И из-за использования '.shift(-future_days)',мы можем наблюдать, что значение закрытия Date: 2021–09–08 напечатано в 15_Day_Price_Forecast столбец Date: 2021–08–24,который на 15 дней раньше Date: 2021–09–08, как мы и ожидали. Таким же образом корректируется и другая дата в данных 15_Day_Price_Forecast.

Шаг 5. Теперь мы возьмем данные «Закрыть» в формате массива для последующего разделения. И мы возьмем те данные «Закрыть», которых нет в «future_days» (последние 15 столбцов).

X = np.array(data[['Close']])
X = X[:data.shape[0] - future_days]
print(X)

Вывод print(X) приведен ниже.

[[ 133.36825562]
[ 140.81941223]
[ 155.04768372]
[ 149.13500977]
[ 154.5819397 ]
[ 155.63859558]
[ 157.74620056]
[ 151.69921875]
[ 150.3596344 ]
[ 150.80311584]
[ 128.62518311]
[ 127.54832458]
[ 125.96652985]
[ 116.89780426]
[ 129.06872559]
[ 122.03271484]
[ 123.54706573]
[ 123.74192047]
[ 121.01026154]
[ 124.51902008]
[ 119.47483063]
[ 117.15785217]
[ 118.74755096]
[ 117.4526062 ]
[ 117.36288452]

показать больше (открыть необработанные выходные данные в текстовом редакторе) ...

[3286.93530273] [3226.08398438] [3242.11547852] [3319.25732422] [3172.45629883]]

Шаг 6. Теперь мы возьмем данные «15_Day_Price_Forecast» в формате массива для последующего разделения. И мы возьмем те данные «15_Day_Price_Forecast», которых нет в «future_days» (последние 15 столбцов).

y = np.array(data[str(future_days)+'_Day_Price_Forecast'])
y = y[:-future_days]
print(y)

Вывод print(y) ниже.

[ 122.03271484 123.54706573 123.74192047 121.01026154 124.51902008
119.47483063 117.15785217 118.74755096 117.4526062 117.36288452
116.37834167 116.48873901 113.4052887 106.58997345 105.5982132
108.90753937 107.06101227 107.60978699 110.4302597 107.49266815
107.82160187 107.44351959 104.91928864 104.53530121 119.26774597
119.43088531 124.80648804 121.29839325 122.57228851 122.55360413
121.39020538 122.10038757 123.26021576 133.59887695 146.09837341
145.34619141 149.55433655 146.13084412 149.092453 158.79542542
135.85266113 139.82286072 138.0896759 136.1259613 136.74624634
136.44361877 134.20695496 132.24942017 127.77412415 137.8223877
138.78935242 138.03450012 135.1270752 137.96533203 136.75868225
133.83403015 134.44288635 133.26307678 133.71159363 137.69178772
142.3981781 140.00054932 139.37460327 140.51919556 140.68635559
136.63606262 137.18144226 138.23986816 136.98692322 135.03102112
135.46035767 140.98815918 139.41647339 142.49742126 142.09268188
141.51409912 141.83032227 163.96174622 161.45880127 158.05253601
165.5148468 165.94720459 174.53164673 180.25881958 176.11457825
177.33747864 165.49702454 164.73632812 164.51335144 167.83851624
161.57417297 167.6234436 166.95075989 173.81402588 173.70843506
173.75126648 170.04652405 171.87466431 171.44779968 165.82609558
154.45939636 156.34709167 158.43493652 157.29507446 155.20199585
162.16603088 160.81834412 162.12278748 167.95240784 164.02658081
163.45069885 172.6532135 169.79866028 170.94816589 170.28930664
173.14274597 194.30433655 187.32531738 196.84628296 217.14857483
247.15306091 264.01000977 243.7645874 234.5952301 261.29220581

показать больше (открыть необработанные выходные данные в текстовом редакторе) …

3156.50952148 3014.84594727 3020.08984375 3182.70214844 3286.93530273 3226.08398438 3242.11547852 3319.25732422 3172.45629883 3224.9152832 3100.32543945 3270.60083008 3244.40332031 3227.00268555 3224.37426758 3433.73266602 3834.828125 3790.98999023 3940.61474609 3887.82836914 3952.13354492 3928.37939453 3426.39428711 3497.31518555]

Шаг 7. Разделите X и Y . Взят размер теста 20% и размер поезда 80%.

# Split Data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

Шаг 8. Создание модели — мы возьмем SVR и линейную регрессию

→ Модель СВР:

# Fit SVR Model
svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.00001)
svr_rbf.fit(X_train, y_train)

Вывод:

SVR(C=1000.0, gamma=1e-05)

Проверка точности:

# Accuracy Check
svr_rbf_acc = svr_rbf.score(X_test, y_test)
print('Accuracy of SVR model :', svr_rbf_acc)

Вывод:

Точность модели SVR: 0,9294892861789898

Теперь проверьте прогноз и фактические значения:

# prediction Check
svr_pred = svr_rbf.predict(X_test)
svr_pred = pd.DataFrame(svr_pred)
print("Prediction Value :", svr_pred)

Вывод:

# Actual Value
print("Actual Value :", pd.DataFrame(y_test))

Теперь мы нанесем эти прогнозируемые и фактические значения на график, чтобы лучше понять сценарий.

# Actual vs Prediction Accuracy Graphical View
plt.figure(figsize=(16, 9))
plt.plot(svr_pred, label='Predict', lw=2, alpha=.7)
plt.plot(y_test, label='Actual', lw=2, alpha=.7)
plt.title('Actual vs prediction')
plt.ylabel('price in USD')
plt.xlabel('Time')
plt.legend()
plt.xticks(rotation=45)
plt.show()

→ Линейная регрессия:

# Fit LR Model
lr = LinearRegression()
lr.fit(X_train, y_train)

Вывод:

Линейная регрессия()

# Accuracy Check
lr_acc = lr.score(X_test, y_test)
print('Accuracy of LR model :', lr_acc)

Вывод:

Точность модели LR: 0,8789637085611208

Теперь проверьте прогноз и фактические значения:

# prediction Check
lr_pred = lr.predict(X_test)
lr_pred = pd.DataFrame(lr_pred)
print("Prediction Value :", lr_pred)

Вывод:

# Actual Value
print("Actual Value :", pd.DataFrame(y_test))

Теперь мы нанесем эти прогнозируемые и фактические значения на график, чтобы лучше понять сценарий.

# Actual vs Prediction Accuracy Graphical View
plt.figure(figsize=(16, 9))
plt.plot(lr_pred, label='Predict', lw=2, alpha=.7)
plt.plot(y_test, label='Actual', lw=2, alpha=.7)
plt.title('Actual vs prediction')
plt.ylabel('price in USD')
plt.xlabel('Time')
plt.legend()
plt.xticks(rotation=45)
plt.show()

Вывод :

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

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

Спасибо за чтение этого блога.

Хорошего дня !!!