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

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

Введение

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

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

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

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

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

В частности, чтобы достигнуть цели, были поставлены следующие задачи:

1) Исследовать данные и выбрать временной промежуток, максимально удовлетворяющий условиям, при которых можно было бы проводить дальнейшую работу;

2) Преобразовать данные в такой вид, где применение метода будет наиболее эффективным;

3) Применить алгоритм Single Spectrum Analysis для декомпозиции ряда на несколько процессов;

4) Сравнить метрики качества базовой модели и модели, построенной с учетом разложения процесса;

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

Для решения задач и реализации задуманного был использован язык программирования Python, а сама работа выполнена в Jupyter Notebook. Несмотря на то, что в работах по данной тематике широко распространен язык R, мой выбор пал именно на Python по нескольким причинам: во-первых, среда программирования Jupyter Notebook более удобна для работы с базами и таблицами данных, коих в моей работе достаточно. Во-вторых, в данном языке программирования спектр предсказательных моделей гораздо шире, так как большинство пакетов были разработаны именно для Python. В-третьих, упомянутая выше среда программирования представляется наиболее удобной с точки зрения наглядности представления данных в виде графиков, диаграмм, таблиц и т.д. Вдобавок к этому, у меня уже есть опыт работы в данной среде, что сокращает долю времени и усилий, потраченных на технические аспекты реализации идей, и позволяет сосредоточиться на основных задачах.

Работа состоит из пяти глав: в первой главе разбирается теоретическая часть алгоритма SSA, во второй главе идет описание данных, на которых ведется исследование, в третьей и четвертой главах описаны проведенные эксперименты и оценка качества моделей, а в последней главе описана эмпирическая проверка моделей, построенных ранее, с помощью алгоритма торговли при реальных ценах.

курс динамика прогнозирование

1.SSA-Algorithm

Single Spectrum Analysis -- метод анализа временных рядов, смысл которого -- разложить начальный ряд в сумму нескольких временных рядов, каждый из которых бы имел бы собственную структуру, более определенную и интуитивно понятную. Таким образом, каждый из получившихся рядов можно анализировать по отдельности, соответственно, анализ начального ряда заметно упрощается. Фундаментальной работой по методу SSA можно считать книгу Golyandina, et al [3], в которой определяется алгоритм со всеми его вариациями и показывается его практичность.

Сам алгоритм состоит из четырех шагов:

1) Взять начальный ряд , выбрать параметр , называемый длиной окна, присвоить и трансформировать ряд в матрицу с столбцами и строками, где столбец . Матрица будет ганкелевой, то есть элементы на побочных диагоналях будут равны, и будет выглядеть следующим образом:

2) Теперь необходимо построить SVD разложение получившейся матрицы : .[4] Пусть , , …, - собственные числа матрицы , упорядоченные по убыванию, а , , …, - система собственных векторов, соответствующих им. Определяем . Обозначим . Тогда получим, что , где - количество собственных значений. Тройку () называют сингулярной тройкой, и каждая такая тройка соответствует одной компоненте. При этом важно отметить следующие свойства: во-первых, все векторы ортогональны, во-вторых, собственные числа этих троек положительны по построению матрицы , а, в-третьих, их величины отражают «вклад» данной компоненты в начальный временной ряд: чем больше значение , тем меньше разница между начальным рядом и данной компонентой. [5]

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

4) После этого необходимо усреднить элементы на побочных диагоналях каждой из получившихся матриц. Усреднение происходит следующим образом: необходимо взять каждую побочную диагональ, взять среднее арифметическое элементов на ней и заменить все начальные значения на среднее арифметическое. Такая матрица будет ближайшей ганкелевой матрицей к начальной по квадратичной матричной норме. [6] Наконец, необходимо сделать преобразование, обратное к первому пункту, то есть превратить каждую из матриц в ряд, тогда сумма рядов будет очень близка к начальному ряду. Получится, что у нас есть ряд, который представлен в виде суммы нескольких рядов, каждый из которых имеет свое устройство.

