Наша цель в этом посте - не предсказать как можно точнее цену биткойнов на завтра. Вместо этого мы хотим увидеть, как мы можем использовать алгоритм машинного обучения под названием Random Forest для создания модели, которая может прогнозировать цены на биткойны, используя исторические данные о спросе и предложении биткойнов.

Nota bene: алгоритм случайного леса, хоть и хорош во многих отношениях, но не учитывает время. Это означает, что прогнозы цен в этом посте игнорируют сезонность. Опять же, наша цель НЕ в том, чтобы точно предсказать цены на биткойны, а в том, чтобы увидеть случайный лес в работе.

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

  1. Общее количество биткойнов, которые уже были добыты.
  2. Общая сумма вознаграждений за блоки Coinbase, выплаченных майнерам
  3. Относительная мера того, насколько сложно найти новый блок биткойнов.
  4. Общая сумма всех комиссий за транзакции, уплаченных майнерам
  5. Общее количество уникальных адресов, используемых в цепочке блоков биткойнов

Как работает случайный лес

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

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

Прежде чем мы это сделаем, давайте сначала посмотрим, что есть в нашем наборе данных.

Быстрое исследование данных

В нашем наборе данных 2643 строки. Они представляют все дни с 23 февраля 2010 г. до 19 мая 2017 г.. Ниже приведены минимальные, максимальные и средние значения для каждый фактор, а также их значения 25-го, 50-го и 75-го процентилей.

Согласно этим данным, с 2010 по 2017 год цены на биткойны постоянно росли:

sns.lineplot(data=df2.btc_market_price, label = "Price of Bitcoin Over the Years")

Нас особенно интересует влияние этих факторов на цены биткойнов:

  • Общее количество биткойнов, которые уже были добыты (btc_total_bitcoins). Есть только 21 миллион биткойнов, которые можно добыть. К 19 мая 2017 года было добыто около 16,3 миллиона биткойнов.

  • Общая сумма всех комиссий за транзакции, выплаченных майнерам (btc_transaction_fees). Когда человек тратит биткойн, эта транзакция должна быть подтверждена набором компьютеров, принадлежащих «майнерам» в сети Биткойн. Плата за транзакцию требуется для того, чтобы эти транзакции обрабатывались майнерами. Спонсор может указать, какую комиссию следует добавить, но майнеры могут подтвердить транзакции на сумму не более 1 МБ для каждого пакета или блока. Если количество транзакций, ожидающих подтверждения, превышает то, что может поместиться в 1 блок, майнер может подтвердить транзакции с самой высокой комиссией биткойнов.

  • Общая сумма вознаграждений за блоки coinbase, выплаченных майнерам (btc_rewards). Добывать биткойны означает участвовать в проверке информации о транзакциях с биткойнами. Этот процесс требует больших вычислительных мощностей, и майнеры получают вознаграждение в виде платежей в биткойнах за успешные транзакции (помимо комиссий за транзакции).

  • Относительный показатель того, насколько сложно найти новый блок или успешно проверить пакет транзакций (btc_difficulty). Сложность майнинга биткойнов рассчитана на корректировку каждого установленного количества блоков. Это означает, что чем больше блоков будет добыто, тем сложнее будет добыть следующий.

  • Общее количество уникальных адресов, используемых в цепочке блоков биткойнов (btc_n_unique_addresses). Это количество биткойн-кошельков, созданных за долгие годы.

Годовые темпы роста

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

Например, когда количество биткойн-кошельков в 2014 году увеличилось на 150% по сравнению с 2013 годом, цены выросли почти на 270%. В мае 2012 года общее количество биткойнов на рынке увеличилось на 45% по сравнению с предыдущим годом. При этом цены снизились на 30%. До сих пор это следует из элементарной экономики: рост спроса приводит к росту цены, а увеличение предложения - к ее снижению.

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

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

Применение случайного леса

Чтобы выполнить обучение случайного леса для нашего набора данных, мы сначала загружаем данные. Я импортирую его со своего компьютера, но набор данных также можно скачать с Kaggle.

Когда я читал словарь данных, я запутался в разнице между miners_revenue и transaction_fees. Они звучат частично:

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

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

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

Мы заявляем, что используем Случайный лес для создания модели:

Теперь мы передаем обучающие данные в алгоритм Случайный лес, чтобы он мог отображать шаблоны или деревья решений.

Когда у нас есть модель, мы можем вызвать прогноз, чтобы спрогнозировать цены биткойнов на основе наших данных тестирования или проверки. То есть, учитывая, что мы обучили модель с помощью train_X и train_y, теперь нас интересует, сможет ли она вывести число, близкое к val_Y задано val_X. Помните, что ранее мы разделили набор данных на набор данных для обучения (train_X, train_Y) и набор данных для тестирования (val_X, val_y).

Чтобы увидеть прогнозируемые значения модели на последних 5 данных проверки, мы можем вызвать

print(rf_model.predict(X.tail()))
df1['btc_market_price'].tail()

Цифры близки! Давайте посмотрим, насколько далеко прогнозируемые значения отличаются от фактических, используя MAE (M ean A абсолютное E rror). Это число скажет нам, насколько плохи в среднем прогнозы.

Неплохо! MAE сообщает нам, что в среднем наш прогноз цен на биткойны отклоняется от фактических цен всего на 11 долларов.

фин.