Кодирование индикатора разворота Роба Букера на Python.

Некоторые менее известные индикаторы на самом деле работают неплохо. Среди них - индикатор разворота Роба Букера, который использует особую комбинацию осциллятора MACD и осциллятора стохастика. В этой статье обсуждается создание индикатора на Python. Все кредиты принадлежат Робу Букеру.

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



Осциллятор MACD

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

Как рассчитывается MACD? Это разница между 26-периодной экспоненциальной скользящей средней, применяемой к цене закрытия, и 12-периодной экспоненциальной скользящей средней, также применяемой к цене закрытия. Значение, найденное после взятия разницы, называется линией MACD. 9-периодная экспоненциальная скользящая средняя этого расчета называется сигналом MACD.

# The function to add a number of columns inside an array
def adder(Data, times):
    
    for i in range(1, times + 1):
    
        new_col = np.zeros((len(Data), 1), dtype = float)
        Data = np.append(Data, new_col, axis = 1)
        
    return Data
# The function to delete a number of columns starting from an index
def deleter(Data, index, times):
    
    for i in range(1, times + 1):
    
        Data = np.delete(Data, index, axis = 1)
        
    return Data
    
# The function to delete a number of rows from the beginning
def jump(Data, jump):
    
    Data = Data[jump:, ]
    
    return Data
# Example of adding 3 empty columns to an array
my_ohlc_array = adder(my_ohlc_array, 3)
# Example of deleting the 2 columns after the column indexed at 3
my_ohlc_array = deleter(my_ohlc_array, 3, 2)
# Example of deleting the first 20 rows
my_ohlc_array = jump(my_ohlc_array, 20)
# Remember, OHLC is an abbreviation of Open, High, Low, and Close and it refers to the standard historical data file
def ma(Data, lookback, close, where): 
    
    Data = adder(Data, 1)
    
    for i in range(len(Data)):
           
            try:
                Data[i, where] = (Data[i - lookback + 1:i + 1, close].mean())
            
            except IndexError:
                pass
            
    # Cleaning
    Data = jump(Data, lookback)
    
    return Data
def ema(Data, alpha, lookback, what, where):
    
    alpha = alpha / (lookback + 1.0)
    beta  = 1 - alpha
    
    # First value is a simple SMA
    Data = ma(Data, lookback, what, where)
    
    # Calculating first EMA
    Data[lookback + 1, where] = (Data[lookback + 1, what] * alpha) + (Data[lookback, where] * beta)
    # Calculating the rest of EMA
    for i in range(lookback + 2, len(Data)):
            try:
                Data[i, where] = (Data[i, what] * alpha) + (Data[i - 1, where] * beta)
        
            except IndexError:
                pass
            
    return Data
def macd(Data, what, long_ema, short_ema, signal_ema, where):
    
    Data = adder(Data, 1)
    
    Data = ema(Data, 2, long_ema,  what, where)
    Data = ema(Data, 2, short_ema, what, where + 1)
    
    Data[:, where + 2] = Data[:, where + 1] - Data[:, where]
    Data = jump(Data, long_ema)
    Data = ema(Data, 2, signal_ema, where + 2, where + 3)
    
    Data = deleter(Data, where, 2)   
    Data = jump(Data, signal_ema)
    
    return Data

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

Если вы хотите поддержать меня и статьи, которые я регулярно публикую, рассмотрите возможность подписки на мой ЕЖЕДНЕВНЫЙ информационный бюллетень (доступен бесплатный план) по приведенной ниже ссылке. В нем есть статьи о моем Medium, другие торговые стратегии, уроки программирования, связанные с исследованиями и анализом, а подписчики получают бесплатную копию моей книги в формате PDF. Вы можете ожидать 5–7 статей в неделю с платной подпиской и 1-2 статей в неделю с бесплатным планом. Это поможет мне продолжать делиться своими исследованиями. Спасибо!



Стохастический осциллятор

Первое, что нужно понять со стохастическим осциллятором, - это нормализация. Этот метод позволяет нам захватывать значения от 0 до 1 (или от 0 до 100, если мы хотим умножить на 100). Концепция вращается вокруг вычитания минимального значения в определенном периоде ретроспективного анализа из текущего значения и деления на максимальное значение в тот же период ретроспективного анализа за вычетом минимального значения (то же самое в номинаторе).

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

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

def stochastic(Data, lookback, high, low, close, where, genre = 'High-Low'):
        
    # Adding a column
    Data = adder(Data, 1)
    
    if genre == 'High-Low':
        
        for i in range(len(Data)):
            
            try:
                Data[i, where] = (Data[i, close] - 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
            
    if genre == 'Normalization':
        
        for i in range(len(Data)):
            
            try:
                Data[i, where] = (Data[i, close] - min(Data[i - lookback + 1:i + 1, close])) / (max(Data[i - lookback + 1:i + 1, close]) - min(Data[i - lookback + 1:i + 1, close]))
            
            except ValueError:
                pass
            
    Data[:, where] = Data[:, where] * 100  
    Data = jump(Data, lookback)
    return Data

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

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



Создание индикатора разворота Роба Букера

Индикатор разворота - это индикатор наложения, основанный на стрелках, созданных в соответствии с некоторыми правилами на MACD и осцилляторах стохастика:

  • Для длинного сигнала разворота (покупка) осциллятор MACD с параметрами по умолчанию должен превышать нулевую линию, в то время как 10-периодное простое скользящее среднее 70-периодного осциллятора стохастика находится ниже нижнего барьера 30.
  • Для короткого сигнала разворота (Продажа) осциллятор MACD с параметрами по умолчанию должен пробить нулевую линию, в то время как 10-периодное простое скользящее среднее 70-периодного осциллятора Стохастик находится выше верхнего барьера 70.

# Setting parameters
stoch_lookback = 70
lower_barrier  = 30
upper_barrier  = 70
# Calling the 70-period Stochastic oscillator
my_data = stochastic(my_data, stoch_lookback, 1, 2, 3, 4)
# Calling the 10-period moving average on the Stochastic values
my_data = ma(my_data, 10, 4, 5)
# Calling the MACD function
my_data = macd(my_data, 3, 26, 12, 9, 6)

def signal(Data, stoch_col, macd_col, buy, sell):
    
    Data = adder(Data, 10)
        
    for i in range(len(Data)):
            
        if Data[i, macd_col] > 0 and Data[i - 1, macd_col] < 0 and Data[i, stoch_col] < lower_barrier:
               
               Data[i, buy] = 1
            
        elif Data[i, macd_col] < 0 and Data[i - 1, macd_col] > 0 and Data[i, stoch_col] > upper_barrier:
                              
               Data[i, sell] = -1
                
    return Data

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

Заключение

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

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

Medium - это центр множества интересных чтений. Я прочитал много статей, прежде чем решил начать писать. Рассмотрите возможность присоединения к Medium по моей реферальной ссылке!



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