Цены на акции, как известно, трудно предсказать. На это есть разные причины, в зависимости от того, как подойти к проблеме. Эти причины включают (но не ограничиваются) самоподобие, непериодичность и хаотический характер ценовых движений. Но вне зависимости от лежащих в основе причин одно остается несомненным: типичные методы, такие как ARIMA и множество разновидностей RNN, оказались ненадежными при решении этой задачи.

В этой статье мы собираемся изучить несколько нетрадиционный способ прогнозирования цен на акции. И для этого мы будем рассматривать цену как форму волны.

Представление цены в виде волны подразумевает некоторые основные предположения; наиболее важным является то, что цена на самом деле является всего лишь составным сигналом, состоящим из ряда синусоид. Чтобы идентифицировать и проанализировать эти составляющие синусоиды, мы можем использовать дискретное преобразование Фурье (ДПФ) для разложения нашего сигнала. Точно так же мы можем использовать обратное дискретное преобразование Фурье (iDFT) для восстановления нашего исходного сигнала из этих базовых частей.

Для тех, кто не знает, ДПФ позволяет переводить сигнал из временной области в частотную. И iDFT делает обратное; это означает, что он позволяет вам переводить из частотной области обратно во временную область. Для математического определения см. здесь или здесь.

Чтобы продемонстрировать этот принцип, представьте себе музыканта, играющего на фортепиано аккорд ля минор. Используя ДПФ, мы можем разложить этот аккорд на составные части, а именно на ноты ля, до и ми. Это можно показать ниже. Кстати, если вас интересует код, стоящий за всем этим, вот версия этого поста для ноутбука jupyter.

Давайте разберем, что мы только что сделали. Сначала (сверху вниз) мы начали с построения ля-минорного аккорда. Затем мы использовали ДПФ для перевода ля-минорного аккорда из временной области в частотную. Наконец, в частотной области мы нашли частоты с наиболее заметными амплитудами, что дало нам 28 Гц, 33 Гц и 41 Гц. Обратите внимание, что это частоты, связанные с нотами, составляющими наш ля-минорный аккорд: «A», «C» и «E» соответственно.

Таким образом, мы смогли использовать ДПФ, чтобы разбить исходный аккорд на составляющие его ноты. Точно так же, теперь, когда у нас есть три ноты («A», «C» и «E»), мы можем использовать iDFT для восстановления исходного ля-минорного аккорда. Вот результат этого ниже:

Как видите, реконструированный сигнал (почти) идеально соответствует исходному сигналу. Крайне малая ошибка (5,7е-16) доказывает это количественно.

Итак, мы знаем, что ДПФ способен к интерполяции. Но как бы круто это ни было, а как насчет экстраполяции? Можем ли мы использовать ДПФ и iDFT для эффективного прогнозирования сигнала в будущем?

Оказывается, да, но с некоторыми условиями.

Чтобы экстраполировать сигнал, мы можем рассчитать ДПФ для N временных шагов, найти частоты «x» наиболее заметных амплитуд, а затем использовать iDFT для восстановления нашего ряда по N + p (где p равно количеству будущих временных шагов). мы хотим предсказать). Это дает следующий результат, где красная линия — это наш прогноз, основанный на iDFT:

На самом деле результаты неплохие (для нашего игрушечного набора данных). К сожалению, как вы увидите, у этого метода есть много внутренних проблем при использовании реальных непериодических данных. А пока давайте продемонстрируем это на ценах акций.

Во-первых, мы повторим, что iDFT действительно способен почти идеально реконструировать любой сигнал.

Еще раз, очень маленькая ошибка (1,3e-14) показывает, что восстановленный сигнал почти полностью совпадает с оригиналом.

Теперь мы будем прогнозировать будущие цены, используя ту же методологию iDFT, что и раньше.

На первый взгляд, вы должны заметить две вещи. Во-первых, iDFT смог превосходно смоделировать обучающие данные. Это неудивительно, поскольку мы уже знаем, что можем использовать эти методы для интерполяции любого сигнала. Что удивительно, однако, так это степень, в которой модель iDFT смогла предсказать наши будущие значения цен.

Остерегайтесь, так как это всего лишь иллюзия. На самом деле iDFT не может эффективно прогнозировать будущие значения. На это есть несколько причин, которые мы сейчас кратко обсудим.

Во-первых, iDFT предполагает, что базовая функция будет иметь период, равный N (что является количеством выборок). Точно так же, поскольку частота сигнала обратно пропорциональна его периоду, это означает, что частоты заморожены. Следовательно, iDFT не может эффективно моделировать какие-либо непериодические компоненты сигнала. Таким образом, тот факт, что он почти идеально соответствует обучающим данным, не имеет значения для экстраполяции. На самом деле, поскольку iDFT не может моделировать непериодические компоненты, любой прогноз, использующий эту технику, будет, по сути, просто вечно повторять шаблоны, определенные в обучающих данных. Это явно не идеально.

Продемонстрируем этот факт на другом примере:

Опять же, прогноз iDFT выглядит довольно хорошо, по крайней мере, по направлениям. Однако, если присмотреться и сравнить прогноз с началом таймсерии, становится понятно, что происходит на самом деле.

Чтобы констатировать очевидное, 20-периодный «прогноз» (названный yhat) на самом деле является просто грубым воспроизведением первых 20 временных шагов ряда. Что довольно забавно, так это то, как часто это приводит к приличным результатам. У меня есть несколько предположений, почему это так.

Во-первых, когда цены находятся в тренде, существует высокая вероятность того, что имитация формы более ранних временных шагов будет точной по направлению. Кроме того, цены, кажется, имеют некоторую периодичность. Однако важно отметить, что в моих экспериментах эта степень периодичности колебалась во времени, наряду с постоянно меняющейся рыночной средой. Но в этих относительно периодических рыночных условиях прогноз iDFT, казалось, был способен уловить, где во времени были расположены локальные экстремумы. А учитывая синусоидальный характер любой модели iDFT, это важное наблюдение, поскольку оно придает некоторую достоверность идее о том, что цена действительно является формой волны.

Тем не менее, использование iDFT для прогнозирования движения цен само по себе является ужасной идеей, и я определенно не утверждаю, что его можно использовать в качестве выигрышной торговой стратегии. Однако я подчеркиваю, что есть некоторые интересные характеристики, данные прогнозами iDFT, которые могут дать некоторое представление об истинной природе ценовых движений.

На этом месте я хотел бы сделать короткую паузу и отметить, что DFT технически представляет собой простую однослойную нейронную сеть без функции активации или смещения, а также с заранее рассчитанными весами. По сути, так можно представить любое линейное преобразование, поскольку мы можем переписать такое преобразование, используя матричное умножение — основу нейронных сетей. Чтобы осмыслить это, я рекомендую вам прочитать эту запись в блоге.

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

Нейронная декомпозиция (ND), подробно описанная в этой статье, использует модель, подобную iDFT, с двумя ключевыми отличиями. Во-первых, ND позволяет тренировать частоты; и, во-вторых, ND способен обрабатывать непериодические компоненты с помощью функции увеличения, называемой g(t).

Ниже представлена ​​анатомия этой модели.

На приведенной выше диаграмме w(i) представляет наши частоты, φ(i) представляет наши фазовые сдвиги, a(i) представляет наши амплитуды, а g(t) представляет нашу функцию увеличения.

Математически модель можно описать следующим образом:

Короче говоря, это просто упрощенная версия iDFT с добавленной дополнительной функцией расширения.

Подробности о реализации этой модели на Python можно найти в кодовой версии этой статьи, а также в оригинальной статье. Но основная идея заключается в использовании обучаемых частот в сочетании с обучаемой функцией g(t), которая предназначена для моделирования как линейного тренда, так и нелинейных нарушений, включая любые непериодические компоненты.

