Д.Катс.Д.Маккормик.Энциклопедия торговых стратегий. Донна л. Маккормик
Скачать 5.96 Mb.
|
ГЛАВА 6 МОДЕЛИ, ОСНОВАННЫЕ НА скользящих СРЕДНИХ 137 ограничения риска; нельзя ждать, пока система выдаст сигнал в противо- положном направлении. Некоторые модели, идущие против тренда, мо- гут иметь сильную логическую основу; например, если они используют понятия поддержки и сопротивления. ПРИКАЗЫ, ИСПОЛЬЗУЕМЫЕ ДЛЯ ОСУЩЕСТВЛЕНИЯ ВХОДОВ Входы, основанные на скользящих средних, могут быть осуществлены с помощью стоп-приказов, лимитных приказов или рыночных приказов. Хотя возможны более удачные сочетания, в принципе с любой моделью может работать любой тип приказов. Иногда приказ может быть частью сигнала входа. Простая система, основанная на пересечении средних, может использовать стоп-приказ на ожидаемом завтрашнем уровне сколь- зящего среднего. Во избежание исполнения нескольких приказов при случайных скачках внутридневной цены на следующий день ставится только стоп-приказ на покупку или на продажу, а не оба вместе. Если зак- рытие было выше скользящей средней, ставится стоп-приказ на прода- жу, а если ниже, то на покупку. Приказы, используемые для входов, имеют свои достоинства и недо- статки. Рыночный приказ никогда не пропустит сигнала, поданного на вход. Стоп-приказ никогда не пропустит важного тренда (если система следует за трендом). Вход всегда будет произведен, когда движение цен подтверждает его выгодность — но за счет проскальзывания и неопти- мальных цен входа. Лимитный приказ обеспечит лучшую цену и снизит расходы на сделку, но в ожидании отката цен можно пропустить важные тренды. В противотрендовой модели лимитный приказ может при случае ухудшить входную цену — поскольку приказ отдается по фиксированной цене, а не по цене, которую дает «отрицательное проскальзывание», воз- никающее при движении рынка против сделки в момент входа. МЕТОДОЛОГИЯ ТЕСТИРОВАНИЯ Во всех нижеследующих тестах использован стандартный портфель. Ко- личество контрактов при покупке или продаже при входе на любом рын- ке в любое время подбиралось так, чтобы приблизительно соответство- вать долларовой волатильности двух контрактов S&P 500 на конец 1998 г. Использованы стандартные выходы. Все тесты проведены с использова- нием C-Trader toolkit. Для того чтобы была возможность сравнить резуль- таты, использованы портфели, стратегии выхода и платформа тестирова- ния, идентичные использованным ранее. Тесты разделены на следующие за трендом и идущие против тренда. Они проводились на основе скрипта, содержащего инструкции для установки параметров, проведения опти- 138 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК мизации и генерации результатов для каждого сочетания видов скользя- щих средних, моделей и входных приказов. Приведенный ниже код более сложен, чем код для пробоев; вместо разных последовательностей для комбинаций скользящих средних, пра- вил входа и приказов использован один цикл, в котором параметры уп- равляют выбором элементов системы. Этот метод необходим при генети- ческом развитии систем. Хотя здесь, собственно, нет генетических алго- ритмов, подобные методы будут использованы в следующих главах. Этот код содержит параметры для управления элементами модели, упрощая обработку всех возможных комбинаций в систематическом виде. 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 = xlOmodOl.c // parms — набор [1..MAXPRM] параметров // dt — набор [l..nb] дат в формате ГГММДД // орn — набор [l..nb] цен открытия // hi — набор [1..nb] максимальных цен // 1о — набор [1..nb] минимальных цен // cls — набор [l..nb] цен закрытия // vol — набор [l..nb] значений обьема // oi — набор [1..nb] значений открытого интереса / / dlrv — набор [1..nb] значений среднего долларовой волатильности / / nb — количество дней в наборе данных // ts — ссылка на класс торгового симулятора // eqcls — набор [1..nb] уровней капитала при закрытых позициях // объявляем локальные переменные static int rc, cb, ncontracts, maxhold, fastmalen,slowmalen; static int modeltype, ordertype, avgtype, signal; static float mmstp, ptlim, stpprice, limprice, tmp; static float exitatr[MAXBAR+1] ; static float fastma[MAXBAR+1] , slowma[MAXBAR+1] ; // копируем параметры в локальные переменные для более удобного обращения fastmalen = parms[1]; // период для быстрой скользящей средней slowmalen = parms[2]; // период для медленной скользящей средней modeltype - parms[5]; // тип модели входа avgtype = parms[6]; // тип скользящего среднего ordertype = parms[7]; // тип входного приказа maxhold = 10; // максимальный период удержания позиции ptlim = 4; // целевая прибыль в единицах волатильности mmstp = 1; // защитная остановка в единицах волатильности // пропускать неверные комбинации параметров if(fastmalen >= slowmalen) { set_vector(eqcls, 1, nb, 0.0); return; } // делаем вычисления по всему ряду данных, используя векторизацию AvgTrueRangeS(exitatr, hi, lo, cls, 50, nb); // средний истинный // диапазон для выхода switch(avgtype) { // выбираем тип скользящей средней case 1: // простые скользящие средние ГЛАВА 6 МОДЕЛИ, ОСНОВАННЫЕ НА скользящих СРЕДНИХ 139 Averages{fastma, cls, fastmalen, nb); Averages(slowma, cls, slowmalen, nb); break; case 2: // экспоненциальные скользящие средние XAverageS(fastma, cls, fastmalen, nb); XAverageS(slowma, cls, slowmalen, nb); break; case 3: // треугольные скользящие средние с передним взвешиванием FWTAverageS(fastma, cls, fastmalen, nb}; FWTAverageS(slowma, cls, slowmalen, nb); break; case 4: // VIDYA-адаптивные скользящие средние VIAverageS(fastma, cls, fastmalen, 10, nb) ; VIAverageS(slowma, cls, slowmalen, 10, nb) ; break; default: nrerror("Invalid moving average selected"); } ; // проходим через дни, чтобы смоделировать реальную торговлю for(cb =1; cb < = nb; cb++) { //не входим в сделки до начала периода выборки // ...так же, как установка MaxBarsBack в Trade Station if (dt[cb] < IS_DATE} { eqcls [cb] = 0.0; continue;) // выполняем все ожидающие приказы и подсчитываем капитал по закрытым // сделкам гс = ts.update (opn [cb] , hi [cb] , lo [cb] , cls [cb] , cb) ; if (rc = 0) nrerror("Trade buffer overflow"); eqcls[cb] = ts.currentequity(EQ_C1OSETOTAL); // подсчитываем количество контрактов для сделки / / ... мы хотим торговать эквивалентом долларовой волатильности // ... 2 новых контрактов S&P-500 от 12/31/98 ncontracts = RoundToInteger(5673.0 / dlrv[cb]); if(ncontracts < 1) ncontracts = 1; // избегаем установки приказов на день, когда остановлены торги if (hi[cb+1] == lo [cb+1]) continue; // генерировать входные сигналы, цены стоп- и лимитных приказов, // используя модель входа определенной скользящей средней #define CrossesAbove(a,b, с) {а[с]>=b[с] && a [c-1]#define CrossesBelow(a,b,c) {a[c]=b[c-1]) #define TurnsUp(a,c) {a [c]>=a[c-l] && a [c-1]#define TurnsDn(a,c) {a[c]=a[c-2] ) signal=0; switch(modeltype) { case 1: // классическая следующая за трендом модель, основанная на // пересечении if (CrossesAbove(fastma, slowma, cb)) signal = 1; else if (CrossesBelow(fastma, slowma, cb)) signal = -1; limprice = 0.5 * (hi [cb] + lo [cb]); stpprice = cls [cb] +0.5 * signal * exitatr[cb] ; break; case 2: // следующая за трендом модель, основанная на наклоне if (TurnsUp(fastma, cb)) signal = 1; else if(TurnsDn{fastma, cb)) signal = -1; limprice = 0.5 * (hi[cb] + lo [cb]}; stpprice = cls[cb] +0.5 * signal * exitatr[cb]; break; case 3: // противотрендовая модель if(CrossesAbove(fastma, slowma, cb)) signal = -1 ; else if(CrossesBelow(fastma, slowma, cb)) signal = 1; 140 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК В этом коде содержатся три сегмента. Первый сегмент рассчитывает скользящие средние. Параметр avgtype выбирает вид среднего: 1 — про- стое, 2 — экспоненциальное, 3 — треугольное с передним взвешиванием, 4 — модифицированное VIDYA. Даже если в коде использовано всего одно среднее, рассчитываются два одинаковых, чтобы сделать выбор вида скользящего среднего независимым от модели. Также рассчитывается средний истинный диапазон, значение которого требуется для установки защитных остановок и целевых прибылей в стратегии стандартных вы- ходов. Два дополнительных параметра — fastmalen и slowmalen — указы- вают период быстрой и медленной скользящих средних. Значения сколь- зящих средних сохраняются в векторах fastma и stowma. Следующий блок использует выбранную модель для получения сиг- налов выхода, цен для стоп-приказов и цен для лимитных приказов. Сна- limprice = 0.5* (hi[cb] + lo[cb]); stpprice = cls[cb] + 0.5 * signal * exitatr[cb]; break; case 4: // противотрендовая модель, основанная на поддержке // и сопротивлении if(slowma[cb] > slowma[cb-1] && CrossesBelow(fastma, slowma, cb) ) signal = 1; else if(slowma[cb] < slowma[cb-1] && CrossesAbove(fastma, slowma, cb)) signal = -1; limprice = 0.5 * (hi[cb] + lo[cb]); stpprice = cls[cb] +0.5 * signal * exitatr[cb]; break; default: nrerror("Invalid model selected"}; } #undef CrossesAbove #undef CrossesBelow #undef TurnsUp #tundef TurnsDn // входим в сделку, используя опеределенный тип приказа if(ts.position() <= 0 && signal == 1) { switch (ordertype) { // выбираем желаемый тип приказа case 1: ts.buyopen('1' , ncontracts); break; case 2: ts.buylimit('2', limprice, ncontracts); break; case 3: ts.buystop('3' , stpprice, ncontracts); break; default: nrerror("Invalid buy order selected"); } } else if(ts.position)) >= 0 && signal == -1) ( switch (ordertype) ( // выбираем желаемый тип приказа case 1: ts.sellopen{'4', ncontracts); break; case 2: ts.selllimit('5', limprice, ncontracts); break; case 3: ts.sellstop('6', stpprice, ncontracts); break; default: nrerror("Invalid sell order selected"); } ) // симулятор использует стандартную стратегию выхода tmp = exitatr[cb]; ts.stdexitcls('X', ptlim*tmp, mmstp*tmp, maxhold); } // обрабатываем следующий день } ГЛАВА 6 МОДЕЛИ, ОСНОВАННЫЕ НА скользящих СРЕДНИХ 141 чала определяются простые соотношения значений (CrossesAbove, CrossesBelow, Turnsllp и TurnsDown). В зависимости от mode/type одна из 4 видов моделей скользящих средних генерирует сигнал. Переменная modeltype принимает следующие значения: 1 — классическая, следующая за трендом модель пересечения двух скользящих средних; 2 — следую- щая за трендом модель, основанная на наклоне; 3 — противотрендовая модель, основанная на пересечении и 4 — противотрендовая модель на основе поддержки/сопротивления. В классической модели, основанной на пересечении скользящих средних, трейдер открывает длинную пози- цию, если быстрое среднее поднимается выше медленного, и короткую, если быстрое среднее опускается ниже медленного. Эта модель также может содержать сравнение скользящего среднего и цены в случае, когда период быстрого среднего приравнен к единице. При использовании ос- нованной на наклоне модели, следующей за трендом, трейдер покупает, когда скользящее среднее после снижения стало расти, и продает в об- ратной ситуации. Эта модель требует только медленного скользящего среднего. Противотрендовая модель представляет собой обратную вер- сию следующей за трендом классической модели пересечения: трейдер покупает, когда быстрое среднее (или собственно цена) опускается ниже медленного, и продает, когда оно поднимется выше. Такая модель — меч- та для приверженцев теории противоположного мнения: она работает строго противоположно системе следования за трендом. Последняя мо- дель — грубая система на основе поддержки/сопротивления, где ожида- ется, что цены будут «отскакивать» от линии скользящего среднего, как от уровней поддержки/сопротивления. Правила почти идентичны про- тивотрендовой системе пересечения за тем исключением, что медленное среднее должно двигаться в направлении входа. Если медленное скользя- щее среднее стремится вверх, а цены (или быстрое среднее) падают сверху до его уровня или ниже, то дается сигнал на покупку; в противном случае дается сигнал на продажу. Дополнительное правило тренда обеспечивает защиту от немедленного разворота позиции после соприкосновения или пересечения средних. Без этого ограничения быстрый пробой с последу- ющим разворотом вызвал бы два входа — желаемый вход против тренда и второй при пересечении средней во время отката цен. Контроль тренда позволяет входить только при движении в одном направлении: пересече- ние и отскок при повышающемся тренде приводят к открытию длинной позиции, а при понижающемся тренде — к открытию короткой. В последней части кода параметр ordertype определяет вид приказа: 1 — рыночный приказ при открытии; 2 — лимитный приказ; 3 — стоп- приказ. Генерация приказа на покупку или продажу либо отсутствие при- каза определяется тем, какой сигнал был сгенерирован предыдущим бло- ком программы; эта информация содержится в переменной signal: 1 — покупка; —1 — продажа (открытие короткой позиции); 0 — нет приказа. Уровень цены лимитного приказа (limprice) рассчитывается как сумма 142 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК максимума и минимума текущего дня, деленная на два. Поскольку мно- гие из моделей не имеют естественного уровня цены для установки вход- ных стоп-приказов, используется стандартный стоп. Его цена (stpprice) получается таким образом: берется цена закрытия предыдущего дня и к ней прибавляется (при сигнале для длинной позиции) или от нее отнима- ется (при сигнале для короткой позиции) средний истинный интервал за последние 50 дней, умноженный на 0,50; т.е. рынок должен сместиться как минимум на половину среднего дневного движения в направлении желаемого входа, чтобы этот вход имел место. Такой стоп-приказ как бы добавляет методику пробоя к скользящим средним — рынок должен «про- бить» некоторую границу, чтобы сработал вход. Поскольку тестов прово- дилось множество, мы приводим только наиболее интересные результа- ты статистического анализа. ТЕСТЫ МОДЕЛЕЙ, СЛЕДУЮЩИХ ЗА ТРЕНДОМ Эта группа включает модели, построенные по принципу следования за трендом, с использованием скользящих средних. Модели различаются ви- дом скользящих средних, правилами генерации сигналов и видами прика- зов, обеспечивающих вход. Использовались следующие виды скользящих средних: простые, экспоненциальные, треугольные с передним взвеши- ванием и модифицированные VIDYA. Исследованы системы простого пе- ресечения цены и средней, пересечения двух скользящих средних, а так- же модели со входами на основе наклона графика скользящей средней. В качестве входов использовались лимитные, рыночные и стоп-приказы. Первые 12 тестов проведены на моделях, основанных на пересечении. Оптимизация состояла в прогонке периода быстрого скользящего сред- него от 1 до 5 с шагом 1 и периода медленного скользящего среднего от 5 до 50 с шагом 5. Разумеется, период медленного среднего был всегда длин- нее периода короткого. Проводилась оптимизация с лобовым подходом. Целью была максимизация соотношения риска/прибыли или, что то же самое, минимизация вероятности случайного происхождения прибылей. В тестах 13 — 24 испытывались модели, основанные на наклоне. В них оп- тимизация состояла в прогонке периода первого (т.е. единственного) скользящего среднего от 3 до 40 с шагом 1. Как и в тестах 1 — 12, максими- зировалось соотношение риска/прибыли. Оптимизация проводилась толь- ко на данных в пределах выборки. Табл. 6-1 и 6-2 показывают прибыль или убыток по каждому из компо- нентов портфеля для каждого из тестов в пределах выборки (табл. 6-1) и вне пределов выборки (табл. 6-2). В столбце SYM указан рынок, первая строка — номер теста. Такое представление данных дает достаточно под- робную информацию о прибыльности или убыточности рынков отдель- ных товаров; одно тире ( — ) означает умеренный убыток со сделки, т.е. ГЛАВА 6 МОДЕЛИ, ОСНОВАННЫЕ НА скользящих СРЕДНИХ 143 $2000 — 4000. Два тире ( ) означают значительные убытки, т.е. более $4000. Аналогично, один плюс ( + ) означает умеренную прибыль, т.е. $1000 — 2000, а два плюса (+ +) — крупную прибыль, более $2000. Пустая ячейка означает убыток размером до $1999 или прибыль от 0 до $1000. В табл. 6-3 для всего портфеля приведены показатели прибыли в про- центах годовых (ДОХ %) и среднего результата сделки ($СДЕЛ), распре- деленные по видам скользящих средних, моделей, входных приказов и выборке данных. Два правых столбца и четыре нижние строки — усред- ненные значения. В последней строке приведены данные, усредненные для всех сочетаний моделей и средних. Данные в правом столбце усред- нены для всех видов приказов. Таблица 6—1. Эффективность в пределах выборки по тестам и рынкам 144 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК Ни одна из следующих за трендом моделей по портфелю в целом не была прибыльной. Более подробное исследование показывает, что для моделей, основанных на пересечении, использование лимитных прика- зов приводило к резкому улучшению в пределах выборки. По сравнению с входами при открытии или по стоп-приказу использование лимитного приказа снижало средний убыток почти вдвое. Вне пределов выборки улучшение было не столь выражено, но все же значительно. То же самое отмечалось и для показателя ДОХ %: наименьшие убытки были получены при использовании лимитного приказа. Для моделей, основанных на на- клоне, лимитный приказ работал наилучшим образом вне пределов вы- Таблица 6—2. Эффективность вне пределов выборки по тестам и рынкам ГЛАВА 6 МОДЕЛИ, ОСНОВАННЫЕ НА скользящих СРЕДНИХ 145 борки. Прибыль была несколько лучше при использовании стоп-приказа (поскольку значения прибыли в процентах годовых при оценке убыточ- ных систем, естественно, искажаются) и хуже при входе по цене откры- тия. В пределах выборки лучше всего работал стоп-приказ, но с минималь- ным преимуществом. В пределах выборки по показателю средней прибыли со сделки наи- лучшие результаты дали системы на основе простого скользящего сред- него, наихудшие — на основе адаптивного скользящего среднего. Другие два варианта скользящих средних дали промежуточные результаты, при- чем экспоненциальное среднее работало лучше в моделях на основе пе- Таблица 6—3. Эффективность следующих за трендом моделей в зависимости от вида приказов, вида скользящих средних, типа модели и выборки данных Модель пcс Пересеч ЭСС Пересеч ТССПВ Пересеч АСС Пересеч пcс Наклон ЭСС Наклон ТССПВ Наклон АСС Наклон ДОХ% $СДЕЛ ДОХ% $СДЕЛ ДОХ% $СДЕЛ ДОХ% $СДЕЛ ДОХ% $СДЕЛ ДОХ% $СДЕЛ ДОХ% $СДЕЛ ДОХ% $СДЕЛ Модели пересечения Средняя ДОХ% Средняя $СДЕЛ. Модели наклона Средняя ДОХ% Средняя $СДЕЛ В пределах выборки Открытие -9.4 -1785 -9.2 -1570 -9.3 -1666 -9.6 -1942 -10.1 -1667 -10.1 -2137 -10.0 -1842 -10.1 -2353 -9.4 -1738 -10 -2000 Лимитный -7.5 -926 -7.5 -705 -8.2 -890 -7.1 -769 •8.7 -906 -9.6 -1629 -9.3 -1365 -9.6 -1531 -7.6 -823 -9 -1358 Стоп -6.5 -1045 -9.1 -1534 -9.2 -1720 -8.3 -1731 -9.5 -1076 -8.5 -1289 -8.0 -1203 -8.7 -1603 -8.3 -1508 -9 -1293 Вне пределов выборки Открытие -23.0 -1628 -20.4 -1269 -21.6 -1984 -22.5 -1798 -22.4 -1083 -23.1 -1714 -23.4 -1647 -23.4 -1872 -21.9 -1670 -23 -1579 Лимитный -21.4 -1213 -22.4 -1755 -18.0 -1265 -19.0 -1071 -19.2 -615 -20.5 -1096 -19.2 -1561 -22.9 -1391 -20.2 -1326 -20 -1166 Стоп -19.7 -1337 -19.9 -1223 -23.4 -2715 -23.5 -2350 -23.8 -2528 -20.5 -1199 -3.5 -91 -23.0 -2002 -21.8 -1906 -18 -1455 Среднее в -7.8 -1245.3 -8.6 -1269.7 -8.9 -1425.3 -8.3 -1480.7 -9.4 -1216.3 -9.4 -1685.0 -9.1 -1470.0 -9.5 -1829.0 -8.4 -1355 -9 -1550 Среднее Вне -21.4 -1392.7 -20.9 -1415.7 -21.0 -1988.0 -21.7 -1739.7 -21.8 -1408.7 -21.4 -1336.3 -15.4 -1099.7 -23.1 -1755.0 -21.2 -1634 -20 -1400 146 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК ресечения, а треугольное с передним взвешиванием — в моделях на ос- нове наклона. Из всех моделей на основе пересечения по показателю ДОХ% также лучше всего работали простые скользящие средние. В об- щем, модели на основе пересечения работали так же или немного лучше, чем модели на основе наклона, возможно, ввиду их более быстрой реак- ции на рыночные изменения. Вне пределов выборки простое скользящее среднее было однозначно лучшим для моделей, основанных на пересече- нии, а треугольное с передним взвешиванием — лучшим для моделей, ос- нованных на наклоне. По показателю ДОХ% экспоненциальное скользя- щее среднее, видимо, было лучшим для моделей, основанных на пересе- чении, а треугольное с передним взвешиванием — опять-таки лучшим для моделей, основанных на наклоне. При рассмотрении отдельных тестов обнаруживается, что вне преде- лов выборки наилучшие показатели имела модель, испытанная в тесте 21 : основанная на наклоне, использующая треугольное скользящее среднее с передним взвешиванием и вход по стоп-приказу. Результаты вне преде- лов выборки для моделей на треугольном скользящем среднем с передним взвешиванием были, в общем, лучше при всех видах приказов. Видимо, между различными факторами во всех тестах присутствовали сильные взаимосвязи, например для моделей с пересечением в пределах выборки вход по рыночному приказу при открытии следующего дня всегда был наихудшим, вход по стоп-приказу давал средние результаты и вход по лимитному приказу был всегда наилучшим вне зависимости от вида ис- пользованного скользящего среднего. Вне пределов выборки результаты были менее закономерны. При ис- пользовании простого скользящего среднего результаты были более все- го близки к полученным в пределах выборки; при использовании экспо- ненциального среднего лимитные приказы работали хуже всего, а стоп- приказы лучше всего; рыночные приказы давали средние результаты. Вне пределов выборки при использовании треугольного скользящего средне- го с передним взвешиванием стоп-приказы были самыми худшими, а ли- митные приказы — наиболее эффективными. Таким образом, существу- ет взаимодействие между скользящим средним, входом и временем. Модели, основанные на наклоне, всегда плохо работали при рыночном приказе; лимитные и стоп-приказы давали близкие результаты: в двух слу- чаях был предпочтителен лимитный приказ (при простых скользящих сред- них и адаптивных скользящих средних) и в двух случаях — стоп-приказ (при экспоненциальных и треугольных скользящих средних). Как и ранее, вне пределов выборки отмечалось большее разнообразие результатов. Для простых скользящих средних лучше всего работали лимитные приказы, а хуже всего стоп-приказы. При использовании экспоненциаль- ных средних наблюдалась отмеченная ранее типичная картина: рыноч- ный приказ работает хуже всех, лимитный приказ — лучше всех, а стоп- приказ дает средние результаты. Как уже было сказано, треугольное сколь- |