preview
Нелинейные индикаторы

Нелинейные индикаторы

MetaTrader 5Примеры | 23 ноября 2022, 08:56
699 0
Aleksej Poljakov
Aleksej Poljakov

Введение

Нелинейные методы широко используются для обработки финансовых временных рядов. Например, в торговой платформе MetaTrader довольно много индикаторов, которые используют нелинейные подходы. И все они активно используются в трейдинге.

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

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

Где, w[i] – весовые коэффициенты индикатора. Сейчас мы сделаем этот индикатор нелинейным. Для этого, вместо цен возьмем их логарифмы. А после вычисления суммы найдем ее экспоненту:

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

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

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


Меры центральной тенденции

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

Медиана делит набор данных на две половины. В первой половине находятся значения меньше медианы, а во второй – больше нее. Давайте посмотрим, как происходит вычисление медианы. Пусть у нас имеется следующий ряд значений: 1, 6, 9, 3, 3, 7, 8. Отсортируем эти числа по возрастанию: 1, 3, 3, 6, 7, 8, 9. Тогда медианой будет число находящееся в центре этого ряда. В нашем примере это число 6. В случае четного количества данных, медиана представляет собой половину суммы чисел ближайших к центру. Например, для ряда: 1, 3, 3, 6, 7, 8 медиана будет равна (3 + 6)/2 = 4.5. Основная особенность медианы заключается в том, что она очень устойчива к выбросам.

Мода – это значение, которое встречается чаще всего в выборке данных. Например, в выборке: 1, 6, 9, 3, 3, 7, 8 чаще всего встречается число 3. Оно и будет модой этого ряда. Однако, при анализе цен каждое значение может встретиться только по одному разу. Тогда, для вычисления моды можно воспользоваться эмпирической формулой Пирсона:

Мода = 3*Медиана – 2*Средняя.

Из этой формулы видно, что мода является неустойчивым индикатором (коэффициенты выходят за границы интервала -1…+1). Но, она может пригодится в качестве дополнения в других индикаторах.

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

Вот так выглядят все четыре меры центральной тенденции на графике.



Байесовское сглаживание

Если мы посмотрим на график медианы, то можем обнаружить участки, где медиана не меняет своего значения в течение довольно длительного времени. И чем больше период медианы, тем значительнее такие участки. Например, так выглядит график медианы с периодом 51.

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

Сначала нам нужно вычислить сумму всех цен:

sum = price[1] + … + price[n].

Далее нужно выбрать значение относительно которого будет происходить сглаживание. Тогда байесовское среднее можно вычислить по формуле:

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

Байесовское сглаживание можно применять и для нескольких значений. Тогда его формула примет вид:

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


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


Медиана медиан

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

 

После этого нам остается найти среднее этих трех значений:


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


Тогда значение индикатора будет равно медиане из этих медиан:


А так она будет выглядеть на графике.



Псевдомедиана

Алгоритм расчета псевдомедианы немного напоминает предыдущий. Единственное отличие – на каждом шаге мы ищем не медиану подпоследовательности, а ее максимум и минимум.

 

Теперь нам нужно взять минимальное значение из найденных максимумов и максимальное значение из минимумов. Их среднее и будет псевдомедианой.


Псевдомедиана может служить заменой и медиане, и середине диапазона.


Нелинейностью индикатор не испортишь

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


Далее, мы возьмем эти цены и создадим из них две новых последовательности. В первой (обозначим ее p[]) цены будут отсортированы по возрастанию (от меньшего значения к большему). А для второй последовательности (P[]) отсортируем цены по убыванию. Теперь применим к этим последовательностям весовые коэффициенты LWMA.


 

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


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

Relative Strength Index. Индикатор RSI был разработан J. Welles Wilder и был опубликован в журнале Commodities в июне 1978 года. Для расчета этого индикатора используются две вспомогательные переменные U и D. Они нужны для разделения движения цены вверх и вниз.


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


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

Вместо разности цен мы будем использовать следующую величину:


Где, n – сколько раз встречалась эта разность в истории, а N – общее число наблюдений. Тогда формула нашего индикатора станет такой:


А сам индикатор будет выглядеть так.


