Выводы из теории хаоса применительно к торговле. Исследование на Python.

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

Финансовые рынки не являются абсолютно случайными, они подобны случайности, т. Е. Демонстрируют низкое соотношение сигнал / шум. Другими словами, трудно прогнозировать рынки и еще труднее быть стабильно прибыльными. Однако слово «трудно» не означает «невозможно». В этой статье мы узнаем о теории хаоса и о том, как ее определение используется на финансовых рынках. Затем мы разработаем индикатор, который использует формулу, близкую к вычислению Rescaled Range, которая часто связана с фрактальной математикой, хотя и более проста по своей природе. В конце концов, нам не нужно слишком усложнять, чтобы понять, как движется рынок.

Я только что опубликовал новую книгу после успеха Новые технические индикаторы в Python. Он содержит более полное описание и добавление сложных торговых стратегий со страницей Github, посвященной постоянно обновляемому коду. Если вы считаете, что это вас заинтересует, не стесняйтесь перейти по приведенной ниже ссылке или если вы предпочитаете купить версию в формате PDF, вы можете связаться со мной в Linkedin.



Введение в теорию хаоса

Теория хаоса - очень сложная математическая область, задача которой - объяснять влияние очень малых факторов. Когда вы думаете о теории хаоса, на ум приходит эффект бабочки. Упомянутый эффект - это явление, при котором незначительные факторы могут привести к экстремальным изменениям. Хаотическая система - это среда, в которой чередуются предсказуемость и случайность, и это самое близкое объяснение, которое у нас есть до сих пор для финансовых рынков. Гипотеза эффективного рынка не может полностью объяснить динамику рынка, и сейчас лучше придерживаться реальных торговых результатов и исторических показателей, чтобы судить о том, предсказуемы ли рынки или нет.

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

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

Как указано выше, Лоренц доказал, что на хаотические системы влияют малейшие изменения их переменных. Это заставляет нас задуматься о том времени, когда, если определенная финансовая информация не публикуется или немного отличается, где будет торговаться рынок?

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

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

Индикатор фрактала

Британский гидролог Гарольд Эдвин Херст ввел меру изменчивости временных рядов за анализируемый период времени. Этот показатель называется анализом измененного диапазона, который является основой нашего индикатора фракталов. Вот как рассчитать масштабированный диапазон:

Формула Rescaled Range очень интересна, поскольку она учитывает волатильность (S), среднее значение (X-bar) и диапазон данных для анализа ее свойств. . Приведенная выше формула говорит о том, что мы должны вычислить диапазон между мини-диапазонами максимального и минимального значений, а затем разделить их на стандартное отклонение, которое в данном случае является показателем волатильности.

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

Объединение максимумов и минимумов может дать нам более ясную картину волатильности, поэтому сначала мы рассчитаем экспоненциальную скользящую среднюю как по минимумам, так и по максимумам за предыдущий период X, а затем рассчитаем их соответствующее стандартное отклонение, то есть волатильность. Затем мы вычислим первый диапазон, в котором мы вычтем текущий максимум из среднего максимума, измеренного экспоненциальной скользящей средней на первом этапе, а затем сделаем то же самое с минимумом. После этого мы рассчитаем скользящий максимум для первого диапазона (максимум минус его среднее значение) и скользящий минимум для второго диапазона (минимум минус его среднее значение). Затем мы вычитаем высокий скользящий максимум из низкого скользящего минимума перед изменением масштаба путем деления результата на среднее значение между двумя стандартными отклонениями, рассчитанными выше для максимумов и минимумов.

Все это делается с помощью следующей функции, для которой требуется массив OHLC с несколькими свободными столбцами:

def fractal_indicator(Data, high, low, ema_lookback, min_max_lookback, where):
    
    Data = ema(Data, 2, ema_lookback, high, where)
    Data = ema(Data, 2, ema_lookback, low, where + 1)
    
    Data = volatility(Data, ema_lookback, high, where + 2)
    Data = volatility(Data, ema_lookback, low, where + 3)
    
    Data[:, where + 4] = Data[:, high] - Data[:, where]
    Data[:, where + 5] = Data[:, low]  - Data[:, where + 1]
for i in range(len(Data)):
        try:
            Data[i, where + 6] = max(Data[i - min_max_lookback + 1:i + 1, where + 4])
        
        except ValueError:
            pass              
        
    for i in range(len(Data)):
        try:
            Data[i, where + 7] = min(Data[i - min_max_lookback + 1:i + 1, where + 5])
        
        except ValueError:
            pass  
         
    Data[:, where + 8] =  (Data[:, where +  2] + Data[:, where +  3]) / 2
    Data[:, where + 9] = (Data[:, where + 6] - Data[:, where + 7]) / Data[:, where + 8]
    
    return Data

Итак, становится ясно, что индикатор фрактала - это просто переработанная версия формулы Rescaled Range, созданная Гарольдом Херстом.

Если вы хотите добавить столбцы в свой массив, вы можете использовать следующую функцию:

def adder(Data, times):
    
    for i in range(1, times + 1):
    
        z = np.zeros((len(Data), 1), dtype = float)
        Data = np.append(Data, z, axis = 1)
return Data

Мы должны понять, как использовать индикатор фракталов. Из графиков видно, что мы можем найти экстремальные значения около нижней конечности, которая составляет 1,00 (или немного ниже, в зависимости от параметров, используемых ниже). Мы можем назвать это фрактальным порогом.

Если вас также интересуют другие технические индикаторы и использование Python для создания стратегий, то моя книга-бестселлер по техническим индикаторам может вас заинтересовать:



Следовательно, разумная торговая стратегия может иметь следующие условия:

  • Каждый раз, когда индикатор фрактала достигает порогового значения 1,00, когда рыночная цена имеет тенденцию к снижению, мы можем ожидать, что произойдет структурный сдвиг рыночной цены, то есть краткосрочный разворот вверх. Мы должны открыть длинную позицию.
  • Каждый раз, когда индикатор фрактала достигает порогового значения 1,00, когда рыночная цена имеет тенденцию к повышению, мы можем ожидать, что произойдет структурный сдвиг рыночной цены, то есть краткосрочный разворот вниз. Мы должны открыть короткую позицию.
trend = 10
def signal(Data, what, closing, buy, sell):
    
    for i in range(len(Data)):
            
     if Data[i, what] < barrier and Data[i, closing] < Data[i - trend, closing]:
        Data[i, buy] = 1
            
     if Data[i, what] < barrier and Data[i, closing] > Data[i - trend, closing]:  
        Data[i, sell] = -1
# The trend variable is the algorithm's way to see whether the market price has been trending down or up. This is to known what position to initiate (long/short) as the Fractal Indicator only shows a uniform signal which is the event of reaching 1.00
# The Data variable refers to the OHLC array
# The what variable refers to the Fractal Indicator
# The closing variable refers to the closing price
# The buy variable refers to where we should place long orders
# The sell variable refers to where we should place short orders

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

  • Первая переменная - это просто период расчета скользящей средней.
  • Вторая переменная - это просто период наблюдения диапазона.

Следовательно, индикатор фрактала с периодом экспоненциальной скользящей средней 20 и периодом ретроспективного обзора нормализации 14 может быть записан как FI (20, 14).

Бэк-тестирование стратегии

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

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

Видно, неплохо и даже можно по-разному оптимизировать. Систематически это показывает потенциал.

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

Это дает нам следующие сигналы:

Заключение

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

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