<< Пред. стр.

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

ОГЛАВЛЕНИЕ

След. стр. >>

раничению времени, исходя из того соображения, что при динамической
защитной остановке и целевой прибыли ограничение времени не столь
УЛУЧШЕНИЯ СТАНДАРТНОЙ СИСТЕМЫ ВЫХОДА 339
ГЛАВА 14




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


ТЕСТИРОВАНИЕ МОДЕЛИ С ФИКСИРОВАННОЙ ЗАЩИТНОЙ
ОСТАНОВКОЙ И ЦЕЛЕВОЙ ПРИБЫЛЬЮ
В стратегии МССВ величины защитной остановки и целевой прибыли
были фиксированы на достаточно произвольном и, возможно, неопти-
мальном уровне. Что произойдет, если протестировать ряд значений этих
параметров в поисках оптимального сочетания?
В данном тесте положение защитной установки управления капита-
лом прогоняется от 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];
УЛУЧШЕНИЯ СТАНДАРТНОЙ СИСТЕМЫ ВЫХОДА 341
ГЛАВА 14




ts.exitshortlimit('С' , limprice);
ts.exitshortstop('D' , stpprice);
}
else {
// выходы после дня входа
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') ;
}
}
} // обрабатываем следующий день
)


В коде использован стандартный случайный вход по цене открытия и
модифицированный стандартный выход. Правила выхода следующие:
лимитный приказ на выход размещается на уровне некоторого количе-
ства средних истинных диапазонов выше (для длинных) или ниже (для
коротких позиций) цены входа. Данное количество доверительных интер-
валов определяется параметром ptlim. Кроме лимитного приказа целевой
прибыли, размещается защитная остановка на уровне некоторого коли-
чества средних доверительных интервалов ниже (для длинных) или выше
(для коротких позиций) цены входа. Данное количество доверительных
интервалов определяется параметром mmstp. Максимальное время удер-
жания позиции определяется параметром maxhold. Если сделки не были
закрыты ранее по достижении целевой прибыли или защитной останов-
ки, то они закроются по истечении maxhold дней (в этом тесте, как и во
всех предшествовавших, фиксированное значение maxhold равно 10).
В табл. 14-1 приведены годовые соотношения риска/прибыли
(Р/ПРИБ), процент прибыльных сделок (ПРИБ%) и средняя прибыль или
убыток со сделки ($СДЕЛ) для каждой из комбинаций значений лимита и
защитной остановки. В столбце справа приведены средние значения СРЕД
для каждого из значений лимита целевой прибыли, в нижней строке —
средние значения СРЕД для каждого из значений защитной остановки.
Из полученных результатов можно сделать целый ряд выводов. Чем
ближе целевая прибыль к цене входа, тем выше процент прибыльных сде-
лок. Близко расположенная целевая прибыль с большей вероятностью
достигается и закрывает позицию с некоторой прибылью. При этом по-
вышенный процент прибыльных сделок недостаточен для преодоления
отрицательного эффекта потери потенциальной прибыли. Более удален-
ные целевые прибыли работали лучше, и в большинстве случаев оптималь-
ное расположение целевой прибыли составило от 1 до 2 средних истин-
ных диапазонов от цены входа. При удалении защитных остановок от цены
входа процент прибыльных сделок возрастал, но другие показатели ухуд-
ИССЛЕДОВАНИЕ выходов
342 ЧАСТЬ III



шались, при приближении — процент прибыльных сделок падал вместе с
другими показателями.
Наилучшая общая эффективность по показателям годового соотно-
шения риска/прибыли и средней прибыли сделки была достигнута при
целевой прибыли 4,5 и защитной остановке 1,5. При удалении от опти-
мальных значений возрастало отношение риск/прибыль, равно как и сред-
ний убыток в сделке. Между размещением целевой прибыли и защитной
установки не было особо выраженной связи. Значения, оптимальные для
одного параметра, при изменении другого менялись незначительно. По-
чти так же хорошо работало сочетание целевой прибыли 1,5 и защитной
остановки 4 — была получена несколько большая средняя прибыль в сдел-
ке и несколько худшее соотношение риска/прибыли. Интересно, что про-
извольно заданные значения оказались весьма близкими к оптимальным
(занимая соседние ячейки в табл. 14-1). Впрочем, оптимальные значения
обеспечили на 6% больше прибыльных сделок, чем произвольно задан-
ные целевая прибыль 4 и защитная остановка 1.
Для оптимальных параметров процент прибыльных сделок составил
39%. При поиске максимального значения обнаружилось, что параметр
целевой прибыли 0,5 обеспечивает 69% прибыльных сделок, но со значи-
тельно худшими показателями риска/прибыли и средней прибыли со сдел-
ки. Это однозначно показывает важность удержания потенциально при-
быльных позиций.
Ни одна из комбинаций не принесла прибыли — чего и следовало ожи-
дать от минималистской стратегии выходов со случайными входами. Впро-
чем, полученные результаты при различных сочетаниях параметров впол-
не пригодны для сравнения.


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



Эффективность портфеля в пределах выборки при использо-
Таблица 14—1.
вании случайного входа с модифицированными стандартны-
ми выходами в зависимости от параметров целевой прибыли
(по горизонтали) и защитной остановки (по вертикали)
ИССЛЕДОВАНИЕ выходов
344 ЧАСТЬ III



