Далее, для каждого ряда было сделано следующее: взята обычная модель , обучена на данных обычного ряда, то есть временном ряде длиной 29, а затем спрогнозирован тридцатый член. Такие же три модели были обучены на трех рядах - слагаемых, полученных в результате применения к ряду алгоритма SSA. Спецификация модели была выбрана в соответствии с анализом автокорреляционной и частной автокорреляционной функций. Затем для каждого из трех рядов были получены предсказания тридцатого члена и сложены. В результате получилось предсказание для их суммы, то есть для начального ряда. После выполнения данной операции было посчитано среднеквадратическое отклонение для прогноза по модели для начального ряда и по разложению. Получились примерно одинаковые величины.
Однако оказалось, что если в случае разложения брать сумму не всех трех предсказаний, а первых двух, то результат становится лучше. Это соответствует предположению о наличии непрогнозируемого шума в данных, который ушел в третью компоненту. После этого была поставлена под сомнение практичность выделения периодической части. Если в случае со смертями наличие периода было интуитивно связано с месяцами в году, то в случае с курсом валюты предпосылки этого были не так очевидны. Пример трех компонент для разложения одного из периодов длиной 60 приведен ниже:
Рисунок 3.1, пример разложения ряда на 3 компоненты
Заметно, что вторая компонента, которая должна отвечать за тренд, совсем на него не похожа. Для того, чтобы хоть как-то отследить данный момент, была рассмотрена средняя доходность в каждый из 24 часов суток. Оказалось, что данных недостаточно, чтобы отвергнуть гипотезу о том, что все эти числа имеют одинаковое распределение. После этого была повторена процедура сравнения предсказаний, только в случае разложения было уже две компоненты, соответствующие тренду и шуму, а в качестве предсказания взят лишь прогноз по тренду. И такой метод разложения действительно дал результат лучше. Если же в качестве предсказания брать прогноз суммы предсказаний тренда и шума, то результат получается почти такой же, как при предсказании без разложения. Таблица сравнения результатов по двум метрикам приведена ниже:
Таблица 1, сравнение методов прогнозирования временного ряда
Следующим шагом было написание алгоритма с шагом группировки. Однако, как уже было упомянуто, группировка не задается однозначно, даже если известно конечное число компонент, которое мы должны получить. Алгоритм был изменен таким образом, что стало возможным отдельно задавать длину окна и финальное количество компонент. Было реализовано два детерминированных алгоритма, которые позволяют осуществить стадию группировки:
Первый алгоритм основан на взаимной корреляции. Пусть после второго шага метода SSA получилось матриц, которые суммируются в исходную. Теперь, если применить диагональное усреднение к каждой матрице и «свернуть» ее в ряд, получится какой-то вектор (. После этого подсчитывается матричная корреляция между каждой парой векторов ( и ( по следующей формуле, которая, к слову, была использована и в других работах по данной тематике. Положим . Определим следующим образом:
Взвешенная корреляция между двумя матрицами определяется по формуле:
Соответственно, чем ближе данная величина к единице, тем менее разделимы два ряда, а если она близка к нулю, значит, ряды почти ортогональны и с большой вероятностью представляют разные компоненты.
После подсчета всех корреляций можно задать порог, по которому нужно группировать получившиеся матрицы, то есть если корреляция у пары выше порога, то мы эти две матрицы складываем и превращаем в одну, а если ниже, то оставляем все как есть. Данный подход плох тем, что по одному и тому же порогу для разных рядов матрицы сгруппируются в различное количество компонент. Поскольку моей целью было выделить именно две компоненты, алгоритм был немного модифицирован: после подсчета корреляций мы берем пару, имеющую наивысший коэффициент, и группируем их в одну матрицу, таким образом слагаемых становится на 1 меньше. Далее снова считаем попарные корреляции уже для нового ряда и снова группируем ту пару, где коэффициент оказался наибольшим. Эту процедуру повторяем, пока не остается ровно 2 компоненты, первая из которых представляет собой тренд, а вторая - шум.
Например, пусть изначально ряд был разложен на 12 компонент и получилась следующая таблица корреляции:
Рисунок 3.2, пример таблицы корреляций различных компонент
В таком случае необходимо объединить 7 и 8 компоненту, то есть заменить их на сумму. Затем снова построить таблицу корреляций и повторить процедуру.
Второй алгоритм основан на близости собственных значений. Согласно работе Alexandrov [8], наиболее практичный способ выделения тренда - это объединение компонент с наибольшими собственными значениями. Чтобы однозначно определить алгоритм, значения были упорядочены по убыванию, а затем выделено, между какой парой собственных значений разность логарифмов наибольшая. В этом месте необходимо провести черту и все компоненты с большими собственными числами отнести к тренду, а с меньшими -- к шуму.
В итоге оказалось 3 разных конфигурации алгоритма SSA - один без шага группировки и два с группировкой. Далее была повторена процедура прогнозирования для новых двух алгоритмов, причем с разными параметрами длины окна - от трех до двенадцати. Однако каждая из модификаций метода SSA с шагом группировки давала предсказательную точность хуже, чем без него при всевозможных значениях длины окна. На мой взгляд, падение качества может быть связано с тем, что в результате группировки тренд и шум каким-то образом перемешиваются, соответственно, алгоритму становится сложнее отделять их друг от друга. Следовательно, можно заключить, что с наилучшей стороны показал себя алгоритм SSA без группировки и с разложением на два слагаемых.
4.Применение алгоритма на ряде доходностей
После анализа начального ряда я перешел к работе с доходностями. Чтобы получить ряд доходностей, из начального ряда был вычтен ряд, сдвинутый на единицу влево, а получившаяся разность поделена на сдвинутый ряд. Сначала была предпринята попытка применить все те же алгоритмы предсказания, которые описаны в предыдущей главе. Тем не менее, в случае доходностей применение алгоритма никак не улучшало предсказательную точность модели. Тогда было решено провести анализ, схожий с анализом в работе моего руководителя [9]. Для этого я взял ряд, начинающийся в самой первой точке длины 50, а затем сдвигал его вправо на единицу и наблюдал за тем, как меняется разложение на две компоненты и соответствующие им собственные значения, параллельно визуализируя все преобразования. Сдвинув ряд на 100 единиц вправо, были проанализированы происходящие изменения, в частности, рассмотрены следующие параметры, введенные в работе Garashchuk [9]:
1) Среднее абсолютное смещение первой компоненты. Для периода и номера компоненты она определяется следующим образом:
2)
где - значение компоненты в период в точке ;
3) Разница собственных чисел, соответствующих первой и второй компоненте;
4) Корреляция Пирсона первой и второй компоненты (каждая компонента представлена вектором из 50 чисел).
Первые два параметра были нормированы от нуля до единицы, чтоб можно было построить график:
График 4.1, связь собственных значений, смещения и корреляции
Из графика видно, что эти три параметра связаны между собой. Например, корреляция высока там же, где высоко смещение, а в моменты, когда приходящие величины относительно малы по модулю, все три показателя ведут себя одинаково и почти не меняются. Рассмотрев пиковые точки графика, я обнаружил, что в этом месте две компоненты «меняются местами», что также совпадает с тем фактом, что пришедшее число -- большое по модулю относительно других точек. Наглядно это видно на графике разложения в переходе из 90-го периода в 91-ый:
Рисунок 4.1, разложение рядов на две компоненты в периоды 90-91
В периодах 12 - 15 тоже происходит смена компонент, и это тоже сопровождается прибытием большого по модулю члена, который, грубо говоря, нарушает текущий тренд. Однако в этом случае компоненты не сразу меняются местами, а делают это постепенно: сначала сближаются, а уже потом принимают иные значения.
Рисунок 4.2, разложение рядов на две компоненты в периоды 12-15
В целом, из графиков разложения визуально возникает впечатление, что из этих двух компонент нет одной доминирующей -- у обеих компонент порядок значений одинаковый. Это подтверждает тот факт, что собственные числа, соответствующие обеим компонентам, тоже отличаются не так сильно. Также при рассмотрении обеих компонент едва ли в голову приходит мысль, что одна из них по своему устройству проще другой или проще начального ряда. Тем не менее, есть и вещи, которые могут говорить о пользе разложения. Например, заметно, что в двух пиках абсолютного смещения, которые соответствуют появлению большого по модулю члена, собственные значения начинают меняться заранее.
По этой причине я все же попытался применить получившиеся величины для составления модели и сравнения качества предсказания с разложением и без него. Для этого был применен метод, схожий с методом авторов статьи Wang [10]. Были обучены две модели: в первой единственным регрессором являлось предыдущее число в ряду, а во второй добавлены три регрессора, описанные выше -- разность собственных значений, абсолютное смещение и корреляция двух компонент за предыдущий период. Обучив линейные регрессии и простое решающее дерево, был сделан вывод, что результаты в двух случаях не отличаются в случае регрессии, а в случае разрешающего дерева вторая модель еще и переобучается. Более сложные конструкции не были использованы в силу слишком маленькой выборки.
Из получившихся результатов можно сделать вывод о том, что SSA алгоритм не так эффективен, если мы имеем дело с рядом, где значения автокорреляций низкие, и зависимость каждого нового члена от предыдущего очень слабая, так как в этом случае тренда нет в целом, и весь ряд по своей структуре больше походит на шум.
5.Торговая стратегия
После изучения метода в целом и его сильных и слабых сторон в частности, я решил приступить к его проверке на практике, ведь если алгоритм хорош лишь на бумаге, то, значит, не так уж он и хорош. Для этого была использована симуляция торгов на бирже по предсказаниям алгоритма и сравнение результата со случаем торгов по модели без применения алгоритма, а также с базовой рыночной стратегией «купи и держи». Торги были воспроизведены следующим образом: рассмотрен начальный ряд курса доллар/рубль, начинающийся с первого члена длиной 50. Затем на первых 49 точках обучена модель , а последняя точка предсказана с ее помощью. После этого были проделаны аналогичные действия, но ряд из 50 элементов был предварительно разложен с помощью алгоритма SSA, и предсказана была лишь трендовая составляющая. Наконец, я сохранил три точки - предсказание с методом SSA, предсказание без него и реальное значение. Сдвинув ряд на единицу вправо, я повторил все то же самое и сохранил три новых значения.
Сдвиг был проделан 2000 раз, и получилась достаточная для оценки результатов выборка. После этого было необходимо сравнить некоторые метрики для получившихся предсказаний - среднеквадратическая ошибка и среднее абсолютное отклонение. Затем я перешел к доходностям, заменив все величины в датасете на процентный прирост относительно предыдущей точки, чтобы было удобно видеть величину ожидаемой доходности от сделки в данный период. Важно отметить, что рассмотренные торговые стратегии заключаются в том, чтобы получить прибыль в течение одного временного периода - иными словами, сделка заключается в текущий момент, а на следующей временной отсечке закрывается, вне зависимости от того, в какую сторону изменился курс. Никакие торги в долгосрочной перспективе не предполагаются, так как задача о предсказании следующих точек гораздо сложнее как в терминах сравнения алгоритмов, так и в терминах построения торговой модели.
Несомненно, в случае, когда мы хотим принять решение о том, покупать или продавать валюту, недостаточно оценивать лишь абсолютные отклонения, важным критерием является то, насколько хорошо мы угадываем знак числа: лучше предсказать , чем , если реальное значение равно , так как мы угадаем знак и будем торговать в нужную сторону, несмотря на то, что абсолютная ошибка будет больше. Поэтому была рассмотрена та часть выборки, где прирост ненулевой, чтобы можно было выделить два класса - положительная доходность и отрицательная. После этого были рассмотрены еще две метрики - и , которые отражают то, насколько хорошо модель классифицирует знак величины доходности. Результаты сравнения предсказаний доходности обычной модели и модели с разложением на тренд и шум приведены в таблице ниже:
Таблица 5.1, сравнение качества моделей с применением SSA и без
Несмотря на то, что ошибки самой регрессии у двух моделей отличаются не так сильно, видно, что метрики классификации все-таки выставляют модель с SSA в лучшем свете относительно базовой модели.
Закончив работать с абсолютными величинами, я обратился к ряду доходностей и по такому же принципу обучал две модели - с разложением и без - а затем оценивал получившиеся результаты на той же выборке. Единственное отличие от предыдущего случая заключается в том, что для модели с разложением на два ряда предсказание подсчитывалось как сумма предсказаний по двум компонентам, а не по одной, так как в случае доходностей алгоритм не выделяет тренд и шум явно, а просто раскладывает ряд на две составляющие. Теперь появилась возможность сравнить предыдущие результаты с моделью, примененной к доходностям: