Визуализация данных

Как создать торговую стратегию ARIMA + GARCH с помощью QuantStart

Введение

В этой статье я покажу, как я построил торговую стратегию ARIMA + GARCH с помощью пакета Quantstrat R.

Я предполагаю, что читатель знаком с основными строительными блоками, из которых состоит торговая стратегия в квантстрате. Если это не так, я настоятельно рекомендую прочитать главы с 1 по 5 из [1].

Код для воспроизведения результатов, описанных в этой статье, можно найти в этом репо.

Мотивация

Во всех онлайн-руководствах по quanstrat, которые я встречал, использовались технические индикаторы, которые доступны в готовом виде в пакете TTR, чтобы продемонстрировать, как работает Quantstrat. Я не мог найти ничего, что описывало бы создание пользовательских индикаторов, поэтому мне пришлось немного изучить и подумать, что я поделюсь тем, что нашел.

Обзор стратегии

Мы будем реализовывать стратегию, описанную в [2].

Вкратце, стратегия включает прогнозирование доходности на следующий день с использованием модели ARIMA + GARCH, которая обучается на скользящем окне доходности за последние 500 дней.

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

Детали реализации

Набор данных

Мы будем использовать SPDR S&P 500 ETF Trust (тикер: SPY) для оценки этой торговой стратегии.

Подбор модели ARIMA и GARCH является сложной вычислительной задачей, поэтому, чтобы сэкономить время, мы будем работать с небольшим подмножеством доступных данных. Мы установили дату начала 2017–01–01 и дату окончания 2021–05–02. Вот фрагмент того, как выглядят данные:

Столбцы с date по adjusted были загружены с Yahoo! Финансы, в то время как daily_return был рассчитан вручную и представляет собой доходность журнала на основе цены close.

Нам нужно сделать эту таблицу доступной для квантового анализа. Один из способов сделать это - создать глобальную переменную, названную в соответствии с тикером акции, то есть SPY, и присвоить значение тиббла в формате xts. Вот как это делается:

Построение индикатора

Индикатор основан на прогнозе модели GARCH (1,1), порядок ARIMA которой, то есть p и q (d установлен на 0), определяется путем подбора лучшей модели ARIMA на прошлых доходах. Индикатор должен вернуть 1, если прогнозируемая доходность следующего периода положительна, и -1 в противном случае.

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

Во-первых, у нас есть функция, которая найдет лучшую модель ARIMA с учетом одномерного временного ряда и вернет значение AR, то есть p и MA, то есть порядок q:

Затем мы пишем функцию, которая будет соответствовать модели GARCH (1,1) с учетом одномерного временного ряда и желаемого порядка AR и MA:

Обратите внимание, что мы оборачиваем вызов ugarchfit в вызов tryCatch, чтобы мы знали, когда соответствие не удается сойтись (функция выдаст предупреждение, если это произойдет, поэтому мы хотим ее поймать).

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

Обратите внимание, что мы приняли решение вернуть 1 в случае, если модель GARCH (1,1) не сойдется.

Функция на рисунке 5 работает, когда она хорошо работает при задании одномерного временного ряда. Но предстоит еще кое-что сделать, чтобы заставить его работать с квантстратом.

Нам нужно сообщить Quantstrat, как использовать данные на рисунке 2 для расчета скользящей версии индикатора:

Функция на рисунке 6 принимает в качестве аргументов данные на рисунке 2, размер окна и имя столбца, которые мы хотим соответствовать модели ARIMA + GARCH. Поскольку quanstrat ожидает, что данные будут объектами xts, а эта функция использует пакет tidyquant для реализации логики прокрутки, которая ожидает, что данные будут объектами tibble, нам необходимо выполнить преобразование между этими двумя объектами.

Наконец, мы можем добавить наш индикатор ARIMA + GARCH к стратегии, которую хотим протестировать на исторических данных:

Создание сигналов

Мы хотим открывать длинную позицию, когда индикатор ARIMA + GARCH равен 1, и открывать короткую позицию, когда индикатор равен -1. Этот фрагмент кода создаст два логических столбца, чтобы указать, когда мы должны это сделать:

Торговля сигналами

Последнее, что нам нужно сделать, это сказать Quantstrat, как торговать по сигналу. Мы сохраним простоту.

Для открытия позиций:

Для закрытия позиций:

Помимо этих правил, мы также устанавливаем максимальное количество удерживаемых средств в размере 4 439 для любой данной длинной или короткой позиции. Это количество, на которое мы израсходуем почти весь наш первоначальный капитал в размере 1000000 долларов. Очень нереально, особенно для короткой позиции, но неважно. Мы также не хотим сразу занимать максимальную позицию, поэтому каждый заказ будет на половину максимального удерживаемого количества. Это код, который накладывает эти ограничения:

Результаты

Результаты этой торговой стратегии действительно печальны:

Вот как эта стратегия сравнивается с подходом покупки и удержания:

Стратегия всегда была хуже, чем покупка и удержание. Тем не менее, он может принести приличную прибыль до января 2020 года. Похоже, что прогнозный сигнал индикатора ARIMA + GARCH значительно ухудшился после краха COVID-19, поскольку он все еще не восстановился после падения по состоянию на апрель 2021 года, но покупайте и держите делает новые максимумы с сентября 2020 года.

Больше статистики доступно в репо.

Вывод

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

использованная литература

[1] Стратегии тестирования на истории с R. Тим Трайс. 2016. Последний доступ 6 мая 2021 г.

[2] Торговая стратегия ARIMA + GARCH для индекса фондового рынка S & P500 с использованием R. QuantStart. Последний доступ 6 мая 2021 г.