Продолжаю копать в сторону машинного обучения и применения 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 — устанавливаемая Вами величина, то шортим или лонгим в зависимости от того, выше или ниже текущей цены точечный прогноз.
Уот как-то так…
1)Доверительный интервал вы имеете ввиду стандартную ошибку прогноза (делающиеся по фактическим данным) или сами ошибки прогноза (прогноз — факт) в абсолютном выражении?)
2)Можно проверить ошибки построив график нормального распредления и доверительный уровень, например по Колмогорову-Смирнову.
5)По-моему имеется критерий проверки сколько нужно значений n… для определенных условий.
Отдельно: почему не в вести MAPE, как критерий или MAD?.. Почему бы к прогнозу по выше указанному методу, не добавить иные методики Холта или адаптивного сглаживания Брауна?
Да, по-хорошему ARIMA-GARCH нужно перекалибровывать раз в N свечек. Плюс они не являются regime switching моделями, тут нужны TAR, STAR и т.п.
Давненько я не слышал ничего интересного про риски. Неужели строите случайные эквити по аппроксимированной модели? Не могли бы Вы наметить, направление применения этих штук к риск-менеджменту. Я далее монте-карло с марковской цепью не продвинулся.
А если одновременно минимизировать и задержку и боковики, вообще гауссиан может получиться в качестве оконной функции.
Просто как не стараться, никак не не сделать достаточно хороший КИХ с малой задержкой. 4-хполюсник на Чебышева или эллиптическом реагирует быстро, давит высокие частоты хорошо.
Возможно, я неправильно пытался их использовать.
Например, нужно ли использовать ту же длину выборки для аппроксимации ряда и для оценки дисперсии или иной оценки волатильности (кстати, какой именно). Сейчас по факту у меня волатильность оценивается с гораздо более длинным окном, чем фильтрация цен.
SergeyJu, ну, для Баттерворта ещё будет параметром количество полюсов.))
Просто у Вас в оценках волы и параметра для EMA используются разные модели, поэтому вполне нормально. Главное, чтобы количество параметров сильно не росло, иначе рост размерности и ад подгонки. Для параметрических моделей а-ля ARIMA-GARCH и волатильность, и прочие параметры суть результат оценивания по конкретной выборке.
Но можно ли из Ваших оценок сделать вывод о том, что реальные сроки удержания позиций для трендовой торговли должны быть существенно больше часа?
Брать приращения цен и рассматривать только их как минимум странно как раз, т.к. оценивается ряд цен как временная траектория некоторого случайного процесса. Взятие разности первого порядка уже есть модификация ряда. Обычно разности берут для того, чтобы ряд устационарить. Но огульное взятие разностей приводит к спектральным искажениям — появлениям ложных циклов (длинных или коротких) там, где их нет (TS и DS ряды, я уже писал об этом).
Насчёт перекалибровки модели — я веду к тому, что рынок не является статической структурой, и конкретную выборку данных, например, лучше описывает модель ARIMA(1,0,1), а через 10 свечек (с той же шириной окна) уже, например, ARIMA(2, 0, 1). Поэтому требуется постоянная перекалибровка, использование regime switching моделей, оценка спектра ряда (для выявления стекания энергии в нижние частоты, например, и выдвигании гипотезы о формировании тренда) и т.п. Много всего. Автор только царапнул верхушку айсберга параметрических моделей и их использования.
Если мы хотим обнаружить в ценах смену режима — мы можем построить оценку типа «новое не такое, как старое».
А что на самом-то деле мы оцениваем.
Что есть сигнал?
Данные точки будут определяться исключительно Вашей/моей/любого другого трейдера торговой системой, в основу которой положена та или иная модель принятия решения, основанная на чём угодно. Вот автор топика попробовал основывать её на ARIMA-GARCH модели с разной шириной окна и системой принятия решения на основе анализа точечного прогноза. Я, в свою очередь, года 2-3 назад экспериментируя над этим же самым, отошёл от точечных прогнозов и перешёл к интервальным и поначалу использовал мат.ожидание как функцию полезности.
В конце концов мы хотим получить систему с хорошим соотношением риска к доходности. То есть мы аппроксимируем «идеальную» систему. Наверное, и мера должна быть основана не на качестве аппроксимации ценового ряда. Это, как мне представляется, ложная цель. А прямо на искомых параметрах системы, например, среднегодовой доходности отнесенной к риску.