<< Пред. стр.

стр. 17
(общее количество: 46)

ОГЛАВЛЕНИЕ

След. стр. >>

тренд, пусть даже и с запаздыванием, лучше и, в общем, выгоднее, чем
попытки предсказывать развороты, которые только изредка происходят
в ожидаемый момент. Поскольку мы вынуждены использовать стандарт-
ные выходы и поскольку в реальной торговле любой серьезный трейдер
будет использовать защитные остановки и управление капиталом, мы не
будем тестировать простые модели скользящих средних, постоянно при-
сутствующие на рынке. Впрочем, при использовании быстрых скользя-
щих средних сигналы разворота позиции возникают раньше, чем стан-
дартный выход закрывает сделки.
Следующие за трендом входы на основе скользящих средних могут
генерироваться различными способами. Одна из простых моделей осно-
вана на пересечении скользящих средних; трейдер покупает, когда цены
поднимаются выше скользящего среднего, и продает, когда цены опуска-
ются ниже его. Вместо ожидания пересечения линии среднего и цен мож-
но использовать быстрое среднее и его пересечение медленным: сигнал
на покупку возникает, когда быстрое среднее поднимется выше медлен-
ного, сигнал на продажу — когда опускается ниже. Сглаживание исход-
ных рядов данных за счет использования скользящих средних снижает
количество «ложных» пересечений и, следовательно, уменьшает частоту
убыточных сигналов.
ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК
136



Скользящие средние могут также использоваться для получения сиг-
налов входа в противотрендовых системах. Биржевые цены часто реаги-
руют на линию скользящего среднего примерно так, как на уровни под-
держки и сопротивления, на чем и основывается модель входа. Согласно
ее правилам, покупают, когда цены опускаются до скользящей средней
или пересекают ее сверху, и продают, когда они поднимаются до нее или
пересекают снизу. Предполагается, что цены «отскакивают» от уровня
скользящего среднего, меняя направление движения. Входы против трен-
да также можно производить на основе стандартного пересечения, но в
обратном направлении. Когда цена опускается ниже линии скользящей
средней, открывают длинную позицию, а когда цена поднимается выше
линии скользящей средней, открывают короткую позицию. Такой «об-
ратный» подход часто оправдывается в торговле, поскольку, как правило,
бывает выгодно продавать после сильного роста цен и покупать, когда
цены чрезмерно быстро падают. Поскольку скользящие средние отстают
от рынка, к моменту получения сигнала рынок может как раз находиться
в начале обратного движения.
Использование скользящих средних для получения сигналов, идущих
против рынка в модели, основанной на уровнях поддержки и сопротивле-
ния, не является чем-то новым. Александер (Alexander, 1993) обсуждал
использование отката до уровня поддержки после пересечения скользя-
щего среднего как вариант организации входа. Тилли (Tilley, 1998) опи-
сывал систему на уровнях поддержки/сопротивления для торговли вза-
имными фондами. Суини (Sweeney, 1998) описывал применение скользя-
щих средних цен закрытия для вычисления внутридневных уровней под-
держки и сопротивления.


ХАРАКТЕРИСТИКИ ВХОДОВ,
ОСНОВАННЫХ НА СКОЛЬЗЯЩИХ СРЕДНИХ
Вход на основе скользящих средних, следующих за трендом, в принципе
подобен пробою; такие входы интуитивно понятны и, несомненно, обес-
печат вход в любой крупный тренд, а также просты в исполнении даже в
обычной программе обработки таблиц. Но, как и большинство следую-
щих за трендом методов, такие входы отстают от рынка, и вход в любое
движение начинается поздно. Быстрые скользящие средние могут сни-
зить запаздывание, но при этом сделают торговлю более «пилообразной».
Стратегия противотрендовых входов на основе скользящих средних
открывает позицию тогда, когда другие выходят из рынка. Это означает
лучшее исполнение приказов, лучшие входные цены и большие потенци-
альные прибыли без запаздывания — но только в том случае, если вход не
произошел слишком рано, до того как рынок действительно развернулся.
При работе с противотрендовой моделью требуется хорошая стратегия
МОДЕЛИ, ОСНОВАННЫЕ НА скользящих СРЕДНИХ 137
ГЛАВА 6




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


