Как правильно поставить стоп-лосс и не ошибиться:ПРО ФОРЕКС
InstaForex

суббота, 11 июня 2016 г.

Как правильно поставить стоп-лосс и не ошибиться


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

1. Постановкой стопа слишком далеко, что делает его неэффективным.
2. Слишком близким размещением, приводящим к чрезмерно частому срабатыванию стопа и снижающим общую эффективность торговой системы.

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

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

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

Ниже мы попробуем описать возможную последовательность действий и логику рассуждений постановки фиксированного стоп-лосса на примере своей торговой системы.

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

Мы предпочитаем писать стопы сами, а не пользоваться встроенными в Метасток. Одна из причин — чисто идеологическая. Мы полагаем, что на нашем малоликвидном с технической точки зрения рынке для увеличения эффективности системы нежелательно пользоваться для получения сигналов торговых систем ценами закрытия, открытия, максимума или минимума, поскольку они часто носят случайный характер. Для того чтобы представить отличие нашего рынка от «нормального» западного, нужно заметить, что весь объем РТС за день — это примерно 15–20 секунд торговли акциями Microsoft. Понятно, что при таком объеме на западном рынке около минимальных, максимальных цен на открытии торгов и на их закрытии проходят десятки и сотни сделок. В результате эти цены носят не случайный, а закономерный характер, адекватно отражая происходившие на рынке события, и это позволяет корректно использовать данные показатели в техническом анализе. Увы, у нас такой рынок будет еще не скоро. Выход, который мы нашли, состоит в использовании для получения сигналов средней цены за период (день, час). С нашей точки зрения, средняя цена более верно отражает динамику состояния рынка, нежели используемые стандартно цены открытия, закрытия, минимума или максимума.

Для хранения средней цены акции за период мы используем в Downloader столбец, зарезервированный для значений Open Interest1. Так как в этот столбец можно вносить только целые значения, то, зачастую, приходится сначала умножать значение цены на некий коэффициент, равный 10, 100, 1000 и т. д., для приведения к целым значениям, а потом создавать в Метастоке индикатор, производящий обратное преобразование. Так, для хранения средних значений сделок РАО ЕЭС за период мы умножаем полученное из отчетов о торгах значение на 10 000, а потом для обращения к данным используем индикатор Avg.Price, представляющий из себя следующую конструкцию:

Avg.Price:=OI/10000;
Avg.Price

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

Логику составления стоп-лосса на языке Метастока можно представить так:

1. Сначала надо выделить те участки цен, которые приходятся на открытые позиции, то есть те фрагменты рыночной динамики, на которых в принципе возможно срабатывание стоп-лосса. В отличии от языка продуктов фирмы Omega Research (TradeStation, SuperChart и д. р.), Метасток не умеет сам определять текущее состояние позиций, что является существенным недостатком его языка, затрудняющим создание торговых стратегий. Мы определяем текущую позицию, сравнивая периоды времени, прошедшие после последнего сигнала на открытие позиций и последнего сигнала на закрытие позиций:

Enter.trade: = условия открытия позиций;
Close.trade: = условия закрытия позиций;
Position: = HighestBars(Close.trade) > HighestBars(Enter.trade);

Теперь мы имеем в своем распоряжении функцию Position, которая возвращает значение 1 при открытой позиции и значение 0 — при закрытой.

2. Следующий шаг состоит в определении «опорной» цены, для которой отсчитывается значение стоп-лосса. Обычно в качестве такой «опорной» цены используется цена открытия позиции. Выглядит это так:

Open.Price: = ValueWhen (1, Position = 1 and ref (Position, 81) = 0, AvgPrice);

Функция Open.Price возвращает значение цены (в данном случае — средней цены на данном баре) для первого с правого края графика бара, для которого выполняется следующее условие — текущая позиция открыта (Position = 1), позиция на предыдущем баре была закрыта (ref (Position, -1) = 0).