Ichimoku Kinko Hyo. Этот индикатор разработан японским аналитиком Гоити Хосодой. Индикатор Ichimoku сочетает в себе несколько подходов к анализу рынка. Этот индикатор для построения линий Tenkan, Kijun и Senkou B использует середины диапазонов. Давайте попробуем заменить их на более устойчивый показатель – медиану. А линию Senkou A будем рассчитывать с помощью взвешенной медианы. Эти замены не должны повлиять на суть индикатора, но придадут ему больше устойчивости. Примерно так выглядят линии модифицированной версии индикатора Ichimoku. А облака раскрасите сами.


Свечные паттерны

В техническом анализе есть одно интересное направление, которое основано на изучении внешнего вида японских свечей и сочетаний свечей друг с другом. Этому направлению посвящено достаточно много статей. Например, "Исследование паттернов (моделей) японских свечей".

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

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

Цена
Значение
Индекс
Open[0]
1.03248
0
Low[1]
1.03133
1
High[1]
1.03204
2
Open[1]
1.03204
3
Low[2]
1.03191
4
High[2]
1.03256
5
Open[2]
1.03248
6
Low[3]
1.03217
7
High[3]
1.03296
8
Open[3]
1.03292
9

Теперь нам нужно отсортировать значения цен по возрастанию.

1.03133
1
1.03191
4
1.03204
3
1.03204
2
1.03217
7
1.03248
6
1.03248
0
1.03256
5
1.03292
9
1.03296
8

Далее, нам нужно устранить возможные неоднозначности при совпадении цен. Для этого индекс с меньшим значением переместим ближе к началу массива. В нашем примере, меняются местами пары индексов (3, 2) и (6, 0).

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

В коде, этот алгоритм может выглядеть так.

   int array[10][2];//массив для записи значений и индексов

   /*заполняем массив*/
   array[0][0]=(int)MathRound(iOpen(_Symbol,PERIOD_CURRENT,1)/_Point);
   array[0][1]=0;
   for(int j=0; j<3; j++)
     {
      array[3*j+1][0]=(int)MathRound(iLow(_Symbol,PERIOD_CURRENT,j)/_Point);
      array[3*j+1][1]=3*j+1;
      array[3*j+2][0]=(int)MathRound(iHigh(_Symbol,PERIOD_CURRENT,j)/_Point);
      array[3*j+2][1]=3*j+2;
      array[3*j+3][0]=(int)MathRound(iOpen(_Symbol,PERIOD_CURRENT,j)/_Point);
      array[3*j+3][1]=3*j+3;
     }

   ArraySort(array);

   /*устраним возможные неоднозначности при совпадении цен*/
   for(int j=1; j<10; j++)
      if(array[j-1][0]==array[j][0] && array[j-1][1]>array[j][1])
        {
         int v=array[j-1][1];
         array[j-1][1]=array[j][1];
         array[j][1]=v;
         j=1;
        }

   /*собираем число*/
   ulong number=0;
   for(int j=0; j<10; j++)
      number=number+array[j][1]*(ulong)MathRound(MathPow(10,j));//10 - основание системы счисления

С помощью скрипта мы можем оценить количество паттернов и сколько раз они встречались в истории.

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


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


Вдоль и поперек

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

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


Поперек. Алгоритм вычисления паттерна можно использовать и для группы индикаторов. В этом случае паттерн будет указывать на порядок, в котором расположились индикаторы относительно друг друга. И именно этот порядок будет определять сигналы торговой системы. В качестве примера я взял десять скользящих средних с периодами 2*n + 1 (n = 0…9). Вот так выглядит торговля в этом случае.


В обоих случаях нужно контролировать количество паттернов, которые распознает алгоритм. Их число не должно быть очень маленьким – тогда торговая система может не отличить различные друг от друга ситуации. Также, число паттернов не может быть большим – тогда слишком много торговых ситуаций будут признаны уникальными, и торговая система просто не будет на них реагировать. Кроме того, во втором случае необходимо применять индикаторы, как можно сильнее отличающиеся друг от друга. Скажем, применение только простых скользящих средних, да еще с небольшими различиями в их периодах – явная ошибка разработчика. Но, мы его всё равно похвалим за старание.


Заключение

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

Программы, используемые в статье.

