Как использовать технологию глубокого обучения для прогнозирования цен на виртуальную валюту?

искусственный интеллект глубокое обучение биткойн Эфириум
Как использовать технологию глубокого обучения для прогнозирования цен на виртуальную валюту?

Если выбрать несколько самых модных словечек 2017 года, то обязательно будет искусственный интеллект и виртуальная валюта. Британский программист Дэвид Шиэн был глубоко впечатлен прорывной технологией Биткойн и ростом и падением цен на американских горках.Хотя у него не было ни одной монеты, он все же хотел использовать технологию машинного обучения для прогнозирования виртуальной валюты Биткойн. валюта.

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

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

Поскольку я также хочу, чтобы ее прочитали читатели, которые мало что знают о машинном обучении, я постараюсь не увеличивать большой раздел кода, пожалуйста, поймите. Если вы тоже хотите это сделать, я выкладываю данные и код на GitHub, нажмитездесьВозьми.

Что ж, без лишних слов, приступим!

получить данные

Прежде чем мы сможем построить модель, нам нужно получить некоторые данные для обучения модели. На Kaggle есть набор данных с подробным описанием цены биткойна в минуту и ​​другими данными за последние несколько лет (тот же набор данных использовался в предыдущем уроке, который я смотрел, чтобы предсказать цену биткойна). Но в поминутном масштабе будет много зашумленных данных, поэтому мы выбираем дневные цены. Это создает проблему: мы можем собрать недостаточно данных (хотя нам нужны сотни строк вместо миллионов). В глубоком обучении ни одна модель не может быть успешной при острой нехватке данных. Я также не хочу полагаться на статические файлы, поскольку они могут усложнить процесс обновления в будущем, когда модель будет обновляться новыми данными. Вместо этого мы получаем данные с веб-сайтов виртуальной валюты и API.

Поскольку мы будем смешивать цены двух виртуальных валют в одной модели, было бы неплохо получить данные из одного источника данных. мы будем использовать веб-сайт http://coinmarketcap.com. В настоящее время мы учитываем данные только по Биткойну и Эфириуму, но добавление других монет таким образом не будет слишком сложным. Прежде чем мы сможем импортировать данные, мы должны загрузить некоторые пакеты Python, чтобы упростить работу.


import pandas as pd
import time
import seaborn as sns
import matplotlib.pyplot as plt
import datetime
import numpy as np

# get market info for bitcoin from the start of 2016 to the current day
bitcoin_market_info = pd.read_html("https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20130428&end="+time.strftime("%Y%m%d"))[0]
# convert the date string to the correct date format
bitcoin_market_info = bitcoin_market_info.assign(Date=pd.to_datetime(bitcoin_market_info['Date']))
# when Volume is equal to '-' convert it to 0
bitcoin_market_info.loc[bitcoin_market_info['Volume']=="-",'Volume']=0
# convert to int
bitcoin_market_info['Volume'] = bitcoin_market_info['Volume'].astype('int64')
# look at the first few rows
bitcoin_market_info.head()

Что только что произошло? Мы загрузили несколько пакетов Python, а затем импортировалиcoinmarketcap.comТакая таблица данных, как показано выше. Немного очистив данные, мы получаем приведенную выше таблицу цен на биткойны. Данные о цене Ethereum также можно получить, заменив биткойн на ethereum в URL-адресе.

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

поезд, тест и случайное блуждание

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

Вы можете видеть, что большую часть времени обучения составляют периоды, когда цены на виртуальную валюту низкие. Таким образом, обучающие данные могут не отражать тестовые данные, что повредит способности модели обобщать невидимые данные (вы можете попытаться сделать данные более стационарными). Но зачем позволять негативным ситуациям мешать? Прежде чем использовать нашу модель машинного обучения, стоит обсудить более простую модель. Самая основная модель состоит в том, чтобы предположить, что завтрашняя цена равна сегодняшней цене (мы называем это лаговой моделью). Мы математически определяем эту модель следующим образом:

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

Мы определим μ и σ из обучающего набора и применим модель случайного блуждания к тестовому набору Биткойн и Эфириум.

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

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

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