3. Необходимо учесть комиссию, которая добавляется к «опорной» цене при длинных позициях и вычитается при коротких позициях (далее пример для длинных позиций):

Full.Price: = Open.Price * (100 + значение комиссии в %)/100;

4. Теперь можно задать условие, при котором происходит срабатывание стоп-лосса, а именно прохождение текущей ценой (средней ценой за период) ниже «опорной» цены на некоторое количество процентов (для длинных позиций):

AvgPrice < Full.Price * (( 100 - opt1)/100), где opt1 — это величина стоп-лосса в процентах. Итого, целиком конструкция стоп-лосса для длинных позиций выглядит следующим образом: Enter.trade: = условия открытия длинных позиций; Close.trade: = условия закрытия длинных позиций; Position:= HighestBars (Close.trade) >= HighestBars (Enter.trade);
Open.Price: = ValueWhen (1, Position = 1 and ref (Position, 81) = 0, AvgPrice);
Full.Price: = Open.Price *(100 + значение комиссии в %)/100;
AvgPrice < Full.Price *((100 - opt1) / 100) Для коротких позиций так: Enter.trade: = условия открытия коротких позиций ; Close.trade: = условия закрытия коротких позиций ; Position: = HighestBars (Close.trade) >= HighestBars (Enter.trade);
Open.Price: = ValueWhen (1, Position = 1 and ref (Position, 81) = 0, AvgPrice);
Full.Price: = Open.Price *(100 - значение комиссии в %)/100;
AvgPrice > Full.Price *((100 - opt1)/100)

Заменяя AvgPrice на любое другое значение — Close, Open, High, Low или даже значение какого-нибудь индикатора, можно привязать стоп-лосс к любому другому показателю.

Далее, после внесения данного фрагмента кода в условия закрытия сделки в окне System Editor можно приступать к тестированию. За шаг при оптимизации лучше взять значение в один процент.

После проведения оптимизации начинается самое важное — анализ полученных результатов.

Психологически комфортно торговать два вида стоп-лоссов — близкие, из-за маленького размера убытков по каждой сделке, и дальние, из-за редкой реализации этих стопов. Именно с этим связано иногда желание или приблизить стопы или вовсе их убрать с глаз долой. Дальние стопы и отказ от стопов мы обсудим чуть ниже, вопрос же о приближении стопов к цене захода для нас наболевший— не реже раза в месяц приходится рассказывать анекдот о бабушке летчика, просившей своего внучка летать пониже, чтобы не разбиться…

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

Отбросив 1–3%-е стоп-лоссы как слишком близко поставленные, снова рассматриваем результаты анализа и
ищем наиболее доходные и наименее рискованные варианты. С этой точки зрения наиболее хорошо смотрятся 7, 8 и 9%-е стоп-лоссы. У них максимальная из всех помесячная доходность и максимальное соотношение доход/риск, самое большое математическое ожидание прибыли от сделки. Кстати, в Метастоке по результатам тестирования они занимают первые три строчки в отчете, претендуя на вхождение в состав торговой системы. Это одна из ловушек системной торговли. Все бы было хорошо, если бы не одно «но» — смотрим самую первую строчку в таблице, — эти стоп-лоссы очень редки. Увы, это то, что, возможно, называется подгонкой под исторические данные. Эти стоп-лоссы встречались слишком редко, чтобы их результаты можно было рассматривать как достоверные.

Вполне возможно, что по мере накопления статистики появится возможность еще раз вернуться к этому вопросу и тогда 7 или 8%-е стоп-лоссы смогут доказать свое право на существование в составе торговых систем — но не сейчас.

Вообще говоря, существует точка зрения, что стоп-лоссы должны быть очень широкими (придуман даже соответствующий термин — ruin-stop). В отличие от стоп-лосса, который, как следует из названия, ограничивает убытки, данный вид стопов срабатывает только при угрозе разорения. Обычно это означает десятки процентов просадки счета. Есть даже примеры успешного использования такой торговой тактики. Так, легендарный Ларри Вильямс увеличил свой счет за год в 1000 раз (!), играя по определенным правилам в основном внутри дня против тренда и не используя стоп-лоссов. Справедливости ради следует отметить, что столь агрессивный стиль торговли сопровождается все-таки чрезмерно большими
рисками — на следующий год он разорился.

