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

За последние несколько недель я затронул несколько тем временных рядов, на которых я буду строить здесь, включая визуализации OHLC, EDA данных временных рядов и анализ тенденций.

Когда дело доходит до удаления тенденций, аналитикам данных доступны несколько вариантов: преобразование данных, удаление скользящей статистики и дифференцирование. Я расскажу об этих методах ниже, используя исторические данные о ценах индекса S&P 500, полученные из UniBit API ниже.

1) Преобразование

Я организовал свои данные о ценах в фреймворке pandas. Индекс устанавливается в столбец даты, а даты сортируются в порядке возрастания. Я получил цены на OHLC за год до 9 января 2020 года.

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

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

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

2) Прокатные средства

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

Метод .rolling() Панды может использоваться для вычисления этого скользящего среднего. Например, код для расчета скользящего среднего за 20 дней для моих данных:

inx_df[‘adj_close’].rolling(window = 20).mean()

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

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

inx_df[‘adj_close’].ewm().mean()

В этом методе доступно несколько параметров, которые определяют индивидуальные веса наблюдений, включая com, интервал и период полураспада.

3) Различие

Другой метод удаления тенденций в данных временных рядов - это разность. Это процесс вычитания значения одного наблюдения из значения другого наблюдения x количество периодов назад, где x - задержка периода времени. Например, в примере с S&P 500, если задержка составляет один год, то значение разницы на 1 января 2020 года равно фактической цене, наблюдаемой 1 января 2020 года, за вычетом значения, наблюдаемого 1 января 2019 года. .diff(periods=x) библиотеки Pandas может использоваться для вычисления массива дифференцирующих значений. Параметр периода обозначает используемую задержку. Мои значения указаны с ежедневным приращением, что означает, что задержка в 365 равна году, а задержка в 1 равна одному дню.

Различие также устранило тенденцию к росту временных рядов, хотя дисперсия все еще зависит от времени.

Резюме

Библиотеки Python NumPy и Pandas содержат множество методов преобразования и анализа тенденций для данных временных рядов. Вам нужно попробовать множество методов с разными параметрами, чтобы увидеть, что помогает вашему ряду максимально приблизиться к стационарности. После применения этих преобразований вы можете применить статистические тесты, такие как Дики-Фуллер, для сравнения своих результатов.