Имя Тип  Краткое описание
Base LogIndicator
индикатор Индикатор, основанный на логарифмическом преобразовании цен. InpCoefficient - весовые коэффициенты индикатора, можно вводить любые числа. Ограничение - их сумма не должна быть равна нулю.
MMMM
индикатор Индикатор, показывающий меры центральной тенденции. iMode - выбор тенденции. iPeriod - период индикатора (не меньше 2).
Bayesian Moving Average индикатор Индикатор, реализующий байесовское сглаживание. iMode - выбор тенденции для сглаживания. iPeriod - период индикатора. Parameter - параметр сглаживания.
Median Median индикатор  Индикатор, отображающий медиану медиан. Нелинейный аналог треугольной оконной функции. iPeriod - период индикатора.
Pseudomedian
индикатор  Псевдомедиана - в некоторых случая может оказаться хорошей заменой медианы и середины диапазона. iPeriod - период индикатора.
Strength Trend
индикатор  Индикатор, показывающий насколько сильна трендовая составляющая в выборке цен. iPeriod - период индикатора.
nRSI  индикатор  Индикатор, основанный на вероятностях приращения цены. iMode - выбор метода сглаживания. iPeriod - период индикатора.
nIchimoku Kinko Hyo
индикатор Пример модернизации индикатора классического индикатора Ichimoku. PeriodS,  PeriodM,  PeriodL - короткий, средний и длинный периоды индикатора.
Script Pattern  скрипт Скрипт, собирающий статистику по паттернам цены. По окончании работы сохраняет результаты в файл в папке Files.
Pattern  индикатор  Индикатор, рассчитывающий паттерны. На основе исторических данных делает прогноз о преимущественном движении цены на открывающемся баре. Least - минимальное количество наблюдений паттерна в истории. Прогноз будет выводиться только для тех паттернов, которые наблюдались не менее Least раз.
EA Along Across
эксперт Торговый советник, использующий паттерны цены. Mode - выбор направления паттерна. Least - количество наблюдений паттерна в истории. Percent - процент преобладания одного направления движения цены над другим. Влияет на количество открываемых позиций. Значение этого параметра следует выбирать в пределах 51 - 99.

 

    Прикрепленные файлы |
    MMMM.mq5 (3.48 KB)
    Median_Median.mq5 (2.44 KB)
    Pseudomedian.mq5 (2.36 KB)
    Strength_Trend.mq5 (3.57 KB)
    nRSI.mq5 (3.51 KB)
    Script_Pattern.mq5 (4.61 KB)
    Pattern.mq5 (4.54 KB)
    MMMM.mq4 (4.44 KB)
    Pseudomedian.mq4 (3.33 KB)
    Strength_Trend.mq4 (4.53 KB)
    nRSI.mq4 (4.64 KB)
    Script_Pattern.mq4 (2.32 KB)
    Pattern.mq4 (4.58 KB)
    Популяционные алгоритмы оптимизации: Искуственная Пчелиная Колония (Artificial Bee Colony - ABC) Популяционные алгоритмы оптимизации: Искуственная Пчелиная Колония (Artificial Bee Colony - ABC)
    Сегодня изучим алгоритм искусственной пчелиной колонии. Дополним наши знания новыми принципами исследования функциональных пространств. В данной статье я расскажу о моей интерпретации классического варианта алгоритма.
    Разработка торговой системы на основе Индекса относительной бодрости Relative Vigor Index Разработка торговой системы на основе Индекса относительной бодрости Relative Vigor Index
    Это новая статья из серии, в которой мы учимся создавать торговые системы по показателям самых популярных технических индикаторов. В этот раз познакомимся с Индексом относительной бодрости (Relative Vigot Index, RVI).
    Разработка торговой системы на основе Awesome Oscillator Разработка торговой системы на основе Awesome Oscillator
    Это очередная статья из серии, и в ней мы познакомимся с еще одним полезным техническим инструментом для торговли — индикатором Awesome Oscillator (AO). Узнаем, как разрабатывать торговые системы на основе показателей от этого индикатора.
    DoEasy. Элементы управления (Часть 27): Продолжаем работу над WinForms-объектом "ProgressBar" DoEasy. Элементы управления (Часть 27): Продолжаем работу над WinForms-объектом "ProgressBar"
    В статье продолжим разработку элемента управления ProgressBar. Создадим функционал для управления полосой прогресса и визуальными эффектами.