Прогнозируйте цены на биткойны с помощью моделирования временных рядов подписи

Новый способ управления потоками данных

Введение в подпись пути

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

Сигнатура - это гомоморфизм моноида путей (при конкатенации) в групповые элементы свободной тензорной алгебры. Он представляет собой поэтапное резюме пути X. Вот формальное математическое определение преобразования подписи из Учебника по методу подписи в машинном обучении.

Для пути

Определите подпись пути следующим образом

куда

Короче говоря, Подпись - это преобразование пути в последовательность, которая инкапсулирует резюме пути.

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

Повторяющиеся по координатам интегралы (члены сигнатуры) образуют более тонкую алгебру характеристик, которые могут аналогичным образом описывать поток или путь; они позволяют определять приблизительный путь и образуют естественный линейный «базис» для непрерывных функций на путях.

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

Более того, функции подписи масштабируемы. В качестве иллюстрации, если мы хотим смоделировать будущую цену на сырую нефть как функцию от исторических цен на сырую нефть.

  1. Мы можем использовать прошлые цены на нефть в качестве характеристик. Чем больше цен мы используем, тем больше информации о его поведении и тем точнее модель, но с большими вычислительными затратами. То есть 1000 исторических цен приводят к 1000 функций, а 1000000 исторических цен приводят к 1000000 функций.
  2. В качестве альтернативы мы можем построить путь на основе прошлых цен на нефть и использовать усеченную сигнатуру этого пути в качестве характеристик. Даже когда мы используем больше прошлых цен для нашего пути, количество функций будет таким же. Например, пусть X будет путем измерения 2, усеченная сигнатура X уровня 2 включает только 7 элементов. То есть использование 1000 прошлых цен или 1000000 прошлых цен даст нам ровно 7 характерных черт. Это поможет сократить время вычислений (если мы примем во внимание время, которое мы тратим на вычисление сигнатуры пути) и потенциально даст нам представление о данных (одна функция сигнатуры может оказаться важной). Однако мы должны быть осторожны с использованием слишком низкого уровня усечения, что может привести к недостаточной подгонке.

Если вам нужна дополнительная информация о математике, лежащей в основе подписи, я рекомендую вам прочитать

Вот примеры применения функций подписи

Что мы хотим здесь сделать

Недавно мы стали свидетелями заметного роста торговли криптовалютой, когда самая популярная валюта, биткойн, достигла своего пика почти в 20000 долларов США / BTC в конце 2017 года, в то время как в ноябре 2018 года произошел большой обвал до примерно 3000 долларов США / BTC. Цифровые деньги появились на финансовом рынке совсем недавно, и мы бы сказали, что их поведение практически непредсказуемо. Зная, что подпись может фиксировать значимые свойства пути и может использоваться в качестве линейной основы для аппроксимации непрерывной функции пути, автор хочет изучить, как будет работать этот многообещающий метод, когда мы будем использовать его для прогнозирования цены биткойнов. Мы сравним результат с алгоритмом XGBoost, который является современным алгоритмом машинного обучения.

Мы будем использовать ежедневные данные о ценах на биткойны и доллары с https://www.cryptodatadownload.com/. Мы будем использовать данные Gemini, одной из крупнейших платформ для торговли криптовалютой в США. Наша цель - использовать окно размером 30 дней для прогнозирования средней цены на следующие 10 дней. Для метода подписи мы будем использовать усеченную подпись 30-дневных цен как функции + линейную регрессию Лассо, а для XGBoost мы будем использовать 30-дневные цены как функции.

Предварительная обработка данных

Мы исследуем набор данных с помощью панд.

Нам нужно удалить первую строку фрейма данных, перевернуть фрейм данных и использовать дату в качестве индекса.

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

#Plot to visualise data
import matplotlib.pyplot as plt
ax = BTC_price.plot(y= 'Close', figsize=(12,6), legend=True, grid=True, use_index=True)
plt.show()

Есть несколько интересных периодов, которые могут нас заинтересовать: бум в октябре 2017 года, а также сбои в январе 2018 и октябре 2018 года. Во-первых, мы будем использовать данные с января 2017 года по ноябрь 2017 года, чтобы увидеть, может ли модель предсказать период бума. .

#select duration
initial_date = '2017-01-01'
finish_date = '2017-12-01'
BTC_price_time = BTC_price[initial_date:finish_date]

Создание функций из фрейма данных

Затем мы создадим функции для нашего алгоритма машинного обучения. Во-первых, мы напишем функцию, которая создает окно исторических цен размером h и средние значения будущих будущих цен f.

