В последней статье серии «анализ временных рядов» мы обсуждали важность серийной корреляции и почему она чрезвычайно полезна в контексте количественной торговли.
В этой статье мы будем в полной мере использовать последовательную корреляцию, обсуждая наши первые модели временных рядов, включая некоторые элементарные линейные стохастические модели. В частности, мы собираемся обсудить белый шум и случайные блуждания.
Резюмируем нашу цель:
Прежде чем мы углубимся в определения, я хочу кратко перечислить причины изучения этих моделей, а также нашу конечную цель в изучении анализа временных рядов.
По сути, мы заинтересованы в повышении прибыльности наших торговых алгоритмов. Как кванты, мы не полагаемся на «догадки».
Наш подход состоит в том, чтобы дать как можно лучшую количественную оценку, чтобы исключить любую эмоциональную вовлеченность в торговый процесс и гарантировать (насколько это возможно) повторяемость нашей торговли.
Чтобы повысить прибыльность наших торговых моделей, мы должны использовать статистические методы для определения последовательного поведения активов, которое можно использовать для получения прибыли. Чтобы обнаружить это поведение, мы должны изучить, как свойства самих цен активов меняются во времени.
В этом нам помогает анализ временных рядов. Он предоставляет нам надежную статистическую основу для оценки поведения временных рядов, таких как цены на активы, чтобы помочь нам найти компромисс с этим поведением.
Анализ временных рядов предоставляет нам надежную статистическую основу для оценки поведения цен на активы.
До сих пор мы обсуждали серийную корреляцию и исследовали основную структуру корреляции смоделированных данных. Кроме того, мы определили стационарность и рассмотрели свойства второго порядка временных рядов. Все эти атрибуты помогут нам идентифицировать закономерности среди временных рядов. Если вы не читали предыдущую статью о последовательной корреляции, я настоятельно рекомендую вам сделать это, прежде чем продолжить читать эту статью.
Далее мы собираемся изучить, как мы можем использовать некоторые из структур цен на активы, которые мы определили с помощью моделей временных рядов.
Процесс моделирования временных рядов
Так что же такое модель временных рядов? По сути, это математическая модель, которая пытается «объяснить» последовательную корреляцию, присутствующую во временном ряду.
Когда мы говорим «объяснять», на самом деле мы имеем в виду, что после того, как мы «подогнали» модель к временному ряду, она должна учитывать частично или полностью последовательную корреляцию, присутствующую в коррелограмме. То есть, приспосабливая модель к историческому временному ряду, мы уменьшаем последовательную корреляцию и, таким образом, «устраняем ее».
Наш процесс состоит в том, чтобы рассмотреть широкий спектр моделей, включая их предположения и их сложность, а затем выбрать такую модель, которая, будучи «самой простой», объяснит серийную корреляцию.
Когда у нас есть такая модель, мы можем использовать ее для прогнозирования будущих цен или будущего поведения в целом. Этот прогноз, очевидно, чрезвычайно полезен в количественной торговле.
Если мы можем предсказать направление движения актива, то у нас есть основа для торговой стратегии (с учетом транзакционных издержек, конечно!). Кроме того, если мы можем предсказать волатильность актива, то у нас есть основа для другой торговой стратегии или подхода к управлению рисками. Вот почему мы заинтересованы в свойствах второго порядка, поскольку они дают нам средства, позволяющие делать прогнозы.
Здесь возникает один вопрос: «Как мы узнаем, что наша модель хорошо нам подходит?». Какие критерии мы используем, чтобы судить, какая модель лучше? На самом деле их несколько! Мы рассмотрим эти критерии в этой серии статей.
Подведем итоги общего процесса, которому мы будем следовать на протяжении всей серии:
1. Обозначить гипотезу о конкретном временном ряду и его поведении.
2. Получить коррелограмму временного ряда (возможно, используя библиотеки R или Python) и оценить ее последовательную корреляцию.
3. Использовать наши знания о моделях временных рядов и подобрать подходящую модель, чтобы уменьшить последовательную корреляцию в остатках (определение см. ниже) модели и ее временных рядов.
4. Уточнять соответствие до тех пор, пока корреляция не исчезнет, и использовать математические критерии для оценки соответствия модели.
5. Использовать модель и ее свойства второго порядка, чтобы делать прогнозы относительно будущих значений.
6. Оценить точность этих прогнозов, используя статистические методы (например, матрицы ошибок, кривые ROC для классификации или регрессивные показатели, такие как MSE, MAPE и т. д.).
7. Повторять этот процесс до тех пор, пока точность не станет оптимальной, а затем использовать такие прогнозы для создания торговых стратегий.
Это наш основной процесс. Сложность возникнет, когда мы рассмотрим более сложные модели, которые учитывают дополнительную последовательную корреляцию в наших временных рядах.
В этой статье мы собираемся рассмотреть две из самых базовых моделей временных рядов, а именно белый шум и случайные блуждания. Эти модели позже лягут в основу более продвинутых моделей, поэтому важно, чтобы мы хорошо их понимали.
Однако, прежде чем мы представим любую из этих моделей, мы собираемся обсудить некоторые более абстрактные концепции, которые помогут нам унифицировать наш подход к моделям временных рядов. В частности, мы собираемся определить оператор обратного сдвига и оператор разности.
Операторы обратного сдвига и разности
Оператор обратного сдвига (BSO) и оператор разности позволят нам написать множество различных моделей временных рядов особым образом, который поможет нам понять, чем они отличаются друг от друга.
Поскольку мы будем часто использовать обозначения каждого из них, имеет смысл определить их сейчас.
Оператор обратного сдвига
Оператор обратного сдвига или оператор запаздывания, B, принимает в качестве аргумента элемент временного ряда и возвращает элемент на одну единицу времени ранее:
Повторное применение оператора позволяет сделать шаг назад n раз:
Мы будем использовать BSO для определения многих наших моделей временных рядов в будущем.
Кроме того, когда мы приступим к изучению нестационарных моделей временных рядов (то есть их среднее значение и дисперсия могут изменяться со временем), мы можем использовать процедуру дифференцирования, чтобы взять нестационарный ряд и создать из него стационарный ряд.
Оператор разности
Оператор разности, ∇, принимает элемент временного ряда в качестве аргумента и возвращает разность между этим элементом и предыдущим:
Как и в случае с BSO, мы можем применять оператор разности многократно:
Теперь, когда мы обсудили эти абстрактные операторы, давайте рассмотрим некоторые конкретные модели временных рядов.
Белый шум
Начнем с попытки понять концепцию белого шума.
Выше мы упоминали, что наш основной подход состоял в том, чтобы попытаться подогнать модели к временному ряду, пока в оставшихся рядах не будет никакой последовательной корреляции. Это мотивирует определение ряда остатков или ошибок:
Ряд остатков
Ряд ошибок или остатков, xt, представляет собой временной ряд разностей между наблюдаемым значением и предсказанным значением из модели временного ряда в конкретный момент времени t.
Если yt - наблюдаемое значение, а ŷt - предсказанное значение, мы говорим, что: xt = yt-ŷt - остатки.
Ключевым моментом является то, что если выбранная нами модель временных рядов способна «объяснить» последовательную корреляцию в наблюдениях, то сами остатки серийно не коррелируют.
Это означает, что каждый элемент серийно некоррелированного ряда остатков является независимой реализацией от некоторого распределения вероятностей. То есть сами остатки независимы и одинаково распределены (i.i.d.).
Следовательно, если мы собираемся начать создание моделей временных рядов, которые объясняют любую последовательную корреляцию, кажется естественным начать с процесса, который производит независимые случайные величины из некоторого распределения. Это напрямую ведет к концепции (дискретного) белого шума:
Дискретный белый шум (DWN)
Рассмотрим временной ряд {wt: t = 1, ... n}. Если элементы ряда wi независимы и одинаково распределены (i.i.d.), с нулевым средним значением, дисперсией σ2 и отсутствием последовательной корреляции (т.е. Cor(wi,wj)≠0,∀i≠j), то мы говорим, что временной ряд - это дискретный белый шум (DWN).
В частности, если значения wi взяты из стандартного нормального распределения (т. е. Wt∼N (0, σ2)), то этот ряд известен как гауссовский белый шум.
Белый шум полезен во многих контекстах. В частности, с его помощью можно моделировать «синтетический» ряд.
Как мы упоминали ранее, исторический временной ряд - это только один наблюдаемый случай. Если мы сможем смоделировать несколько реализаций, мы сможем создать «множество историй» и, таким образом, сгенерировать статистику для некоторых параметров конкретных моделей. Это поможет нам улучшить наши модели и тем самым повысить точность наших прогнозов.
Теперь, когда мы определили дискретный белый шум, мы собираемся изучить некоторые его атрибуты, включая его свойства второго порядка и его коррелограмму.
Свойства второго порядка
Свойства второго порядка DWN очевидны и легко следуют из фактического определения. В частности, среднее значение ряда равно нулю, и по определению нет автокорреляции:
Коррелограмма
Мы также можем построить коррелограмму DWN, используя R. Во-первых, мы установим случайное начальное число равным 1, чтобы ваши случайные розыгрыши были идентичны моим. Затем мы возьмем 1000 элементов из нормального распределения и построим график автокорреляции:
> set.seed(1)
> acf(rnorm(1000))
Обратите внимание, что при k = 6, k = 15 и k = 18 у нас есть три пика, которые отличаются от нуля на уровне 5%. Однако этого следовало ожидать просто из-за отклонения выборки от нормального распределения.
Еще раз, мы должны быть предельно осторожны в интерпретации результатов. В этом случае, действительно ли мы ожидаем, что что-нибудь физически значимое произойдет при k = 6, k = 15 или k = 18?
Обратите внимание, что модель DWN имеет только один параметр, а именно дисперсию σ2. К счастью, оценить дисперсию с помощью R несложно, мы можем просто использовать функцию var:
> set.seed(1)
> var(rnorm(1000, mean=0, sd=1))
1.071051
Мы специально подчеркнули, что приведенное выше нормальное распределение имеет среднее значение, равное нулю, и стандартное отклонение, равное 1 (и, следовательно, дисперсию, равную 1). R вычисляет дисперсию выборки как 1,071051, что близко к значению генеральной совокупности, равному 1.
Ключевой вывод для DWN заключается в том, что мы используем его в качестве модели для остатков. Мы стремимся подогнать другие модели временных рядов к нашим наблюдаемым рядам, и на этом этапе мы используем DWN в качестве подтверждения того, что мы устранили любую оставшуюся серийную корреляцию из остатков и, таким образом, получили хорошее соответствие модели.
Теперь, когда мы изучили DWN, мы перейдем к известной модели (некоторых) финансовых временных рядов, а именно к случайному блужданию.
Случайное блуждание
Случайное блуждание - это еще одна модель временных рядов, в которой текущее наблюдение равно предыдущему наблюдению со случайным шагом вверх или вниз. Формально оно определяется ниже:
Случайное блуждание
Случайное блуждание - это модель временного ряда xt, такая что xt = xt − 1 + wt, где wt - ряд дискретного белого шума.
Напомним, что выше мы определили оператор обратного сдвига B. Мы можем применить BSO к случайному блужданию:
И отступая еще дальше:
Если повторить этот процесс до конца временного ряда, мы получим:
Отсюда ясно, что случайное блуждание - это просто сумма элементов из ряда дискретного белого шума.
Свойства второго порядка
Свойства второго порядка случайного блуждания немного интереснее, чем свойства дискретного белого шума. Хотя среднее значение случайного блуждания по-прежнему равно нулю, ковариация фактически зависит от времени. Следовательно, случайное блуждание не стационарно:
В частности, ковариация равна дисперсии, умноженной на время. Следовательно, с увеличением времени увеличивается и дисперсия.
Что это значит для случайных блужданий? Проще говоря, это означает, что нет смысла экстраполировать их «тенденции» на долгосрочную перспективу, поскольку это буквально случайные блуждания.
Коррелограмма
Автокорреляция случайного блуждания (которая также зависит от времени) может быть получена следующим образом:
Обратите внимание, это означает, что если мы рассматриваем длинные временные ряды с краткосрочными лагами, то мы получаем автокорреляцию, которая почти равна единице. То есть у нас чрезвычайно высокая автокорреляция, которая не уменьшается очень быстро с увеличением задержки. Мы можем смоделировать такой ряд с помощью R.
Во-первых, мы устанавливаем начальное значение, чтобы вы могли точно воспроизвести мои результаты. Затем мы создаем две последовательности случайных розыгрышей (x и w), каждая из которых имеет одинаковое значение (что задано с помощью seed).
Затем мы перебираем каждый элемент x и присваиваем ему значение предыдущего значения x плюс текущее значение w. Это дает нам случайное блуждание. Затем мы строим результаты, используя type = "l", чтобы получить линейный, а не точечный график.
> set.seed(4)
> x <- w <- rnorm(1000)
> for (t in 2:1000) x[t] <- x[t-1] + w[t]
> plot(x, type="l")
Реализация случайного блуждания с 1000 временных шагов
Нарисовать коррелограмму тоже достаточно просто:
> acf(x)
Коррелограмма случайного блуждания
Подгонка моделей случайного блуждания к финансовым данным
Мы упоминали выше и в предыдущей статье, что попробуем подогнать модели к данным, которые мы уже смоделировали.
Очевидно, это несколько надумано, поскольку мы в первую очередь смоделировали случайное блуждание! Однако мы пытаемся продемонстрировать процесс подгонки. В реальных ситуациях мы не будем знать основную модель наших данных, мы сможем только подобрать модели, а затем оценить коррелограмму.
Мы заявили, что этот процесс был полезен, потому что он помогает нам проверить, правильно ли мы реализовали модель, пытаясь убедиться, что оценки параметров близки к тем, которые используются в симуляциях.
Подгонка к смоделированным данным
Поскольку мы собираемся потратить много времени на подгонку моделей к финансовым временным рядам, мы должны сначала попрактиковаться на модельных данных, чтобы мы хорошо разбирались в этом процессе, когда начнем использовать реальные данные.
Мы уже смоделировали случайное блуждание, поэтому мы можем также использовать эту реализацию, чтобы проверить, точна ли наша предлагаемая модель (случайного блуждания).
Как мы можем определить, подходит ли предлагаемая нами модель случайного блуждания к нашим смоделированным данным? Что ж, мы используем определение случайного блуждания, которое просто заключается в том, что реализацией процесса дискретного белого шума является разность между двумя соседними значениями.
Следовательно, если мы создадим серию разностей элементов из нашего смоделированного ряда, у нас должен получиться ряд, напоминающий дискретный белый шум!
В R это можно сделать очень просто с помощью функции diff. Создав ряд разностей, мы хотим построить коррелограмму, а затем оценить, насколько она близка к дискретному белому шуму:
> acf(diff(x))
Что мы можем заметить из этого графика? Статистически значимый пик наблюдается при k = 10, но он незначителен. Помните, что мы ожидаем увидеть как минимум 5% пиков статистически значимыми просто из-за вариации выборки.
Следовательно, мы можем с полным основанием утверждать, что коррелограмма выглядит как коррелограмма дискретного белого шума. Это означает, что модель случайного блуждания хорошо подходит для наших смоделированных данных. Именно этого и следовало ожидать, поскольку мы в первую очередь имитировали случайное блуждание!
Соответствие финансовым данным
Теперь применим нашу модель случайного блуждания к некоторым реальным финансовым данным. Как и в случае с библиотекой Python, pandas, мы можем использовать пакет R Quantmod для простого извлечения финансовых данных из Yahoo Finance.
Мы собираемся посмотреть, подходит ли модель случайного блуждания к некоторым данным по акциям. В частности, я выберу Microsoft (MSFT), но вы можете поэкспериментировать со своим любимым активом!
Прежде чем мы сможем загрузить какие-либо данные, мы должны установить Quantmod, поскольку он не является частью стандартной установки R. Выполните следующую команду и выберите ближайшее к вам зеркало сервера пакетов R:
> install.packages('quantmod')
После установки пакета Quantmod мы можем использовать его для получения исторических цен акций MSFT:
> require('quantmod')
> getSymbols('MSFT', src='yahoo')
> MSFT
..
..
2015-07-15 45.68 45.89 45.43 45.76 26482000 45.76000
2015-07-16 46.01 46.69 45.97 46.66 25894400 46.66000
2015-07-17 46.55 46.78 46.26 46.62 29262900 46.62000
Этот код создаст объект под названием MSFT в пространстве имен R, который содержит историю цен и объемов MSFT. Нас интересует цена закрытия, скорректированная на корпоративные действия. Мы можем использовать следующие команды для (соответственно) получения цен открытия, максимума, минимума, закрытия, объема и скорректированного закрытия для акций Microsoft: Op(MSFT), Hi(MSFT), Lo(MSFT), Cl(MSFT), Vo(MSFT), Ad(MSFT).
Наш процесс будет заключаться в том, чтобы взять разность значений скорректированного закрытия, опустить все отсутствующие значения, а затем пропустить их через функцию автокорреляции. Когда мы строим коррелограмму, мы ищем доказательства дискретного белого шума, то есть ряд остатков, который не коррелирует последовательно. Чтобы выполнить это в R, мы запускаем следующую команду:
> acf(diff(Ad(MSFT)), na.action = na.omit)
Последняя часть (na.action = na.omit) указывает функции acf игнорировать отсутствующие значения, опуская их. Вывод функции acf следующий:
Мы замечаем, что большинство лаг-пиков не отличаются от нуля на уровне 5%. Однако есть несколько, которые чуть выше. Учитывая, что запаздывания ki, где существуют пики, немного отличаются от k = 0, мы склонны думать, что они вызваны стохастической вариацией и не представляют какой-либо физической серийной корреляции в ряду.
Следовательно, мы можем с достаточной степенью уверенности заключить, что скорректированные цены закрытия MSFT хорошо аппроксимируются случайным блужданием.
Давайте теперь попробуем тот же подход на самом S&P500. Символ Yahoo Finance для индекса S&P500 - ^GSPC. Следовательно, если мы введем следующие команды в R, мы сможем построить коррелограмму разностного ряда S&P500:
> getSymbols('^GSPC', src='yahoo')
> acf(diff(Ad(GSPC)), na.action = na.omit)
Кореллограмма:
Коррелограмма здесь, конечно, интереснее. Обратите внимание на отрицательную корреляцию при k = 1. Маловероятно, что это связано с вариацией случайной выборки.
Также обратите внимание, что есть пики при k = 10, k = 15, k = 16, k = 18 и k = 21. Хотя их существование сложнее обосновать, помимо случайной вариации, они могут указывать на более длительный процесс.
Следовательно, гораздо труднее обосновать, что случайное блуждание является хорошей моделью для данных скорректированного закрытия S&P500. Это мотивирует более сложные модели, а именно модели авторегрессии порядка p, которые будут предметом следующей статьи!
Комментариев нет:
Отправить комментарий