Следует сказать, что алгоритм определен неоднозначно: во-первых, длину окна можно выбирать любую, в зависимости от потребностей задачи и интуиции, стоящей за разложением. В некоторых работах советуют выбирать примерно равным , где -- длина начального ряда. Во-вторых, алгоритм группировки, описанный в третьем пункте, тоже не может трактоваться единственным образом. Чем меньше разделимы две матрицы, тем больше смысла в их группировке в одно слагаемое, однако мерой разделимости могут служить различные метрики: взвешенная корреляция, косинусное расстояние и т.д. Еще один метод -- сравнить собственные значения соответствующих компонент. Если они находятся относительно близко друг к другу (или, по крайней мере, имеют один порядок), то вполне допустима группировка соответствующих членов. Возможна ситуация, когда , и тогда стадию группировки можно вообще пропустить. Заранее не угадаешь, какие должны быть параметры, чтобы модель дала наилучший результат, поэтому в своей работе я пробовал различные конфигурации данного алгоритма и по результатам предсказательной точности отбирал наилучшую. Также стоит отметить, что размер окна почти всегда совпадает с количеством собственных значений и, соответственно, компонент, что верно и для рассматриваемых далее данных. Как уже понятно из устройства алгоритма, он тесно связан с методом главных компонент: в каком-то смысле выделение тренда можно сравнить с выделением главной компоненты. Отличие состоит в том, что в методе главных компонент наши данные имеют высокую размерность, а в нашем случае данные в каком-то смысле уже является проекцией в одномерное пространство. [7]

Одна из работ Hassani [6] как раз изучает применение алгоритма SSA для разложения временного ряда на слагаемые и предсказания следующих членов ряда. Автор взял данные по случайным смертям в США в 1973 - 1978 гг. по месяцам и применил алгоритм SSA для его разложения на составляющие. После разложения, автор анализировал различные способы группировки слагаемых, в числе которых был анализ собственных значений, взаимные корреляции, а также графический анализ получившихся рядов. В конечном счете исследователь пришел к выводу, что наиболее верным решением будет сгруппировать полученные в результате разложения компоненты в три итоговых: тренд, периодическую составляющую и шум, предсказывать который бессмысленно. Далее автор построил предсказательную модель в предположении, что каждый следующий член ряда можно оценить как линейную комбинацию предыдущих с некоторыми коэффициентами, и результаты его предсказания на следующий год оказались точнее, чем результаты базовых моделей временных рядов.

2.Описание данных

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

Рисунок 2.1, начальный вид полученных данных

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

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

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

Рисунок 2.2, временной ряд курса доллар/рубль в рассматриваемом периоде

Рисунок 2.3, автокорреляция и частная автокорреляция временного ряда цены доллара в рублях

Рисунок 2.4, автокорреляция и частная автокорреляция временного ряда доходностей

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

3.Применение алгоритма на начальных данных

В первую очередь, мной был реализован в Python алгоритм SSA, который по данному ряду и заданной длине окна строит его разложение в сумму рядов, пока без алгоритма группировки (в используемых выше терминах, если , соответственно, на втором шаге алгоритма ряд раскладывается сразу на нужные компоненты). Затем введен массив , содержащий числа, кратные 30, от 0 до 2370 включительно (0, 30, 60, …, 2370), а также варьируемый параметр , который для начала положен равным 29. Числа были выбраны именно таким образом, чтобы измерения, принадлежащие разным неделям, оказались в разных частях выборки, и не возникало случаев, когда мы предсказываем значение по данным с предыдущей недели. Для каждого числа из был взят ряд, начинающийся с этого числа длины , и проанализирован следующим образом: была предпринята попытка разложить его с помощью написанного алгоритма на 3 составляющие, которые, по моему предположению, соответствовали бы тренду, периоду и шуму, как в вышеописанной работе. Получилось всего 80 рядов, каждый из которых был разложен на 3 слагаемых.