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

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

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



Пошаговое построение стохастического осциллятора

Осциллятор стохастик пытается найти зоны перепроданности и перекупленности, объединяя максимумы и минимумы, используя формулу нормализации, как показано ниже:

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

Мы создадим следующую функцию, которая вычисляет стохастик по данным OHLC:

def stochastic(Data, lookback, what, high, low, where):
        
    for i in range(len(Data)):
        
        try:
          Data[i, where] = (Data[i, what] - min(Data[i - lookback + 1:i + 1, low])) / (max(Data[i - lookback + 1:i + 1, high]) - min(Data[i - lookback + 1:i + 1, low]))
        
        except ValueError:
            pass
    
    Data[:, where] = Data[:, where] * 100    
    return Data
# The Data variable refers to the OHLC array
# The lookback variable refers to the period (5, 14, 21, etc.)
# The what variable refers to the closing price
# The high variable refers to the high price
# The low variable refers to the low price
# The where variable refers to where to put the Oscillator

На приведенном выше графике показаны значения EURUSD, построенные с помощью 14-периодного стохастического осциллятора. Обратите внимание, что индикатор всегда будет ограничен между 0 и 100 из-за характера его функции нормализации, которая улавливает значения между минимумом и максимумом. Синяя линия выше называется быстрым стохастиком % K. Как правило, программное обеспечение для построения графиков показывает быстрый стохастик и медленный стохастик, который представляет собой примененную к нему трехпериодную скользящую среднюю, также называемую % D.

Параметры по умолчанию, которые обычно встречаются в торговом программном обеспечении, относятся к 14-периодному стохастику. Обычно он имеет уровни перекупленности на 20 и перепроданности на 80. Некоторые программы используют другие параметры, такие как 15 и 85.

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

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

def ma(Data, lookback, what, where):
    
  for i in range(len(Data)):
      try:
        Data[i, where] = (Data[i - lookback + 1:i + 1, what].mean())
        
            except IndexError:
                pass
    return Data
# Using the Function
my_data = ma(my_data, 3, fast_stochastic_column, empty_new_column)

Стратегия обратного стохастика

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

  • Каждый раз, когда быстрый стохастик% K пересекает медленный стохастик% D, формируется бычий сигнал, и мы должны открывать длинную позицию (покупать).
  • Каждый раз, когда быстрый стохастик% K пересекает медленный стохастик% D, формируется медвежий сигнал, и мы должны открывать короткую позицию (продавать).

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



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

Таким образом, новые обновленные теоретические торговые условия (которые мы позже изменим):

  • Каждый раз, когда быстрый стохастик% K пересекает медленный стохастик% D, будучи перепродан, генерируется бычий сигнал, и мы должны открывать длинную позицию (покупать).
  • Каждый раз, когда быстрый стохастик% K пересекает медленный стохастик% D, будучи перекупленным, генерируется медвежий сигнал, и мы должны открывать короткую позицию (продавать).
upper_barrier = 85
lower_barrier = 15
def signal(Data, fast_stoch, slow_stoch, buy, sell):
    
    for i in range(len(Data)):
            
        if Data[i, fast_stoch] > Data[i, slow_stoch] and Data[i - 1, fast_stoch] < Data[i - 1, slow_stoch] and \
            Data[i, fast_stoch] < lower_barrier:
            Data[i, buy] = 1
            
        if Data[i, fast_stoch] < Data[i, slow_stoch] and Data[i - 1, fast_stoch] > Data[i - 1, slow_stoch] and \
            Data[i, fast_stoch] > upper_barrier:
            Data[i, sell] = -1

Для сопоставимости я не буду использовать какие-либо инструменты управления рисками для стратегий. Давайте посмотрим на результаты, используя приведенные выше условия:

Теперь, если мы попробуем обратную теоретическую стратегию, которая имеет следующие условия:

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

Получаем следующие результаты:

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

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

  • Каждый раз, когда быстрый стохастик% K пересекает медленный стохастик% D, генерируется медвежий сигнал, и мы должны открывать короткую позицию (продавать).
  • Каждый раз, когда быстрый стохастик% K пересекает медленный стохастик% D, формируется бычий сигнал, и мы должны открывать длинную позицию (покупать).

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

Торги проводились с использованием спреда 0,2 пункта без системы управления рисками. Данные используются ежечасно с января 2010 года.

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

Слово об управлении рисками

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

Длинная позиция (покупка):

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

Короткая (продажа) позиция:

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

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

Взгляните на последнее значение ATR. Это около 0,0014 (14 пунктов). Если мы инициируем ордер на покупку, следуя простому соотношению риска и прибыли 2,00 (рискуя половиной того, что мы ожидаем получить), мы можем разместить ордер следующим образом:

  • Купить по текущей рыночной цене.
  • Тейк-профит по текущей рыночной цене + (2 x 14 пунктов).
  • Остановите позицию по текущей рыночной цене - (1 x 14 пунктов).

Заключение

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

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