Узнайте, какие функции могут прогнозировать отдачу с помощью теста причинности Грейнджера
Если вы читали мою первую статью, это сложно очистить Твиттер для анализа настроений. Вот мои первые мысли:
- Твит может быть очень положительным, но не имеет никакого значения, если у него нет подписчиков.
- Твит может быть нейтральным (вероятно, опубликованным ботами), но частые публикации таких твитов могут повысить осведомленность и внимание к криптовалюте.
- У твита может быть большое количество подписчиков, но не все подписчики согласны с твитом. Возможно, любимый атрибут твита сможет показать степень консенсуса, достигнутого в твите.
ОБНОВЛЕНИЕ: GIF-файлы и фрагменты кода в этой статье основаны на более старой версии atoti. Мы выпустили гораздо более плавные и еще более функциональные информационные панели и виджеты с последней версией atoti. Перейдите по этой ссылке, чтобы увидеть документацию к последней версии atoti.
Глядя на твиты с разных точек зрения, я не могу заставить себя согласиться с тем, что доходность криптовалют можно просто спрогнозировать с помощью одной-единственной функции, такой как настроения Twitter.
В этой статье я исследую нижеприведенное, чтобы выяснить, можно ли использовать какие-либо атрибуты из твитов для прогнозирования доходности криптовалют:
- Вероятные временные ряды характеристик, которые можно использовать для прогнозирования
- Выполнение стационарной проверки и установление стационарного временного ряда
- Проверка причинности с помощью критерия причинности Грейнджера
- Использование векторной авторегрессионной модели (VAR) для прогнозирования доходности криптовалюты.
Возможные временные ряды аналитики
Из криптовалют я рассмотрел только две функции - цену и доходность в моем случае, так как мне интересно узнать, можно ли использовать твиты для прогнозирования этих характеристик. Однако из твитов у меня есть много возможных особенностей, которые я могу получить, например атрибуты твита:
- Количество ретвитов
- Количество подписчиков (авторов, опубликовавших)
- Любимый счет
Я также могу получить следующие особенности:
- Объем твита
- Полярность твита (эмоции, выраженные в посте - положительные, отрицательные или нейтральные)
- Бычье соотношение твитов (количество положительных твитов к количеству отрицательных)
Подобно соотношению быков / медведей, которое представляет собой рыночное отношение инвесторов к финансовому рынку, я создал бычье соотношение для твитов.
Бычье соотношение больше единицы указывает на уверенность аудитории в том, что доходность криптовалюты увеличится. В противном случае значение ниже единицы указывает на больший негатив по отношению к криптовалюте, и в ближайшем будущем рынок откатится.
Давайте использовать все эти временные ряды в качестве наших функций и загрузить их в atoti.
Обратите внимание, что для каждой криптовалюты я выделил последние 7 дней как тестовые данные, а остальные как данные обучения. Это означает, что я собираюсь прогнозировать возврат до 7 дней.
Стационарная проверка временных рядов
Большинство анализов временных рядов требуют, чтобы временные ряды были стационарными. О том, почему важна стационарность, написано много статей, поэтому я не буду здесь подробно останавливаться на достигнутом. Вместо этого давайте посмотрим, как мы можем обнаружить стационарность во временных рядах:
- Визуальные проверки с помощью построения
- Функция автокорреляции (ACF)
- Расширенный тест Дики-Фуллера (ADF)
Визуальные проверки с помощью построения
Используя Matplotlib, построим график временного ряда:
Судя по форме графика, кажется, что временные ряды доходности, средней полярности и, вероятно, бычьего отношения для Биткойна являются стационарными. Как видите, у этого метода есть несколько проблем:
- Для каждой из 12 криптовалют существует 12 временных рядов (всего 144 графика). Это может занять довольно много времени.
- Это руководство, и я оставлю на него свое мнение.
Функция автокорреляции (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-й дни (коррелированные задержки), которые представляют собой ошибки, которые суммируются вместе, что приводит к снижению точности прогноза.
Тем не менее, есть много других вещей, которые можно сделать для улучшения прогноза. Я приветствую вас, поделитесь со мной своими мыслями, если вы сделали что-то подобное. Вы также можете найти мою записную книжку здесь.