![Нелинейные индикаторы](https://c.mql5.com/2/50/non_linear_indicators_600x314.jpg)
Нелинейные индикаторы
Введение
Нелинейные методы широко используются для обработки финансовых временных рядов. Например, в торговой платформе 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. |
![Популяционные алгоритмы оптимизации: Искуственная Пчелиная Колония (Artificial Bee Colony - ABC)](https://c.mql5.com/2/50/artificial_bee_colony_avatar.png)
![Разработка торговой системы на основе Индекса относительной бодрости Relative Vigor Index](https://c.mql5.com/2/48/why-and-how__8.png)
![Разработка торговой системы на основе Awesome Oscillator](https://c.mql5.com/2/48/why-and-how__9.png)
![DoEasy. Элементы управления (Часть 27): Продолжаем работу над WinForms-объектом "ProgressBar"](https://c.mql5.com/2/50/MQL5-avatar-doeasy-library-2__4.png)
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Медиану медиан в таком виде лучше сравнивать с треугольным окном. Для нее самая "вкусная" ситуация - смена направления тренда на противоположное. Если же, нужен более чувствительный вариант, то лучше сделать так. Сначала находим медиану от одной последней цены, потом находим медиану от двух цен, потом от трех и т.д. В конце находим медиану от всех ранее найденных. Получаем аналог линейно-взвешенной средней. Это не избавит нас от главного недостатка медианы - потери информации на краях, но сделает индикатор более чувствительным к текущим изменениям.
не - все тщетно.
Как и тщетны были все мои предыдущие попытки многолетней давности разработки различных методов скльжения и усреднения и создания сотен роботов с их пременением. Поверьте, в этом я преуспел значительно больше. Белых пятен не осталось в этой области.
Отстаеся только ИИ с распознание образов и процессов.
Все равно к этому придете, если не будете топтаться на месте.
А, ну да, был не внимателен.
если бороться с запаздыванием, то нужно брать соответствующую модель. К примеру, строим полином третьей степени вперед по 20 точкам. Получаем коэффициенты {4979,3264,1904,864,109,-396,-686,-796,-761,-616,-396,-136,129,364,534,604,539,304,-136,-816} /8855 - такой индикатор запаздывать не будет
если бороться с запаздыванием, то нужно брать соответствующую модель. К примеру, строим полином третьей степени вперед по 20 точкам. Получаем коэффициенты {4979,3264,1904,864,109,-396,-686,-796,-761,-616,-396,-136,129,364,534,604,539,304,-136,-816} /8855 - такой индикатор запаздывать не будет
давно все реализовано, проверено, перепроверенно, протестировано, перетестированно. Рыбы нет. Точнее существование рыбы всегда носит временный характер, а остальное время нивелирует временный успех.
если бороться с запаздыванием, то нужно брать соответствующую модель. К примеру, строим полином третьей степени вперед по 20 точкам. Получаем коэффициенты {4979,3264,1904,864,109,-396,-686,-796,-761,-616,-396,-136,129,364,534,604,539,304,-136,-816} /8855 - такой индикатор запаздывать не будет
сам полином перерисовывается, поэтому значение имеет его след, который и формирует неперерисовываемую скользящую.
Действительно, можно добиться минимального запаздывания, но там начинаются другие проблемы.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Lsma
Nikolai Semko, 2020.02.01 01:09
Простое скользящее среднее (период 200):
Скользящее среднее от линейной регрессии (период 200):
Скользящая средняя от параболической регрессии (период 200):
Скользящее среднее от полинома 3-й степени (Период 200):
Скользящее среднее от полинома 4-й степени (Период 200):
Скользящее среднее от полинома 5-й степени (период 600):
и т.д.
не - все тщетно.
Как и тщетны были все мои предыдущие попытки многолетней давности разработки различных методов скльжения и усреднения и создания сотен роботов с их пременением. Поверьте, в этом я преуспел значительно больше. Белых пятен не осталось в этой области.
Отстаеся только ИИ с распознание образов и процессов.
Все равно к этому придете, если не будете топтаться на месте.