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 = x19mod01.c
// parms — набор [1..MAXPRM] параметров
// dt - набор [1..nb] дат в формате ГГММДД
// орn — набор [1. .nbl цен открытия
// hi — набор [1..nb] максимальных цен
// lо - набор [1. .nb] минимальных цен
// cls - набор [1..nb] цен закрытия
// vol — набор [1..nb] значений объема
// oi - набор [l..nb] значений открытого интереса
// dlrv — набор [1..nb] значений среднего долларовой волатильности
// nb — количество дней в наборе данных
// ts — ссылка на класс торгового симулятора
// eqcls — набор [1..nb] уровней капитала по ценам закрытия
//объявляем локальные переменные
static int rc, cb, neontracts, maxhold, ordertype, signal;
static float mmstp, ptlim, stpprice, limprice, tmp;
static float exitatr[MAXBAR+1], rnum;
static int ranseed;
static long iseed;
// копируем параметры в локальные переменные для более удобного обращения
ranseed = parms[8]; // инициируем генератор случайных чисел
ordertype = parms[9]; // вход: 1=по цене открытия, 2=по лимитному приказу, 3=по стоп - приказу
maxhold = 10; // максимальный период удержания позиции
ptlim = 4; // целевая прибыль в единицах волатильности
mmstp = 1; // защитная остановка в единицах волатильности
// делаем вычисления по всем данным
AvgTrueRangeS{exitatr,hi,lo,cls,50,nb); // средний истинный диапазон для выхода
// запускаем генератор случайных чисел
// ... отдельный запуск для каждого инструмента
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+1] == lo [cb+1]) continue;
// генерировать входные сигналы, цены стоп- и лимитных приказов
signal = 0;
rnum = ran2(&iseed); // случайное число 0...1
if(rnum < 0.025) signal = -1; // случайный короткий вход
else if(rnum > 0.975) signal = 1; // случайный длинный вход
limprice = 0.5 * (hi[cb] + lo [cb]);
stpprice = cls[cb] + 0.5 * signal * exitatr[cb];
// входим в сделку, используя определенный тип приказа
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, ncont}racts); 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) ;
} // обрабатывать следующий день
}
Код подобен представленному в предыдущих главах. Изменился лишь порядок генерации сигналов для входа. Входные сигналы теперь создаются с помощью генератора псевдослучайных чисел (ГПСЧ). Перед входом в цикл, который проходит через дни для моделирования процесса торговли, ГПСЧ инициализируется с уникальным начальным значением. Начальное значение инициализации определено номером рынка и параметром (ranseed). При изменении данного параметра генерируется абсолютно другая последовательность случайных входов. Точные значения инициализации не важны, так как для каждой инициализации создается уникальный ряд из-за чрезвычайно большого периода ГПСЧ. Используемый ГПСЧ описан как ran2 в вышеупомянутой работе «Numerical Recipes in С» (1992). Период для ГПСЧ больше, чем 2Х1018. Этот ГПСЧ намного лучше стандартных генераторов, включенных в языки программирования. Внутри цикла, там, где фактически имеет место торговля, сигналы генерируются, основываясь на случайных числах. Шаги очень просты. На каждом дне от ГПСЧ получается равномерно распределенное случайное число между 0 и 1. Если случайное число меньше 0,025, то генерируется сигнал для входа в короткую позицию. Вероятность получения короткого сигнала в любой день равна 0,025, т. е. короткий сигнал должен генерироваться в среднем каждые 40 дней. Если случайное число превышает 0,975, то подается сигнал для открытия длинной позиции; частота этих сигналов такая же — один сигнал каждые 40 дней. Другими словами, в среднем торговые сигналы генерируются каждые 20 дней. Цены лимитного приказа и стоп-приказа рассчитываются обычным способом. Обычным способом размещаются приказы и определяются выходы.
Для проведения трех испытаний используются следующие шаги: на данных внутри выборки для каждого типа входного приказа генерируются и участвуют в торговле 10 различных серий случайных входов. Лучшие из этих последовательностей затем проверяются на данных вне выборки. Процесс подобен оптимизации параметра в реальной системе. Изменяясь от 1 до 10, параметр выбирает различные ряды случайных входов для каждого значения.
Результаты тестов
В табл. 13-1, 13-2 и 13-3 представлены результаты торговли портфелем при использовании стратегии случайных входов и стандартного выхода. В колонке СЛУЧ приведены числа, которые передаются на вход генератора случайных чисел и инициируют случайные последовательности. ПРИБ — совокупная чистая прибыль в тысячах долларов. ПРИБДЛ — общая прибыль от длинных позиций в тысячах долларов; ПРИБКР — общая прибыль от коротких позиций в тысячах долларов, Ф.ПРИБ — фактор прибыли. ДОХ% — доходность, в процентах годовых; Р/ПРИБ — соотношение риска/прибыли в годовом исчислении; ВЕР — ассоциированная вероятность статистической достоверности, МПАД — максимальное падение капитала, в тысячах долларов; СДЕЛ — число сделок; ПРИБ% — процент прибыльных сделок; $СДЕЛ — средняя прибыль/убыток со сделки; ДНИ — среднее количество дней в сделке, округленное до ближайшего целого числа; ВНЕ — результат случайной последовательности, обеспечивший лучшую эффективность внутри выборки, которая затем была продолжена и протестирована на данных вне пределов выборки; СРЕД — среднее значение результатов, приведенных в строках 1 — 10; СТОТКЛ — стандартное отклонение результатов, приведенных в строках 1 — 10.
Тест 1. ССВ со случайными входами по цене открытия. Эта система работала не очень хорошо внутри выборки. Средняя сделка для всех 10 случайных последовательностей принесла убыток в размере $2243, причем стандартное отклонение составило $304. Данная система показала такую же среднюю прибыль в сделке, как и наименее привлекательные системы, тестировавшиеся при изучении входов. Фактически, некоторые из них показали результаты гораздо худшие, чем случайные. Процент прибыльных сделок был очень стабилен — со средним значением 36,91% и стандартным отклонением 0,7%. Общее количество сделок для каждого рынка за более чем 10-летний период внутри выборки составило 3703; именно такое количество сделок должно было получиться при случайных входах на данных в пределах выборки.
Вне пределов выборки эффективность лежала в ожидаемых пределах, в соответствии с показателями в пределах выборки. Процент прибыльных сделок составлял 37%, что весьма близко к соответствующему результату, полученному в пределах выборки. Средний убыток со сделки составил $1883, что отличается менее чем на одно стандартное отклонение от значения в пределах выборки. Очевидно, что использование стандартного выхода не могло обеспечить прибыль на основе случайных входов в рынок.
Тест 2. ССВ со случайными входами по лимитному приказу. Табл. 13-2 идентична табл. 13-1 за исключением того, что она отражает поведение портфеля со стандартной стратегией выходов и входами по лимитному приказу. В пределах выборки средняя сделка приносила убыток в $1930, что несколько ниже, чем в предыдущем тесте, видимо, ввиду уменьшения транзакционных расходов при входе по лимитному приказу. Стандартное отклонение составило $477, что несколько выше предыдущего значения. Процент прибыльных сделок (38,73%) улучшился менее чем на 2% благодаря более выгодным ценам входа при использовании лимитного приказа. Как и ожидалось, помимо подобных мелких изменений, ничего в табл. 13-2 не представляет особенного интереса.
Вне пределов выборки убыток составил $3056 со сделки, т. е. на два стандартных отклонения хуже, чем поведение в пределах выборки. Использование лимитного приказа для случайных входов привело к несколько худшим результатам в последние годы. Процент прибыльных сделок составил 37%, опять-таки на два стандартных отклонения хуже, чем в пределах выборки, но на одном уровне с входом по цене открытия.
Тест 3. ССВ со случайными входами по стоп-приказу. В табл. 13-3 приведены результаты торговли портфелем финансовых инструментов при использовании случайных входов, основанных на срабатывании стоп-приказа. По показателю средней прибыли в сделке эффективность в пределах выборки была лучше, чем в двух предыдущих тестах; средний убыток составил $2039, а стандартное отклонение — $391. Процент прибыльных сделок был ниже (36,36% при стандартном отклонении 1,12%). Более низкий процент прибыльных сделок, видимо, отражает неоптимальные цены входа в рынок, полученные при входе по стоп-приказу.
Вне выборки прибыль и количество прибыльных сделок находились в пределах двух стандартных отклонений в большую или меньшую сторону от значений, полученных в пределах выборки. Следовательно, можно сделать вывод, что вне пределов выборки результаты находятся в статистически ожидаемых границах и принципиально не отличаются от полученных в пределах выборки.
Приведенные в табл. 13-1 — 13-3 результаты могут служить основой для проведения сравнительной оценки методов выхода, описанных в части II этой книги. Для этой цели наиболее показательны параметры $СДЕЛ и ПРИБ%, поскольку они не зависят от количества проведенных системой сделок.
Эффективность системы со случайными входами по цене открытия и ССВ на различных рынках. В табл. 13-4 приведены показатели работы системы со случайными входами по цене открытия и ССВ. Использовались случайные последовательности, обеспечивающие максимальную доходность в пределах выборки (по показателю годового соотношения риска/прибыли) согласно тесту I. В первом столбце (РЫН) указан рынок, прочие столбцы содержат данные о различных аспектах работы системы в пределах и вне выборки.
В пределах выборки прибыльными были только рынки британского фунта, иены, откормленного скота, живых свиней и леса. Высокая прибыль (25,9% в год) была получена только на рынке немецкой марки. Вне пределов выборки прибыльными были рынки NYFE, иены, сырой нефти, золота, палладия, живых свиней, соевых бобов, соевой муки, кофе и апельсинового сока. Только рынки иены и живых свиней были прибыльны как в пределах, так и вне пределов выборки. Система со случайным входом была одной из наименее устойчивых, рассматривавшихся при изучении входов.
Средняя сделка (в усреднении по всем рынкам) приносила убыток $1731 в пределах и $1734 вне пределов выборки. Длинные позиции давали меньший убыток, чем короткие, что уже неоднократно наблюдалось. В пределах выборки все рынки валют, за исключением евродоллара и канадского доллара, были прибыльными в длинных позициях. Впрочем, эти рынки склонны к трендам, поэтому хорошие результаты могут быть связаны со стратегией стандартного выхода, а не со случайными факторами, обеспечивающими вход.
Анализ стандартного выхода при случайных входах с разными видами приказов обеспечивает основу для сравнения результатов с реальными неслучайными входами (исследовавшимися ранее) и с более сложными системами выходов, которые будут рассмотрены далее.
Далее
Вернуться к оглавлению
|