Предсказания модели чрезвычайно чувствительны к случайным начальным значениям. Для предсказания Ethereum я выбрал полное случайное блуждание, которое выглядит нормально в диапазоне (на фото ниже). Вы также можете поиграть со случайными начальными значениями ниже в Jupyter Notebook, чтобы увидеть, насколько все плохо.

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

Модель долговременной краткосрочной памяти (LSTM)

Как упоминалось ранее, мы будем использовать модель долговременной кратковременной памяти. Но нам не нужно строить модель с нуля, существует множество фреймворков с открытым исходным кодом, которые применяют различные доступные нам алгоритмы глубокого обучения (такие как TensorFlow, Keras, PyTorch и т. д.). Я выбрал Keras, потому что нашел, что он хорошо подходит для таких людей, как я, которые не очень хороши в этом. Если вы не знакомы с Керасом, можете прочитать, что я написалэтот учебник, или чей-то туториал подойдет.

Я создал новый фрейм данных с именем model_data. Я переместил некоторые из предыдущих столбцов (Open, Daily High и Low) и переформулировал некоторые новые. Close_off_high представляет собой разницу между ценой закрытия и максимумом дня, где значения -1 и 1 означают, что цена закрытия дня равна минимуму и максимуму соответственно. Столбец волатильности относится к разнице между минимальной и максимальной ценой, разделенной ценой открытия. Вы также можете заметить, что model_data упорядочена от самой старой к самой новой. На самом деле нам больше не нужен столбец даты, потому что нам больше не нужно вводить эту информацию в модель.

model_data.head()

Наша модель LSTM использует предыдущие данные (как для биткойнов, так и для Ethereum) для прогнозирования цены закрытия каждой валюты на следующий день. Мы должны решить, сколько предыдущих дней нужно модели для получения данных. Это произвольно, я выбрал 10 дней, потому что 10 — хорошее целое число. Мы создаем небольшой фрейм данных, содержащий данные за 10 последовательных дней (называемый окном), поэтому первое окно будет содержать строки 0–9 обучающего набора (с нулевой индексацией в Python), а второе окно будет содержать строки 1–10. , и так далее. Выбор маленького окна означает, что мы можем добавить в модель больше окон. Нисходящий тренд — это когда у модели может быть недостаточно информации для обнаружения сложного долгосрочного поведения (если это так).

Модели глубокого обучения не любят больших изменений во входных данных. При внимательном рассмотрении этих столбцов данных некоторые значения находятся в диапазоне от -1 до 1, а другие - в миллионах. Нам нужно нормализовать данные, чтобы наши входные данные были относительно согласованными. Как правило, вы хотите, чтобы значение было между -1 и 1. Столбцы Off_high и волатильности так же хороши, как и раньше. Для остальных столбцов, как и другие, мы нормализуем входные данные до первого значения в окне.

Эта таблица представляет собой пример входных данных для нашей модели долговременной кратковременной памяти (на самом деле у нас есть сотни подобных таблиц). Мы нормализовали некоторые столбцы, чтобы все их значения были равны 0 в первый момент времени, поэтому наша цель — предсказать, как изменится цена в этот момент времени. Теперь мы готовы построить модель LSTM. Построить модель с помощью Keras можно очень быстро, просто соединив несколько частей. я подробно написалруководство, вы можете обратиться.

# import the relevant Keras modules
from keras.models import Sequential
from keras.layers import Activation, Dense
from keras.layers import LSTM
from keras.layers import Dropout

def build_model(inputs, output_size, neurons, activ_func = "linear",
                dropout =0.25, loss="mae", optimizer="adam"):
    model = Sequential()

    model.add(LSTM(neurons, input_shape=(inputs.shape[1], inputs.shape[2])))
    model.add(Dropout(dropout))

    model.add(Dense(units=output_size))
    model.add(Activation(activ_func))

    model.compile(loss=loss, optimizer=optimizer)
    return model

Таким образом, функция build_model строит пустую модель (model = Sequential), добавляя слой LSTM. Этот слой LSTM был скорректирован в соответствии с нашими входными данными (таблица n x m, где n и m представляют числовые значения временных точек/строк и столбцов). Функция также содержит некоторые особенности нейронной сети, такие как функции отсева и активации и т. д. Теперь нам просто нужно указать количество нейронов, которые нужно поместить в слой LSTM (я выбрал 20), и объем данных для обучения модели.