Мы протестируем нашу функцию с последовательностью цен закрытия длиной 10

BTC_price_time['Close'].head(10)

GetWindow(BTC_price_time.loc[:,'Close'].head(10), h_window = 5, f_window =2)

Мы получаем фрейм данных, который содержит скользящее окно размером 5, как показано ниже.

GetNextMean(BTC_price_time.loc[:,'Close'].head(10), h_window = 5, f_window =2)

GetNextMean предоставляет нам фрейм данных, который содержит средние значения двух последовательных цен, начинающихся с шестой цены. Например, 896,12 = (893,49 + 898,75) / 2.

В дополнение к окну цен мы также добавляем столбец времени для функций.

Подписные функции

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

  • кусочно-линейная интерполяция
  • прямоугольная линейная интерполяция

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

Однако есть еще одно интересное преобразование, которое представляет собой преобразование Lead-Lag, которое преобразует одномерный путь в двухмерный.

Здесь мы будем использовать это преобразование Lead-Lag для наших дискретных точек данных и использовать сигнатуру этого пути для наших функций.

Тестируем с последовательностью (1,1), (2,4), (3,2), (4,6).

Теперь пора вычислить усеченную сигнатуру пути! Нам повезло, и нам не нужно писать функцию для вычисления повторных интегралов. Судя по всему, есть пакет ESig, который сделает (грязную) работу за нас, хотя он все еще находится в активной стадии разработки.

pip install esig
import esig.tosig as ts

Ниже приведена документация по ts.stream2sig (…).
stream2sig (array (no_of_ticks x signal_dimension), signature_degree) считывает двумерный массив чисел с плавающей запятой, «данные в пространстве потока» и возвращает числовой вектор, содержащий подпись векторной серии до заданной подписи_степень.

Мы будем использовать эту функцию для вычисления сигнатуры пути (Time_lead, Price_lead, Price_lag).

Получение функций

Теперь мы готовы рассчитать обычные функции и особенности подписи. Для простоты мы будем использовать только близкую цену биткойна. Следующий код позволяет получить нормальные функции окна со столбцом времени, получить цель прогноза, которая является средним значением будущих цен, и вычислить характеристики сигнатуры. Для функций подписи мы используем пакет ESig, чтобы найти усеченную подпись уровня 2 пути (time_lead, price_lead, price_lag).

Мы можем проверить приведенные характеристики.

y.head()

pd.DataFrame(X_window).head()

pd.DataFrame(X_sig).head()

Обучайте модели

Мы разбиваем X_sig, y на поезд и набор тестов для модели, и мы спрогнозируем 10 будущих цен.

Во-первых, мы обучим нашу модель линейной регрессии Лассо с сигнатурными функциями. Мы используем перекрестную проверку теста разделения временных рядов и gridsearchCV для настройки альфа гиперпараметра.

Вот ошибка

и неотъемлемая часть прогнозирования временных рядов - визуализация результата.

PlotResult(y_train, y_test, y_train_predict, y_test_predict, test_len, 'Lasso + Signature features')

Модель может предсказать, что в будущем произойдет бум, с адекватной точностью около 15%. Обратите внимание, что здесь мы используем только функции усеченной подписи уровня 2. Теоретически, если мы увеличим уровень усечения, мы ожидаем, что модель будет более точной, поскольку у нас будет больше информации.

Теперь попробуем нашу модель XGBoost. Мы также используем перекрестную проверку с разделением временных рядов и GridsearchCV для настройки гиперпараметров.

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

PlotResult(y_train, y_test, y_train_predict, y_test_predict, test_len, 'XGBoost')

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

Экспериментируйте с другими периодами времени

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

#select duration
initial_date = '2018-01-01'
finish_date = '2018-11-01'

Ниже приводится результат особенностей подписи.

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

Мы экспериментируем с усеченной подписью 3-го уровня.

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

С другой стороны, вот результат алгоритма XGBoost.

Модель показала себя очень хорошо и сделала прогноз с ошибкой до 0,5%.

Теперь давайте посмотрим, может ли эта модель предсказать крах в декабре 2018 года.

Мы использовали функции усеченной подписи уровня 3, и вот результат.

по сравнению с моделью XGBoost

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

Заключение

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

Примечание от редакторов Data Science. Хотя мы разрешаем независимым авторам публиковать статьи в соответствии с нашими правилами и рекомендациями, мы не поддерживаем вклад каждого автора. Не стоит полагаться на работы автора без консультации с профессионалами. См. Подробности в наших Условиях для читателей.