Продолжаю копать в сторону машинного обучения и применения R для количественного анализа в трейдинге.
Мои статьи про R, машинное обучение, количественный анализ
В этом посте я расскажу о применении модели ARIMA-GARCH для прогнозирования курса рубля на R.
Нашел полезную серию статей на тему анализа временных рядов на R. Использовал
эту статью.
Немного общей информации из википедии:
ARIMA (англ. autoregressive integrated moving average, иногда модель Бокса — Дженкинса, методология Бокса — Дженкинса) — интегрированная модель авторегрессии — скользящего среднего — модель и методология анализа временных рядов. Является расширением моделей ARMA для нестационарных временных рядов, которые можно сделать стационарными взятием разностей некоторого порядка от исходного временного ряда (так называемые интегрированные или разностно-стационарные временные ряды). Модель ARIMA(p,d,q) означает, что разности временного ряда порядка d подчиняются модели ARMA(p, q).
Авторегрессионная условная гетероскедастичность (ARCH — AutoRegressive Conditional Heteroscedasticity) — применяемая в эконометрике модель для анализа временных рядов (в первую очередь финансовых), у которых условная (по прошлым значениям ряда) дисперсия ряда зависит от прошлых значений ряда, прошлых значений этих дисперсий и иных факторов. Данные модели предназначены для «объяснения» кластеризации волатильности на финансовых рынках, когда периоды высокой волатильности длятся некоторое время, сменяясь затем периодами низкой волатильности, причём среднюю (долгосрочную, безусловную) волатильность можно считать относительно стабильной.
Модели ARCH впервые были предложены Энглом в 1982 году. Уже в 1986 году Боллерслев предложил обобщение этих моделей (GARCH). В дальнейшем различные авторы предложили и иные варианты моделей данного типа, учитывающих те или иные особенности.
Стратегия:
Для каждого дня берем k предыдущих дней, расчитываем доходность через разницу логарифмов и используем этот массив как окно для расчета оптимальных параметров комбинированной модели ARIMA+GARCH. Если прогноз негативный, шортим, если положительный — лонгуем. Если прогноз совпадает с прогнозом предыдущего дня, ничего не делаем (продолжаем сидеть в предыдущей позе).
Код на R и Python копипастить не буду. Вы можете найти код для случая S&P в статье по ссылке выше. Общая суть процесса подгонки в том, что перебираются разные модели ARIMA(p, d, q), затем с помощью теста выбирается наилучшая, затем подгоняется GARCH модель. Создается прогноз, затем прогноз выводится в файл csv. Затем этот файл обрабатывается с помощью Python скрипта (удаляются кавычки). Затем полученный файл используется для рисования графика.
Результаты:
Я попробовал построить такую же модель и спрогнозировать курс рубля. Взял историю курса рубля USDRUB с начала 2014 до начала 2016 года. Взял бы больше, но в Финаме нет большей истории. Прогнал модель ARIMA-GARCH с разными k. Получил следующие картинки:
k = 100
k = 250
k = 400
Как видно, при использовании малой истории при k=100 и k=400 модель показывала бы результат хуже, чем при стратегии «купи и держи».
Наилучший результат получился при использовании окна в один год k=250. То, что результат получается хуже при k=400 у меня лично наводит сомнения на данную методику прогнозирования как бесполезную в данном случае при данной истории.
Чем больше k и история, тем дольше считается. В моем случае расчет шел около получаса на PC с конфигурацией Intel i5, RAM 8Gb, SSD.
Но, мне кажется, такая эквити не оправдывает использование настолько сложной модели. Думаю, какие нибудь скользящие средние показали бы не хуже результат.
В любом случае, модель интересная и можно попробовать копнуть глубже — попробовать ее использовать не для прогнозирования просто будущего одного актива, а для торговли портфелем (за счет коинтеграции).
2) Проблема классической модели ARIMA-GARCH в том, что распределение хвостов ни разу почти не нормальное.
3) https://www.quantstart.com/articles/ARIMA-GARCH-Trading-Strategy-on-the-SP500-Stock-Market-Index-Using-R — косяк в том, что модель, порядок которой получен для AR и MA частей отдельно без учёта GARCH-эффекта, несостоятельна — таким образом нельзя получить «корректную» модель ARIMA(p,d,q)-GARCH(u,v).
4) Фиттинг модели полноценным образом приводит к неприятной вещи как overfitting параметров p и q в ARMA части. Поэтому модель будет несколько неадекватной. Для определения кратных корней в AR и MA частях придётся «потрудиться» и поломать голову.
5) TS и DS-ряды (т.е. те, где d = 1, 2,… в ARIMA(p,d,q)). Есть неприятные особенности, связанные с тем, что d > 0 может на малых выборках вполне себе маскировать GARCH эффект насколько я помню. Некорректный подход к оценке того, TS или DS наш ряд может приводить к серьёзному искажению спектра ряда и формированию non-invertible ARIMA-модели (ну, по MA части, а это приводит, в свою очередь, к некорректной оценке волатильности).
6) Использование AIC оправдано на больших выборках. Для малых и средних лучше использовать AICc (ну, или BIC, хотя ряд статей говорят, что излишне сильно штрафует).
7) ARIMA-GARCH ни разу не учитывают long-memory эффектов. Гуглите ARFIMA-модели, используйте в R модуль arfima или же rugarch.
8) Качество оценки параметров для малых выборок в GARCH части не очень высокое. Порой это «пальцем в небо».
Ну, это так, что первое в голове всплыло. Есть ещё ряд ньюансов.
Насчёт торговой стратегии — та, что Вы привели, Вас моментально оставит без штанов. Повторюсь, в данных моделях важен не точечный, а интервальный прогноз. И тут нужно вводить какие-либо функции полезности. Самая простая — мат.ожидание дохода, например. Т.е. Es_{t+k} > M, где M — устанавливаемая Вами величина, то шортим или лонгим в зависимости от того, выше или ниже текущей цены точечный прогноз.
Уот как-то так…