# random seed for reproducibility
np.random.seed(202)
# initialise model architecture
eth_model = build_model(LSTM_training_inputs, output_size=1, neurons = 20)
# model output is next price normalised to 10th previous closing price
LSTM_training_outputs = (training_set['eth_Close'][window_len:].values/training_set['eth_Close'][:-window_len].values)-1
# train model on data
# note: eth_history contains information on the training error per epoch
eth_history = eth_model.fit(LSTM_training_inputs, LSTM_training_outputs, 
                            epochs=50, batch_size=1, verbose=2, shuffle=True)
#eth_preds = np.loadtxt('eth_preds.txt')
Epoch 50/50
6s - loss: 0.0625

Теперь мы построили модель LSTM, которая может предсказать цену закрытия Ethereum на следующий день. Давайте посмотрим, как это работает. Сначала мы проверяем его производительность на обучающем наборе (то есть на данных до июня 2017 года). Цифры под кодом представляют собой среднюю абсолютную ошибку модели на тренировочном наборе после 50-й итерации обучения (или эпохи). Вместо того, чтобы смотреть на изменения, мы можем посмотреть на дневную цену закрытия, выдаваемую моделью.

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

Помимо ошибочности одноточечных прогнозов, о которых мы упоминали выше, построенная нами модель LSTM, похоже, хорошо работает с новыми данными. Самая очевидная ошибка заключается в том, что он не может обнаружить неизбежное падение цены после внезапного повышения цены (например, в середине июня и в октябре). На самом деле это постоянная ошибка, только более выраженная на этих пиках. Прогнозируемая цена в основном совпадает с ценой следующего дня (например, падение цены в середине июля). Кроме того, модель систематически завышает будущую цену Ethereum, поскольку линия прогноза всегда выше фактической линии цены. Я подозреваю, что это связано с тем, что обучающая выборка представляет период времени, когда цена Ethereum стремительно растет, поэтому модель предсказывает, что эта тенденция сохранится. Мы также можем построить идентичную модель LSTM для прогнозирования цены биткойна по сравнению с тестовым набором биткойнов, как показано на следующем рисунке:

нажмитездесьПолучите полный код.

Как я подчеркивал ранее, однобалльные прогнозы вводят в заблуждение. Затем, присмотревшись, вы заметите, что значения прогноза регулярно отражают предыдущие значения (например, октябрь). Наша модель LSTM с глубоким обучением воспроизводит авторегрессионную модель порядка p в местах, где будущие значения представляют собой взвешенные суммы предыдущих значений p. Мы можем математически определить авторегрессионную модель следующим образом:

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

Таким образом, предсказания модели, очевидно, не столь удовлетворительны, как одноточечные предсказания (возможно, удовлетворительные...). Тем не менее, я рад, что модель показывает некоторые очень тонкие движения (например, вторая линия этого графика для Ethereum). Модель не просто предсказывает, что цены будут двигаться в одном направлении, поэтому есть основания для оптимизма в отношении модели.

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

Пожалуй, ИИ до сих пор достоин похвалы! !На этих графиках показана ошибка на тестовом наборе после 25 итераций каждой модели. Ошибки предсказания модели LSTM для Биткойна и Эфириума составляют 4% и 5% соответственно, что полностью разрушает модель случайного блуждания.

Просто хотеть победить модель случайного блуждания — это слишком низко. Мы можем сравнить модель LSTM с другими моделями временных рядов. Такие как авторегрессионная модель, ARIMA, метод средневзвешенных значений и т. д. Оставляем эту задачу на потом, можете попробовать и сами. Опять же, я надеюсь, что все могут оставаться скептичными, когда дело доходит до прогнозирования цен на виртуальную валюту с помощью глубокого обучения, потому что технология не идеальна.

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

Суммировать

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

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

  • Подавление чрезмерно консервативных авторегрессионных моделей: это побуждает алгоритмы глубокого обучения исследовать более интересные или рискованные модели. Этот шаг легче сказать, чем сделать!

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

Если вы хотите создать модель LSTM самостоятельно с нуля, вы можете нажатьздесьПолучить весь код Python.

Спасибо за чтение!