ПРИКАЗЫ, ИСПОЛЬЗУЕМЫЕ ДЛЯ ОСУЩЕСТВЛЕНИЯ ВХОДОВ
Входы, основанные на скользящих средних, могут быть осуществлены с
помощью стоп-приказов, лимитных приказов или рыночных приказов.
Хотя возможны более удачные сочетания, в принципе с любой моделью
может работать любой тип приказов. Иногда приказ может быть частью
сигнала входа. Простая система, основанная на пересечении средних,
может использовать стоп-приказ на ожидаемом завтрашнем уровне сколь-
зящего среднего. Во избежание исполнения нескольких приказов при
случайных скачках внутридневной цены на следующий день ставится
только стоп-приказ на покупку или на продажу, а не оба вместе. Если зак-
рытие было выше скользящей средней, ставится стоп-приказ на прода-
жу, а если ниже, то на покупку.
Приказы, используемые для входов, имеют свои достоинства и недо-
статки. Рыночный приказ никогда не пропустит сигнала, поданного на
вход. Стоп-приказ никогда не пропустит важного тренда (если система
следует за трендом). Вход всегда будет произведен, когда движение цен
подтверждает его выгодность — но за счет проскальзывания и неопти-
мальных цен входа. Лимитный приказ обеспечит лучшую цену и снизит
расходы на сделку, но в ожидании отката цен можно пропустить важные
тренды. В противотрендовой модели лимитный приказ может при случае
ухудшить входную цену — поскольку приказ отдается по фиксированной
цене, а не по цене, которую дает «отрицательное проскальзывание», воз-
никающее при движении рынка против сделки в момент входа.


МЕТОДОЛОГИЯ ТЕСТИРОВАНИЯ
Во всех нижеследующих тестах использован стандартный портфель. Ко-
личество контрактов при покупке или продаже при входе на любом рын-
ке в любое время подбиралось так, чтобы приблизительно соответство-
вать долларовой волатильности двух контрактов 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: // простые скользящие средние
МОДЕЛИ, ОСНОВАННЫЕ НА скользящих СРЕДНИХ 139
ГЛАВА 6




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]<b[c-1])
#define CrossesBelow(a,b,c) {a[c]<b[c] && a [c-1]>=b[c-1])
#define TurnsUp(a,c) {a [c]>=a[c-l] && a [c-1]<a[c-2])
#define TurnsDn(a,c) {a[c]<a[c-l] && a [c-1]>=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




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);

} // обрабатываем следующий день
}


В этом коде содержатся три сегмента. Первый сегмент рассчитывает
скользящие средние. Параметр avgtype выбирает вид среднего: 1 — про-
стое, 2 — экспоненциальное, 3 — треугольное с передним взвешиванием,
4 — модифицированное VIDYA. Даже если в коде использовано всего одно
среднее, рассчитываются два одинаковых, чтобы сделать выбор вида
скользящего среднего независимым от модели. Также рассчитывается
средний истинный диапазон, значение которого требуется для установки
защитных остановок и целевых прибылей в стратегии стандартных вы-
ходов. Два дополнительных параметра — fastmalen и slowmalen — указы-
вают период быстрой и медленной скользящих средних. Значения сколь-
зящих средних сохраняются в векторах fastma и stowma.
Следующий блок использует выбранную модель для получения сиг-
налов выхода, цен для стоп-приказов и цен для лимитных приказов. Сна-
МОДЕЛИ, ОСНОВАННЫЕ НА скользящих СРЕДНИХ 141
ГЛАВА 6




чала определяются простые соотношения значений (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 показывают прибыль или убыток по каждому из компо-

<< Пред. стр.

стр. 17
(общее количество: 46)

ОГЛАВЛЕНИЕ

След. стр. >>