Узнайте, какие функции могут прогнозировать отдачу с помощью теста причинности Грейнджера

Если вы читали мою первую статью, это сложно очистить Твиттер для анализа настроений. Вот мои первые мысли:

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

ОБНОВЛЕНИЕ: GIF-файлы и фрагменты кода в этой статье основаны на более старой версии atoti. Мы выпустили гораздо более плавные и еще более функциональные информационные панели и виджеты с последней версией atoti. Перейдите по этой ссылке, чтобы увидеть документацию к последней версии atoti.

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

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

Возможные временные ряды аналитики

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

  • Количество ретвитов
  • Количество подписчиков (авторов, опубликовавших)
  • Любимый счет

Я также могу получить следующие особенности:

  • Объем твита
  • Полярность твита (эмоции, выраженные в посте - положительные, отрицательные или нейтральные)
  • Бычье соотношение твитов (количество положительных твитов к количеству отрицательных)

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

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

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

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

Стационарная проверка временных рядов

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

  • Визуальные проверки с помощью построения
  • Функция автокорреляции (ACF)
  • Расширенный тест Дики-Фуллера (ADF)

Визуальные проверки с помощью построения

Используя Matplotlib, построим график временного ряда:

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

  1. Для каждой из 12 криптовалют существует 12 временных рядов (всего 144 графика). Это может занять довольно много времени.
  2. Это руководство, и я оставлю на него свое мнение.

Функция автокорреляции (ACF)

Автокорреляция - это степень сходства между заданным временным рядом и отстающей версией самого себя в последовательных временных интервалах. Это может вызвать проблемы при обычном анализе (таком как обычная регрессия по методу наименьших квадратов), который предполагает независимость наблюдений (на основе условия Гаусса-Маркова). При наличии автокорреляции мы можем недооценивать дисперсию ошибок, делая расчет доверительного интервала и т. Д. Недействительным.

Кроме того, путем построения автокорреляции временного ряда по задержке, называемой функцией автокорреляции (ACF), мы можем определить, является ли временной ряд стационарным.

Используя функции acf и pacf из statsmodels, я сгенерировал автокорреляцию для 50 лагов и сохранил их как вектор:

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

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

Теперь я могу сравнить ACF с построением временных рядов.

На графиках ACF для Биткойна мы можем видеть, что временной ряд цен имеет хорошую положительную корреляцию до лага 36, прежде чем он пересечет верхний уровень достоверности 95%, показывая постепенное снижение стоимости и, следовательно, нестационарное время. -серии. Однако ACF для доходности с самого начала продемонстрировал резкое падение, что подразумевает стационарный временной ряд.

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

Расширенный тест Дики-Фуллера (ADF)

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

Я сохранил разностные временные ряды и порядок разности перед загрузкой их в atoti в качестве сценария:

Поступая таким образом, я могу видеть изменение временного ряда с каждой разницей:

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

Тестирование причинно-следственной связи по Грейнджеру

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

Y в этом случае - это доходность, а X состоит из других функций, которые мы определили ранее. Для каждой криптовалюты я перебираю каждую функцию, чтобы увидеть, может ли Грейнджер вызвать возврат до maxlag 50 (аналогично ACF ранее):

Ниже показан результат для лага объема твитов по отношению к возврату биткойнов:

Опять же, я загружаю эти атрибуты в atoti и могу быстро визуализировать p-значение каждой особенности криптовалюты в сравнении с доходностью за 50 лагов:

В приведенной выше сводной таблице зеленые ячейки показывают особенности, для которых отклонена нулевая гипотеза на основе уровня значимости 95%. Нулевая гипотеза формулируется следующим образом:

Временной ряд во втором столбце (функции) НЕ Грейнджер вызывает временные ряды в первом столбце (возвращает)

С помощью atoti я создаю меру, которая дает оценку 1, когда нулевая гипотеза отклоняется из-за задержки:

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

Прогнозирование с помощью модели векторной авторегрессии (VAR)

Используя Statsmodel VAR, я собираюсь использовать функции с нулевой гипотезой, отклоненной из предыдущего раздела, для прогнозирования доходности.

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

Поскольку тест причинно-следственной связи Грейнджера возвращает результаты 4 различных типов тестирования, я выбрал функции, используя значение p из ssr_ftest, основанного на F-распределении.

Ниже показан временной ряд, выбранный на основе 95% уровня значимости для Биткойна:

Я применяю VAR к данным о поездах на ежедневном уровне частоты в соответствии с гранулярностью моих данных.

Глядя на выбранный порядок, мы видим, что и AIC (информационный критерий Акаике), и FPE (окончательная ошибка прогнозирования) возвращают порядок 5, в то время как BIC (байесовский aka Schwarz) возвращает порядок 0, а HQIC (Ханнан-Куинн) возвращает порядок 2. Я выбираю подгонку к моей модели с maxlag 5 на основе AIC.

Давайте быстро посмотрим на результаты для возвратов:

Бывает, что порядок запаздывания для Биткойн с заданными функциями равен 5. Что подтверждается в таблице результатов выше, где мы можем наблюдать, что первый коэффициент со связанной вероятностью менее 0,05 (95% достоверность) соответствует средней переменной подписчиков с запаздыванием. 5. Мы будем использовать функции за последние 5 дней, чтобы спрогнозировать нашу прибыль.

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

Давайте вернем значение в наш фрейм данных:

Я собираюсь загрузить эти данные обратно в atoti в качестве сценария под названием «Прогноз 0,05», поскольку он основан на характеристиках, полученных в результате теста причинности Грейнджера на уровне значимости 95%:

Теперь я могу сравнить наш прогноз с фактическим. Прогнозируемые значения далеки от фактических значений, за исключением последних 2 дней (есть вероятность, что количество наблюдаемых примеров меньше 7 дней).

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

Я сравнил текущую доходность с предыдущим днем ​​и возвращаюсь:

  • -1, если он меньше, чем в предыдущий день,
  • 1, если он больше, чем в предыдущий день
  • 0, если нет изменений

В качестве альтернативы я также могу заменить значение смайликом:

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

Мы видим, что тренд на 2020–09–21 и 2020–09–22 прогнозируется правильно и прогнозных значений всего 5.

Проверка нашей модели VAR

Проверка автокорреляции в остатке

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

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

Из подобранной модели я получил невязку и применил метод Дарбина-Ватсона:

Вместе с некоторыми другими показателями данные загружаются обратно в сценарий «Прогноз 0,05» в atoti. Это позволяет мне визуализировать значение Дарбина Ватсона в сводной таблице, как показано ниже. Для своего тестирования я предположил, что автокорреляция для значений в диапазоне от 1,5 до 2,5 отсутствует.

Распределение остатка

Чтобы наша модель VAR была действительной, невязки должны быть:

  • нормально распределенный
  • не автокоррелированный

Чтобы проверить, нормально ли распределены остатки, мы проводим нормальный тест с помощью SciPy« normaltest ».

Я снова загрузил данные в сценарий «Прогноз 0,05» в atoti вместе с durbin watson из предыдущего раздела.

Если p-значение из «нормального теста» меньше или равно 0,05 (при уровне достоверности 95%), мы отклоним нулевую гипотезу ниже.

  • Нулевая гипотеза: данные выглядят гауссовыми
  • Альтернативная гипотеза: данные выглядят негауссовскими

Мы можем сделать это с помощью следующих мер:

Из вышесказанного мы видим величину эксцесса из остатка на основе определения эксцесса Фишера. 0 возвращается, если все значения равны. Значение эксцесса меньше -1 показывает, что распределение слишком ровное, тогда как значение больше 1 слишком пиковое.

Значение асимметрии от -0,5 до 0,5 показывает, что данные довольно симметричны. Значения от -1 до -0,5 или от 0,5 до 1 показывают, что данные умеренно искажены. В противном случае данные будут сильно искажены.

Кажется, что остаточная доходность не является гауссовой, хотя она довольно симметрична для ADA, LTC и LINK.

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

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

Составляем анализ по всем криптовалютам

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

Хотя сохранение результатов теста в atoti является преимуществом, на самом деле я собираюсь использовать моделирование сценария, которое мы увидим в следующем разделе.

Моделирование сценария с разным уровнем значимости

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

С помощью atoti мы увидим, как изменяются характеристики, если уровень значимости изменяется путем настройки моделирования, которое заменяет альфа-значение. Базовый сценарий (первоначальный прогноз с доверительной вероятностью 95%) помечен как «0,05».

Давайте заменим значение альфа на 0,1 и 0,01 в сценарии «0,1» и «0,01» ниже, отклоняя нулевую гипотезу для теста причинности Грейнджера с уровнем достоверности 90% и 99% соответственно:

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

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

Наконец, чтобы подвести итог нашему анализу, признаки, выявленные с помощью теста причинности Грейнджера на уровне значимости 90%, правильно спрогнозировали наибольшее количество криптовалют с точностью 50% и выше (с точки зрения тренда).

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

В заключение, одни только настроения в Твиттере не могут использоваться для прогнозирования доходности криптовалют. Однако это одна из функций, которые может вызвать Грейнджер и, следовательно, использоваться для прогнозирования доходности Ethereum, Tether, Bitcoin Cash, Binance Coin и EOS.

Однако прогностическая сила наших моделей VAR здесь недооценена. Фактически, как мы выяснили, криптовалюты были вызваны Грейнджером из-за некоторых переменных с лагом больше 1. При прогнозировании заданного момента времени нам нужно использовать его фактические соответствующие прошлые значения, и это то, что мы не сделали в этом использовании. кейс. Следовательно, в наших прогнозах мы накапливали ошибки прогнозов на разных временных шагах. Например, в прогнозируемых доходах на 5-й день отсутствует информация о прошлых значениях на 4-й, 3-й, 2-й, 1-й и 0-й дни (коррелированные задержки), которые представляют собой ошибки, которые суммируются вместе, что приводит к снижению точности прогноза.

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