Кодирование Ultimate Oscillator Уильяма и тестирование его стратегии.
Ларри Вильямс разработал индикатор, который он назвал Ultimate Oscillator, который основан на сочетании давления покупателей, истинного диапазона и скользящих средних. Идея индикатора - найти зоны перепроданности и перекупленности, откуда возможны реакции. В этом индикаторе мы закодируем и протестируем Ultimate Oscillator на исторических данных и посмотрим, обладает ли он прогностической силой или нет.
Я только что опубликовал новую книгу после успеха New Technical Indicators in Python. Он содержит более полное описание и добавление сложных торговых стратегий со страницей Github, посвященной постоянно обновляемому коду. Если вы считаете, что это вас заинтересует, не стесняйтесь перейти по приведенной ниже ссылке или если вы предпочитаете купить версию в формате PDF, вы можете связаться со мной в Linkedin.
Концепция скользящих средних
Скользящие средние помогают нам подтверждать тренд и управлять им. Они являются наиболее известными техническими индикаторами, и это связано с их простотой и доказанным опытом повышения ценности анализа. Мы можем использовать их для поиска уровней поддержки и сопротивления, стопов и целей, а также для понимания основного тренда. Эта универсальность делает их незаменимым инструментом в нашем торговом арсенале.
Как следует из названия, это ваше простое простое средство, которое используется повсюду в статистике и практически в любой другой части нашей жизни. Это просто общие значения наблюдений, разделенные на количество наблюдений. Математически это можно записать как:
Мы видим, что скользящая средняя обеспечивает достойные динамические уровни поддержки и сопротивления, откуда мы можем разместить наши ордера в случае, если рынок там пойдет вниз.
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
Еще одна еще более динамичная скользящая средняя - экспоненциальная. Его идея состоит в том, чтобы придать больший вес более свежим значениям, чтобы уменьшить отставание между ценой и средним значением.
Обратите внимание, как экспоненциальная скользящая средняя ближе к ценам, чем простая, когда тренд сильный. Это потому, что он придает больший вес последним значениям, чтобы среднее не оставалось очень большим. Чтобы закодировать функцию в Python, которая выводит этот тип среднего, вы можете использовать следующий фрагмент:
def ema(Data, alpha, lookback, what, where): # alpha is the smoothing factor # window is the lookback period # what is the column that needs to have its average calculated # where is where to put the exponential moving average 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
Построение абсолютного осциллятора
Создатель осциллятора преследовал цель обнаруживать растянутые движения импульса в разные периоды ретроспективного анализа. Это, в свою очередь, снижает избыточную волатильность, вызванную более короткими периодами ретроспективного анализа. Чтобы построить Ultimate Oscillator, мы выполним следующие шаги, прежде чем представить их более подробно прямо ниже:
- Выберите периоды ретроспективного анализа трех скользящих средних, которые мы будем использовать. По умолчанию создатель осциллятора устанавливает периоды 7, 14 и 28. Как поклонник последовательности Фибоначчи я буду использовать 5, 13 и 21.
- Рассчитайте покупательское давление для каждого периода.
- Рассчитайте истинный диапазон для каждого периода.
- Разделите покупательское давление на истинный диапазон для каждого периода.
- Рассчитайте экспоненциальную скользящую среднюю предыдущего результата трижды, используя три разных периода.
- Рассчитайте средневзвешенное значение трех экспоненциальных скользящих средних и умножьте на 100.
Если вас также интересуют другие технические индикаторы и использование Python для создания стратегий, то моя книга-бестселлер по техническим индикаторам может вас заинтересовать:
Давайте начнем сначала с определения «Давление покупателя». Это простая формула, показанная ниже:
Что можно записать на языке Python как:
# Buying pressure for i in range(len(Data)): Data[i, where] = Data[i, close] - min(Data[i, low], Data[i - 1, close])
Следующим шагом является вычисление истинного диапазона, меры исторической волатильности. Он использует формулу ниже:
Что можно записать на языке Python как:
# True range for i in range(len(Data)): Data[i, where + 1] = max(Data[i, high], Data[i - 1, close]) - min(Data[i, low], Data[i - 1, close]) if Data[i, where + 1] == 0: Data[i, where + 1] = 0.01
Условие в последних строках приведенного выше фрагмента кода заключается в том, что на следующем шаге мы разделим давление покупки на истинный диапазон, и в случае, если истинный диапазон равен нулю, мы получим неопределенное значение и испортим следующие вычисления. Условие - это просто исправление, в котором говорится, что если мы получим нулевое значение, мы будем считать его равным 0,01.
Теперь мы можем продолжить деление, используя следующий код:
# BP / TR Data[:, where + 2] = Data[:, where] / Data[:, where + 1]
Используемые скользящие средние будут экспоненциального типа. В стандартной версии Ultimate Oscillator используются простые скользящие средние, но, поскольку я предпочитаю настройки, я буду использовать экспоненциальные скользящие средние. Вот что мы будем делать:
- Рассчитайте 5-периодную экспоненциальную скользящую среднюю BP / TR.
- Рассчитайте 13-периодную экспоненциальную скользящую среднюю BP / TR.
- Рассчитайте 21-периодную экспоненциальную скользящую среднюю BP / TR.
Что можно записать на языке Python как:
# A5 Data = ema(Data, 2, 5, where + 2, where + 3) # A13 Data = ema(Data, 2, 13, where + 2, where + 4) # A21 Data = ema(Data, 2, 21, where + 2, where + 5)
Не забудьте иметь массив данных OHLC с несколькими свободными столбцами. Вы можете использовать функцию сумматора ниже, чтобы добавить столько столбцов, сколько вам нужно.
# Adding a few columns using the adder function 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 # Using the adder function my_data = adder(my_data, 20)
И, наконец, мы готовы применить приведенную ниже формулу для расчета Ultimate Oscillator:
Даем нам ниже полный код Python для Ultimate Oscillator:
def ultimate_oscillator(Data, high, low, close, where): # Buying pressure for i in range(len(Data)): Data[i, where] = Data[i, close] - min(Data[i, low], Data[i - 1, close]) # True range for i in range(len(Data)): Data[i, where + 1] = max(Data[i, high], Data[i - 1, close]) - min(Data[i, low], Data[i - 1, close]) if Data[i, where + 1] == 0: Data[i, where + 1] = 0.01 # BP / TR Data[:, where + 2] = Data[:, where] / Data[:, where + 1] # A5 Data = ema(Data, 2, 5, where + 2, where + 3) # A13 Data = ema(Data, 2, 13, where + 2, where + 4) # A21 Data = ema(Data, 2, 21, where + 2, where + 5) # Ultimate Oscillator for i in range(len(Data)): Data[i, where + 6] = (Data[i, where + 3] * 4) + (Data[i, where + 4] * 2) + (Data[i, where + 5]) Data[i, where + 6] = (Data[i, where + 6] / 7) * 100 Data = deleter(Data, where, 6) return Data
Функция удаления, показанная в приведенном выше коде, может быть определена следующим образом:
def deleter(Data, index, times): for i in range(1, times + 1): Data = np.delete(Data, index, axis = 1) return Data
Создатель предполагал, что осциллятор будет использоваться с расхождениями, однако для простоты мы применим стратегию барьеров, основанную на зонах перекупленности и перепроданности, таких как 30 и 70 или 40 и 60.
Если вас также интересуют другие технические индикаторы и использование Python для создания стратегий, то моя последняя книга может вас заинтересовать:
Бэк-тестирование стратегии
План атаки довольно прост для такого ограниченного осциллятора, как тот, который у нас есть. Мы смотрим на следующие условия:
- Открывайте длинную позицию (покупайте), когда Ultimate Oscillator достигает 40 с двумя предыдущими значениями выше 40. Удерживайте эту позицию до тех пор, пока не получите новый сигнал или не остановитесь алгоритмом управления рисками.
- Открывайте короткую позицию (продавайте), когда Ultimate Oscillator достигает 60 при двух предыдущих значениях ниже 60. Удерживайте эту позицию до тех пор, пока не получите новый сигнал или не остановитесь алгоритмом управления рисками.
Со спредом 0,5 пипса на транзакцию и теоретической системой вознаграждения за риск 0,20, исходя из среднего истинного диапазона. Ниже приведены результаты стратегии.
Заключение
Если вы регулярно следите за моими статьями, вы обнаружите, что многие индикаторы, которые я разрабатываю или оптимизирую, имеют высокий коэффициент попадания и в среднем являются прибыльными. В основном это связано с тем, что я использую метод управления рисками. Но как насчет рыночной случайности и того факта, что многие отстающие винят технический анализ в своей неудаче?
Прежде всего, я постоянно публикую свои торговые журналы в Твиттере до и после запуска, чтобы показать результаты. Это обеспечивает прозрачность. Я также публикую в Twitter каждые 1–3 месяца. Однако я никогда не гарантирую ни возврата ни превосходного мастерства. Что касается индикаторов, которые я разрабатываю, я постоянно использую их в своей личной торговле. Следовательно, у меня нет мотива публиковать предвзятые исследования. Моя цель - поделиться тем, что я узнал от онлайн-сообщества.
Не забывайте всегда проводить тесты на исторических данных. Несмотря на то, что я предлагаю функцию индикатора (а не просто хвастаюсь им и говорю, что это Святой Грааль, а его функция - секрет), вы всегда должны верить, что другие люди ошибаются. Мои индикаторы и стиль торговли работают для меня, но, возможно, не для всех. Я полагаюсь на это правило:
Рыночную цену невозможно предсказать или ее очень трудно предсказать более чем в 50% случаев. Но реакцию рынка можно предсказать.
Приведенная выше цитата означает, что мы можем сформировать небольшую зону вокруг области и сказать с некоторой степенью уверенности, что рыночная цена покажет реакцию вокруг этой области. Но мы не можем сказать, что он упадет оттуда на 4%, затем снова протестирует его и пробьет с третьей попытки до 103,85 доллара. Параметр ошибки становится экспоненциально выше, потому что мы делаем прогнозы, а не прогнозы.
Пока мы обсуждаем эту тему, я должен отметить несколько моментов в моих тестах на истории и статьях:
- Я использую спред, основанный на институциональных котировках небольшой доли пунктов. Как правило, розничным трейдерам предоставляется колоссальный спред в 1-2 пункта за сделку. Это огромно и несправедливо по отношению к ним. Я использую спред 0,2–0,5. Однако большинство стратегий, использующих часовой таймфрейм, по-прежнему работают со спредом в 1 пункт. Для тех, кто использует таймфреймы M15 или M5, они не могут быть прибыльными со спредом в 1 пункт.
- Я использую расчет периода удержания, близкий к закрытому на случай отсутствия процесса управления рисками.
- Хотя я не рекомендую торговать только по одному индикатору, цифры не лгут. Я представляю то, что могло произойти, если принять во внимание низкий спред.
- Некоторые из представленных мною тестов на истории неудачны, и они публикуются либо для того, чтобы развенчать миф о торговле, либо для того, чтобы представить интересные функции, которые читатели могут запрограммировать.
- Наконец, я твердо убежден, что нельзя кормить учащихся с ложечки. Я научился на практике, а не копируя. Вы должны понять идею, функцию, интуицию, условия стратегии, а затем разработать (даже лучше) одну из них самостоятельно, чтобы вы протестировали ее на исторических данных и улучшили, прежде чем принимать решение о том, чтобы применить ее вживую или отказаться от нее.
Подводя итог, можно ли сказать, что стратегии, которые я предлагаю, реалистичны? Да, но с оптимизацией среды (надежный алгоритм, низкие затраты, честный брокер, управление рисками). Предусмотрены ли стратегии исключительно для торговли? Нет, это необходимо для стимулирования мозгового штурма и получения новых торговых идей, поскольку мы все устали слышать о перепроданности RSI как о причине для открытия короткой позиции или о преодолении сопротивления как о причине долго.