Нейронная сеть использует комбинацию синусоидальной, линейной и сигмоидальной функций активации, чтобы помочь увеличить iDFT таким образом, чтобы он мог более точно представлять хаотические, непериодические данные. Кроме того, выходной слой использует регуляризацию L1 для обеспечения разреженности, что теоретически дает нам простую, но надежную модель.

Ниже я приведу некоторые результаты, которые подчеркивают преимущества использования этого подхода по сравнению с методом прогнозирования iDFT, который мы использовали ранее. Обратите внимание, что прогнозы нашей модели выделены красным цветом, а прогноз iDFT — синим.

Для тех, у кого зоркий глаз, вы сразу заметите то, что мы обсуждали ранее. То есть в каждом отдельном примере прогноз iDFT представляет собой просто транспонированную копию первых нескольких десятков временных шагов в наших обучающих данных. С другой стороны, наша модель нейронной сети — нет.

Образцы, которые вы только что видели, конечно же, отобраны из большей популяции. Тем не менее, я специально выбрал именно эти, так как каждый из них показывает что-то интересное о том, что модель смогла узнать. Он не только может предсказать общее направление движения цены, но и способен предсказать общую «форму». Довольно круто, правда?

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

Однако даже в этом сценарии следует отметить, что модель ND не точно имитирует шаблон, в котором копируется iDFT. Причина этого восходит к тому, что iDFT может моделировать только периодические компоненты, в то время как наша модель нейронной сети способна моделировать как периодические, так и непериодические компоненты. Таким образом, хотя приведенный выше пример и не идеален, он показывает, как наша нейронная сеть учится, по крайней мере, правильно, даже когда выдает ошибочные прогнозы.

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

Для нашей нейронной сети было несколько вещей, которые сильно повлияли на качество предсказания. Во-первых, как мы масштабировали наши данные. В оригинальной статье авторы утверждали, что лучше всего работает масштабирование от 0 до 10. Однако в своих экспериментах с ценами на акции я обнаружил, что масштабирование от 0 до 5 работает лучше.

Но более важным, чем масштабирование наших данных, было используемое контекстное окно. И если вы задумаетесь о том, что на самом деле делают ТПФ и iDFT, вы можете догадаться, почему контекстное окно так важно. Например, многие люди (включая меня) считают, что фондовый рынок имеет некую форму «памяти». То есть определенное поведение цены за несколько недель, месяцев или даже лет назад может дать психологический «толчок», который, в свою очередь, может сдвинуть рынок с места. Что ж, если наше контекстное окно слишком маленькое, наша модель не сможет решить, на каких частотах делать акцент для реконструкции и прогнозирования нашего сигнала. Точно так же, если наше контекстное окно слишком велико, оно может сделать акцент на какой-то долгосрочной гармонике, которая ложно искажает наш прогноз.

В приведенных здесь примерах я использовал 128-дневный период обучения с 22-дневным периодом прогнозирования. Это было довольно произвольно, так как я просто случайным образом выбрал окно в 150 дней, а затем использовал разделение 85/15 для наших обучающих и тестовых данных.

На мой взгляд, оптимальное контекстное окно, скорее всего, является функцией текущей рыночной среды. Например, в периоды с более высокой волатильностью может иметь смысл использовать меньшее контекстное окно, поскольку цены имеют более короткую «память». А в периоды с более низкой волатильностью может иметь смысл использовать большее окно контекста по противоположной причине.

Вероятно, существует много способов решить проблему оптимального контекста. Однако моя первоначальная мысль заключалась в том, чтобы потенциально использовать обучение с подкреплением, чтобы создать эту функцию для нас. Функции этой модели, скорее всего, будут включать в себя такие вещи, как волатильность и показатель Херста, который измеряет, находятся ли цены в тренде или возвращаются к среднему.

Во всяком случае, я остановлюсь на этом.

Очевидно, что ничто из того, что я представил в этой статье, не должно использоваться для каких-либо торговых решений в реальном времени. Использование преобразования Фурье в трейдинге является в значительной степени неизученной областью, и, вероятно, для этого есть веская причина. При этом я надеюсь, что вам было так же интересно, как и мне. Спасибо за прочтение.