ТЕСТИРОВАНИЕ ДИНАМИЧЕСКИХ ЗАЩИТНЫХ ОСТАНОВОК
В этой группе тестов мы заменим фиксированную защитную остановку
МССВ на динамическую, предположительно более эффективную. Целью
является фиксация основной части потенциальной прибыли, избегая при
этом превращения потенциально выгодных сделок в убыточные, как это
может иметь место в случае слишком близко расположенной фиксиро-
ванной остановки.
Существует много способов перемещать защитную остановку так,
чтобы ее уровень следовал за рынком, фиксируя часть возникающей в
течение сделки прибыли. Один из популярных методов состоит в разме-
щении остановки на уровне минимального минимума за несколько пре-
дыдущих дней (для длинных позиций). Затем остановка может переме-
щаться вверх (но не вниз). Для коротких позиций защитная остановка
размещается на уровне максимального максимума за несколько преды-
дущих дней и может двигаться только вниз, но не вверх. Этот простой
метод испытывается в первом тесте.
Второй тест динамической защитной остановки похож на методику
подгонки фиксированной защитной остановки в МССВ. Уровень смеща-
ется вверх (для длинных позиций) или вниз (для коротких позиций) от
текущей цены на некоторое количество средних истинных диапазонов. В
отличие от фиксированной защитной остановки, использованной в МССВ,
в данном случае защитная остановка перемещается в зависимости от те-
кущей рыночной цены. Смещение может происходить только в одну сто-
рону — вверх для длинных позиций, вниз для коротких. Целью является
поддержание одинакового статистического расстояния между наилучшей
ценой, достигнутой во время удержания позиции, и защитной останов-
кой. Защитная остановка для длинных позиций рассчитывается следую-
щим образом: (1) Из цены входа вычитается параметр mmstp, умножен-
ный на средний истинный диапазон. Результат будет уровнем защитной
остановки для следующего дня. (2) На следующей день из текущей цены
вычитается другой параметр stpa, умноженный на средний истинный ди-
апазон. (3) Если цена защитной остановки, полученная на шаге 2, выше
ценового уровня текущей защитной остановки, то текущее значение за-
щитной остановки заменяется вычисленным. (4) Стадии 2 и 3 повторяют-
ся для каждого последующего дня. При расчете защитной остановки для
короткой позиции произведение среднего истинного диапазона на пара-
метр (mmstp или stpa.} прибавляется к рыночной цене, и уровень защит-
ной остановки опускается вниз.
В третьем тесте использован более сложный подход. Для длинных по-
зиций, как обычно, защитная остановка задается на уровне некоторого
количества средних истинных диапазонов ниже цены входа в рынок. За-
тем остановка смещается вверх на величину, зависящую от того, насколь-
ко текущая цена выше текущего уровня защитной остановки. Для корот-
УЛУЧШЕНИЯ СТАНДАРТНОЙ СИСТЕМЫ ВЫХОДА 345
ГЛАВА 14




ких позиций уровень остановки задается выше цены входа и опускается в
зависимости от того, насколько текущая цена ниже его. В принципе этот
метод основывается на варианте смещенного экспоненциального сколь-
зящего среднего (ЭСС), за тем исключением, что величина скользящего
среднего инициализируется отдельным условием при входе в сделку и
может изменяться только в одном направлении (так как защитная оста-
новка может двигаться только в направлении рыночной цены). Защитная
остановка для длинных позиций рассчитывается нижеследующим обра-
зом: (I) Начальное значение в день входа в рынок задается вычитанием из
цены входа произведения параметра mmstp и среднего истинного диапа-
зона. (2) На следующий день от максимальной цены отнимается произве-
дение параметра stpa и среднего истинного диапазона; затем вычитается
текущее значение защитной остановки и результат умножается на пара-
метр stpb. (3) Если результат шага 2 больше нуля, добавляем его к текуще-
му значению защитной остановки, если нет, то уровень не изменяется.
(4) Повторяем шаги 2 и 3 для каждого последующего дня. При вычислении
защитной остановки для коротких позиций произведения среднего истин-
ного диапазона на параметры прибавляются к рыночной цене. К уровню
защитной остановки прибавляются только отрицательные поправки.

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 = x20mod02.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 stpa, stpb, mmstp, ptlim, limprice, stpprice;
static int entryposted, entrybar, model type;
static float exitatr[MAXBAR+1] , rnum, entryprice, tmp, atr;
static long iseed;

// копируем параметры в локальные переменные для удобного обращения
mmstp = parms[1]; // используется для начальный защитной остановки
stpa - parms[2]; // дополнительный параметр защитной остановки
stpb = parms[3]; // дополнительный параметр защитной остановки
ptlim = parms[6]; // целевая прибыль в единицах среднего истинного
// диапазона
ИССЛЕДОВАНИЕ выходов
346 ЧАСТЬ III



modeltype = parms[7]; // тип используемой динамической защитной
// остановки
maxhold = parms[8]; // период максимального удержания позиции
ranseed = parms[9]; // используется для инициализации случайной
// последовательности

// выполняем вычисления по всему объему данных
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.О / dlrv[cb]);
if (ncontracts < 1) ncontracts = 1;

// избегаем устанавливать приказы на дни с ограниченной торговлей
if (hi[cb+1] == lo[cb+1]} continue;

// генерировать "стандартные" случайные сигналы входа
signal = 0;
rnum = 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+1];
entrybar = cb + 1;
}
else if(ts.position{} >= 0 && signal == -1) {
ts.sellopen{'2', ncontracts};
entryposted = -1;

<< Пред. стр.

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

ОГЛАВЛЕНИЕ

След. стр. >>