Заговорив о разных точках зрения на стоп-лосс, нельзя не упомянуть и наиболее радикальную из них. Широко известный писатель и трейдер Виктор Нидерхоффер писал:

«Я никогда не использую стопы. Комбинация различных выходов обеспечивает мне значительное преимущество…»

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

Таким образом, наш выбор ограничивается значениями стоп-лоссов от 4 до 6 %. По большому счету они дают практически одинаковый результат, а те тонкие различия, что есть между ними, сформированы расхождениями в одной-двух сделках, что, с нашей точки зрения, опять-таки недостоверно. Поэтому на этой стадии, после отсечения двух крайностей, выбор стоп-лосса становится скорее вопросом психологического комфорта. Мы выбираем более дальний стоп-лосс, равный 6 %. Он встречается чуть реже, чем 4 и 5 %-е стоп-лоссы, однако средний и максимальный размеры убыточных сделок у них одинаковы, а максимальный дродаун даже меньше. Психологически легче получать стоп-лосс чуть большего размера, но реже. Кроме того, рассматривая потенциальную угрозу потери в будущем эффективности стоп-лосса из-за изменения характера рынка, следует признать, что наибольшую опасность представляет собой все-таки чрезмерно близкое расположение стопов к цене захода. С этой точки зрения 4 и 5%-е стоп-лоссы могут потерять свою эффективность вследствие изменения характера рынка раньше, чем 6%-е стоп-лосс.

Небольшой пассаж о структуре убыточных сделок. В начале данной статьи мы написали, что одной из целей стоп-лосса является ограничение максимального размера убытков. При этом может на первый взгляд показаться странным, что при размере стоп-лосса в 6 % максимальный размер отфиксированного убытка составляет более 11 %. Таким образом, может возникнуть впечатление, что стоп-лосс не выполняет своей задачи и не предотвращает больших убытков. Это, естественно, не так. Стоп-лосс не в состоянии жестко ограничить убытки на уровне своей установки по причине возможных гэпов, сразу проскакивающих, и порой значительно, через установленный уровень. Поэтому, де-факто, стоп-лосс устанавливается на подступах к большим убыткам.

До сих пор мы разбирали объективный стоп-лосс фиксированной величины. В формуле на языке Метастока эта фиксированная величина задавалась значением opt1:

