Д.Катс.Д.Маккормик.Энциклопедия торговых стратегий. Донна л. Маккормик
Скачать 5.96 Mb.
|
ГЛАВА 13 СТАНДАРТНАЯ СТРАТЕГИЯ ВЫХОДА 331 ким разнообразием стратегий выхода. В остальном правила выхода иден- тичны использованным ранее и сводятся к следующему: после входа ус- танавливаются выходная защитная остановка выше (для коротких) или ниже (для длинных позиций) цены входа и выходной лимитный приказ выше (для длинных) или ниже (для коротких позиций) цены входа. Оста- новка смещена от цены входа на величину произведения некоторого мно- жителя (параметр остановки по управлению капиталом) и размера сред- него истинного диапазона. Лимитный приказ смещен от цены входа на величину произведения другого множителя (параметра целевой прибы- ли) и среднего истинного диапазона. Система производит выход по цене закрытия по истечении 10 дней, если ни защитная остановка, ни целевая прибыль не закрывают сделку ранее. Используется средний истинный ди- апазон с периодом 50 баров. Ниже приведен код, обеспечивающий слу- чайные входы и модифицированные стандартные выходы. static void Model (float *parms / float *dt, float *opn, float *hi, float *lo, float *cls, float *vol, float *oi, float *dlrv, int nb, TRDSIM &ts, float *eqcls) { // Выполняет случайные входы с модифицированными выходами // File = x19mod02.c // parms — набор [1..MAXPRM] параметров // dt — набор [l..nb] дат в формате ГГММДД // орn — набор [1..nb] цен открытия // hi — набор [1..nb] максимальных цен // 1о — набор [1..nb] минимальных цен // cls — набор [1..nb] цен закрытия // vol — набор [1..nb] значений объема // oi — набор [1..nb] значений открытого интереса // dlrv — набор [1..nb] средних значений долларовой волатильности // nb — количество баров в наборе данных // ts — ссылка на класс торгового симулятора // eqcls — набор [1..nb] значений капитала по ценам закрытия // объявляем локальные переменные static int rc, cb, ncontracts, maxhold, signal, ranseed; static float mmstp, ptlim, limprice, stpprice; static int entryposted, entrybar; static float exitatr[MAXBAR+1] , rnum, entryprice; static long iseed; // копируем параметры в локальные переменные для удобного обращения ranseed = parms[8] ; // используется для генерации случайной // последовательности maxhold = 10; // период максимального удержания позиции ptlim = 4 . 0 ; // целевая прибыль в единицах среднего истинного // диапазона mmstp =1.0; // защитная остановка в единицах среднего // истинного диапазона // выполняем вычисления для всех данных AvgTrueRangeS(exitatr,hi,lo,cls,50,nb); // средний истинный диапазон для // выхода // запускаем генератор случайных чисел // ... используем разные случайные последовательности для каждого рынка 332 ЧАСТЬ III ИССЛЕДОВАНИЕ выходов // ... ts.model() возвращает индекс рынка (SP=1, YX=2, ...) iseed = -(ranseed + 10 * ts.model()); rnum = ran2 (Stiseed) ; // проходим через дни, чтобы смоделировать реальную торговлю for(cb = 1; cb <= nb; cb++) ( //не открываем позиций до начала периода выборки // ... то же самое, что установка MaxBarsBack в TradeStation if(dt[cb] < IS_DATE) { eqcls[cb] = 0.0; continue; ) // выполняем ожидающие приказы и считаем кумулятивный капитал rc = ts.update(opn[cb], hi[cb], lo[cb], cls[cb], cb) ; if{rc != 0) nrerror{"Trade buffer overflow"); eqcls[cb] = ts.currentequity(EQ_CLOSETOTAL); // считаем количество контрактов для позиции // ... мы хотим торговать эквивалентом долларовой волатильности // ... 2 новых контрактов на S&P-500 от 12/31/98 ncontracts = RoundToInteger(5673.О / dlrv[cb]); if (ncontracts < 1) ncontracts = 1; // избегаем устанавливать приказы на дни с ограниченной торговлей if(hi[cb+l] == lo[cb+l]) continue; // генерируем "стандартные" случайные входные сигналы signal = 0; rnum = ran2(&iseed); // случайное число между 0 и 1 if(rnum < 0.025) signal = -1; // случайный короткий вход else if(rnum > 0.975) signal = 1; // случайный длинный вход // входить в сделки по цене открытия entryposted = 0; if{ts.position() <= 0 && signal =- 1} { ts.buyopen('1' , ncontracts); entryposted = 1; entryprice = opn[cb+l]; entrybar = cb + 1; } else if (ts.position)) >= 0 && signal == -1) { ts.sellopen('2', ncontracts); entryposted = -1; entryprice = opn[cb+l]; entrybar = cb + 1; } // выходить из сделок, используя модифицированный стандартный выход if(entryposted > 0) ( // инициализация и выходы для длинных позиций на каждый день limprice = entryprice + ptlim * exitatr[cb]; stpprice - entryprice - mmstp * exitatr[cb]; ts.exitlonglimit('A', limprice); ts.exitlongstop('B', stpprice); ] else if(entryposted < 0) { // инициализация и выходы для коротких позиций на каждый день limprice = entryprice - ptlim * exitatr[cb]; stpprice = entryprice + mmstp * exitatr[cb]; ts.exitshortlimit('C' , limprice) ; ts.exitshortstop('D' , stpprice); } else { // выходы после дня входа ГЛАВА 13 СТАНДАРТНАЯ СТРАТЕГИЯ ВЫХОДА 333 Это код идентичен предыдущему за исключением изменений в стра- тегии выхода. Система входит на рынок по случайному сигналу, как опи- сывалось ранее, но покупка и продажа производятся только по цене от- крытия. Кроме того, сохраняется информация о входе, т.е. записывается, отдавался ли приказ на вход (длинная, короткая позиция или никакой) в данном торговом дне (entryposted); по какой цене (entryprice) производил- ся вход, если он был, и в какой день имел место вход (entrybar). Эти дан- ные необходимы для расчета выходов, которые производятся после вхо- да. Если на следующий день отдается приказ войти в рынок (т.е. занять длинную либо короткую позицию по цене открытия следующего дня), то для этого дня также рассчитываются целевая прибыль и защитная оста- новка. Для длинных позиций защитная остановка устанавливается на не- котором уровне (цена входа минус произведение среднего истинного диа- пазона и некоторого параметра), а лимитный приказ целевой прибыли — на уровне цены входа плюс произведение среднего истинного диапазона и другого параметра. Если в данный день отдается приказ к открытию короткой позиции по цене открытия следующего дня, то также размеща- ются приказы закрытия данной короткой позиции (лимитный приказ це- левой прибыли или защитная остановка). Для длинных позиций расчет производится подобным же образом, но в обратном направлении. Если данный день не используется для входа, то проводится проверка для оп- ределения наличия существующей позиции после закрытия дня. Если позиция существует, то размещаются два (а возможно, три) приказа: за- щитная остановка и целевая прибыль, вычисленные в день открытия дан- ной позиции, и, если позиция открыта более чем maxhold дней, отдается приказ на выход по цене закрытия. РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ Тест 4. МССВ со случайными входами по цене открытия. В табл. 13-5 (идентичной по формату табл. 13-1 — 13-3) приведены данные об эффективности портфеля рынков при использовании модифицирован- ной стандартной стратегии выходов при случайных входах по цене от- if(ts.position() > 0) ( // длинные позиции ts.exitlonglimit{'F' , limprice) ; ts.exitlongstop('G' , stpprice); if(cb-entrybar >= maxhold) ts.exitlongclose('E') } else if (ts.position)) < 0) { // короткие позиции ts.exitshortlimit{'I' , limprice) ; ts.exitshortstop('J' , stpprice) ; if(cb-entrybar >= maxhold} ts.exitshortclose{'H'); } } )// обрабатываем следующий день } 334 ЧАСТЬ III ИССЛЕДОВАНИЕ выходов крытия. В пределах выборки средняя сделка приносила убыток в $1702 при стандартном отклонении $365. Процент прибыльных сделок соста- вил 31,73%, при стандартном отклонении 1,10%. Средняя сделка, таким образом, приносила меньший убыток, чем при тестировании исходной ССВ. Снижение убытка, несомненно, вызвано способностью модифици- рованной стратегии быстрее останавливать убыточные позиции. Эти вне- запные и частые выходы также объясняют снижение числа прибыльных сделок. Прибыльных сделок было меньше, но убыток со средней сделки также меньше — интересное сочетание. В целом МССВ можно считать шагом вперед по сравнению с исходной стратегией. Вне пределов выборки средняя сделка приносила убыток в размере $836. С точки зрения статистики это значительное улучшение по сравне- нию с выборкой — видимо, в последние годы этот выход работает значи- тельно лучше, чем ранее. Возможно, теперь рынки более чувствительны к способности своевременно закрывать убыточные позиции. Другие по- казатели в табл. 13-5 указывают на изменения подобного вида. Результаты МССВ со случайным входом по цене открытия на раз- личных рынках. В табл. 13-6 показаны результаты тестов на различных рынках системы с наилучшей случайной последовательностью. Входы производились по цене открытия. Наилучшая случайная последователь- ность была выбрана из числа приведенных в табл. 13-5. Положительная прибыль как в пределах, так и вне выборки была получена на рынках швей- царского франка, сырой нефти, мазута, золота и живого скота. На неко- торых рынках при помощи МССВ удавалось получать устойчивую при- Таблица 13—5. Результаты модифицированной стратегии выхода при случайных входах по цене открытия ГЛАВА 13 СТАНДАРТНАЯ СТРАТЕГИЯ ВЫХОДА 335 Таблица 13—6. Результаты торговли системы с модифицированной стан- дартной стратегией выхода и случайными входами по цене открытия на различных рынках быль от случайных сделок! Количество рынков, прибыльных и в преде- лах, и вне пределов выборки было гораздо больше, чем при использова- нии оригинальной ССВ — верный признак того, что модифицированный, более чувствительный выход работает лучше. Как обычно, и в пределах, и вне пределов выборки длинные позиции были более прибыльными (т.е. менее убыточными), чем короткие. Как ни 336 ЧАСТЬ III ИССЛЕДОВАНИЕ выходов странно, вне пределов выборки длинные позиции принесли небольшую прибыль на портфеле в целом при использовании этой стратегии выхо- дов, впрочем, недостаточную для практического применения данной тор- говой стратегии. ЗАКЛЮЧЕНИЕ Результаты однозначно показывают, что многие из стратегий входа, ис- пытанных в предыдущих главах, были ничем не лучше случайных входов, а порой и хуже. Кроме того, показано, что стандартная стратегия выхода далеко не оптимальна. Модифицированная стратегия, всего-навсего по- зволяющая выходить из рынка по внутридневным ценам (а не только по ценам закрытия), работала гораздо лучше и даже смогла обеспечить не- которую прибыль в длинных позициях. Стратегия МССВ остается ми- нималистской, но, тем не менее, показывает, что именно хорошая страте- гия выходов является ключом к успешной торговле. Если данные этого и предыдущих исследований верны, то можно найти стратегию выходов, способную реально получать значительную прибыль на основе случай- ных входов, по крайней мере на некоторых рынках. Такая стратегия под- твердит сказанное многими великими трейдерами: опытный трейдер, уме- ло управляющий капиталом, может получить прибыль даже с плохой сис- темой, а новичок, не имеющий опыта управления капиталом, потеряет деньги даже при использовании великолепной системы. Под системой здесь имеется в виду модель входа. Во всех последующих тестах в этой книге будет использоваться модифицированная стратегия выхода вместо оригинальной ССВ. ЧТО МЫ УЗНАЛИ? Хорошая стратегия выходов чрезвычайно важна. Она может обеспечить прибыль даже при использовании случайных вхо- дов! Представьте, чего можно с ней добиться, применяя про- двинутую систему входов, основанную на реальных рыночных явлениях. Даже небольшие изменения стратегии выходов могут привес- ти к большой разнице в результатах, как и было показано выше. При сочетании с неоптимальной ССВ многие из стратегий вхо- да, описанных в этой книге, производят впечатление работа- ющих не лучше, чем случайные входы, а некоторые гораздо хуже! Конечно, некоторые модели все же работали гораздо лучше, чем модель на основе случайного входа. ГЛАВА 14 Улучшения стандартной системы выхода Продолжая наши попытки улучшить стандартную стратегию до разработ- ки хорошего выхода, исследуем ряд модификаций. В предыдущей главе было показано, что стратегия выхода может оказать значительное влия- ние на общее функционирование торговой системы. Для того чтобы при- близиться к уровню стратегий выхода, рассматриваемых в этой и после- дующих главах, исходная стандартная стратегия выхода (ССВ) была моди- фицирована до состояния МССВ: было отменено ограничение на выход только по цене закрытия. Поскольку входы системы ограничены входами по цене открытия, ограничивать выходы становится необязательным. В предыдущих главах входы производились с помощью различных прика- зов, и ограничение выходов было необходимо во избежание неоднознач- ных результатов. Стратегия МССВ представляет минимальную базовую конфигурацию, обладающую некоторой устойчивостью и сравнимую с ис- ходной. В этой главе будут рассматриваться различные модификации МССВ, предпринимаемые в поисках лучшей торговой стратегии. НАЗНАЧЕНИЕ ТЕСТОВ При создании исходной ССВ (а также при последующей модификации с использованием лимитных приказов целевой прибыли и защитных оста- новок внутри дня) расположение защитной остановки и целевой прибыли было произвольно и жестко установлено. Для длинных входов защитная установка управления капиталом располагалась на уровне одного средне- го истинного диапазона ниже цены входа, а целевая прибыль — на уровне четырех средних истинных диапазонов выше цены входа. Для коротких входов расположение было обратным. Мы пытались разместить защит- ную установку достаточно близко к цене входа для максимально быстрого прекращения убыточных сделок, а целевую прибыль — достаточно дале- ко, чтобы не терять прибыль благоприятных сделок. Первый из нижепри- веденных тестов исследует влияние защитной остановки и целевой при- были при подстройке этих произвольно выбранных значений. 338 ЧАСТЬ III ИССЛЕДОВАНИЕ выходов Второй набор тестов изучает возможность замены фиксированной защитной установки в МССВ на подвижную. Минимальная конфигура- ция МССВ не обладает привлекательными чертами — в частности, для трейдера желательно получить хотя бы минимальную прибыль со сделки, а не ждать, пока она станет убыточной. Такая фиксация прибыли может быть обеспечена следящей защитной остановкой: вместо размещения за- щитной остановки на некотором расстоянии от цены входа остановка пе- ремещается вместе с ценой в направлении открытой позиции, когда сделка становится выгодной. Когда цены движутся в благоприятном направле- нии, вместе с ними движется и уровень защитной остановки, защищая часть потенциальной прибыли. Если рынок разворачивается, то сделка будет закрыта не с убытком (как было бы при фиксированной защитной остановке), а с прибылью, если следящая защитная остановка вошла в при- быльную ценовую область. Существует ряд стратегий размещения и пе- ремещения уровня защитной остановки, предназначенных для избежа- ния убыточного закрытия прибыльных сделок и фиксации максимальной части нереализованных прибылей, которые и будут исследоваться во вто- ром наборе тестов. В стратегиях ССВ и МССВ целевая прибыль реализовывалась в виде лимитного приказа на выход, размещенного на фиксированном уровне. В третьем наборе тестов фиксированный уровень целевой прибыли, по- добно защитной остановке ранее, был заменен на нечто более динами- ческое. Было бы желательно сделать уровень целевой прибыли движущим- ся в сторону текущей цены, особенно в случае затянувшихся сделок на «летаргических» рынках. Это позволило бы выхолить из сделки по хоро- шей цене, возможно, даже с некоторой прибылью, и при отсутствии силь- ного благоприятного движения. Выход из рынка на случайных «шумовых» пиках более выгоден, чем простой выход по истечении некоторого вре- мени или ожидание срабатывания защитной остановки. В то же время желательно не потерять потенциальный доход благодаря неоптимально- му уровню целевой прибыли. Слишком близко расположенная целевая прибыль может обеспечить высокий процент прибыльных сделок, но зна- чительно снизить прибыль каждой из них, что может сделать стратегию в целом убыточной. Было бы желательно применять «мобильную» целевую прибыль, т.е. в начале сделок или при благоприятном устойчивом движе- нии рынка размещать ее подальше от рыночной цены, не соглашаясь на минимальную прибыль. Если же сделка затягивается при отсутствии боль- шой текущей прибыли или поведение рынка неблагоприятно, то целевая прибыль может смещаться к текущей цене, позволяя закрыть сделку с максимально возможной прибылью до разворота рынка. Ниже будут ис- следоваться различные модификации размещения целевой прибыли. Кроме того, будет испытан в различных модификациях выход по ог- раничению времени, исходя из того соображения, что при динамической защитной остановке и целевой прибыли ограничение времени не столь ГЛАВА 14 УЛУЧШЕНИЯ СТАНДАРТНОЙ СИСТЕМЫ ВЫХОДА 339 необходимо. «Застойные» позиции будут закрываться максимально быст- ро другими способами, но будут держаться как можно дольше при благо- приятном движении рынка. Суть в том, чтобы не фиксировать прибыль только из-за того, что истек чрезмерно короткий лимит времени. ТЕСТИРОВАНИЕ МОДЕЛИ С ФИКСИРОВАННОЙ ЗАЩИТНОЙ ОСТАНОВКОЙ И ЦЕЛЕВОЙ ПРИБЫЛЬЮ В стратегии МССВ величины защитной остановки и целевой прибыли были фиксированы на достаточно произвольном и, возможно, неопти- мальном уровне. Что произойдет, если протестировать ряд значений этих параметров в поисках оптимального сочетания? В данном тесте положение защитной установки управления капита- лом прогоняется от 0,5 до 3,5 с шагом 0,5. Целевая прибыль прогоняется от 0,5 до 5 с шагом 0,5. Под защитной остановкой и целевой прибылью понимается произведение указанного числа на средний истинный диапа- зон определенного количества последних торговых дней. float *lo, float *cls, float *vol, float *oi, float *dlrv, int nb, TRDSIM &ts, float *eqcls) { // Выполняет случайные входы с вариациями // модифицированного стандартного выхода. Эта модель тестирует // МСС, используя вариации в параметрах. // File = x20mod01.c // parms — набор [1..MAXPRM] параметров // dt — набор [l..nb] дат в формате ГГММДД // орn - набор [l..nb] цен открытия // hi - набор [l..nb] максимальных цен // 1о — набор [ 1..nb] минимальных цен // cls - набор [l..nb] цен закрытия // vol — набор [1..nb] значений объема // oi — набор [1..nb] значений открытого интереса // dlrv — набор [1..nb] средних долларовой волатильности // nb — количество дней в наборе данных // ts — ссылка на класс торгового симулятора // eqcls - набор [l..nb] уровней капитала по ценам закрытия // объявляем локальные переменные static int rc, cb, neontracts, maxhold, signal, ranseed; static float mmstp, ptlim, lirnprice, stpprice; static int entryposted, entrybar; static float exitatr[MAXBAR+1] , rnum, entryprice; static long iseed; // копируем параметры в локальные переменные для удобного обращения ptlim = parms[1]; // целевая прибыль в единицах среднего истинного // диапазона mmstp = parms[2]; // защитная остановка в единицах среднего истинного // диапазона maxhold = parms[3]; // период максимального удержания позиции ranseed = parms[8]; // используется для инициализации случайной // последовательности 340 ЧАСТЬ III ИССЛЕДОВАНИЕ выходов // выполняем вычисления по всему объему данных AvgTrueRangeS(exitatr,hi,lo,cls,50,nb); // средний истинный диапазон для // выхода // очищаем генератор случайных чисел // ... используем различную случайную последовательность для каждого //инструмента // ... ts.model() возвращает индекс рынка (SP=1, YX-2, ...) iseed = -(ranseed + 10 * ts.model()); rnum = ran2(&iseed); // проходим через дни, чтобы смоделировать реальную торговлю for(cb = 1; cb <= nb; cb++) ( // не открываем позиций до начала периода выборки // ... то же самое, что установка MaxBarsBack в TradeStation if(dt[cb] < IS_DATE) { eqcls[cb] = 0.0; continue; } // выполняем ожидающие приказы и считаем кумулятивный капитал rc = ts.update(opn[cb], hi[cb], lo[cb], cls[cb], cb) ; if(rc != 0) nrerror("Trade buffer overflow"); eqcls[cb] = ts.currentequity(EQ_CLOSETOTAL); // считаем количество контрактов для позиции // ... мы хотим торговать эквивалентом долларовой волатильности // ... 2 новых контрактов на S&P-500 от 12/31/98 ncontracts = RoundToInteger(5673.0 / dlrv[cb]); if(ncontracts < 1) ncontracts - 1; // избегаем устанавливать приказы на дни с ограниченной торговлей if(hi[cb+l] == lo[cb+l]) continue; // генерировать "стандартные" случайные сигналы входа signal = 0; rnurn = ran2(&iseed) ; if(rnum < 0.025) signal = -1; // случайный короткий вход else if (rnum > 0.975) signal = 1; // случайный длинный вход // входим в сделки по цене открытия entryposted = 0; if(ts.position!) <= 0 && signal == 1) ( ts.buyopen('1' , ncontracts}; entryposted = 1; entryprice = opn[cb+l]; entrybar = cb + 1; } else if(ts.position)) >= 0 && signal == -1) { ts.sellopen('2' , ncontracts) ; entryposted = -1; entryprice = opn[cb+l]; entrybar = cb + 1 } // выходим из сделок, используя модифицированный стандартный выход if(entryposted > 0) { // инициализация и выходы для длинных позиций в день входа limprice = entryprice + ptlim * exitatr[cb]; stpprice = entryprice - mmstp * exitatr[cb]; ts.exitlonglimit{'A' , limprice); ts.exitlongstop('B', stpprice); } else if(entryposted < 0) { // инициализация и выходы для коротких позиций в день входа limprice = entryprice - ptlim * exitatr[cb]; stpprice = entryprice + mmstp * exitatr[cb]; |