Nick Rypoсk Moving Average - адаптивная скользящая средняя.
Торговая система на ее основе.
25.06.2001. Обновлены формулы и файл ELA.
Несколько оговорок.
Все началось с написания «Трендового индикатора прорыва динамического ценового канала» («Современный трейдинг» № 4, 2001 г.). Позже, от Колби и Мейерса я узнал, что подобный подход давно известен, и называется «Скользящий фильтр» (ох и трудно получить патент на два колеса с педалями :)) Но, нет худа без добра. В результате название индикатора было сокращено до удобоваримого NRTR (Nick Rypock Trailing Reverse), что пожалуй больше отвечает его смыслу. Вкратце, суть этого индикатора заключается в том, что он всегда находится на постоянном удалении от достигнутых экстремумов цен – под графиком на восходящих трендах и над графиком на нисходящих трендах. Здесь преследовалась следующая идея: небольшие коррекционные движения против основного тренда должны игнорироваться, а движение против основной тенденции, превышающие некоторый уровень (размер скользящего фильтра К) сигнализирует о смене направления тенденции.
Рис. 1. Схема работы NRTR. Индикатор всегда находится на постоянном удалении (размер скользящего фильтра К) от достигнутых экстремумов цен. На восходящем тренде Н1 и Н2 (Н3 не используется в расчетах, т.к. он ниже предыдущего максимума). С момента пересечения ценами индикатора (красная точка), начинается новый отсчет противоположного тренда. Теперь индикатор выше на величину скользящего фильтра от каждого нового минимума цен (L3,L4,L5 и т.д.)
Для расчета NRTR используется динамический ценовой канал. В расчетах участвуют только те цены, которые входят в текущий тренд и исключаются экстремумы, относящиеся к предыдущей тенденции. Индикатор находится всегда на одинаковом удалении (в процентах в данном случае), от экстремумов, достигнутых ценами (ниже максимального пика для текущего ап-тренда, выше минимальной впадины для текущего даун-тренда).
Для восходящих трендов:
NRTR = Highest(Close, period)*(1-(K/100)),
Для нисходящих трендов:
NRTR = Lowest(Close, period)*(1+(K/100)),
где первая часть выражения – высший/низший экстремум цен, достигнутый за период с момента последнего пересечения ценами индикатора, К – размер скользящего фильтра в процентах, на который индикатор отстоит от достигнутых экстремумов.
Подробнее о свойствах и разновидностях этого индикатора читайте в 4-м номере журнала "Современный трейдинг" за 2001 год.
Как и любой другой максимально упрощенный подход, такой индикатор прекрасно работает на трендовых участках рынка, но начинает пошаливать на не трендовых. Однако меня привлекла другая особенность NRTR. В периоды динамичных трендов он несется за ценами с элегантностью скаковой лошади, а в периоды небольших коррекций или боковиков замирает в горизонтальном положении, как бы выжидая, что же будет дальше (желтые овалы на рисунке ниже). Вот это его свойство я и решил попробовать использовать в качестве элемента управления периодом усреднения адаптивной скользящей средней. Индикатор, динамично движущийся вместе с ценами, указывает на наличие сильного тренда, горизонтально направленный индикатор сигнализирует о развивающейся коррекции или боковике. Таким образом, направление индикатора должно управлять периодом усреднения, посредством коэффициента к фактору сглаживания ЕМА.
Логика рассуждений была такова: на выраженных трендах период усреднения ЕМА должен быть мал, чтобы скользящая средняя как можно меньше отставала от цен, а в периоды коррекций и боковиков, период усреднения ЕМА должен возрастать, для фильтрации мелких колебаний цены.
Формула Nick Rypock Moving Average (NRMA) - стандартная формула ЕМА с дополнительным коэффициентом к фактору сглаживания:
NRMA = NRMA(-1) + NR_ratio*F*(Close – NRMA(-1)), где
F = 2/(1+n) – фактор сглаживания ЕМА,
n – минимальный период сглаживания ЕМА,
NRMA(-1) – предыдущее значение NRMA,
NR_ratio – коэффициент к фактору сглаживания на основе NRTR,
Осталось найти алгоритм вычисления NR_ratio. Сразу скажу, оказывается простые решения даются мне не так уж легко. Чего только я не перепробовал. И угол наклона пытался измерять и скользящие на NRTR накладывал, вычислял периоды горизонтального положения, и т.д. и т.п. Я чувствовал, что «истина где-то рядом…», однако постоянно шел к ней кружными путями. Как говаривал мой ротный, в восьмидесятых годах прошлого века: «Если Вы дурак, то читайте первоисточники, как это делаю я!» Перечитав в очередной раз Ченда и Кауфмана, я вдруг подумал, а почему надо искать более сложные преобразования? И остановился на самом простом и, как сейчас кажется, самом логичном. Осциллятор, вычисляемый, как абсолютное значение разности между ценой и NRTR и нормированный от 0 до 1. Дальше – проще. Осталось сгладить этот «пилообразный» осциллятор простой трех-периодной МА и возвести его в N-ную степень, для придания большей динамичности.
Рис.2. РАО ЕЭС ММВБ. Синий индикатор на графике цены это NRTR с 10% скользящим фильтром К. Хорошо видно, как он принимает горизонтальное положение во время коррекций и боковиков. В нижней части графика осциллятор NRTR нормированный от 0 до 1 (красная кривая). Синяя кривая – тот же осциллятор, сглаженный 3-периодной МА и возведенный в степень (Sharp) для большей «резкости» движений. Он будет использоваться в качестве коэффициента к сглаживающему фактору в Экспоненциальной МА.
В результате, получился готовый коэффициент NR_ratio (Nick Rypock Ratio) к фактору сглаживания Экспоненциальной скользящей средней.
NR_ratio = (Average(Osc, 3))^Sharp, где
Osc = (100*AbsValue(Close-NRTR)/Close)/K – осциллятор нормированный от 0 до 1,
NRTR – старый знакомый,
K – размер скользящего фильтра, используемый при вычислении NRTR,
Sharp – степень, в которую необходимо возвести осциллятор, для его большей динамичности.
На сильных трендах, когда цены непрерывно прирастают (в плюс, или в минус), NR_ratio равен или близок к единице, что позволяет использовать очень малый период усреднения ЕМА. На коррекциях и боковиках, коэффициент заметно уменьшается, за счет чего резко увеличивает период усреднения ЕМА, которая перестает реагировать на мелкие пилообразные скачки цен, так характерные для периодов ненаправленного движения рынка.
Теперь настало время прояснить фразу в начале статьи о том, что результаты оказались для меня неожиданными. Дело вот в чем. Из приведенной выше формулы NRMA видно, что существует некий минимальный период усреднения скользящей средней. Он может увеличиваться при идентификации коррекции или боковика, но не может быть меньше определенной величины, как бы сильно не развивался тренд. Начиная работу, я подразумевал, что торговые сигналы с использованием NRMA будут формироваться традиционно – при пересечение ценами индикатора. В первых опытах я использовал в качестве минимального периода усреднения для NRMA классические 12-ти и 21-дневные периоды. Результаты были совсем не впечатляющими, хотя адаптация скользящей средней к поведению цен была налицо. Вдруг я вычитал у Колби и Мейерса великую истину, что ЕМА меняет свое направление в момент пересечения ее ценой (раньше я об этом не знал :)). Это позволило изменить алгоритм получения сигналов с "пересечения" на "направление", благо, хороший фильтр для сигналов на изменение направления ЕМА есть у Кауфмана. То есть, сигнал на покупку поступает, когда NRMA разворачивается вверх и проходит некоторое расстояние (Filter), обратное справедливо для сигналов на продажу. При этом, размер фильтра представляет собой процент от стандартного отклонения приращений индикатора за период. Соединив воедино все эти великие открытия, я решил провести оптимизацию системы не только на величину входного фильтра, но и на значение минимального периода NRMA. Вот здесь результаты меня несколько обескуражили. На большинстве исследуемых рынков минимальный период NRMA действительно стремился к неразумному, на мой взгляд, минимуму, принимая значения от 2-х до 5-ти. Однако когда я нанес индикатор с полученными значениями на график, все встало на свои места. На приведенном ниже рисунке хорошо видна разница между поведением быстрой 2-х периодной обычной ЕМА и NRMA со значением минимального периода равным 2. При динамичных движениях цены, NRMA так же быстро и динамично меняет свое направление ,давая своевременные сигналы в самом начале движения. Но при малейшем признаке боковика, NRMA увеличивает свой период усреднения, заметно сглаживая болтанку и исключая появление ложных сигналов. Такой способ использования индикатора оказался близок по смыслу к принципам Buy Bottoms - Sell Tops или Swing Trading, когда покупки и продажи происходят на ранней стадии движения от локальных минимумов или максимумов и не требуется предварительного подтверждения начавшегося тренда.
Рис.3. Синяя линия на графике обычная 2-периодная ЕМА, красная линия – NRMA, зеленая линия в нижней части рисунка– гипотетический период усреднения NRMA. Видно, как NRMA сглаживает пилу на боковиках.
Короче, дальше лить воду не буду. Стало ясно, что минимальный период NRMA должен быть очень мал, для получения как можно более ранних сигналов на динамичных движениях цены. Дальнейшее поведение системы управляется остальными компонентами: K (скользящий фильтр NRTR), Sharp («острота» изменения периода сглаживания), ну и наконец, параметры фильтра на величину изменения NRMA от локального минимума/максимума (я использовал Кауфмановский вариант).
Учитывая полученные данные, можно утверждать, что использование NRMA в таком виде годится в первую очередь для получения сигналов входа (открытие лонга или шорта). Сигнал поступает на ранней стадии тренда, достаточно близко от локального минимума или максимума, достигнутого ценами. Для выхода разумнее использовать другие подходы, или учитывать дополнительные факторы. Поэтому, для демонстрации возможностей NRMA мне пришлось использовать так нелюбимую мной (и любимую Иваном FXS :)) простую реверсивную торговую систему. На рисунке ниже приведен результат системы для РАО ЕЭС ммвб с начальным капиталом 100, К=10%, мин.период=2, sharp=2, параметры Кауфмановского фильтра: период расчета StdDev=14, входной фильтр=0.7. Процент прибыльных сделок оказался около 62%, что совсем не плохо для реверсивной системы на одной скользящей средней :)
В конце статьи приведены все формулы функций, индикаторов и торговой системы в формате Omega TradeStation, упомянутые в данной статье. Но сейчас мне хотелось бы очертить круг вопросов, на которые у меня пока нет однозначного ответа.
Формулы функций, индикаторов и сигналов, описанных в данной статье, в формате Omega TradeStation.
Файл NickRypock.ela (Update 25.06.2001)
1. Базовая функция "$NRTR_DT". Рассчитывает динамику процентного скользящего фильтра. Вариант предложенный Дмитрием Толстоноговым:
{*************************
"New Russian" Trailing Reverse Function based on
percentage channel
Coded by Dmitri Tolstonogov (aka DT)
**************************}
Inputs: K(Numeric);
Vars: Trend(0), HPrice(C), LPrice(C), Reverse(0);
if Trend >=0 then begin
if C > HPrice then HPrice = C;
Reverse = HPrice*(1 - K*.01);
if C <= Reverse then begin
Trend = -1;
LPrice = C;
Reverse = LPrice*(1 + K*.01);
end;
end;
if Trend <= 0 then begin
if C < LPrice then LPrice = C;
Reverse = LPrice*(1 + K*.01);
if C > Reverse then begin
Trend = 1;
HPrice = C;
Reverse = HPrice*(1 - K*.01);
end;
end;
$NRTR_DT = Reverse;
{************************}
2. Индикатор тренда "1_NRTR_DT".
{***************************************************
Description : This Indicator plots Nitwit Radical Trailing
Reverse level
Coded By : Konstantin Kopyrkin (aka konkop) 08.06.2001
****************************************************}
Inputs: K(10);
Value1 = $NRTR_DT(K);
Plot1(Value1,"NRTR_DT");
3. Осциллятор "1_NRTR_Oscillator" (просто для визуальной оценки значений NR_Ratio).
{*************************
Nick
Rypock Trailing Reverse oscillator
Coded by Konstantin Kopyrkin (aka konkop) 24.06.2001
Copyright (c) konkop, 2001.
**************************}
Inputs: K(10), Smooth(3), Sharp(2);
Value1 = AbsValue((100*(C-$NRTR_DT(K))/C)/K) ;
Value2 = Power(Average(Value1,Smooth),Sharp);
Plot1(Value1,"NRTR_Osc");
Plot2(Value2,"NR_ratio");
4. Функция "$NRMA". Рассчитывает адаптивную скользящую среднюю NRMA.
{*************************
Nick Rypock Moving Average function
Coded by Konstantin Kopyrkin (aka konkop) 24.06.2001
This function calculate adaptive moving average
based on Trailing Reverse function $NRTR_DT
Copyright (c) konkop, 2001.
**************************}
Inputs: K(Numeric), Fast(Numeric), Sharp(Numeric);
Vars: Osc(0), F(0), NRratio(0), NRMA(0);
If Currentbar <= Fast then NRMA = Close;
If Currentbar > Fast then begin
Osc = (100*AbsValue(C-$NRTR_DT(K))/C)/K ;
NRratio = Power(Average(Osc,3),Sharp);
F = 2/(1+Fast);
NRMA = NRMA[1] + NRratio*F*(Close - NRMA[1]);
End;
$NRMA = NRMA;
5. Индикатор "1_NRMA". Рисует адаптивную скользящую среднюю NRMA на графике.
{*************************{*************************
Nick Rypock Moving Average indicator
Coded by Konstantin Kopyrkin (aka konkop) 24.06.2001
This indicator plot adaptive moving average NRMA
Copyright (c) konkop, 2001.
**************************}
Inputs:
K(10), {Trailing Reverse}
Fast(2), {Fastest period of EMA}
Sharp(2); {Sharpness to slowing EMA}
Vars: NRMA(0);
NRMA = $NRMA(K,Fast,Sharp);
Plot1(NRMA,"NRMA");
6. Торговый сигнал "1_NRMA_Filter".
Inputs: K(10), Fast(2), Sharp(2),
Period(14), Pcnt(.7);
Vars: NRMA(0), NRMAF(0), NRMAL(0), NRMAH(0);
NRMA = $NRMA(K,Fast,Sharp);
NRMAF = StdDev(NRMA-NRMA[1], Period) * Pcnt;
IF CurrentBar =1 Then Begin
NRMAL = NRMA;
NRMAH = NRMA;
End Else Begin
IF NRMA < NRMA[1] Then
NRMAL = NRMA;
IF NRMA > NRMA[1] Then
NRMAH = NRMA;
IF NRMA - NRMAL Crosses Above NRMAF Then
Buy This Bar on Close;
IF NRMAH - NRMA Crosses Above NRMAF Then
Sell This Bar on Close;
End;
А эта картинка - в качестве анекдота. Кривая дохода реверсивной системы на основе NRMA с входным фильтром=0 на индексе РТС. Ну чем не священный грааль? :))
(c) konkop, 2001 г.