AvgPrice < Full.Price . ((100 . opt1)/100). Однако существует возможность (и в этом одна из прелестей написания стопов самостоятельно, вместо использования встроенных в программы заготовок) заменить opt1 более сложной конструкцией. Понятно, что величина стоп-лосса зависит во многом от средней волатильности рынка. Стоп-лосс должен размещаться за границей того, что можно назвать обычным колебанием цен, и реагировать именно на настоящее движение против позиции. Тестирование, подобно описанному выше, позволяет методом подбора значений привязать стоп-лосс к средней волатильности рынка за период тестирования. Однако никто не может запретить нам и более тонкой настройки, когда стоп-лосс привязывается не к средней волатильности за весь период тестирования, а к значению волатильности за существенно более короткий период. Так можно осуществить переход к объективному адаптивному стоп-лоссу. Слово объективный означает, что величина стоп-лосса вычисляется на основании характеристик рынка, а адаптивный — что эта величина может меняться в зависимости от изменения текущих характеристик рынка. Безусловно, такая адаптация стоп-лосса требует дополнительного исследования рынка — и не обязательно именно волатильности. Можно предложить несколько вариантов реализации адаптивного стоп-лосса. Стоп-лосс, адаптивный по волатильности В качестве меры текущей волатильности рынка можно взять значение среднего торгового диапазона (Average True Range (ATR)), стандартное отклонение цен (Standart Deviation) или стандартную ошибку (Standart Error)2 за определенный период времени, умножать на некий коэффициент и вычитать полученное значение от цены открытия позиции. На языке Метастока эти варианты адаптивного стоп-лосса выглядят так: AvgPrice < Full.Price - opt1 * ATR(opt2) или AvgPrice < Full.Price - opt1 * stdev (close, opt2) или AvgPrice < Full.Price - opt1 * ste(close, opt2) Возможны и иные варианты определения волатильности. Мы, например, предпочитаем стандартное отклонение за период n1 логарифма соотношения текущей цены и цены n2 периодов назад: Std(Log(Close/Ref(Close,8n2)),n1) По наблюдениям Чака Лебо (Chuck LeBeau), в реальной практике можно обнаружить, что проблемы с адаптивным по волатильности стопом начинают возникать тогда, когда краткосрочная рыночная волатильность становится необычно маленькой и близкие стопы могут быть выбиты случайным движением. Для устранения этих ложных срабатываний стопов Лебо предложил рассчитывать как краткосрочную рыночную волатильность (3–4 дня), так и долгосрочную (15–20 дней) и устанавливать стопы с использованием того значения волатильности, которое на данный момент оказалось наибольшим. Это позволяет стопам двигаться достаточно быстро и в то же время предотвращает ложные срабатывания стопов после нескольких необычайно спокойных дней. Стоп-лосс, адаптивный к уровням сопротивления и поддержки. Есть определенная логика в том, чтобы распологать стоп-лоссы на пробитие важных уровней поддержки или сопротивления, линий хорошо различимых графических паттернов — треугольников, каналов, линий тренда. В случае пробития таких уровней дальнейшее движение цен против позиции является логическим обоснованием необходимости закрытия. В то же время есть одна тонкость — не следует, как правило, располагать стоп-лоссы точно на хорошо видимых линиях — лучше несколько сдвигать их в ту или иную сторону. Достаточно часто на хорошо видимых уровнях располагается значительное количество ордеров, и крупные игроки порой специально играют на пробитие таких уровней, провоцируя массовое закрытие позиций мелких игроков. Обычно графически это проявляется картиной «прокола» линии поддержки — цена быстро уходит вниз в результате выхода мелких игроков из позиций и также быстро потом возвращается в предыдущий торговый диапазон в результате скупки крупными игроками подешевевших в результате успешной игры на понижение акций. На трейдерском слэнге это называется «стряхивание с позиций». Минусом такого стоп-лосса является трудность его формализации на языках программ технического анализа, и, соответственно, сложности с его тестированием. В качестве частичного выхода можем предложить к использованию два индикатора, автоматически определяющих сразу несколько уровней поддержки и сопротивления. Индикатор уровней сопротивления: Pds: = Input( «Periods»,2,25,3); B: = Input(«Field: 1 = Close, 2 = Open, 3 = High, 4 = Low», 1, 4, 1); Z: = If(B=1, CLOSE, If(B=2, OPEN, If(B=3, HIGH, If(B=4, LOW, 0)))); r1: = ValueWhen( 1, Ref( Z, -pds) = HHV( Z, 2 * pds+1) AND Ref( Z, -pds) <> Ref( Z, -pds - 1), Ref( Z, -pds));
r2: = ValueWhen( 1, Ref( Z, -pds) = HHV( Z, 2 * pds+1) AND Ref( Z, -pds) <> Ref( Z, -pds - 1), Ref( Z, -pds));
r3: = ValueWhen( 1, Ref( Z, -pds) = HHV( Z, 2 * pds+1) AND Ref( Z, -pds) <> Ref( Z, -pds - 1), Ref( Z, -pds));
r4: = ValueWhen( 1, Ref( Z, -pds) = HHV( Z, 2 * pds+1) AND Ref( Z, -pds) <> Ref( Z, -pds - 1), Ref( Z, -pds)) ;
r5: = ValueWhen( 1, Ref( Z, -pds) = HHV( Z, 2 * pds+1) AND Ref( Z, -pds) <> Ref( Z, -pds - 1), Ref( Z, -pds));
r6: = ValueWhen( 1, Ref( Z, -pds) = HHV( Z, 2 * pds+1) AND Ref( Z, -pds) <> Ref( Z, -pds - 1), Ref( Z, -pds));
R1; R2; R3; R4; R5; R6

