Финансовые временные ряды что это
Финансовые временные ряды что это
Вводный материал о временных рядах. Адаптированный перевод[1] статьи “Beginner’s Guide to Time Series Analysis” ресурса Quantstart.
Содержание:
Предисловие переводчика
Текст продолжает серию публикаций переводов-рерайтов по различным аспектам алготрейдинга от сайта Quantstart.
В этом цикле смотрите:
Изложение от первого лица.
Что такое анализ временных рядов
Под временным рядом (Time Series) понимается величина, последовательно измеряемая во времени в течение некоторого интервала.
В самом широком смысле, анализ временных рядов заключается в том, чтобы сделать вывод о том, что произошло с линейкой данных в прошлом, и попытаться предсказать, что с ними произойдет в будущем.
Мы собираемся применить количественный статистический подход к временным рядам, сформированный на реализации последовательности случайных величин. Будем исходить из того, что существует некий базовый процесс генерации для временных рядов на основе одного или нескольких статистических распределений из которых взяты эти переменные.
Исследователь временных рядов пытается понять прошлое и предсказать будущее.
Такая последовательность случайных величин известна как стохастический процесс с дискретным временем (Discrete-Time Stochastic Process, DTSP). В количественной торговле мы стремимся подогнать статистические модели к DTSP, чтобы вывести главные взаимосвязи между рядами или предсказать будущие значения для торговых сигналов.
Временным рядам в целом, в том числе и не относящимся к финансовой сфере, присущи следующие особенности:
Как применяется анализ временных рядов в количественных финансах
Кроме того, можно применять стандартные статистические тесты к моделям временных рядов для оценки влияния смены ситуации на фондовом рынке и иных внешних факторов.
Программное обеспечение анализа временных рядов
На сегодняшний день для реализации наших торговых стратегий мы почти исключительно пишем на C ++ и Python. Оба языка представляют собой “первоклассные среды” для создания всего торгового стека. Оба содержат множество библиотек и позволяют “сквозное” построение торговой системы только на этих языках.
Дорожная карта в изучении временных рядов от QuantStart
Корреляция. Абсолютно фундаментальным аспектом моделирования временных рядов является концепция последовательной корреляции. Отмечу, что корреляция далеко не всегда подразумевает причинно-следственную связь.
Прогнозирование будущего направления и/или числовых уровней временного ряда.
Регрессия. Имеет место при наличии детерминированных (не стохастических) тенденций в рядах данных, с их экстраполяцией через регрессионные модели. Существует как линейная, так и нелинейная регрессия.
Стационарные модели предполагают, что статистические свойства (а именно среднее значение и дисперсия) ряда постоянны во времени. Мы можем применять модели скользящего среднего (MA), а также комбинировать их с авторегрессией для формирования моделей ARMA.
Нестационарные модели. Многие финансовые временные ряды нестационарны, то есть характеризуются изменяющимся средними значениями и дисперсиями. В частности, цены на активы часто входят в периоды высокой волатильности. Для этих серий нам нужны нестационарные модели, такие как ARIMA, ARCH и GARCH.
Многомерное моделирование. Тесно связано с понятием коинтеграции временных рядов и моделью векторной авторегрессии (VAR).
Модели пространства состояний. Заимствует долгую историю современной теории управления, используемой в инженерии, для моделирования временных рядов с быстро меняющимися параметрами.
перевод, обработка, комментарии и примечания
В основе изложения статья “Beginner’s Guide to Time Series Analysis”, опубликованная на сайте Quantstart.
Список источников (Википедия/Wikipedia, если не оговорено иное)
Финансовые временные ряды что это
ФИНАНСОВЫЕ ВРЕМЕННЫЕ РЯДЫ: КУСОЧНОЕ ПРОГНОЗИРОВАНИЕ И ПРОБЛЕМА ОБНАРУЖЕНИЯ ПРЕДВЕСТНИКОВ СУЩЕСТВУЮЩЕГО ИЗМЕНЕНИЯ ЗАКОНОМЕРНОСТИ
Александр Батуро, Наталья Еременко
Основная проблема в задаче анализа и прогнозирования заключается в построение модели, адекватно отражающей динамику финансовых временных рядов. Рыночный механизм, характеризующийся огромным количеством постоянно меняющихся связей, зависит от множества внешних факторов, способных существенно повлиять на всю структуру его зависимостей, причем воздействие может быть самым разнообразным. Появление тех или иных внешних факторов, как правило, никак не отражается в предыстории финансового временного ряда, но вызывает значительное нарушение его динамики. Именно в этом состоит особенность практически всех финансовых временных рядов. Принятие нового закона, изменение ставки рефинансирования, отставка правительства, смена руководства одной из крупнейших российских компаний, предвыборная кампания, громкие скандалы — вот список немногих факторов, способных существенно повлиять на финансовый рынок.
Другая проблема, с которой приходится сталкиваться при моделировании финансовых временных рядов, состоит в том, что финансовые рынки постоянно испытывают потрясения, примерами которых являются обвал рынков Юго-Восточной Азии, финансовый кризис в России. Это особенно актуально для российского рынка, поскольку риск мгновенно потерять вложенные инвестором средства остается достаточно высоким. Трудно найти объективную причину того, что данное событие произошло именно тогда, когда произошло, а не месяцем раньше или позже. Возникает проблема обнаружения факторов, являющихся предвестниками критических явлений, меняющим направление движения тренда и способных привести в том числе и к кризису.
Для решении задачи анализа и прогнозирования финансовых временных рядов применяется два основных подхода: теоретический и практический. Теоретический подход объединяет модели, гипотезы, теории, дающие представление о наиболее общих зависимостях рыночного механизма, представленных в некотором идеализированном виде. Практический подход уделяет больше внимания непосредственному моделированию финансовых временных рядов, которые рассматривает как реализацию некоторой сложной зависимости неизвестного вида. Главное в данном подходе то, что используемая модель должна успешно решать задачу прогнозирования, а вид ее не имеет значения. Хотя, с другой стороны, для лучшего понимания зависимостей желательно, чтобы способ вычисления будущих значений финансового временного ряда имел осмысленное толкование. Выбор модели, как правило, осуществляется эмпирическим методом на основе некоторого заданного универсального семейства предикторов, возможности которого позволяют описать любой временной ряд. Выбор того или иного семейства моделей отражает специфику решения задачи прогнозирования. Наиболее ярким представителем практического подхода является технический анализ. Кроме того, в последнее время получили широкое распространение регрессионные методы, а также методы, основанные на Wavelet- преобразовании и на нейронных сетях.
Общая черта, объединяющая оба подхода, заключается в попытке построения единой модели для финансового временного ряда. Однако из сказанного выше следует, что построение такой модели наталкивается на ряд принципиальных трудностей, обусловленных природой финансового временного ряда.
Идея подхода, основанного на кусочном моделировании временного ряда состоит в следующем. Исследования показывают, что один и тот же предиктор (Предиктор №1) с разной точностью моделирует разные участки временного ряда. В то время как существует другой предиктор (Предиктор №2), который на одних участках временного ряда предсказывает лучше, чем Предиктор №1, а на других — хуже (или также). Так можно задать целый набор предикторов, которые будут иметь свои особенности. Для прогнозирования выбирается тот предиктор, который лучше остальных спрогнозировал некоторый участок временного ряда. (Чаще всего он состоит из последних нескольких значений этого ряда.) При правильной настройке такой системы можно добиться лучшего качества прогнозирования по сравнению с каждым предиктором из заданного набора в отдельности.
Иллюстрация предлагаемого подхода представлена на рисунке:
Рисунок 1. Кусочное моделирование временного ряда
Общий вид предиктора №1 имеет вид a1*sin(a2*t+a3)+a4, где a1. a4 — настроечные коэффициенты, которые для каждого отдельного участка временного ряда рассчитываются отдельно. Общий вид предиктора №2 имеет вид a1*t+a2, где a1, a2 — коэффициенты, настраиваемые по аналогичной схеме. Цифрами «№1» и «№2» обозначены участки временного ряда, на котором предиктор с соответствующим номером имеет лучшие прогнозирующие свойства.
Две основные проблемы которые необходимо решить при кусочном моделировании заключаются в определении набора предикторов и правила выбора одного из них для прогнозирования некоторого участка временного ряда. Обычно эти проблемы для реальных временных рядов решаются эмпирически, но можно предложить некоторые приемы.
Фундаментальное предположение о временном ряде
Наблюдаются величины X =X(t), X(t)=(х1(t), x2(t),…,xp(t)), p>=1 в дискретные моменты времени t1. tk. (Обычно рассматривается ситуация когда наблюдения производятся через равные промежутки времени В этом случае можно записать t1= t0+1dt, t2=t0+2dt, …, tk=t0+kdt и т.д., где t0 — некоторый начальный момент времени, dt минимальный промежуток времени между наблюдениями). Задача прогнозирования временного ряда заключается в том чтобы по его известному участку оценить будущие значения величины X.
Прежде чем перейти к непосредственному решению данной задачи, необходимо сформулировать ряд фундаментальных предположений о природе временного ряда, в рамках которых можно будет применять ту или иную схему прогнозирования:
Предикторы и их настройка
Ключевым в задаче прогнозирования является понятие «адаптивный предиктор». Предиктором F называется любая вычислительная схема, которая позволяет по значениям одних параметров (входных) получать значения других (выходных) В качестве выходных задаются те параметры, значения которых нужно спрогнозировать, т.е. будущие значения временного ряда. Если, кроме входных параметров, для расчета также используются настроечные коэффициенты, то такой предиктор называют адаптивным. Его обычно применяют тогда, когда имеется некоторый поток данных, к которому нужно постоянно адаптировать работу предиктора. Один из способов, чтобы сделать это, заключается в изменении значении набора настроечных коэффициентов, производимом с помощью некоторой процедуры настройки.
Набор входных и выходных параметров определяет тип предиктора. Если в качестве входных параметров используются значения предыстории временного ряда, то предиктор называется авторегрессионным, например, предиктор , где параметр d определяет глубину предыстории (кочичество этементов временного ряда, используемых для предсказания его будущего значения). Если в качестве аргумента предиктора используется параметр времени t то предиктор называется трендовым, например,
. Это — наиболее распространенные типы предикторов.
На предиктор могут накладываться ограничения например ограничения в виде набора неравенств на значения настроечных коэффициентов предиктора, ограничения на применение процедуры настройки предиктора.
В процессе настройки требуется оценить работу предиктора на всей выборке. Для этого на основе отдельных оценок Н(уk) формируется оценка всей выборки. Для этого может применяться простое суммирование. Решением оптимизационной задачи будет набор настроечных коэффициентов из множества допустимых значений А, обеспечивающих глобальный минимум функции
. Затем обученный предиктор проверяется на тестовой выборке и делается вывод о качестве предсказания. Качество прогноза предиктором временного ряда во многом зависит от обучающей выборки, функции оценки и используемого семейства адаптивных предикторов, поэтому проблемы их выбора являются одними из наиболее важных. Большое значение при решении задачи предсказания временного ряда отводится квалификации и опыту исследователя, формулирующему гипотезы о характере зависимостей во временном ряде на основе априорных сведении о задаче.
Прогнозирование и «разладки»
Общая схема кусочного прогнозирования временного ряда содержит два этапа, подготовительный и основной. На первом этапе происходит сбор информации о предсказывающих свойствах каждой из предикторных схем, а на втором — прогнозирование участка временного ряда предикторной схемой, которая показала лучшие предсказывающие свойства Подготовительный и основной этапы представлены на рисунке 1.
Рисунок 2. Блок-схема метода кусочного прогнозирования
Для определения предикторной схемы с лучшими предсказывающими свойствами используется правило выбора. Это правило на основе реальных и прогнозных значений временного ряда оценивает работу (согласно некоторому критерию Н) каждой предикторной схемы из набора Ф, а затем выбирает лучшую из них. Предикторную схему, выбранную с помощью данного правила, будем называть ведущей. Мы 6удем пользоваться следующим правилом: для прогнозирования временного ряда в момент времени t будет применяться предикторная схема с минимальным значением критерия Н на данный момент; если таких схем несколько, то выбирается любая из них. Формально запишем это таким образом:
Если выбрана некоторая предикторная схема, то она остается ведущей до тех пор, пока выдаваемый ею прогноз удовлетворяет заданному пользователем критерию. Если ошибка предсказания временного ряда начинает существенно возрастать, то это означает, что данная предикторная схема непригодна для дальнейшего прогнозирования В этом случае будем говорить о разладке — ситуации, когда ведущая предикторная схема не удовлетворяет некоторому заданному критерию качества.
Предлагаемый подход может быть применен для решения проблемы обнаружения предвестников существенных изменений закономерности во временном ряде Это имеет большое значение для финансового рынка. Если некоторый предиктор с заданной точностью предсказывает достаточно длинный участок финансового временного ряда, то с высокой степенью уверенности можно говорить о том, что используемый предиктор на данном участке достаточно точно описывает динамику этого ряда. Если после некоторого шага ошибка предсказания начинает существенно возрастать, то будем говорить о нарушении закономерности, зафиксированной в данном предикторе, и появлении разладки. Разладка может свидетельствовать о нарушении закономерности в динамике этого ряда — все это может служить предвестником критических явлений для финансового рынка. Из-за неодинаковой информированности участников рынка реакция на некоторое событие, способное существенно изменить динамику рынка, происходит не сразу и имеет лавинообразный характер. Система, основанная на кусочном моделировании, может реагировать раньше значительной части трейдеров, поскольку тоньше отслеживает изменения зависимостей финансовых временных рядов
Предлагаемый метод был апробирован для обнаружения предвестников критических явлений в финансовом временном ряде.
Прогнозирование финансовых временных рядов с MLP в Keras
Всем привет! В этой статье я хочу рассказать про базовый пайплайн в прогнозировании временных рядов с помощью нейронных сетей, в данном случае, наверное, с самыми сложными временными рядами для анализа — финансовыми данными, которые имеют случайную природу, и, казалось бы, непредсказуемые. Или все-таки нет?
Вступление
Я сейчас учусь на последнем курсе магистратуры в University of Verona по специальности «прикладная математика», и как типичный студент-айтишник из СНГ, работать начал еще на бакалаврате в Киевском Политехническом Институте, применяя тогда еще только набиравшее обороты машинное обучение в разных проектах, чем занимаюсь и сейчас. В университете тема моих исследований — deep learning применительно к временным рядам, в частности — финансовым.
Цель этой статьи — показать процесс работы с временными рядами от обработки данных до постройки нейронных сетей и валидации результатов. В качестве примера финансовые ряды были выбраны как абсолютно случайные и вообще интересно, могут ли обычные архитектуры нейронных сетей уловить нужные паттерны для предсказания поведения финансового инструмента.
Пайплайн, описанный в этой статье, легко применяется к любым другим данным и к другим алгоритмам классификации. Для тех, кто хочет сразу запустить код — можете скачать IPython Notebook.
Подготовка данных
Для начала заимпортим нужные нам для загрузки библиотеки:
Выглядит почти как типичный случайный процесс, но мы попробуем решить задачу прогнозирования на день или несколько вперед. Задачу “прогнозирования” сначала надо описать ближе к задачам машинного обучения. Мы можем предсказывать просто движение цены акций на рынке — больше или меньше — это будет задача бинарной классификации. С другой стороны, мы можем предсказывать или же просто значения цены в следующий день (или через пару дней) или изменение цены в следующий день по сравнению с последним днем, или же логарифм от этой разницы — то есть мы хотим предсказать число, что является задачей регрессии. Но при решении задачи регрессии придется столкнуться с проблемами нормализации данных, которые мы сейчас рассмотрим.
Что в случае классификации, что в случае регрессии, на вход мы возьмем какое-то окно временного ряда (например, 30 дней) и постараемся или предсказать движение цены в следующий день (классификация), или значение изменения (регрессия).
Основная проблема финансовых временных рядов — они вообще ни капельки не стационарны (можете проверить сами с помощью, скажем, теста Дики-Фуллера), то есть их характеристики, как мат. ожидание, дисперсия, среднее максимальное и минимальное значение в окне меняются со временем, что значит, что по-хорошему мы не можем использовать эти значения для MinMax или z-score нормализации по нашим окнам, так как если в 30 дней в нашем окне у нас одни характеристики, но они могут измениться уже на следующий день или измениться посередине нашего окна.
Но если внимательно посмотреть на задачу классификации, нас не так интересует мат. ожидание или дисперсия в следующий день, нас интересует исключительно движение вверх или вниз. Поэтому мы рискнем, и будем нормализировать наши 30-дневные окна с помощью z-score, но только их, не затрагивая ничего из “будущего”:
Для задачи регрессии так уже сделать не получится, ведь если мы будем также вычитать среднее и делить на отклонение, нам придется восстанавливать это значение для значения цены в следующий день, а там уже эти параметры могут быть совершенно другими. Поэтому мы попробуем два варианта: обучить на необработанных данных и попытаемся обмануть систему, взяв процентное изменение цены в следующий день — с этим нам поможет pandas:
Для разделения на обучающую и тренировочную выборку возьмем первые 85% окон во времени для обучения и последние 15% для проверки работы нейронной сети.
Так что для обучения нашей нейронной сети мы получим следующие пары X, Y: цены в момент закрытия рынка за 30 дней и [1, 0] или [0, 1] в зависимости от того, выросло или упало значение цены для бинарной классификации; процентное изменение цен за 30 дней и изменение на следующий день для регрессии.
Архитектура нейронной сети
Как базовую модель будем использовать многослойный перцептрон. Если вы не знакомы с основными понятиями работы нейронных сетей, лучше всего начать отсюда.
В качестве фреймворка для имплементации возьмем Keras — он очень прост, интуитивно понятен и с ним можно реализовывать достаточно сложные вычислительные графы на коленке, но пока что нам это и не понадобится. Реализуем простенькую сетку — входной слой с 30 нейронами (длина нашего окна), первый скрытый слой с 64 нейронами, после него BatchNormalization — его рекомендуется использовать практически для любых многослойных сетей, потом активационная функция (ReLU уже считается не комильфо, поэтому возьмем что-то модное вроде LeakyReLU). На выходе разместим один нейрон (или два для классификации), который в зависимости от задачи (классификация или регрессия) будет или иметь softmax на выходе, или оставим его без нелинейности, чтобы иметь возможность прогнозировать любое значение.
Код для классификации выглядит так:
Для задачи регрессии в конце параметр активации должен быть ‘linear’. Далее нам нужно определить функции ошибки и алгоритм оптимизации. Не вдаваясь в детали вариаций градиентного спуска возьмем Adam с длиной шага 0.001; параметр loss для классификации нужно поставить кросс-энтропию — ‘categorical_crossentropy’, а для регрессии — среднюю квадратическую ошибку — ‘mse’. Также Keras позволяет нам достаточно гибко контролировать процесс обучения, например, хорошая практика — это уменьшать значение шага градиентного спуска, если наши результаты не улучшаются — именно этим и занимается ReduceLROnPlateau, который мы добавили как коллбэк в обучение модели.
Обучение нейронной сети
После того, как процесс обучения завершен, будет неплохо вывести на экран графики динамики значения ошибки и точности:
Перед запуском обучения хочу обратить внимание на на важный момент: учить алгоритмы на таких данных надо подольше, хотя бы 50-100 эпох. Это связано с тем, что если вы обучите на, скажем, 5-10 эпохах и увидите 55% точности, это скорее всего не будет значить, что вы научились находить паттерны, если вы проведете анализ тренировочных данных, будет видно, что просто 55% окон были для одного паттерна (повышение, например), а остальные 45% — для другого (понижение). В нашем случае 53% окон класса “понижения”, а 47% — “повышения”, поэтому мы будем стараться получить точность выше 53%, которая и будет говорить о том, что мы научились находить признаки.
Слишком высокая точность на сырых данных вроде цены закрытия и простых алгоритмах скорее всего будет говорить о переобучении или “заглядывании” в будущее при подготовке обучающей выборки.
Задача классификации
Проведем обучение нашей первой модели и посмотрим на графики:
Как видим, что ошибка, что точность для тестовой выборки все время остается на плюс-минус одном значении, а ошибка для тренировочной падает, а точность растет, что говорит нам о переобучении. Давайте попробуем взять более глубокую модель с двумя слоями:
Вот результаты ее работы:
Приблизительно такая же картина. Когда мы сталкиваемся с эффектом переобучения, нам нужно добавить регуляризацию в нашу модель. Если вкратце, то во время переобучения мы строим модель, которая просто “запоминает” наши тренировочные данные и не позволяет обобщить знания на новые данные. В процессе регуляризации мы накладываем определенные ограничения на веса нейронной сети, чтобы не было большого разброса в значениях и не смотря на большое количество параметров (т.е. весов сети), часть из них обратить в ноль для упрощения. Мы начнем с самого распространенного способа — добавления к функции ошибки дополнительного слагаемого с L2 нормой по сумме весов, в Keras это делается с помощью keras.regularizers.activity_regularizer.
Такая нейронная сетка учится уже немного лучше с точки зрения функции ошибки, но точность все еще страдает:
Такой странный эффект как уменьшение ошибки, но не уменьшение точности нередко встречается при работе с данными большой зашумленности или случайной природы — это объясняется тем, что ошибка считается на основе значения cross-entropy, которое может уменьшаться во время того, как точность — это индекс нейрона с правильным ответом, который даже при изменении ошибки может оставаться неправильным.
Поэтому стоит добавить еще больше регуляризации в нашу модель с помощью популярной в последнии года техники Dropout — грубо говоря, это случайное “игнорирование” некоторых весов в процессе обучения, чтобы избежать ко-адаптации нейронов (чтобы они не выучивали одинаковые признаки). Код выглядит следующим образом:
Как видим, между двумя скрытыми слоями мы будем “дропать” связи во время обучения с вероятностью 50% для каждого веса. Дропаут обычно не добавляют между входным слоем и первым скрытым, так как в этом случае мы будем учить на просто-напросто зашумленных данных, и также не добавляется прямо перед выходом. Во время тестирования сети никакого дропаута, разумеется, не происходит. Как учится такая сетка:
Как видим, графики ошибки и точности адекватны, если остановить обучение сети чуть раньше, можем получить 58% точности предсказания движения цены, что уж точно лучше случайного гадания.
Еще один интересный и интуитивно понятный момент прогнозирования финансовых временных рядов заключается в том, что колебание в следующий день имеет случайную природу, но когда мы смотрим на графики, свечи, мы все-таки можем замечать тренд на следующие 5-10 дней. Давайте проверим, могут ли с такой задачей справиться наша нейронка — спрогнозируем движение цены через 5 дней с последней удачной архитектурой и ради интереса обучим на большем количестве эпох:
Как видим, если мы остановим обучение достаточно рано (со временем все равно наступает оверфиттинг), то можем получить 60% точности, что очень даже неплохо.
Задача регрессии
Для задачи регрессии возьмем нашу последнюю успешную архитектуру для классификации (она уже показала, что умеет выучивать нужные признаки), уберем Dropout и обучим на большем количестве итераций.
Также в данном случае мы можем смотреть уже не только на значение ошибки, а и визуально оценить качество прогнозирование с помощью следующего кода:
Архитектура сети будет выглядеть следующим образом:
Посмотрим что получится, если обучить на “сыром” adjustment close:
Издалека выглядит неплохо, но если присмотреться, мы увидим, что наша нейронная сеть просто запаздывает со своими предсказаниями, что можно считать провалом.
Если же обучить на изменениях цен, то получим следующие результаты:
Некоторые значения предсказываются неплохо, кое-где правильно угадывается тренд, но в целом — так себе.
Обсуждение
В принципе, на первый взгляд, результаты вообще не впечатляют. Так и есть, но мы обучили самый простой вид нейронной сети на одномерных данных без особой предобработки. Есть ряд шагов, которые позволяют вывести точность на уровень 60-70%:
Занимаясь прогнозированием временных рядов, мы оставили без внимания главную цель — использовать эти данные для торговли и убедиться в том, что она будет прибыльная. Я бы хотел это показать в режиме вебинара онлайн и применить сверточные и рекуррентные сети для задачи прогнозирования плюс проверить прибыльность стратегий, использующих эти предсказания. Если кому-то интересно, жду в Hangouts on Air 5 мая в 18:00 по UTC.
Заключение
В этой статье мы применили самую простую архитектуру нейронных сетей для прогнозирования движения цен на рынке. Этот пайплайн можно использовать для любых временных рядов, главное — правильно выбрать предобработку данных, определить архитектуру сети, оценить качество работы алгоритма. В нашем случае у нас удалось с точностью 60% предсказывать тренд через 5 дней, используя окно цен в предыдущие 30 дней, что можно считать хорошим результатом. С количественным предсказанием изменения цены получился провал, для этой задачи целесообразно использовать более серьезные инструменты и статистический анализ временного ряда. Весь используемый код в IPython Notebook можно взять по ссылке.