Форум трейдеров » Торговые стратегии » Адаптивные фильтры. Применение в торговле
+ Подписаться
Страница 13 из 55 ПерваяПервая ... 3111213141523 ... ПоследняяПоследняя
  1. 1,048
    Комментарии
    2
    Темы
    1975
    Репутация Pro
     
    Мастер форумных наук

    4 Медалей
    Очень естественной на первый взгляд выглядит идея адаптивного фильтра, управляемого непосредственно сигналом: мы как-то оцениваем какие-то свойства сигнала, после чего на лету синтезируем (или корректируем) фильтр, соответствующий поведению сигнала в ближайшем прошлом.
    Практически это выражается в том, что где-то отдельно существует алгоритм, который получает на вход цену, а на выходе выдает параметры фильтра.
    Для торговца важнейшим свойством поведения цены является наличие или отсутствие направленного движения, поэтому этот самый отдельно стоящий алгоритм в адаптивных используется для количественной оценки степени направленности движения. При наличии такой оценки можно изменять параметр сглаживания.

    Однако здесь есть некоторая логическая несообразность. Нам для торговли нужно отделить тренд от флэта, что мы и пытаемся сделать с помощью сглаживающих фильтров, линейных ли адаптивных.
    Если у нас есть в наличии достаточно хорошо работающий этот самый отдельно стоящий вычислитель параметров фильтра, то становится не нужным сам фильтр: можно торговать непосредственно по этому измерителю степени направленности движения.
    Рассмотрим конкретный пример адаптивного фильтра, управляемого непосредственно ценой.
    ===============================
    Исторически первыми адаптивными фильтрами, созданными специально для торговли, были адаптивные средние Тушара и Кауфмана.
    Они появились почти одновременно и практически совпадают - в отсутствие гэпов (когда открытие бара совпадает с закрытием предыдущего) формулы дают одинаковый результат.
    Творения Кауфмана и Тушара появились в середине 90-ых годов, русскоязычному читателю обычно известны по статьям Копыркина, являющимся не то чтобы переводом, а скорее пересказом первоисточников. Статья Копыркина про среднюю Кауфмана прицеплена к посту в виде PDF-файла

    Средняя Кауфмана среди пользователей МТ4 известна как индикатор АМА.
    Идея его состоит в том, чтобы выделить в движении цены слагаемые. соответствующие направленному движению и колебательному движению.
    Так сказать, сигнальное слагаемое и шумовое слагаемое.
    После этого - модифицировать классическую ЕМА за счет изменения значения параметра сглаживания alfa в зависимости от соотношения направленного и шумового компонентов движения цены.
    Ниже - выдержка из статьи Копыркина с описанием средней Кауфмана, из того места, где описывается ER - количественная мера направленности движения цены.

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

    Вот так выглядит характерное поведение АМА.

    На рисунке выделено прямоугольником характерное для АМА поведение: когда цена после резкого рывка вверх входит в консолидацию, выходной сигнал АМА довольно резко выполаживается сравнительно с участком направленного подъема цены.
    ========================
    Присмотримся к АМА поближе.
    На содержательном уровне тут обсуждать почти нечего: если уж выбрали в качестве механизма адаптации управление непосредственно ценой, то оспорить идею адаптации к такому свойству поведения цены как степень направленности - трудно.

    На уровне же реализации - возможны некоторые очевидные модификации АМА, которые, не исключено, окажутся улучшениями.
    1. Простейшая модификация. Формулу для ER можно представить в виде Сумма(dC[k])/Сумма(Abs(dC[k])), где dC[k]=Close[k]-Close[k-1].
    Поэтому ЕR унаследовал недостаток простой суммы: он резко меняется не только при появлении на текущем баре аномально большого значения, но и при уходе этого аномального значения в прошлое за пределы N баров (известный образ "дважды лающей собаки"). Не исключено, что применение вместо простой суммы иного усреднения для dC и abs(dC) будет лучше (разумеется, усреднять в числителе и знаменателе надо одинаковыми способами).
    2. Со знаменателем спорить трудно - если ограничиваться ценами закрытия, то трудно придумать лучшую оценку полного пути, пройденного ценой, чем вариация. Если же рассматривать не только цены закрытия, но и ХайЛо, то мерой полного пути за N баров очевидно будет что-то вроде N*ATR(N).
    3. А вот использование в качестве меры направленного движения на отрезке именно моментума - неочевидно, совсем не очевидно. Моментум - наивное усреднение за N баров приращения цены, являющегося простейшей (и единственной, если нам доступны только два бара) оценкой скорости изменения цены. Разумной альтернативой является приращение за N баров не самой цены, а приращение аппроксимирующей движение цены прямой - простейшей линейной регрессии.
    ======================
    Все эти модификации - очевидны и сравнительно просто программируются. Я этим не занимался по простой причине: мне не нравится сам выбор способа адаптации. "Общефилософский" аргумент против вычисления параметров фильтра только по входному сигналу я уже приводил: если бы мы имели хороший индикатор для определения меры трендовости поведения цены в ближайшем прошлом, можно было бы торговать непосредственно по этому индикатору, тогда и адаптивный фильтр сам по себе - не очень нужен.

    Замечание. Общепризнанный индикатор меры тренда - ADX. Почему-то ни Кауфман, ни Тушар не использовали его в качестве ER.

    Более конкретно можно указать на недостаток адаптации фильтра непосредственно к сигналу, рассмотрев картинку поведения АМА, приведенную выше. Смотрим ещё раз на тот самый зеленый прямоугольник.
    На левом краю прямоугольника - резкий рывок цены вверх, переходящий в консолидацию. АМА резко становится более пологой в самом начале этой консолидации, как только в консолидацию вошла цена. При этом в этот момент АМА довольно далеко отстоит от цены.
    Лично мне это кажется недостатком. Поскольку (ИМХО) если цена убежала далеко от выходного сигнала, то мелкие детали поведения цены не должны быть существенными.
    Рискну предположить, что именно для борьбы с этим недостатком Кауфман рекомендовал в качестве границы сверху для alfa использовать очень большое значение 2/3, соответствующее ЕМА2, при этом на направленных участках АМА будет прижиматься ближе к цене. А для сохранения разумной степени сглаживания во флэте Кауфман рекомендовал усиливать контраст, возводя ER в квадрат при вычислении alfa.

    Это - чисто личное мнение, поэтому мне лично больше нравится управление параметрами фильтра не от цены, а от ошибки слежения, от разности цены и сглаженной цены.
    Быть может, на мои предпочтения повлияло то, что с помощью АМА мне не удавалось создать ТС, достаточно устойчивую к тестеру. А при помощи управляемого ошибкой слежения фильтра - удалось.
    Изображения Изображения
  2. 1,048
    Комментарии
    2
    Темы
    1975
    Репутация Pro
     
    Мастер форумных наук

    4 Медалей
    Есть во мне всё-таки что-то от жирафа.
    Прошел месяц жизни ветки, а я только сейчас понял одну из возможных причин отрицательной реакции читателей.

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

    Потом я прочитал и понял описания средних Тушара и Кауфмана.
    В этом месте "пути познания" (это было довольно давно) решил слепить свой первый адаптивный ФНЧ для торговли.
    ======================
    Буду следовать стихийно сложившейся последовательности изложения и опишу этот свой продукт. Сразу замечу, что тестер Омеги показал возможность торговать только по этому фильтру, но результаты не слишком привлекали. При разработке ТС я придерживаюсь такого принципа: прибыль должна приносить одна идея, инструментом создания прибыли должен быть один (по возможности идейно простой) индикатор. Все остальные навороты призваны лишь уменьшить возможную просадку. Я забросил тот фильтр и до ТС его доводить не стал.

    Поэтому этот пример интересен читателю скорее как описание законченного процесса разработки - от постановки задачи "на пальцах" до формулы, исходника и графика.
  3. 1,048
    Комментарии
    2
    Темы
    1975
    Репутация Pro
     
    Мастер форумных наук

    4 Медалей
    Семейство адаптивных фильтров В.

    Как я уже писал, будем делать адаптивные фильтры в виде
    p(k+1) = y(k)+gam*(y(k)-y(k-1))
    y(k+1)=alpha*(x(k+1)-p(k+1))+p(k+1),
    разрешив параметрам alpha и gam на каждом шагу изменяться (адаптироваться).

    Первый мой адаптивный фильтр был назван, естественно, В1.

    Верный своим принципам «правильного» изложения в стиле ЗАЧЕМ – ЧТО – КАК, я сначала сформулирую задачу (цель), которую поставил себе при разработке фильтра В1.

    Фильтр В1 должен иметь следующие «внешние» свойства (уровень ЗАЧЕМ).
    1. Иметь на быстрых направленных движениях не очень большое запаздывание. Замечу, что в случае адаптивного фильтра запаздывание трудно оценить в единицах времени (есть зависимость от вида входного сигнала, нет принципа суперпозиции), поэтому корректнее говорить о невязке прогноза или об ошибке слежения, о величине x(k+1)-p(k+1), обозначим её как del, del(k) = x(k)-p(k).
    2. При переходе рынка от направленного движения к консолидации запаздывание не должно быть слишком маленьким. То есть выходной сигнал фильтра должен «не торопиться» подойти к цене, если цена от него не убегает. Это требование введено в соответствии с обычной практикой устройства ТС на ФНЧ: при цене выше выхода ФНЧ покупаем, при цене ниже выхода ФНЧ – продаем. При этом в тренде имеем прибыль, а во флэте и в консолидации – ряд мелких убытков. Так вот, я хочу, чтобы при переходе к консолидации выход фильтра В1 оставался бы по одну сторону от зоны консолидации, не выкидывая из сделки по причине окончания прошлого движения. Потому что после консолидации движение может и продолжиться в прежнюю сторону.

    Кроме внешних требований, налагаемых на фильтр заказчиком-торговцем, я сформулировал также некие «внутренние» ограничения для разработчика. Внутренние – потому что он относятся не к внешнему, видимому поведению фильтра, а к его внутреннему устройству. То есть внутренние ограничения – это уровень обсуждения не ЗАЧЕМ ДЕЛАЕМ, а ЧТО ДЕЛАЕМ, следующий уровень детализации.

    Внутренние ограничения (уровень ЧТО).
    1. исходя из внешнего требования (2), в общей структуре фильтра следует положить gam=0. Это вытекает из того, что при gam>0 прогноз более инерционен, чем в ЕМА. Поэтому при переходе движения в консолидацию прогноз (и, тем самым, выходной сигнал) будут продолжать приближаться к зоне консолидации «по инерции» даже при предельном случае alpha=0.
    Таким образом, структура фильтра В1 упрощается до
    p(k+1) = y(k)
    y(k+1)=alpha(k)*(x(k+1)-p(k+1))+p(k+1)
    или, с учетом выхолащивания p(k), до
    y(k+1)=alpha(k)*(x(k+1)- y(k))+ y(k),
    где способ вычисления alpha(k) надо ещё придумать.
    2. Значение alpha(k) должно адаптироваться безынерционно именно к текущему состоянию, а не к состоянию на некотором интервале в прошлом. Обычно же адаптивные фильтры вычисляют значения переменных параметров в зависимости от каких-либо статистик сигнала на некотором интервале от текущего момента в прошлое. Требование безынерционности приводит к тому, что alpha(k) должно зависеть только от текущих величин, только от del(k) = x(k)-p(k). Точнее – от абсолютной величины del, так как увеличение и уменьшение входного сигнала равноправны.

    Реализация (уровень КАК).
    В рамках установленных ограничений осталось не так уж много разумных способов вычисления alpha как функции невязки прогноза del.
    Согласно внешним требованиям, мы должны быстро уменьшать большие невязки прогноза и медленно уменьшать малые невязки. То есть с ростом абсолютной величины del alpha должно асимптотически приближаться к 1 (во всяком случае, к достаточно близкому к единице числу), а с убыванием абсолютной величины del к нулю alpha также должна уходить к нулю или почти к нулю. Из соображений здравого смысла alpha должна быть монотонной функцией del.

    Таких функций довольно много. Первой мне бросилась в глаза экспонента.
    alpha=1-exp(-|del|/bet),
    где bet – параметр фильтра, задающий масштаб невязки прогноза, задающий смысл понятий «большая невязка прогноза» и малая невязка прогноза» из внешних требований. Видно, что, начиная с некоторого места (при больших del) alpha почти не отличается от единицы, т.е. большая невязка прогноза отрабатывается резким скачком, за один шаг.

    Впоследствии я при шел к выводу, что ради внешнего требования (2) лучше вычислять alpha так, чтобы близко к нулю была некоторая зона нечувствительности, где alpha близка к нулю, что привело к замене exp(x) на exp(x*x). Также я ввёл ещё один параметр, которым задаётся мера усреднения фильтра (странно было бы его не иметь).

    Окончательно сейчас фильтр В1 имеет вид, описываемый формулами
    del(k+1)= x(k+1)-y(k)
    alpha(k+1)=1- alpha0*exp(-(del(k+1)/bet)*(del(k+1)/bet))
    y(k+1)=alpha(k+1)* del(k+1) + y(k),
    где alpha0 и bet – параметры фильтра.

    Практически всегда я использую alpha0=1, то есть этот параметр оказался холостым, что радует (из общих соображений хорошо иметь индикатор с одним параметром).
    А вот параметр bet хочется прокомментировать. Дело в том, что параметры, подобные bet, в принципе не могут появиться у обычного (неадаптивного) фильтра. Обычный фильтр может иметь параметры либо безразмерные, либо в единицах времени, либо в единицах частоты. Это так потому, что для обычных фильтров верен принцип суперпозиции, принцип линейности по входному сигналу. А параметр bet, как легко видеть, имеет размерность входного сигнала, в нашем случае – пункты курса торгуемой пары.
    ============
    Пора идти на работу, характерные графики и отчеты тестера - в следующем посте.
  4. 1,048
    Комментарии
    2
    Темы
    1975
    Репутация Pro
     
    Мастер форумных наук

    4 Медалей
    поведение графика В1 характерно для адаптивных СС: при переходе от направленного движения к консолидации график резко выполаживается.

    На графике ниже - дневки евродоллара и В1 с bet=0.43
    Отчет тестера Омеги приложен в виде файла Эксел.

    ТС проста до неприличия: торговым сигналом служит пересечение цены и В1, ничего более - нету, нету даже стопов...
    Значение bet=0.43 получено оптимизацией на этом же участке, поэтому не пинайте меня ногами, я понимаю истинную цену профит-фактору 2.6 из отчета тестера

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

    Оптимизация проводилась перебором от bet=0,1 до bet=1 с шагом 0,01.
    То есть динамический диапазон перебора - десятка. И практически на всем этом интервале - прибыль положительна. При оптимизации простейшей ТС, базирующейся на обычной ЕМА, результаты оптимизации обычно выглядят несколько иначе. Трудно надеяться на то, что простейшая ТС на ЕМА будет прибыльна в диапазоне от ЕМА10 до ЕМА100.

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

    И это - ещё одно достоинство адаптивных фильтров с точки зрения трейдера-практика: ТС дольше выдерживает от оптимизации до оптимизации.
    Вложения Вложения
    • Тип файла: xls EUR_B1.XLS (75.5 Кб, Просмотров: 34)
  5. 1,048
    Комментарии
    2
    Темы
    1975
    Репутация Pro
     
    Мастер форумных наук

    4 Медалей
    Подавляющее большинство линейных следящих систем в технике реализуется при помощи систем с обратной связью.
    Вырабатывается некий сигнал прогноза, вычитается из реального входного сигнала, полученный сигнал рассогласования подвергается каким-то
    преобразованиям, превращаясь в выходной сигнал.
    Естественно строить адаптивные следящие системы по такой же структурной схеме.
    Поэтому, ознакомившись с известными адаптивными средними Кауфмана и Nушара, я и слепил свой первый адаптивный сглаживатель В1,
    опираясь на сигнал рассогласования, на ошибку прогноза.

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

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

    Соответственно, при наличии направленного движения надо увеличивать alfa и gam, при отсутствии направленного движения - уменьшать их. То есть на содержательном уровне - всё просто.
    А на уровне реализации - простор для применения знаменитого "метода проб и ошибок", в просторечии - "метода научного тыка".
    На уровне реализации надо придать конкретный смысл словам "значения цены находятся преимущественно выше значений сглаженной цены" и
    научиться количественно измерять этот показатель.
    Нужно также принять решение о том. какой именно параметр будет меняться при адаптации - только alfa, только gam, или оба вместе.
    И ещё надо выбрать конкретные формулы для вычисления alfa и gam.

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

    Однако мне не нравится такая мера. Причина моей антипатии состоит в том, что эта мера не учитывает упорядоченности значений цены во времени.
    Не знаю, многие ли из активно использующих полосы Боллинджера трейдеров отдают себе отчет в том, что как среднее значение, так и СКО - не
    зависят от порядка элементов в выборке, по которой они вычисляются
    .
    Если произвольно поменять местами последние 22 значения цены, то ни среднее занчение, ни дисперсия не изменятся, не изменятся и значения
    индикатора "полосы Боллинждера".

    Упорядочим ли мы последние значения цены до монотонного возрастания, перемешаем ли мы их хаотично - Боллинджер покажет один и тот же
    коридор, хотя в случае упорядоченности последних значений мы увидим явный тренд на интервале наблюдения, а в случае беспорядочного
    расположения - флэт. Меня это несколько нервирует и отвращает от использования СКО.
    Тем не менее, я предпринял и попытку со средним и СКО, но - не сразу.
    ===================================
    Первым моим изделием с протяженным интервалом наблюдения стал фильтр, в котором изменялись как alfa, так и gam.
    Назвал я его, естественно, славным именем D1. В качестве меры направленности использовалась конструкция, на содержательном уровне аналогичная использованной Кауфманом, только примененная не к приращению цены, а к ошибке прогноза. Это - отношение средней ошибки прогноза за некоторый интервал наблюдения к среднему значению абсолютного значения ошибки прогноза за этот же интервал.
    На уровне реализации вместо использованного Кауфманом простого среднего значения я использовал усреднение ошибки прогноза с помощью модифицированной ЕМА.

    Результат меня приятно удивил: этим можно торговать. То есть - простая ТС выдерживает аккуратное тестирование, когда оптимизируются
    параметры ТС на одном интервале времени, а оцениваются результаты торговли - на другом, непересекающемся интервале.
    =================================
    Здесь надо заметить, что всякие исследования я провожу в Омеге - там заметно проще программировать и строже тестер.
    А торгую я при помощи МТ, поэтому в MQL я переношу только те самоделки, которыми реально пользуюсь.
    Этой - пользуюсь, поэтому для фильтра D1 существует исходник для МТ4.
  6. 1,048
    Комментарии
    2
    Темы
    1975
    Репутация Pro
     
    Мастер форумных наук

    4 Медалей
    Рассмотрим реализацию D1 для Омеги на EasyLanguage.
    Язык крайне простой, все формулы будут видны.
    Ниже - исходник функции, вычисляющей значение D1.
    Собственно индикатор состоит из пары команд рисования значений функции.
    Функция, естественно, была выделна для того, чтобы использовать её и в индикаторе и в торговом сигнале.
    Код:
    Inputs: price(Numericseries),N(Numeric),alfa(Numeric),gam(Numeric);
    
    Variables: prev(0), def(0),adef(1), prog(0),aa(alfa),gg(gam),w(0);
    
    If CurrentBar <= N Then begin
    	prog=Price[0];
    	$D1 = XAverage(Price,N);
    end
    Else
    begin
    	def=$A1(price-prog[1],1/N,0.5);
    	adef=$A1(absvalue(price-prog[1]),1/N,0.5);
    	if adef=0 then aa=0. else aa=alfa*absvalue(def/adef);
    	if adef=0 then gg=1 else gg=gam*absvalue(def/adef);
    	
    print(def*1000,adef*1000,aa,gg,CurrentBar);
    
    	w =  aa*Price + (1 - aa) * prog;
    	$D1=w;
    	prog=w+gg*(w-$D1[1]);
    end
    Первая строка задает внешние параметры индикатора, которые потом можно менять.
    price - входной сигнал фильтра, обычно Close или (High+Low)/2.
    N - интервал наблюдения, длина отрезка в прошлое, который используется для адаптации.
    alfa и gam - заданные пользователем базовые значения параметров фильтра.

    Далее объявляются внутренние переменные, смысл которых будет объяснен по мере их употребления в тексте.

    Далее следует условный блок с условием f CurrentBar <= N. Первая его часть задает поведение функции D1 на начальном отрезке графика, когда не сформировались еще первые N баров. В этом случае никакой адаптации не производится, вычисляется просто экспоненциальное среднее длины N. На самом деле в этом месте было бы логичнее вычислять неадаптивную модифицированную ЕМА с параметрами alfa и gam.
    Это - мой ляпсус, который я только сейчас и заметил, готовя этот пост.
    "Смягчающее вину обстоятельство" состоит в том, что, разумеется, почти всё равно, как функция ведет себя на начальном отрезке графика. Поэтому надеюсь на вердикт присяжных "виновен, но заслуживает снисхождения":).

    Самое интересное происходит во второй части условного блока - когда уже есть N сформированных баров.

    Переменная prog содержит прогноз для входного сигнала.
    Ошибка этого прогноза price-prog[1] усредняется с помощью модифицированной ЕМА с параметрами 1/N и 0,5 в качестве сглаживания и инерционности прогноза, результат запоминается в def.
    Функция $A1 - это и есть та самая модифицированная ЕМА.
    Аналогично усредняется и абсолютная величина ошибки прогноза, результат запоминается в adef.

    Величина absvalue(def/adef) используется как мера направленности движения - аналогично средней Кауфмана.
    Вычисляются значения aa и gg, которые и используются на текущем шаге вычислений как рабочие текущие значения параметра сглаживания alfa и параметра инерционности прогноза gam.
    Легко видеть, что рабочие значения alfa и gam могут быть только меньше заданных базовых значений.

    Вычисляются текущее значение функции $D1 и значение прогноза на следующий бар.
    ============
    Ниже - график евродоллара с наложением двух экземпляров индикатора D1.
    Наверху графика видны значения параемторв индикаторов.
    Синий график - с параметрами N=22, alfa=1/22, gam=0.
    Красный график - с параметрами N=22, alfa=1/22, gam=0,5.

    Поведение характерно для всех адаптивных средних: сравнительно резкое выполаживание при переходе направленного движения в консолидацию.

    К посту прицеплен исходник для МТ4.
    Так как файл *.mql загружать нельзя, он переименован в D1.txt.
    Особенность реализации для МТ4: так как модифицированная ЕМА не является встроенным индикатором МТ4, а обращение к пользовательским индикаторам ест много ресурсов, вычисление модифицированной ЕМА внесено прямо в текст D1 (в разобранном примере это было обращение к функции $A1).
    ================
    Следующий пост - описание ТС на этом фильтре. Идея торгового сигнала изложена в посте №44.
    Вложения Вложения
    • Тип файла: txt D1.txt (3.9 Кб, Просмотров: 44)
  7. 1,048
    Комментарии
    2
    Темы
    1975
    Репутация Pro
     
    Мастер форумных наук

    4 Медалей
    После того, как мне "на глаз" понравилось поведение фильтра D1, естественным следующим шагом являлось создание ТС на этом фильтре.

    Я обычно для проверки идеи создаю и проверяю в тестере специальную экспериментальную ТС, по которой, вообще говоря, торговать не планирую. Это связано с тем, что я считаю, что торговую прибыль должна приносить основная идея ТС, грубо говоря - один сигнал от одного индикатора. Все прочие навороты (дополнительные условия входа для отсечения ложных входов, сигнал на выход из сделки, отличающийся от основного сигнала на вход в противоположную позицию и т.д.) призваны не принести прибыль, а уменьшить просадку. В основе такой идеологии построения ТС лежат некоторые слабо формализованные наблюдения за распределением периодов прибыли и убыточности "простых" и "сложных" ТС.
    Для обоснования этой точки зрения приведу кусок автобиографии.
    ==============
    Классика вечноживая
    При начальном освоении Омеги (много лет назад, до начала кризиса) я прогонял через тестер сперва простые стратегии (входящие в комплект поставки или построенные мной на основе входящих в комплект поставки сигналов).
    Удивительное наблюдение: на дневках евродоллара на промежутке 5 лет любая классическая стратегия прибыльна. Хоть пересечение средних. Хоть классический MACD, хоть пробой канала, хоть DMI. Хоть тресни.
    Почему же мы все ещё не имеем по домику в Средиземноморье? Ответ прост: просадка при этом доходит до 1000 пунктов, а годовая доходность около 25%.
    Замечу, что доходность вполне себе ничего, но вот просадка – совершенно нетерпима для начинающих Соросов с депозитом в 300 пунктов.
    Первая моя гипотеза была о том, что именно по евродоллару наблюдался в те 5 лет глобальный тренд, а большинство классических систем – трендовые. Для проверки гипотезы я прогнал встроенную в Омегу ТС на основе автоматического (!) обнаружения свечных паттернов. Результат граалеподобный (на дневках за 5 лет!). Просадка – около 1000 пунктов.
    Внимание: это наблюдение было сделано до 2008 года, до начала кризиса.
    Мировая константа простой ТС
    В Омеге торговая система (они там называются strategy) строится из отдельных сигналов, не надо всё запихивать в один эксперт. Поэтому хорошей практикой является писать отдельный сигнал для каждой торговой идеи. Которых в торговой системе может быть и много.
    Я принял для себя в исследовании и построении ТС следующую технику: сначала я пишу один торговый сигнал, отражающий основную идею торговли, и проверяю базовую стратегию на основе только этого сигнала. Если сигнал дает только вход в сделку – присобачиваю сверхпростой выход. Явно ********овые идеи отсеиваются сразу. Прибыль должна приносить базовая торговая идея. Любые навороты должны лишь уменьшать просадку.
    Ошеломившее меня наблюдение: стратегия из одного разумного сигнала (разумным я называю сигнал, для которого могу явно и ясно сформулировать словами тот «физический эффект», на ловлю которого рассчитан сигнал) прибыльна на дневках на интервале в 5 лет, а просадка будет около 1000 пунктов (как правило от 800 до 1500). Как стена.
    Причем стратегии трендовые, пробойные и отбойные дают примерно похожий результат.
    Если учесть, что классические стратегии построены как правило на одном сигнале – напрашивается следующий вывод: к просадке примерно в 1000 пунктов приводит «чужая» фаза рынка (флэт для трендовых стратегий, тренд для отбойных, безоткатное движение – для отбойного мартингейла и т.п.).Если рынок находится в требуемой фазе (в тренде для трендовых систем, в флэте для отбойных и т.п.), то не только прибыль велика, но и убытки малы. Чужая же фаза рынка порождает серию убытков.

    Сложные ТС
    Для более изощренных стратегий, которые пользуются не одним сигналом, убытки концентрируются не столько даже в «чужих» фазах рынка (изощренные стратегии тем или иным способом явно или неявно пытаются определить текущую фазу рынка), а в периодах смены фазы рынка (с тренда на флэт и т.п.). Смена фазы порождает серию убытков, которая длится до тех пор, пока стратегия не «поймет», что фаза сменилась.
    Естественнейший вывод состоит в том, что «фортуне надо помогать» (цитата из моего знакомого карточного шулера). То есть – располагая МТС, заточенными под различные фазы рынка, следует переключать их вручную
    =====================
    =====================
    Вернемся к созданию экспериментальной ТС на D1.

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

    Однако тут меня слегка осенило: любой адаптивный фильтр для торговли определяет степень направленности движения цены за свой интервал наблюдения. Это значит, что где-то в середине фильтра существует такое место, откуда можно эту информацию выдрать и использовать независимо от собственно выходного сигнала фильтра, от сглаженной цены.
    Для D1 таким показателем меры направленности движения является используемое для изменения параметров фильтра выражение absvalue(def/adef).

    Именно его я и использовал в экспериментальной ТС, основанной на фильтре D1.
  8. 1,048
    Комментарии
    2
    Темы
    1975
    Репутация Pro
     
    Мастер форумных наук

    4 Медалей
    Ниже - исходник сигнала, смысл которого описан в предыдущем посте.
    Код:
    inputs: price(close),alfa(1/24),gam(0),TrEn(0.5),k(0);
    Var: cur_alfa(alfa),D1(0);
    
    cur_alfa=adaptalfa(price,1/alfa,alfa,gam);
    
    if cur_alfa cross above -TrEn*k then ExitShort this bar on close;
    if cur_alfa cross below TrEn*k then ExitLong this bar on close;
    
    if cur_alfa cross above TrEn then buy this bar on close;
    if cur_alfa cross below -TrEn then sell this bar on close;
    Как видим, он устроен предельно просто, всё основано на одной функции adaptalfa.

    Входные параметры price, alfa, gam имеют тот же смысл, что и в исходнике фильтра D1.
    Параметры TrEn и k явялются параметрами ТС.
    TrEn определяет уровень входа в сделку (две последние строки текста).
    k определяет уровень выхода из сделки, причем задает не абсолютный уровень, а уровень относительно уровня входа. При k=1 получается чисто переворотная ТС: выход сопровождается входом в противоположном направлении.
    Замечание. Из вычисления cur_alfa=adaptalfa(price,1/alfa,alfa,gam); видно, что при создании ТС я искусственно задал интервал наблюдения фильтра в виде 1/alfa, связав его с базовой степенью сглаживания. Возможно, что при разрешении свободного изменения интервала наблюдения можно добиться лучших результатов в тестере. Однако - я резко отрицательно отношусь к увеличению количества оптимизируемых параметров ТС, и особенно - именно в экспериментальных ТС. Потому что лучше недооценить ТС в тестере, чем переоценить её.
    ============
    Используемая функция adaptalfa приведена ниже.
    Код:
    Inputs: price(Numericseries),N(Numeric),alfa(Numeric),gam(Numeric);
    Variables: prev(0), def(0),adef(1), prog(0),aa(alfa),gg(gam),w(0),filtVal(0);
    
    If CurrentBar <= N Then begin
    	prog=Price[1];
    	filtVal = Price;
    end
    Else
    begin
    	def=$A1(price-prog[1],1/N,0.5);
    	adef=$A1(absvalue(price-prog[1]),1/N,0.5);
    	if adef=0 then aa=0. else aa=alfa*absvalue(def/adef);
    	if adef=0 then gg=1 else gg=gam*absvalue(def/adef);
    	
    {print(def*1000,adef*1000,aa,gg,CurrentBar);}
    
    	w =  aa*Price + (1 - aa) * prog;
    	filtVal=w;
    	prog=w+gg*(w-filtVal[1]);
    	adaptAlfa=(def/adef);
    end;
    Видно, что она почти совпадает с фрагментом кода для D1.
    Отличие состоит в том, что для торгового сигнала надо сохранить знак отношения def/adef, чтобы отличить движение вниз от движения вверх, в то время как для фильтра надо только оценить меру направленности движения.
    ================
    Пора скакать в офис на работу, отчеты тестера и комментарии к методике тестирования - в следующем посте.
    Забегая вперед, скажу, что прибыльность невелика (что естественно для экспериментальной ТС на одном сигнале), но присутствует в "слепом" периоде.
  9. 1,048
    Комментарии
    2
    Темы
    1975
    Репутация Pro
     
    Мастер форумных наук

    4 Медалей
    Перед выкладыванием отчета тестера Омеги необходимо прокомментировать ряд не совсем очевидных моментов в построении и тестировании экспериментальной ТС.

    1. ТС - экспериментальная. Поэтому она основана только на одном индикаторе adaptalfa, который порождает как сигнал на вход, так и сигнал на
    выход. Для "боевой" ТС, предназначенной для реальной торговли, я это ограничение считаю неправомерным, так как решение о выходе из сделки
    может приниматься на основе принципиально иных соображений, чем решение о входе. Пример - пробойные ТС. В случае успешного пробоя
    движение должно развиваться быстро, поэтому может быть разумным выход из сделки по истечении опредленного времени после входа.

    2. Стопы отсутствуют, выход - только по сигналу. Опять же, для боевой ТС отсутствие стопов граничит с безумием, стоп должен быть хотя бы "на
    случай атомной войны" (биржа в состоянии панических продаж, ордера на закрытие сделки не принимаются, сервер вашего торгового посредника
    упал или имитирует падение и т.д, и т.п.). А вот экспериментальная ТС, задача которой - отвергнуть явно неподходящую торговую идею, гораздо
    лучше выполнит свою задачу без стопов.

    3. Я не люблю ТС с большим количеством настраиваемых параметров. Поэтому их количество в данном случае было ограничено искусственно.
    А. как уже было сказано в прошлом посте, я насильственно задал интервал наблюдения фильтра в виде 1/alfa, связав его с базовой степенью
    сглаживания. Быть может это - не вполне хорошее решение по значению (а вдруг 2/alfa было бы здорово лучше?), но весьма хорошее по структуре.
    Но это - сугубо личное моё мнение. Более того, я время от времени это мнение собственное игнорирую. Но не сейчас.
    Б. Базовая степень сглаживания при тестировании на дневках не оптимизировалась и задана в виде 1/22. В месяце обычно бывает 22 рабочих дня, так что интервал наблюдения при тестировании на дневках установлен равным месяцу.
    В. Аналогично дело обстоит с параметром gam. У него есть три в некотором смысле естественных значения - ноль, единица и значение,
    пограничное между наличием и отсутствием перерегулирования. Это пограничное значение зависит от alfa, поэтому тут таится возможность некоей
    вариации фильтра D1: вместо пересчета gam по значению def/adef аналогично параметру alfa можно сначала вычислять alfa по def/adef, после чего
    устанавливать gam в пограничное значение перерегулирования.
    Так что разумны три версии тестирования экспериментальной ТС: gam=0=const, gam=1=const, gam оптимизируется.
    Сначала исследуем вариант "поближе к классической ЕМА" gam=0=const.
    Г. Параметр k имеет два естественных диапазона оптимизации: от 0 до 1 и от -1 до 1. Случай k=-1 соответствует переворотной ТС. Замечу, что при
    оптимизации по критерию чистой прибыли обычно оптимальной оказывается переворотная версия (не только для этой ТС) - ценой большой
    просадки. Именно поэтому я считаю разумным также и диапазон k от 0 до 1. Выход при k=0 соответствует выходу при малейшем намеке на начало
    противоположного тренда.
    Сначала исследуем "трусливый" вариант оптимизации k в диаразоне от 0 до 1.

    4. Добавлен сигнал закрытия сделки на последнем баре графика - чтобы не мучить тестер открытой позицией.
    ================
    Итак, в рамках принятых произвольно решений оптимизации подлежат параметры TrEn и k, определяющие вход и выход.
    Замечу, что эти параметры определяют свойства именно ТС, а не индикатора, на котором она основана. То есть тестирование выполняется в
    довольно жестких условиях.

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

    1. установим период оптимизации в 1500 дней с концом 1 января 2009 года и оптимизируем ТС по TrEn и k перебором от 0 до 1 с шагом 0,05.
    Критерий оптимизации - чистая прибыль. Глазомерно проверяем на разумность размер просадки.
    После оптимизации получаем TrEn=0,9 и k=1. Результат меня самого несколько удивил: выход при k=1 означает выход при снижении adaptalfa ниже
    уровня входа, что при уровне входа казалось бы оставляет ТС слишком мало времени для нахождения в рынке. Однако отчет тестера показал
    время в рынке 48% - почти половина времени.
    Однако всё это малоинтересно, так как относится к результатам на периоде оптимизации.
    2. Сдвинем график на год, т.е. установим период графика в 1500 дней с концом 1 января 2010 года и посмотрим на результаты торговли, принимая
    во внимание только сделки за 2009 год (общие результаты за период никому не интересны, интересен только результат за 2009 год).
    Тут есть ещё один тонкий момент: сделка может пересечь границу года, как её учитывать?
    В данном случае повезло: в Новый Год открытой позиции не было.
    В 2009 году было две сделки (для трендовой ТС на дневках - нормальный результат), -369 пунктов и +1058 пунктов. Максимальная просадка за все
    1500 дней равна 718 пунктов и случалась не в 2009 году.

    3+4. Оптимизируем ТС за период 1500 дней до 1 января 2010 года, получим те же значения для оптимальных параметров TrEn=0,9 и k=1.
    Сдвинем график на год, проверим торговлю в 2010 году. Опять мозг не мучаем, в Новый Год открытой позиции не было.
    В 2010 году было четыре сделки: +1880 (это продажа от 1,4511 12 января до 1,2623 7 июля) и три убытка -535, -104 и -272 пункта. Общий плюс чуть
    меньше тысячи. Просадка 956 примерно равна прибыли за год. Это - опять же обычное явление для экспериментальных ТС на одном индикаторе.
    Распределение сделок (большой плюс и три убытка потом) наводит на мысль, что во второй половине года что-то изменилось.

    5+6. Однако оптимизация до 1 января 2011 года показывает TrEn=0,95 и k=1. Честно скажу, мне это не понравилось сразу: рынок явно изменился, а
    оптимальные значения почти такие же, даже усугубились. В реальной торговле я бы сильно призадумался. получив такой результат оптимизации.
    А тут - продолжаем соблюдать процедуру.
    Результаты торговли в 2011 году подтвердили опасения. Сделки -438, +266, -509, +446 дают в сумме убыток 235 пунктов.

    7+8. Оптимизация до 1 января 2012 года показывает TrEn=0,7 и k=0. Оправдалось опасение, что рынок изменился (с точки зрения этой ТС!) летом
    2010 года, слишком уж отличаются оптимальные значения параметров для этой оптимизации от прошлых оптимальных значений.
    Торговля за неполный 2012 год (до 10 октября) такова: три сделки 2012 года дают "минус ноль", убыток в 16 пунктов. И есть ещё переходящая из
    2011 года прибыльная сделка в +606 пунктов.
    ===========
    Не исключено, что при таком скользящем тестировании надо было бы брать поменьше период оптимизации, так как 1500 дней это пять лет.
    Именно поэтому переоптимизация до 1 января 2011 года не почувствовала смену рынка летом 2010 года - предыдущие годы пересилили.
    Однако для экспериментальной ТС на одном индикаторе результаты вполне удовлетворительные. В прибыльные годы прибыль была заметна, а в убыточный - краха не случилось, просто был убыток.

    Вывод: можно продолжать работу над боевой ТС на этом индикаторе.
    ==================
    Собственно отчеты тестера за эти несколько лет не выкладываю, так как их много, по два на год (до оптимизации и после оптимизации).
  10. 19,801
    Комментарии
    465
    Темы
    20570
    Репутация Pro
    Аватар для Евгений Ляпкин  
    Старожил

    9 Медалей
    Цитата Сообщение от BQQ Посмотреть сообщение
    Вывод: можно продолжать работу над боевой ТС на этом индикаторе.
    А в каких случаях индикатор не годится?..

Вверх
РегистрацияX

чтобы писать, читать, комментировать