Введение

Когда Биткойн становится финансовым трендом последних нескольких лет, бесспорно, что многие исследователи и аналитики стремятся демистифицировать эту технологию, поскольку она завоевывает нашу повседневную финансовую жизнь. В этой статье я попытаюсь использовать машинное обучение для прогнозирования цены акций Биткойна на основе 9-летних записей из наборов данных Bitstamp и Coinbase, и мы должны надеяться, что Илон Маск забудет о Биткойне во время этого сканирования.

Прогнозирование временных рядов

Временной ряд - это ряд точек данных, проиндексированных или перечисленных в соответствии с порядком меток времени и взятых на основе фиксированного периода времени.

например: - погодная температура записывается каждый час, сейсмический датчик регистрирует землетрясения каждую секунду. Движение акций.

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

  • Без сезонности, без тренда - (рис 01)
  • Нет сезонности, есть тренд - (рис 02)
  • Имеет сезонность, нет тренда - (рис 03)
  • Имеет сезонность, имеет тренд - (рис 04)

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

Наборы данных

Наборы данных Bitstamp - это записи временных рядов для Биткойн с 2011 по 2020 год, 9-летний непрерывный мониторинг цен акций с окнами по 60 секунд для каждой строки и 7 функций: Открыть , High, low, Close, Volume (BTC), Объем (валюта), взвешенная цена.

Функциональная инженерия

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

1- Вменение. Отсутствие значения - наиболее распространенная проблема, это как червь, который может испортить наши данные и вызвать множество ошибок моделирования. Итак, это первый шаг, который я сделал, чтобы очистить свои данные.

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

  • Среднее вменение.
  • Режим вменения.
  • Среднее вменение.
  • Произвольное вменение выборки.

Но мы можем найти другие методы вменения, специфичные для данных временных рядов:

  • Последнее наблюдение перенесено вперед (LOCF).
  • Следующее наблюдение, перенесенное в обратном направлении (NOCB).
  • Линейная интерполяция.
  • Сплайн-интерполяция.

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

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

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

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

Более чем ясно, что многие функции очень похожи, что побудило нас оставить только релевантные: Volume_ (BTC), Volume_ (Currency) и Weighted_Price который тоже должен быть нашей целью. и вот наш окончательный график данных:

5- Разделение данных: нам нужно разделить наши данные на 70% для обучения, 30% для проверки и всего 10% для тестирования.

6- Стандартизация: данные представлены в разном масштабе и диапазонах, что делает шаблон отслеживания и регрессию невыполнимой задачей для нашей модели, поэтому масштабирование наших функций между интервалом [-1, 1] это хорошая практика - стандартизировать наши данные.

Конвейер данных

1- Окно данных: модель, которую мы надеемся построить, состоит из взятия функции за 24 часа подряд и прогнозирования взвешенной цены на следующий час. и сравнить прогноз с существующей записью с 24-го часа.

Выделение функции для разделения окна очень помогает, когда нам нужно сопоставить это поведение разделения с пакетами из tf.data.Dataset.

2- Создание наборов данных: Чтобы завершить сборку с нашим конвейером, нам нужно воспользоваться помощью keras.preprocessing, который преобразует данный массив в набор данных Tensorflow. эта функция может создавать наборы данных в пакетной форме и перемешивать. и может взять карту из split_window функции, чтобы предоставить поля ввода и метки, соответствующие нашим потребностям.

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

Результат

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

И здесь вы можете узнать производительность модели сначала путем оценки наборов данных проверки, а затем по скрытым тестовым данным.

Кредит

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

Вы можете получить весь код предыдущей статьи по этой ссылке на Github.