Индикатор уровней поддержки:

pds: = Input(«Periods»,2,25,7);
B: = Input(«Field: 1 = Close, 2 = Open, 3 = High, 4 = Low», 1,4,1);
Z:=If(B=1,CLOSE,If(B=2,OPEN,If(B=3,HIGH,If(B=4,LOW, 0))));
s1: = ValueWhen( 1, Ref( Z, -pds) = LLV( Z, 2 * pds + 1), Ref( Z, -pds)) AND Ref( Z, -pds) <> Ref( Z, -pds - 1), Ref( Z, -pds));
s2: = ValueWhen( 2, Ref( Z, -pds) = LLV( Z, 2 * pds + 1), Ref( Z, -pds)) AND Ref( Z, -pds) <> Ref( Z, -pds - 1), Ref( Z, -pds));
s3: = ValueWhen( 3, Ref( Z, -pds) = LLV( Z, 2 * pds + 1), Ref( Z, -pds)) AND Ref( Z, -pds) <> Ref( Z, -pds - 1), Ref( Z, -pds));
s4: = ValueWhen( 4, Ref( Z, -pds) = LLV( Z, 2 * pds + 1), Ref( Z, -pds)) AND Ref( Z, -pds) <> Ref( Z, -pds - 1), Ref( Z, -pds));
s5: = ValueWhen( 5, Ref( Z, -pds) = LLV( Z, 2 * pds + 1), Ref( Z, -pds)) AND Ref( Z, -pds) <> Ref( Z, -pds - 1), Ref( Z, -pds));
s6: = ValueWhen( 6, Ref( Z, -pds) = LLV( Z, 2 * pds + 1), Ref( Z, -pds)) AND Ref( Z, -pds) <> Ref( Z, -pds - 1), Ref( Z, -pds));
S1; S2; S3; S4; S5; S6

Это результат проведенной нами модификации опубликованных в 1998 году в майском номере TASC индикаторов Мела Виднера (Mel Widner) для языка Метастока. При модификации данных индикаторов мы избавились от функции Prev(), которая работает в Метастоке ОЧЕНЬ медленно, добавили возможность изменения цен, для которых рассчитывается уровень (в первоначальном варианте была возможность расчета уровней только для цен закрытия), и возможность изменения порядка уровней (в первоначальном варианте уровни рассчитывались только для 5-дневных экстремумов).

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

AND Ref( Z, -pds) <> Ref( Z, -pds — 1)

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

Результат применения индикатора уровней поддержки (необходимо выбрать dotted style отображения) к часовым ценам РАО ЕЭС представлен на рисунке.

Изменяя периоды в индикаторе, можно изменять важность уровня — чем выше значение периода, тем значение уровня выше, и наоборот.

Стоп-лосс канала

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

Для длинных позиций стоп-лосс канала будет выглядеть так:

Close < LLV( Close, opt1) Для коротких позиций так: Close > HHV( Close, opt1),

где opt1 — длина канала.

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

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

Наши возможности по адаптации стоп-лоссов ограничены только нашей фантазией…

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

В заключение хочется подчеркнуть ряд положений, которые кажутся нам особенно важными:

1. Стоп-лосс должен быть, его не может не быть.
2. Стоп-лосс должен быть объективным, основанным на изучении особенностей рынка.
3. При анализе результатов тестирования стоп-лосса недостаточно оценивать только изменения доходности системы. Необходимо проводить комплексный анализ, включающий в себя показатели доходности и риска системы, а также частоту реализации стоп-лосса.

Комментариев нет:

Отправить комментарий