WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 |   ...   | 3 | 4 || 6 | 7 |

«THE ENCYCLOPEDIA OF TRADING STRATEGIES JEFFREY OWEN KATZ, Ph.D. ...»

-- [ Страница 5 ] --

Циклы на рынке можно толковать таким же образом — как звуковые сигналы с изменяющейся частотой. Обнаружение рыночных циклов мож но попытаться осуществить при помощи такого набора фильтров, полосы пропускания которых перекрываются, но достаточно разнесены, чтобы обнаружить частоту циклической активности, доминирующую на рынке в любой момент. Некоторые из этих фильтров будут резонировать под действием текущей циклической активности. В фильтрах, настроенных на другие частоты/периоды активности рынка, резонанса не возникнет.

Когда на вход фильтра приходит сигнал, соответствующий его частоте, происходит резонанс, подобный резонансу камертона. При этом сигнал на выходе фильтра не имеет фазового сдвига и запаздывания по отноше нию к входному сигналу. Кроме того, сигнал на выходе будет близок к идеальной форме синусоиды и удобен для принятия торговых решений.

Использованная в наших прошлых исследованиях группа фильтров была основана на полосовых фильтрах Баттеруорта, код для которых весьма сложен, но, тем не менее, приведен целиком на языке Easy Language для TradeStation.

ФИЛЬТРЫ БАТТЕРУОРТА Фильтры Баттеруорта достаточно просты для понимания. Фильтр Бат теруорта для низких частот подобен скользящему среднему;

он сгла живает высокочастотный сигнал (или шум) и пропускает низкочастотные колебания (т.е. колебания с длинным периодом). Если у экспоненциаль ного скользящего среднего отсечка составляет 6 дБ на октаву (т.е. выход с частотой выше отсечки снижается вдвое при двойном снижении периода сигнала), то у четырехполюсного фильтра Баттеруорта (использованного в нашей работе от мая 1997 г.) снижение составляет 18 дБ на октаву (вы ход с частотой выше отсечки снижается в 8 раз при уменьшении периода сигнала вдвое). Такое резкое снижение ненужного высокочастотного сиг нала имеет свою цену: при этом возрастает запаздывание и возникают искажающие фазовые сдвиги.

Фильтр Баттеруорта для высоких частот подобен осциллятору, ос нованному на разности скользящих средних (например, X— МА(Х), где X — входящий сигнал, а МА(Х) — его скользящее среднее). Оба процесса обеспечивают ослабление низкочастотных сигналов (например, трендов), пропуская высокочастотный сигнал без изменений. Фильтр Баттеруорта обеспечивает более сильное сглаживание, чем осциллятор скользящего ГЛАВА 10 Входы НА ОСНОВЕ циклов среднего (18 дБ против б дБ на октаву). И осциллятор, и высокочастотный фильтр вызывают сдвиг вперед, а не запаздывание, но при этом возника ют искажающие высокочастотные шумы и фазовые сдвиги.

Если соединить высокочастотный и низкочастотный фильтры, подав выход первого на вход второго, получится полосовой фильтр, блокирую щий частоты выше и ниже желаемой. Сигнал с частотой (или периодом), соответствующим центру полосы пропускания, будет пропущен без ис кажений (с минимальным сглаживанием) и без запаздывания. Фазовые сдвиги высокочастотного компонента (смещение вперед) и низкочастот ного (запаздывание) компенсируют друг друга, как и в случае с вибриру ющим камертоном или с осциллятором MACD, который на самом деле является примитивным полосовым фильтром на основе скользящих сред них. Сглаживание, обеспечиваемое осциллятором MACD, как и в случае со скользящими средними, невелико по сравнению со сглаживанием фильтров Баттеруорта. Поскольку фильтр пропускает только небольшую часть спектра, выходной сигнал очень сглажен и близок к синусоиде. Бо лее того, поскольку запаздывание и смещение вперед компенсируют друг друга, сигнал не запаздывает. Можно ли назвать такой фильтр идеальным осциллятором? Можно, но с одним условием: использовать только фильтр с центральной частотой, соответствующей частоте рыночных цикличес ких процессов.

Выход должным образом настроенного фильтра должен быть син хронным с циклической активностью рынка в текущий момент. Такой вы ход будет очень сильно сглаженным;

на его основе можно будет прини мать решения с минимальным риском пилообразной торговли, что мож но применить для получения сигналов торговой системы. Кроме того, если использовать фильтр, настроенный на несколько более высокую частоту, чем фильтр с максимальным резонансом, то выход фильтра будет слегка опережать сигнал, будучи в некоторой степени прогностическим.

Проблема с полосовыми фильтрами Баттеруорта состоит в том, что при смещении частоты сигнала от центральной частоты фильтра возни кают огромные фазовые сдвиги, которые могут полностью разрушить ге нерируемые таким фильтром торговые сигналы.

ВОЛНОВЫЕ ФИЛЬТРЫ Фильтры Баттеруорта нельзя назвать единственными оптимальными фильтрами для анализа рыночных циклов. Недостатки фильтров Батте руорта включают довольно низкую скорость принятия решений, не все гда достаточную для реальной торговли, а также проблемы с измерением мгновенной амплитуды данного цикла. Как было указано ранее, фильтры Баттеруорта могут вносить сильные фазовые искажения. Альтернативой им могут быть волновые фильтры.

234 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК Теория групп фильтров недавно стала гораздо сложнее с появлением теории малых волн. На практическом уровне эта теория позволяет конст руировать весьма изящные цифровые фильтры с большим числом полез ных свойств. Использованные в нижеприведенных тестах фильтры осно ваны с рядом допущений на волнах Мореле. В принципе волны Мореле ведут себя подобно локализованным преобразованиям Фурье. Они зах ватывают информацию о циклической активности в данный момент вре мени, причем влияние других точек данных на результат очень быстро убывает при удалении этих точек от текущей. В отличие от фильтров Бат теруорта волны Мореле имеют максимальную временную локализацию для данного уровня избирательности (степени сглаживания). Это очень важно для фильтров, настроенных на поиск потенциально выгодных цик лов на основе максимально свежих данных. Кроме того, использованные в тестах фильтры имеют преимущество очень высокой фазовой устойчи вости, что принципиально важно при работе с циклами различной длины для определения моментов рыночных событий. Такие высокоуровневые фильтры могут быть использованы в составе групп, согласно методике, подобной описанной в нашей работе от мая 1997 г.

Волновые фильтры, использованные в тестах, подобны квадратичным зеркальным фильтрам, которые имеют два выхода. Один выход по фазе в точности соответствует любому рыночному сигналу, имеющему частоту, равную центральной частоте полосы пропускания. Второй выход сдви нут по фазе ровно на 90°, т.е. его пики и провалы соответствуют нулевым значениям первого выхода, и наоборот. В математическом смысле эти выходы ортогональны. Используя их для вычисления мгновенной ампли туды циклической активности (на частоте настройки фильтра), достаточ но взять сумму квадратов двух выходов, а затем извлечь из нее квадрат ный корень. Для определения силы циклического процесса не требуется искать максимумы и минимумы в фильтрованном сигнале и измерять их амплитуды. Кроме того, нет необходимости использовать экзотические методы, вроде расчета корреляции между фильтрованным сигналом и ценами в пределах примерно одного цикла, как мы делали в 1997 г. Если один из фильтров в составе группы обнаружит сильный цикл, то пара выходов этого фильтра может подавать сигнал торговой системе в любой желаемой фазе этого цикла.

На рис. 10-1 изображен отклик фильтра на циклический процесс с постоянной амплитудой и возрастающим периодом. Центральная часто та фильтра соответствует периоду 12. Вторая линия сверху изображает выходной сигнал фильтра с совпадающей фазой. Очевидно, что когда пе риод входящего сигнала приближается к центру полосы пропускания, амплитуда выходного сигнала фильтра возрастает, достигая в центре по лосы максимального значения. Когда период сигнала начинает превышать значение полосы пропускания, амплитуда на выходе падает. Вблизи цен трального значения полосы пропускания выходной сигнал практически Рисунок 10-1. Обработка сигнала квадратичным зеркальным волновым фильтром.

236 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК полностью совпадает с входящим. Третья линия (выход с фазой, смещен ной на 90°) показывает такую же последовательность изменения ампли туды, за исключением фазового сдвига. Вблизи центрального значения полосы пропускания выходной сигнал смещен точно на 90°. Последняя, четвертая линия, изображает мгновенную мощность по данным двух пре дыдущих. Эта линия показывает амплитуду циклической активности на частоте, соответствующей середине полосы пропускания. На графике мак симум наблюдается при периоде 13, а не в центре полосы пропускания фильтра (12), причиной этому — небольшое искажение, возникающее из за быстрого изменения периода исходного сигнала. Поскольку фильтр использует данные нескольких циклов, возникает искаженный общий результат. Тем не менее, очевидно, что на основе такого фильтра можно организовать выгодную торговлю. Масштаб оси Y не имеет значения и выбран просто для представления сигналов на разных линиях в пределах одного графика.

На рис. 10-2 изображена частота (или же период) и фазовый ответ филь тра. В этом случае середина полосы пропускания фильтра установлена на периоде 20. Кривая относительной мощности изображает мощность выход ного сигнала при изменяющейся частоте входного сигнала, амплитуда ко торого постоянна. Фильтр пропускает сигнал максимально при частоте, соответствующей середине полосы пропускания, а при удалении от нее в обе стороны выходная мощность быстро и плавно снижается. В кривой нет вторичных пиков, и мощность выходного сигнала при значительной раз нице частот падает до нуля. Фильтр никак не реагирует на появление трен дов, что весьма полезно для трейдеров. Такой фильтр способен работать с данными, не очищенными от трендов и не подвергнутыми дополнительной переработке. Фазовый ответ фильтра также демонстрирует полезные ха рактеристики. На большей части спектра ответ находится в пределах ± 90°.

На центральной частоте фазового сдвига нет, т.е. выходной сигнал в точно сти синхронизован с входным, что может обеспечить идеальные входы в рынок. Как и в случае с мощностью, кривая фазового ответа плавная и глад кая — любой ученый или инженер высоко оценил бы эффективность та кого фильтра. При построении подобного графика для фильтров Баттеру орта в 1997 г. результаты были гораздо менее удовлетворительными, осо бенно в отношении фазового ответа и задержки. При незначительном из менении периода сигнала возникали большие сдвиги по фазе, что в реаль ном применении разрушило бы любые попытки использовать такой фильтр для осмысленных входов в рынок.

На рис. 10-3 изображен импульсный ответ обоих выходов волнового фильтра — совпадающего по фазе с входным сигналом и ортогонального.

Эти кривые напоминают почти идеальные экспоненциально затухающие синусоиды или косинусоиды. Впрочем, затухание не совсем экспоненци ально, и относительные амплитуды пиков подвергаются незаметным под стройкам для избежания влияния трендов.

Рисунок 10-2. Частота и фаза выходного сигнала квадратичного зеркального волнового фильтра.

ГЛАВА 10 Входы НА ОСНОВЕ циклов В дополнение к данным, представленным на графиках, были проведе ны другие тесты с использованием «плазмод». Плазмодой называют набор данных, подобранных так, чтобы содержать предполагаемые в реальных данных характеристики. Идея состоит в проверке того, насколько алго ритм или модель может обнаружить и проанализировать эти характерис тики. Хорошая торговая система на основе циклов должна проявлять вы сокую эффективность на синтетической серии данных, состоящей из боль шого количества шума и изредка встроенных циклов. Фильтры, описан ные в следующих тестах, работали в такой ситуации очень хорошо.

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

ХАРАКТЕРИСТИКИ ЦИКЛИЧЕСКИХ ВХОДОВ Исследуемые ниже циклические входы (нацеленные на продажу по мак симуму и покупку по минимуму) имеют ряд важных характеристик: вы сокий процент прибыльных сделок, низкое проскальзывание, способность захватывать максимально возможную часть каждого движения рынка — одним словом, мечта трейдера. Это справедливо только при условии, что на рынке действительно существуют предсказуемые циклы, которые мож но обнаружить и, что еще важнее, экстраполировать имеющимися мето дами. Считается, что на рынках примерно 70% времени присутствует цик 240 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК лическая активность. Даже если четкие циклы, ведущие к выгодным сдел кам, возникают гораздо реже, использование близких защитных остано вок позволяет сводить к минимуму потери от неудачных сделок. Главный недостаток циклических входов состоит в том, что ввиду широкого рас пространения весьма мощных алгоритмов анализа циклов, например ме тода максимальной энтропии, рынки изменили свою природу и стали «ме нее уязвимыми» для подобных методов. Предсказуемые циклы обнару живаются и нивелируются настолько быстро, что их исследования зачас тую теряют смысл. Поскольку описываемые циклические входы по при роде своей направлены против циклов, то при отсутствии продолжения циклов (т.е. при продолжении тренда) трейдер понесет потери, если не будут применены эффективные методы управления капиталом (защит ные остановки). Пригодность к реальной работе сложных методик анали за циклов и будет рассмотрена в наших тестах.

МЕТОДОЛОГИЯ ТЕСТИРОВАНИЯ Во всех тестах циклических моделей входа используется стандартный портфель из 36 рынков. Количество контрактов для покупки или прода жи на каждом рынке подбиралось для соответствия долларовой волатиль ности двух контрактов S&P 500 на конец 1998 г. Использован стандарт ный выход: защитная остановка закрывает любую позицию, убытки ко торой превышают одну единицу волатильности. Кроме того, лимитный приказ закрывает позиции, прибыль которых превышает четыре едини цы волатильности, а рыночный приказ по цене закрытия закрывает пози ции, не закрытые предыдущими выходами в течение 10 дней. Правила входов рассмотрены в обсуждении модели и индивидуальных тестов. Все тесты проведены при помощи стандартного C-Trader toolkit. Ниже при веден код модели, основанный на волновом фильтре со стандартной стра тегией выходов:

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 = x14mod01.c // parms — набор [1..MAXPRM] параметров // dt - набор [l..nb] дат в формате ГГММДД // орn — набор [1..nb] цен открытия // hi — набор [1..nb] максимальных цен // 1о - набор [l..nb] минимальных цен // cls — набор [1..nb] цен закрытия // vol — набор [1..nb] значений объема // oi — набор [1..nb] значений открытого интереса // dlrv - набор [l..nb] средних долларовой волатильности / / nb — количество точек в наборе данных // ts - ссылка на класс торгового стимулятора ГЛАВА 10 Входы НА ОСНОВЕ циклов // eqcls - набор [l..nb] уровней капитала по ценам закрытия // объявляем локальные переменные static int rc, cb, ncontracts, maxhold, ordertype, signal;

static int disp, k, modeltype, fcount, goodcycle, domperndx;

static float mmstp, ptlim, stpprice, limprice, tmp;

static float width, oldwidth, lper, sper, per, ratio;

static float exitatr[MAXBAR+1], **inphase, **inquad, **power;

static float peakpower, phase, peaknoise, domperiod;

static float buyphase, sellphase, phaseb, oldphase, oldphaseb;

static WAVFILT filter[20];

// копируем параметры в локальные переменные для удобного обращения width = parms[l];

// ширина полосы пропускания фильтра (0.05.. 0.20} disp= parms[2];

// временное смещение в градусах modeltype = parms[8];

// модель: 1=торговать развороты циклов ordertype = parms[9];

// вход: 1=на открытии, 2=по лимитному приказу, // 3=по стоп-приказу maxhold = 10;

// период максимального удержания позиции ptlim = 4;

// целевая прибыль в единицах волатильности mmstp = 1;

// защитная остановка в единицах волатильности // Создаем искусственный набор цен закрытия в // форме синусоиды. Это «плазмода» для проведения тестов.

// Модель должна хорошо торговать на данном наборе цен.

// #define USESIMEWAVE #ifdef USESINEWAVE per = 3.0;

ratio = exp (log (30.0/3.0) / (nb - 1));

sper=0.0;

for (cb = 1;

cb <= nb;

cb++) ( sper += 2.0 * PI * (1.0 / per);

cls[cb] = sin(sper);

per *= ratio;

} #endif // инициализируем группу равноотстоящих волновых фильтров // заново инициализируем, если параметр ширины полосы изменился if(width != oldwidth) { lper ==30.0;

// фильтр длинных периодов sper = 3.О ;

// фильтр коротких периодов fcount =20;

// число фильтров в группе ratio = exp (log (lper / sper) / (fcount - 1) ) ;

per = sper;

for(k = 1;

k <= fcount;

k++) ( filter[k-1].build_kernel(per, width);

per *= ratio;

} oldwidth = width;

} // рассчитываем выходы фильтров и откорректированный спектр мощности // если матрицы (таблицы) пустые, то присваиваем им значения if(inphase == NULL) inphase = matrix(l,fcount,1,MAXBAR);

if(inquad == NULL) inquad = matrix(1,fcount,l.MAXBAR);

if(power == NULL) power = matrix(1,fcount,1.MAXBAR);

for(k =1;

k <= fcount;

k++) { filter[k-1].apply (cls, inphase[k], inquad[k], nb);

for(cb = 1;

cb <= nb;

cb++) power [k] [cb] = (inphase [k] [cb] * inphase [k] [cb] + inquad [k] [cb] * inquad [k] [cb] ) / filter[k-1].period();

242 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК } // сохраняем спектральный анализ выборки в файл // эта процедура проводится для отладки // #define WRITESAMPLE #ifdef WRITESAMPLE FILE *fil = fopen("test.dat", "wt");

for(cb = nb-1200;

cb < nb;

cb++) { domperndx = 0 ;

peakpower = -1.0;

for(k = 1;

k <= fcount;

k++) ( if(power[k][cb] > peakpower) { peakpower = power[k] [cb] ;

domperndx = k;

} ) phase = (180.0 / PI) * atan2 (inquad [domperndx] [cb], inphase[domperndx] [cb]);

for(k = 1;

k <= fcount;

k++) ( if (power [k] [cb] > 0.90 * peakpower) fprintf(fil, " **");

else if (power[k][cb] > 0.75 * peakpower) fprintf(fil, " ++");

else if (power[k][cb] > 0.5 * peakpower) fprintf(fil, " + ");

else fprintf(fil, " ");

) fprintf(fil, "%4d %7d %7d %7d %8.1f\n", (int)filter[domperndx-1].period(), (int)(inphase[domperndx] [cb]), (int)(inquad[domperndx] [cb]), (int)phase, cls [cb]);

} fclose(fil);

exit(0);

#endif // используется для отладки сигналов // #define SIGNALDEBUG #ifdef SIGNALDEBUG FILE *fil = fopen("testsig.dat", "wt");

#endif // выполняем вычисления для всех данных AvgTrueRangeS(exitatr,hi,lo,cls,50,nb) ;

// средний истинный диапазон для // выхода switch (modeltype) [ case 1:

// Ничего не делайте! Место для будущего кода, break ;

default: nrerror ("Invalid model type");

) // проходим через дни, чтобы смоделировать реальную торговлю for(cb = 1;

cb <= nb;

cb++) { // не открываем позиций до начала периода выборки //... то же самое, что установка MaxBarsBack в TradeStation if(dt[cb] < IS_DATE) 1 egcls[cb] = 0.0;

continue;

) ГЛАВА 10 Входы НА ОСНОВЕ циклов // выполняем ожидающие приказы и сохраняем значение капитала 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);

//не торгуем в последние 30 дней выборки // оставляем место в массивах для будущих данных if(cb > nb-30) continue;

// считаем количество контрактов для позиции //... мы хотим торговать эквивалентом долларовой волатильности //... 2 новых контрактов на S&P-500 от 12/31/ ncontracts = RoundToInteger(5673. О / dlrv[cb] ) ;

if (ncontracts < 1) ncontracts = 1;

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

// генерировать входные сигналы, цены стоп- и лимитных приказов signal = 0;

switch (modeltype) { case 1:

// ищем хороший цикл для торговли domperndx = 0;

peakpower = -1.0;

for(k = 1;

k <= fcount;

k++) { if(power[k][cb] > peakpower) { peakpower = power[k][cb];

domperndx = k;

} } goodcycle = FALSE;

if(domperndx > 3 && domperndx < fcount-1) { peaknoise = 0.0;

for(k = 1;

k <= fcount;

k++) { if (abs(k - domperndx) > 2) { if (power[k] [cb] > peaknoise) peaknoise - power[k] [cb] ;

} } if(peakpower > 1.5 * peaknoise) goodcycle = TRUE;

} // генерируем торговые сигналы if (goodcycle) { domperiod = filter [domperndx-1].period() ;

phase = (180.0 / PI) * atan2(inquad[domperndx] [cb], inphase[domperndx] [cb]);

oldphase = (180.0 / PI) * atan2(inquad[domperndx] [cb-1], inphase[domperndx] [cb-1] );

phaseb - (phase<0.0) ? (360.0+phase) : phase;

oldphaseb = (oldphase<0.0) ? (360.0+oldphase) : oldphase;

sellphase = 0.0 - (disp + 180.0 / domperiod);

buyphase = 180.0 + sellphase;

if (phaseb > buyphase && oldphaseb <- buyphase) signal = 1;

// сигнал на покупку if (phase > sellphase && oldphase <= sellphase) signal = -1;

// сигнал на продажу } break;

244 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК } limprice = 0.5 * (hi [cb] + lo [cb] ) ;

stpprice = cls[cb] + 0.5 * signal * exitatr[cb];

// печатаем отладочную информацию #ifdef SIGNALDEBUG fprintf(fil, "%8d %8.1f %8d %8d %8d %8d\n", cb, cls[cb], signal, (int)filter[domperndx-1].period(), (int)peakpower, {int)peaknoise);

#endif // входим в сделку, используя определенный тип приказа 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);

} // обрабатываем следующий день // закрываем, если в режиме отладки #ifdef SIGNALDEBUG fclose(fil);

exit(0);

#endif } Вышеприведенный код описывает тестируемую модель. Первый важ ный блок кода, принципиальный для циклической модели, инициализи рует индивидуальные фильтры, составляющие группу фильтров. Этот код работает только при первом проходе или при изменении параметра, вли яющего на инициализацию группы фильтров, например параметра width.

Если важные параметры остаются без изменений, не имеет смысла пере запускать фильтры при каждом вызове функции Model.

Следующий блок применяет к входящему сигналу каждый из фильт ров в составе группы. В этом блоке отведены два массива для хранения выходного сигнала группы фильтров. Первый массив хранит выход с со впадающей фазой inphase, а второй — ортогональный выход inquad. Вход ной сигнал представляет исходные цены закрытия. Поскольку фильтры математически оптимальны и рассчитаны на удаление трендов, предва ГЛАВА 10 Входы НА ОСНОВЕ циклов рительная обработка данных становится излишней в отличие от менее продвинутых методик анализа. Каждая строка в массиве представляет собой выход отдельного фильтра с данной частотой или периодом, каж дая колонка представляет собой торговый день. Центральные частоты или периоды фильтров расположены на равных расстояниях на логарифми ческой шкале, т.е. соотношение между центральной частотой данного и следующего фильтра постоянно. Селективность полосы пропускания (width) — единственный настраиваемый параметр в расчете группы филь тров, и это значение может подбираться путем оптимизации.

Затем запускается обычный цикл перебора точек данных, и генери руются собственно торговые сигналы. Сначала проверяется наличие чи стого, пригодного для торговли цикла. Для этого определяется мощность при периоде, имеющем максимальный резонанс с текущей активностью рынка (peakpower). Также оценивается период, на котором наблюдается максимальная мощность. Если период не попадает на одно из крайних зна чений рассматриваемого диапазона (диапазон составляет от 3 до 30 дней), то потенциально цикл может быть пригоден для торговли. Затем проверя ется максимальная мощность на расстоянии не менее 2 полос пропуска ния фильтра от периода пика (peaknoise). Если отношение peakpower/ peaknoise составляет 1,5 или более, то выполняется второе условие при годности цикла. На основе пары выходов определяется фазовый угол цик ла. Затем код проверяет фазовый угол на соответствие максимуму или минимуму цены. Кроме того, в эту оценку вводится небольшое значение смещения (disp). Оно работает подобно смещению в предыдущих моде лях, хотя здесь относится к фазовому углу, а не к количеству точек дан ных. Между фазовым углом и количеством точек данных существует пря мая зависимость: период цикла, умноженный на фазовый угол в градусах и разделенный затем на 360, дает количество точек данных, соответству ющее фазовому углу. Если фаза после смещения такова, что через неко торое количество градусов до или после текущего дня можно ожидать минимума, отдается приказ на покупку. Если фаза такова, что можно ожи дать максимума, отдается приказ на продажу. Затем, как обычно, рассчи тываются цены для лимитного и стоп-приказов. При поступлении сигна лов система исполняет требуемые приказы.

Другие блоки вышеприведенного кода здесь не обсуждаются, посколь ку связаны с отладкой и тестированием программы. Их предназначение описано в комментариях к коду.

РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ Тестировалась только одна модель с входами по цене открытия (тест 1), по лимитному приказу (тест 2) и стоп-приказу (тест 3). Правила были про стыми: покупать на предсказанных минимумах и продавать на предска 246 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК занных максимумах. Выходы производились при поступлении сигнала к открытию противоположной позиции или при срабатывании стандарт ного выхода. Эта простая торговая система сначала испытывалась на ис кусственных ценовых данных, созданных путем добавления шума к иде альной синусоиде с периодом от 4 до 20 дней. На этих данных были полу чены сигналы покупки и продажи, идеально совпадающие с максимума ми и минимумами. Такое совпадение показывает, что при наличии реаль ных циклов система способна обнаруживать их с высокой точностью и использовать в торговле.

В табл. 10-1 приведены лучшие показатели, полученные для данных, находящихся в пределах выборки, а также эффективность портфеля на данных в пределах и вне пределов выборки. В таблице: ВЫБ. — вид вы борки данных (В — в пределах, ВНЕ — вне пределов выборки);

ДОХ% — доходность в процентах годовых;

Р/ПРИБ — соотношение риска/прибы ли в годовом исчислении;

ВЕР — ассоциированная вероятность статисти ческой достоверности;

СДЕЛ — число сделок на всех рынках в составе портфеля;

ПРИБ% — процент прибыльных сделок;

$СДЕЛ — средняя при быль/убыток со сделки;

ДНИ — средняя длительность сделки в днях;

ПРИБДЛ — общая прибыль от длинных позиций в тысячах долларов;

ПРИБКР — общая прибыль от коротких позиций в тысячах долларов. Оп тимизировались два параметра. Первый (Р1) определяет ширину полосы пропускания для каждого фильтра в составе группы. Второй (Р2) отобра жает фазовое смещение в градусах. Во всех случаях параметры прогоня лись в пределах выборки для ширины полосы пропускания от 0,05 до 0,2 с шагом 0,05 и для фазового сдвига от —20 до +20° с шагом 10°. Показаны только оптимальные решения.

Интересно отметить, что в общем циклическая модель имела доста точно низкую эффективность. По показателю прибыли со сделки эта мо дель превосходила многие рассмотренные ранее, но сильно уступала луч шим из них. В пределах выборки убыток со сделки оставил $ 1329 при вхо де по цене открытия, $1037 при входе по лимитному приказу и $1245 при входе по стоп-приказу. Вход по лимитному приказу обеспечил максималь ный процент прибыльных сделок и минимальный средний убыток. Длин ные позиции были слабо прибыльными при входе по цене открытия, бо лее прибыльны при входе по лимитному приказу и убыточны при входе по стоп-приказу. Вне пределов выборки входы по лимитному приказу и цене открытия работали хуже, чем в пределах выборки. Средний убыток в сделке составил $3741 при входе по цене открытия и $3551 при входе по лимитному приказу. Доля прибыльных сделок также снизилась до 34%.

Эффективность циклической модели вне пределов выборки была одной из худших среди всех моделей, что нельзя отнести на счет избыточной оптимизации: при других параметрах убытки были еще больше. При ис пользовании входа по стоп-приказу эффективность вне пределов выбор ки не ухудшалась, средний убыток ($944) в сделке был близок к убытку в ГЛАВА 1О Входы НА ОСНОВЕ циклов Таблица 10—1. Эффективность портфеля на данных в пределах и вне пределов выборки с лучшими параметрами, полученными в пределах выборки Выб. Р1 Р2 РЗ дох% Р/ПРИБ ВЕР СДЕЛ ПРИБ% $СДЕЛ ДНИ ПРИБДЛ ПРИБКР Тест 1. Базовая циклическая модель, вход по цене открытия В 0,2 20 0 -10,2 -0,66 0,980 1312 40 -1329 6 255 - ВНЕ 0,2 20 0 -23,2 -1,70 1,000 547 34 -3741 6 -693 - Тест 2. Базовая циклическая модель, вход по лимитному приказу В 0,2 20 0 -9,5 -0,46 0,926 1103 41 -1037 7 621 - ВНЕ 0,2 20 0 -22,8 -1,47 0,999 475 34 -3551 7 -652 - Тест 3. Базовая циклическая модель, вход по стоп-приказу В 0,1 20 0 -8,3 -0,53 0,951 957 40 -1245 7 -195 - ВНЕ 0,1 20 0 -15,0 -0,35 0,762 403 41 -944 7 -220 - пределах выборки. Однако, несмотря на то что применение входа по стоп приказу предотвратило падение эффективности, отмеченное при других видах входа, очевидно, что на новых данных система все равно убыточна.

Ухудшение эффективности системы за последние годы было по срав нению с другими моделями неожиданно сильным. Одним из возможных объяснений можно считать широкое распространение в последние годы сложных циклических торговых систем. Кроме того, может сказаться вли яние того, что крупные торговые фирмы широко используют сложные методы, включая описанные волновые, в исследованиях, формирующих их торговую политику. Таким образом, в последнее время становится все меньше возможностей использовать в торговле циклические свойства рынков.

В табл. 10-2 показано поведение модели с различными входами на раз личных рынках в пределах и вне пределов выборки. В первом столбце приведено обозначение рынка, средний и правый столбцы — количество прибыльных тестов для данного рынка. Цифры в первой строке показы вают вид входа: 01 — по цене открытия, 02 — по лимитному приказу и 03 — по стоп-приказу. Последняя строка показывает, на скольких рын ках данная модель была выгодной. Степень прибыльности и убыточности рынков для каждой модели указана следующим образом: один минус (—) означает убыток в $2000 — 4000;

два минуса ( ) — убыток более $4000;

один плюс ( + ) означает прибыль от $1000 до $2000;

два плюса (+ +) — прибыль более $2000;

пустая ячейка означает прибыль до $1000 или убы ток до $1999 в сделке. (Названия рынков и их символы соответствуют обо значениям табл. II-1;

часть II, введение.) 248 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК Таблица 10—2. Эффективность системы на различных рынках по тестам 250 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК Только 10-летние казначейские бумаги и хлопок показали значитель ную прибыль в пределах выборки при использовании всех трех видов приказов, вне выборки эффективность этих рынков была ничтожной. На рынке S&P 500, где по нашим собственным данным присутствуют выра женные и пригодные для торговли циклы, в пределах выборки были по лучены значительные прибыли при входе по цене открытия или по ли митному приказу. Вне пределов выборки этот рынок также был высоко прибыльным при входе по лимитному приказу и по стоп-приказу и ме нее прибыльным при входе по цене открытия. Интересно, что на рынке NYFE, где в пределах выборки отмечена значительная прибыль при вхо дах по цене открытия и по лимитному приказу, вне пределов выборки во всех случаях отмечались только убытки. Отмечено несколько других при быльных сочетаний как в пределах, так и вне пределов выборки, но вы раженной взаимосвязи между ними обнаружить не удалось. Возможно, рынки, обладавшие циклическими свойствами в прошлом (в пределах выборки), потеряли их к настоящему времени (вне пределов выборки), и наоборот. По крайней мере, рынок S&P 500 вел себя согласно данным нашего прошлого исследования и постоянно давал прибыль даже с такой грубой моделью.

Рис. 10-4 изображает график изменения капитала при торговле порт фелем для входа по цене открытия. Капитал медленно понижался пример но до августа 1992 г., после чего падение стало постоянным и быстрым.

ЗАКЛЮЧЕНИЕ В статье, опубликованной в мае 1997 г., мы утверждали, что метод групп фильтров имеет потенциал мощной и эффективной торговой стратегии.

Порой он работал невероятно успешно и был почти нечувствителен к зна чительным изменениям своих параметров, порой работал плохо — воз можно, из-за неумелого программирования. Тогда исследовался рынок S&P 500, приносивший прибыли и в нынешнем исследовании.

Результаты этого исследования удручают, тем более что теоретичес кая основа фильтров стала изящнее. Возможно, при использовании для анализа циклов других методов, например метода максимальной энтро пии, результат был бы лучше, а возможно, и нет. Подробные же разоча рования постигали и других трейдеров, пытавшихся использовать различ ные идеи для циклической торговли с простым принципом продажи по максимуму и покупки по минимуму. Возможно, циклы слишком уж оче видны и обнаружимы практически любым способом, что приводит к экс плуатации цикла всеми участниками рынка. В последнее время, с распро странением программ для анализа циклов, это кажется наиболее вероят ным. Мы считаем, что не стоит отказываться от концепции циклической торговли, но использовать обнаруженные циклы более сложными спосо ГЛАВА 10 Входы НА ОСНОВЕ циклов бами можно в сочетании с другими критериями входов, например можно открывать позицию только при совпадении циклического максимума с сезонной точкой разворота.

По нашему опыту, в случае успешной реализации циклическая торго вая система дает весьма точные сигналы входа. Тем не менее убыточные сделки циклической системы могут привести к катастрофическим резуль татам. Такой вывод можно сделать по графику S&P 500: зачастую 4 — 5 раз подряд сделки заключаются в точном совпадении с максимумами и мини мумами рынка, а порой позиция открывается именно там, где не следует.

С использованием правильной стратегии выходов такая система может быть чрезвычайно выгодной — убытки должны пресекаться в корне, но при правильном прогнозе позиции нужно удерживать подольше. Высо кая точность прогнозов в тех случаях, когда они верны, и очень близко расположенная защитная остановка могли бы содействовать достижению цели. Когда система улавливает точный момент максимума или миниму ма, рынок немедленно начинает движение в благоприятном направлении, почти без обратных движений, и защитная остановка не срабатывает.

Когда модель ошибается, остановка срабатывает почти мгновенно, сводя убыток к минимуму. Поскольку у стандартных выходов защитная оста новка располагалась достаточно далеко, преимущества циклической сис темы могли остаться нереализованными.

ЧТО МЫ УЗНАЛИ?

• Теоретически солидные, изящные и привлекательные модели не обязательно хорошо работают на реальном рынке.

• Исключение: рынок S&P 500 был прибылен и в предыдущем, и в настоящем исследовании.

Если модель работает, то работает очень выгодно. Как было ска зано ранее при исследовании поведения S&P 500 и других рын ков, можно легко и быстро обнаружить последовательности сигналов, точно предсказывающих максимумы и минимумы.

• Следовательно, необходимы специализированные выходы, рассчитанные на систему, которая при срабатывании весьма точна, но в случае ошибки приводит к большим убыткам.

Видимо, рынок со временем стал «менее уязвим» в отноше нии циклических моделей, как это было с моделями, основан ными на пробоях. Очевидные, явные циклы исчезают раньше, чем большинство трейдеров успевает получить в них прибыль.

Следовательно, все, что слишком гладко и привлекательно в теории, вряд ли приведет к успеху в реальной торговле.

ГЛАВА Нейронные сети Технология нейронных сетей, одного из видов искусственного интеллек та (AI), возникла на основе подражания процессам обработки информа ции и принятия решений, происходящих в живых организмах. Целью было моделирование поведения нервной ткани живых систем при помощи ком пьютерных структур, организованных из программно симулируемых ней ронов и нейронных связей (синапсов). Исследования нейронных сетей на теоретическом уровне начались в 1940-х годах. Когда компьютерная технология стала достаточно мощной для реализации подобных исследо ваний, работа началась всерьез. Во второй половине 1980-х годов систе мы на основе нейронных сетей стали представлять интерес для биржевой общественности. К 1989 г. ряд разработчиков уже предлагали пакеты для создания инструментов на нейронных сетях. Scientific Consultant Services разработал коммерческую систему NexTurn для прогнозирования индек са S&P 500. Интерес достиг пика в начале 1990-х годов, появились новые программы, но по причинам, о которых будет сказано ниже, к настояще му времени первоначальное увлечение финансовой общественности ней ронными сетями прошло.

Поскольку мы не собираемся представлять в этой книге полный курс по нейронным сетям, эта глава будет содержать краткий обзор, содержа щий основное для понимания принципов работы. Те, кто заинтересуется предметом, могут обратить внимание на материалы в книгах «Virtual Trading» (Ledermanand Klein, 1995) и «Computerized Trading» (Jurik, 1999), где также имеется подробная информация о разработке систем на осно ве нейронных сетей, а также на ряд статей в Technical Analysis of Stocks and Commodities (Katz, апрель 1996, Katz and McCormick, ноябрь 1996 и 1997). Также следует обратить внимание на книгу «Neural Networks in Finance and Investing» (Trippi and Turban, 1993).

ЧТО ТАКОЕ НЕЙРОННЫЕ СЕТИ?

Нейронные сети представляют собой, в сущности, некие блоки со спо собностью к самообучению и распознаванию образов, классификации и ГЛАВА 11 НЕЙРОННЫЕ СЕТИ прогнозированию. Они особо привлекательны для трейдеров, поскольку сети могут справляться и с оценками вероятности в неоднозначных ситу ациях, и с моделями нечеткой логики, т.е. с моделями, легко определимы ми на вид, но с трудом поддающимися алгоритмизации в виде точных пра вил. Потенциально, нейронные сети могут обнаруживать любые присут ствующие в исходных данных повторяющиеся модели. Сети также могут интегрировать большие объемы информации, не захлебываясь в деталях, и могут адаптироваться к изменениям рынков и их условий.

Существует большое разнообразие нейронных сетей, отличающихся своей «архитектурой», т.е. способом связи виртуальных нейронов, дета лями их поведения (обработкой сигнала или «функциями передачи») и процессом обучения. Существуют различные виды архитектур сетей пред ставляющих интерес для трейдеров, например сети Коонена и сети с кван тованием обучающего вектора (LVQ), различные сети с адаптивным ре зонансом и периодические сети. В этой главе будет рассмотрена наибо лее популярная и полезная во многих отношениях архитектура, а именно нейронная сеть с прямой связью.

Как было сказано выше, сети различаются по методу обучения. Раз работчики системы играют роль учителя, снабжая сеть примерами для обучения. Некоторые сети обучаются «под контролем», некоторые «без контроля». Обучение под контролем имеет место, когда сеть обучают да вать правильные ответы, показывая ей примеры правильных решений;

для каждого набора входов целью сети является обеспечение правильно го выхода. Обучение без контроля состоит в том, что сеть организует вве денные данные так, как считает нужным, на основе найденных в них внут ренних закономерностей. Вне зависимости от формы обучения основная проблема состоит в поиске соответствующих данных и придании им фор мы учебных примеров, фактов, которые выделяют важные модели для эффективного и направленного обучения сети, во избежание формиро вания заблуждений. Предварительная подготовка данных — само по себе искусство.

Собственно процесс обучения обычно включает некоторый механизм обновления удельных весов или важности разных связей между нейро нами в ответ на подаваемые учебные примеры. При использовании в ар хитектуре прямых связей часто используют обратное распространение — наиболее быструю форму оптимизации. Также эффективны генетичес кие алгоритмы, которые требуют большого количества расчетов и време ни, но обычно дают лучшие окончательные результаты.

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

например сеть 10-3-1 состоит из нейронов во входном, 3 в скрытом и 1 в выходном слое. Сети бывают раз личного размера — от нескольких нейронов до тысяч и от всего трех сло ев до десятков;

сложность зависит от размаха решаемой задачи. Практи чески всегда бывает достаточно трех-четырех слоев.

Нейронные сети с прямой связью (аналоги использованной в этой гла ве) включают особую форму нелинейной множественной регрессии. Сеть берет ряд входных переменных и использует их для прогнозирования цели задания, как и при регрессии. В стандартной множественной линейной регрессии, например, если ставится задача предсказать уровень холесте рола (зависимая переменная) на основе потребления жиров и физичес кой нагрузки (независимые входные переменные), то данные будут мо делироваться следующим образом: прогнозируемый уровень холестеро ла = а + b х потребление жиров + с X нагрузку, где значения a, b и с будут определяться статистической процедурой. Будет производиться поиск множества решений задачи, которое может быть линией, плоско стью или гиперплоскостью (в зависимости от количества переменных) согласно правилу наименьших квадратов. В вышеприведенной задаче все решения находятся на плоскости: ось х представляет потребление жиров, ось у—физическую нагрузку, высота плоскости в каждой точке (х, у) пред ставляет собой прогнозируемый уровень холестерола.

При использовании технологии нейронных сетей двумерная плоскость или n-мерная гиперплоскость множественной линейной регрессии заме няется гладкой n-мерной изогнутой поверхностью с пиками и провалами, хребтами и оврагами. Например, нам требуется найти оптимальное ре шение для набора переменных, и задача будет сводиться к построению многомерной карты. В нейронной сети решение достигается при помощи «нейронов» — взаимосвязанных нелинейных элементов, связи которых сбалансированы так, чтобы подгонять поверхность подданные. Алгоритм обучения производит регулировку весов связей для получения максималь но вписывающейся в исходные данные конфигурации поверхности. Как и в случае со стандартной множественной регрессией, где коэффициен ты регрессии необходимы для определения наклона гиперповерхности, для нейронной модели требуются параметры (в виде весов связей), чтобы обеспечить наилучшее совпадение построенной поверхности, всех ее воз вышений и впадин, с входными данными.

ГЛАВА 11 НЕЙРОННЫЕ СЕТИ НЕЙРОННЫЕ СЕТИ В ТОРГОВЛЕ Нейронные сети были наиболее популярны в конце 80 — начале 90-х го дов, после чего медовый месяц завершился. Что же произошло? В общем, наступило разочарование среди трейдеров, надеявшихся, что новые тех нологии чудесным образом обеспечат им превосходство с минимальны ми затратами усилий. Разработчики использовали для обучения недоста точно подготовленные исходные данные, надеясь на открытия, которые должна была сделать сама сеть. Это был наивный подход. Успех на рынке никогда не бывает таким простым и доступным для всех. Этот подход был не только неэффективен в отношении разработки сетей, но и привел к тому, что сети широко распространились. В результате любая попытка систем уловить выгодные движения рынка сводилась к нулю ввиду изме нившейся природы рынка, который быстро адаптировался к новым мето дам торговли. Во всем обвинили саму технологию и отбросили ее, не за думавшись о неправильном подходе к ее применению. Для получения ус пешных результатов был необходим более осмысленный и изощренный подход.

Большинство попыток разработать прогностические модели на осно ве нейронных сетей, простые или усложненные, были сконцентрирова ны на отдельных рынках. Проблема с отдельными рынками состоит в том, что количество точек данных для обучения сети весьма ограничено и ве дет к переоптимизации, что, особенно в сочетании с не слишком хорошо подготовленными данными, ведет к провалу при торговле. В этой главе нейронные сети будут обучаться на основе целого портфеля ценных бу маг, валют и фьючерсов, что позволит использовать для избежания под гонки десятки тысяч точек данных — приличное количество для малень кой или средней нейронной сети. Возможно, таким образом удастся зас тавить работать достаточно прямолинейный алгоритм прогнозирования рынка. Фактически, такая сеть сможет служить универсальным прогнос тическим средством, т.е. после обучения на целом портфеле она сможет прогнозировать в отдельности каждый из рынков.

ПРОГНОЗИРОВАНИЕ С ПОМОЩЬЮ НЕЙРОННЫХ СЕТЕЙ Нейронные сети будут разрабатываться с целью прогнозирования: (I) куда уйдет рынок в ближайшем будущем и (2) будет ли завтрашняя цена от крытия представлять собой точку разворота. Для первого случая будет сооружаться сеть, прогнозирующая обращенный во времени стохасти ческий осциллятор, а именно обращенный Медленный %К. Это, в общем, стандартный осциллятор, но рассчитываемый с обратным отсчетом вре мени. Такой осциллятор отражает текущее положение цены закрытия по отношению к нескольким последующим дням. Несомненно, предсказа ние значения такого индикатора было бы полезно для трейдера: зная, что 256 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК сегодняшняя цена закрытия и, вероятно, завтрашняя цена закрытия ле жат внизу ценового диапазона нескольких следующих дней, можно пред полагать, что это хорошая ситуация для покупки, и наоборот, если сегод няшняя цена открытия лежит вблизи максимума ближайшего будущего, время поразмыслить о продаже. Во втором случае представим моделиро вание ситуации с завтрашним открытием — будет ли эта цена максиму мом или минимумом? Для решения этой задачи будут обучены две ней ронные сети: одна на определение минимума в завтрашней цене откры тия, другая на определение максимума. Возможность предсказать макси мум или минимум на завтрашней цене открытия также полезно для трей дера, решающего, входить ли в рынок и какую позицию занимать—длин ную или короткую. Целью этого исследования будет получение таких про гнозов в отношении любого рынка, где используется модель.

ВХОДЫ НА ОСНОВЕ НЕЙРОННОЙ СЕТИ Мы будем обучать три нейронные сети, дающие три модели входа. Две из них будут настроены на поиск точек разворота: одна будет определять минимумы, другая — максимумы. Если модель, определяющая минимум, покажет, что вероятность минимума на завтрашней цене открытия выше некоторого порога, то будет отдан приказ на покупку. Если модель, опре деляющая максимум, покажет, что вероятность максимума на завтраш ней цене открытия выше некоторого другого порога, то будет отдан при каз на продажу. Ни одна из этих моделей не будет отдавать приказы при каких-либо других условиях. Таким образом, стратегия проста и основа на только на предсказанных минимумах и максимумах. Если вероятность определения максимумов и минимумов будет выше случайной, то торгов ля будет прибыльной. Система обнаружения не должна быть идеальной, пусть вероятность правильного сигнала будет выше 50% — этого будет достаточно, чтобы преодолеть транзакционные затраты.

Для модели, использующей обращенный во времени Медленный %К, будет использоваться подобная стратегия. Если прогноз показывает, что обращенный во времени Медленный %К имеет вероятность быть ниже установленного порога, будет отдан приказ на покупку;

это значит, что рынок находится вблизи минимума некоторого будущего ценового диа пазона и можно быстро получить прибыль. Таким же образом, если про гнозируемое значение обращенного Медленного %К высоко и превыша ет некоторый верхний порог, будет отдан приказ на продажу.

Эти входы, как и многие другие, рассмотренные в предыдущих главах, являются прогностическими — они предсказывают рынок, а не следуют за ним. Они подходят для торговли против тренда и при точном предсказа нии могут резко снизить проскальзывание, обеспечить своевременное вы полнение приказов, поскольку трейдер будет покупать, когда другие про ГЛАВА 11 НЕЙРОННЫЕ СЕТИ дают, и наоборот. Хорошая прогностическая модель — Святой Грааль тор говли, который дает возможность продавать вблизи максимума и покупать вблизи минимума. Однако при неточной работе все преимущества про гностической модели будут перевешены расходами на неудачные сделки.

МОДЕЛЬ НА ОБРАЩЕННОМ ВО ВРЕМЕНИ МЕДЛЕННОМ %К Первый шаг в разработке нейронной сети с прогностическими функция ми — это подготовка обучающего набора фактов, т.е. выборки данных, содержащей примеры для обучения сети, а также для оценки некоторых статистических показателей. В данном случае набор фактов генерирует ся на основе данных из пределов выборки по всем рынкам в составе порт феля: таким образом, набор фактов будет велик — 88 092 точки данных.

Этот набор генерируется только для обучения, но не для тестирования по причинам, которые будут пояснены далее.

Для получения набора фактов под данную модель сперва следует про извести расчеты целевого показателя — обращенного во времени Мед ленного %К. Каждый факт затем записывается в файл при проходе через все точки данных для всех рынков в составе портфеля. Для каждого тор гового дня процесс создания факта начинается с расчета входных пере менных. Это делается путем расчета разности между парой цен и делени ем результата на квадратный корень количества дней, лежащих между этими двумя ценами. Квадратичная поправка используется, поскольку в случайном рынке стандартное отклонение между двумя днями примерно пропорционально квадратному корню от количества дней между ними.

Эта поправка сделает вклад каждой разницы цен в факт примерно рав ным. В этом эксперименте в каждом факте содержится 18 изменений цены, рассчитанных с квадратичной поправкой. Эти 18 значений будут служить как 18 входов нейронной сети после дополнительной обработки.

Пары цен (использованные при расчете изменений) выбираются с возрастающим расстоянием между ценами, т.е. чем дальше во времени, тем расстояние между точками данных больше. Первые несколько пар перед текущим днем берутся с расстоянием в один день, т.е. цена преды дущего дня вычитается из цены текущего и т.д. После нескольких таких пар шаг изменяется до 2 дней, затем до 4,8 и т.д. Точная расстановка вклю чена в код программы в виде таблицы. Смысл этого состоит в получении максимально точной информации о новейших процессах. Чем дальше во времени от текущего дня находятся данные, тем больше вероятность того, что только долговременные процессы будут иметь значение, следователь но, можно обойтись меньшим разрешением. Такая выборка дней должна обеспечивать достаточное разрешение для регистрации циклов и других явлений с периодом от 1 — 2 до 50 дней и более. Такой подход принят в соответствии с рекомендацией Марка Джурика (jurikres.com).

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

Для каждого факта целью (т.е. зависимой переменной регрессии) яв ляется попросту значение обращенного во времени Медленного %К. Вход ные переменные и цель для каждого факта выдаются в простом ASCII формате в виде файла, который может анализироваться качественным пакетом для разработки нейронных сетей.

Полученный набор фактов используется для обучения сети прогнози рованию обращенного во времени Медленного %К, т.е. относительного положения сегодняшней цены закрытия и, предположительно, завтраш ней цены открытия по отношению к диапазону цен за последующие 10 дней (обращенный во времени Медленный %К с периодом 10 дней).

Следующий шаг разработки нейронного прогностического устрой ства — реальная тренировка нескольких сетей на полученном наборе фактов. Обучают серию нейронных сетей различного размера, причем метод отбора наиболее хорошо обученной и устроенной сети не состоит, как можно было бы подумать, в проверке ее эффективности на данных вне пределов выборки. Вместо этого проводится коррекция коэффици ентов корреляции (показателей прогностических способностей каждой сети), причем коэффициент коррекции зависит от размера выборки дан ных и количества параметров (связей между нейронами) в исследуемой сети. При этом используется то же уравнение, что и при коррекции мно жественных корреляций, получаемых при многовариантной регрессии (см. главу о статистике и оптимизации). Чем больше и сложнее сеть, тем сильнее будут скорректированы (в меньшую сторону) коэффициенты корреляции. Этот подход помогает оценить степень излишней подгонки системы под исходные данные. Чтобы большая сеть превзошла малень кую, она должна давать значительно больший коэффициент корреляции.

Этот метод позволяет выбирать лучшие сети без обычного обращения к данным вне пределов выборки. Все сети проходят полное обучение, т.е.

не делается попыток скомпенсировать снижение степеней свободы мень шим обучением сети.

Наилучшие сети, отобранные на основе скорректированных корре ляций, затем тестируются с настоящей моделью входа, стандартизован ным выходом на всех рынках как в пределах, так и вне пределов выборки.

ГЛАВА 11 НЕЙРОННЫЕ СЕТИ Как было сказано выше, излишне подогнанные сети должны иметь очень низкие значения корреляции после проведения ее коррекции. Большое количество фактов в наборе (88 092) должно помочь избежать вредного влияния подгонки для сетей умеренного размера.

Код модели обращенного Медленного %К static void PrepareNeurallnputs (float *var, float *cls, int cb) { // Преобразование исходных цен закрытия // во входную информацию для нейронной сети.

// var - вывод: массив [1..18] переменных для нейросети // cls - ввод: массив [1..] цен закрытия // cb - ввод: индекс текущего дня static pbars[] = { 0, 0,1,2,3,4,5,6,8,10,12,16,20,24,32,34, 40,48,64,96 };

static float pfac[19], amp;

static int notfirstpass, k;

// инициализируем таблицу фактора корректировки разницы if(notfirstpass == FALSE) ( for(k = 1;

k <= 18;

k++) pfac [k] = 1.0 / sqrt (pbars [k+1] - pbars[k]);

notfirstpass = TRUE;

} // считаем откорректированные ценовые разницы и квадраты амплитуды amp = 0.0;

for (k = 1;

k <= 18;

k++) ( var [k] = pfac [k] * (cls[cb - pbars[k]] - cls (cb - pbars[k+1] ]);

amp += var [k] * var [k] ;

} // нормирование вектора ценовых разниц к единице амплитуды amp = 1.0 / sqrt(amp);

for(k = 1;

k <= 18;

k++) var[k] = amp * var[k];

} static void Model (float *parms, float *dt, float *opn, float *hi, float *lo, float *cls, float *vol, float *oi, float *dlrv, int nb, TRDSIM its, float *eqcls) ( // Выполняет простую торговую модель на нейросетях. Она // торгует с помощью предсказания обратного Медленного %К.

// File = xl5modOl.c // parms - набор [1..MAXPRM] параметров // dt — набор [1..nb] дат в формате ГГММДД // орn - набор [l..nb] цен открытия // hi — набор [l..nb] максимальных цен // 1о — набор [l..nb] минимальных цен // cls - набор [l..nbj цен закрытия // vol — набор [l..nb] значений объема // oi — набор [l..nb] значений открытого интереса // dlrv - набор [1..пЬ] средних долларовой волатильности // nb — количество дней в наборе данных // ts — ссылка на класс торгового симулятора // eqcls — набор [l..nb] уровней капитала при закрытых позициях 260 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК //объявляем локальные переменные static int rc, cb, ncontracts, maxhold, ordertype;

static int mode, signal, factcount, k, netnum;

static FILE *fil;

static NEURALNET *nnet;

static char netname [20];

static float thresh, netout, var[19];

static float mmstp, ptlim, stpprice, limprice, tmp;

static float exitatr[MAXBAR+1], revstoch[MAXBAR+1];

// копируем параметры в локальные переменные для удобного обращения thresh = parms[l];

// порог выходных значений для сети netnum = parms[2];

// число нейросети mode = parms[6] ;

// обучение (режим=1) или тест (режим=2) ordertype = parms[9];

// тип входного приказа maxhold = 10;

// период максимального удержания позиции ptlim = 4;

// целевая прибыль в единицах волатильности mmstp = 1;

// защитная остановка в единицах волатильности //выполняем вычисления по всему объему данных с помощью векторных процедур AvgTrueRangeS(exitatr,hi,lo,cls,50,nb);

// средний истинный диапазон для // выхода RevStochOsc(revstoch,hi,lo,cls,2,10,nb);

// обратный Медленный %К // готовим набор фактов для обучения нейросети if(mode == 1) { // режим подготовки // фактов (р6=1) // открываем выходной файл и записываем N-TRAIN в файл // заголовок перед обработкой первого рынка if(strcmp(ts.symbol(), "SP") == 0) ( fil = fopen("yl5fac01.dat", "wt");

fprintf(fil, "%d\n%d\n", (int)18, (int)l);

factcount = 0;

} // записываем действительные факты в файл // делаем для каждого рынка в портфеле for(cb = 1;

cb <= nb;

cb++) ( if(dt[cb] < ISJATE) continue;

// период анализа if(dt[cb+10] > OOS_DATE) break;

// игнорируем данные вне пределов // выборки fprintf(fil, "%6d", ++factcount) ;

// номер факта PrepareNeurallnputs(var, cls, cb) ;

for(k = 1;

k <= 18;

k++) fprintf(fil, "%7.3f", var[k]);

// входные значения fprintf(fil, "%7.3f\n",revstoch[cb] );

// цель if((cb % 1000) == 1) printf("CB = %d\n", cb);

// информация о прогрессе } // закрываем выходной файл и выходим после обработки последнего рынка if(strcmp(ts.symbol(), "LB") == 0) ( fclose(fil);

exit(0);

} } // моделируем торговлю с обученной нейросетью if(mode == 2) { // режим торгового симулятора (рб=2) // загружаем обученную сеть перед обработкой первого рынка if (strcmp(ts.symbol(), "SP") == 0) ( sprintf(netname, "/nets/nn%d.net", netnum);

nnet = ntlload(netname) ;

ГЛАВА 11 НЕЙРОННЫЕ СЕТИ. if(nnet == NOLL) nrerror(ntlerrm(ntlerrc()));

} // проходим через дни, чтобы смоделировать реальную торговлю 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");

egcls[cb] = ts.currentequity(EQ_CLOSETOTAL);

// считаем количество контрактов для позиции //... мы хотим торговать эквивалентом долларовой волатильности //... 2 новых контрактов на S&P-500 от 12/31/ ncontracts = RoundToInteger(5673.0 / dlrv[cb]);

if(ncontracts < 1) ncontracts = 1;

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

// генерируем входные сигналы, цены стоп- и лимитных приказов, // используя обученную нейросеть signal=О;

PrepareNeurallnputs(var, cls, cb) ;

ntlset_inputv(nnet, &var[l]);

// принимаем входные параметры сети ntlfire (nnet);

// запускаем сеть netout = ntlget_output(nnet, 0);

// получаем выходные данные if(netout > thresh) signal = -1;

// сигнал на продажу if(netout < (100 - thresh)) 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, 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);

} // обрабатываем следующий день // выгружаем обученную сеть после обработки последнего рынка if(strcmp(ts.symbol(),"LB") == 0) ntldisp(nnet) ;

} } 262 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК Код включает две функции — обычную функцию Model, реализую щая торговую модель, и процедуру подготовки входов нейронной сети PrepareNeurallnputs. Процедура, которая подготавливает входы, требует для работы индекса текущего дня (cb) и серии цен закрытия (cls).

Функция PrepareNeurallnputs при наличии индекса текущего дня и серии цен закрытия рассчитывает для данного факта все входы, необхо димые нейронной сети. В списке параметр pbars указывает на относитель ный по сравнению с текущим (приравненным к нулю) номер дня из про шлых данных, используемый для вычисления вышеописанных разностей цен. Первый блок кода после объявления переменных запускает таблицу факторов подстройки цен. Таблица запускается на первом проходе фун кции и содержит квадратные корни количества дней между каждой из пар цен, используемых для расчета разностей. Следующий блок кода рас считывает скорректированные разности, а также суммы их квадратов, т.е.

квадрат амплитуды или длину результирующего вектора.

Код, реализующий торговую модель, основан на наших обычных прин ципах. После объявления переменных ряд параметров копируется в ло кальные переменные для простоты ссылок. Затем рассчитываются сред ний истинный интервал, используемый для стандартного выхода, и обра щенный во времени Медленный %К с периодом 10 дней.

Один из параметров (mode) выбирает режим работы кода. Mode = запускает код для подготовки факта;

файл открывается, заголовок (состо ящий из числа входов — 18 и числа целей — 1) записывается, и счет фак тов начинается с нуля. Это производится только при открытии первого из рынков в составе портфеля. Файл остается открытым все время дальней шей обработки, вплоть до конца обработки последнего символа в порт феле. После заголовка в файл записываются факты. Все данные до нача ла периода выборки и после окончания периода вне выборки игнориру ются. Используются только данные в пределах выборки. Каждый факт, записанный в файл, состоит из номера факта, 18 переменных входов, рас считанных процедурой PrepareNeurallnputs, и цели (значения обращен ного во времени Медленного %К). Пользователю сообщается информа ция о продвижении работы.

Если mode выбирается равным 2, то нейронная сеть, обученная на вы шеописанном файле с фактами, используется для генерации торговых вхо дов. Первый блок кода открывает и загружает нужную сеть до начала рас четов по первому рынку. После выполнения стандартных функций обнов ления симулятора, расчета количества контрактов, избежания дней с ос тановленной торговлей и т.п. запускается блок, генерирующий сигналы входа и выхода. Функция PrepareNeurallnputs вызывается для получения входных данных, соответствующих текущему дню. Сеть обрабатывает эти данные, и на основании ее выхода генерируются сигналы на вход в рынок.

Правила генерации сигналов таковы: если на выходе нейронной сети значение превышает порог thresh, то подается сигнал на продажу — сеть ГЛАВА 11 НЕЙРОННЫЕ СЕТИ предсказывает высокое значение обращенного во времени Медленно го %К, т.е. текущая цена закрытия, возможно, близка к максимуму на бли жайшее будущее. Если на выходе сети значение составляет менее 100 — thresh, то подается сигнал на покупку. Например, если thresh установлен на уровне 80, то любой предсказанный Медленный %К более 80 будет вы зывать сигнал на продажу, а любой Медленный %К менее 20 — сигнал на покупку.

Кроме того, встроены еще два блока, обеспечивающие отдачу соб ственно приказа на вход в рынок и работу стандартизированного выхода.

Эти блоки подобны использованным в предыдущих главах.

Методология тестирования модели на основе обращенного Медленного %К Модель выполняется со значением mode — 1 для получения набора фак тов. Набор фактов загружается в N-TRAIN — набор для разработки ней ронных сетей Scientific Consultant Services (516-696-3333), масштабирует ся и перетасовывается, как это необходимо при разработке нейронной сети. Затем обучается набор сетей, начиная с маленькой и кончая весьма большой;

в основном это простые 3-слойные сети. Также обучаются две 4-слойные сети. Все сети тренируются до максимальной конвергентнос ти и затем «полируются» для удаления мелких отклонений или сдвигов.

Процесс «полировки» обеспечивается снижением интенсивности обуче ния до очень низкой и еще примерно 50 прогонами после этого.

В табл. 11-1 приводится информация о всех сетях, обучавшихся для этой модели, с коэффициентами корреляции и другими показателями. В табли це указаны название файла, содержащего сеть, размер — число слоев и число нейронов в каждом из слоев, число связей в сети, оптимизирован ных при обучении (подобно количеству коэффициентов регрессии при множественной регрессии и их связи с излишней подгонкой под истори ческие данные), и корреляция — множественная корреляция выхода сети с его целевым значением. Скорректированные на излишнюю подгонку под входные данные значения корреляции занимают два столбца: в левом — коррекция исходя из обучения на наборе в 40 000 точек данных, в пра вом — исходя из 13 000 точек. Последние строки содержат реальное коли чество точек данных, а также их количество, предполагаемое при расчете коррекции.

Количество точек данных, использованное при расчете коррекции коэффициентов корреляции, меньше, чем реальное их количество в на боре для обучения. Причина в повторяемости фактов, а именно в том, что факт, основанный на некоторой точке данных, с большой вероятностью будет весьма подобен факту, основанному на соседней точке. Из-за этого «эффективное» число точек данных в отношении статистически незави ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК Таблица 11—1. Показатели обучения нейронных сетей для прогнозирования обращенного во времени Медленного % К Корреляция Название Размер Число связей Корреляция после коррекции NN1.NET 18-4-1 76 0,093 0,082 0, NN2.NET 18-6-1 114 0,118 0,105 0, NN3.NET 18-8-1 152 0,122 0,106 0, NN4.NET 18-10-1 190 0,124 0,104 0, NN5.NET 18-12-1 228 0,144 0,123 0, NN6.NET 18-16-1 304 0,156 0,130 0, NN7.NET 18-20-1 380 0,172 0,143 0, NN8.NET 18-14-4-1 312 0,169 0,145 0, NN9.NET 18-20-6-1 486 0,201 0,169 0, Реальное число 88092 Подразумевалось 40000 симой информации будет уступать реальному. Мы использовали два раз ных прореживания данных, представленных в двух столбцах. Процесс коррекции корреляций подобен процессу коррекции вероятностей мно жественных тестов при оптимизации: при прогонке параметра через ряд значений полученные результаты для соседних значений, скорее всего, будут подобны, что снижает эффективное количество тестов по сравне нию с реальным.

Результаты обучения для модели обращенного во времени Медленного %К Как следует из табл. 11-1, значения некорректированной корреляции не уклонно возрастали с увеличением сети в отношении количества связей.

Если же провести коррекцию коэффициентов корреляции, то для эффек тивной выборки величиной 13 000 точек картина драматически меняется:

наиболее эффективными оказываются малые 3-слойные сети с 6 нейро нами в среднем слое и наименьшая из двух 4-слойных сетей. При более умеренной коррекции ожидаемая прогностическая способность оказалась наибольшей для двух 4-слойных сетей, как видно из множественных кор реляций результата с целью.

ГЛАВА 11 НЕЙРОННЫЕ СЕТИ При более консервативной оценке (с меньшей эффективной выбор кой и, следовательно, с большей коррекцией коэффициентов корреляции) на основе данных табл. 11 -1 для работы в модели было выбрано две сети — сеть 18-6-1 (rm2.net) и сеть 18-14-4-1 (nn8.net). Они были признаны лучши ми из сетей, способными потенциально эффективно работать вне преде лов выборки. Для теста модели входа в рынок программа прогонялась со значением mode = 2;

как обычно, тестировались все входы — по цене от крытия, по лимитному приказу и по стоп-приказу.

МОДЕЛИ НА ОСНОВЕ ТОЧКИ РАЗВОРОТА Для работы таких моделей требуются два дополнительных набора фак тов, идентичных фактам для обращенного во времени Медленного %К во.

всем, кроме целевого параметра. Цель первого набора равна 1, что обо значает нижнюю точку разворота (минимум), когда завтрашняя цена от крытия ниже цен трех предыдущих и десяти последующих дней. Если это условие не выполняется, то значение цели приравнивается к 0. Целью второго набора является 1, т.е. максимум, являющийся точкой разворота в случае, если завтрашняя цена открытия выше цен трех предыдущих и десяти последующих дней. Если это условие не выполняется, то значение цели приравнивается к 0. Если считать, что на рынке присутствуют ус тойчивые модели, то нейронная сеть должна иметь способность усваи вать их и предсказывать положение завтрашней цены открытия.

В отличие от набора фактов для обращенного во времени Медленно го %К в этих наборах факты генерируются только в тех случаях, когда зав трашняя цена открытия имеет вероятность стать точкой разворота. На пример, если завтрашняя цена открытия выше сегодняшней цены откры тия, то, согласно предыдущим правилам, завтрашнее открытие уже не может считаться точкой разворота, что бы ни случилось в дальнейшем.

Зачем заставлять сеть делать прогнозы, когда нет никакой неопределен ности? Прогнозирование производится только в случаях, когда завтраш няя цена открытия может составить точку разворота, и факты генериру ются только для таких случаев.

Обработка вводов, использование статистики и другие аспекты мето дологии тестирования для моделей, основанных на точке разворота, иден тичны используемым для модели на обращенном во времени Медлен ном %К. Обе модели в принципе идентичны, различаются только цели предсказания и, следовательно, цели для обучения нейронных сетей. Кро ме того, ввиду отличия прогнозов различаются правила получения сигна лов входа на их основе.

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

для второй модели — если прогноз максимума выше некоторого порога, следует продавать. Для обеих моделей порог представляет собой доверительный уровень для зак лючения о будущем максимуме или минимуме рынка, которое делает ней ронная сеть перед отдачей приказа.

// запись фактов в файл for(cb = 1;

cb <= nb;

cb++) { if(dt[cb] < IS_DATE) continue;

// период анализа if(dt [cb+10] > OOS_DATE) break;

// игнорируем данные вне пределов // выборки if(opn[cb+l] >= Lowest (opn, 3, cb)} continue;

// пропускаем эти факты fprintf(fil, "%6d", ++factcount);

// номер факта PrepareNeurallnputs{var, els, cb) ;

for(k = 1;

k <= 18;

k++) fprintf(fil, "%7.3f", var[k] );

// стандартные входные данные if(opn[cb+l] < Lowest {opn, 9, cb+10)) netout = 1.0;

else netout =0.0;

// считаем цель fprintf(fil, "%6.1f\n", netout);

// цель if{(cb % 500) == 1) printf("CB = %d\n", cb);

// информация о прогрессе } // генерируем входные сигналы, цены лимитных приказов и стоп-приказов signal=0;

if(opn[cb+1] < Lowest (opn, 3, cb)) { // пускаем только эти PrepareNeurallnputs(var, cls, cb) ;

// обрабатываем данные ntlset_inputv{nnet, &var[l]);

// передаем в сеть входные данные ntlfire (nnet);

// запускаем тест netout = ntlget_output(nnet, 0);

// получаем выходные данные netout *= 100.О;

// переводим в проценты if(netout > thresh) signal = 1;

// сигнал на покупку } limprice = 0.5 * (hi[cb] + lo [cb]);

stpprice = cls [cb] +0.5 * signal * exitatr[cb] ;

Поскольку код для модели, прогнозирующей минимумы, почти иден тичен коду модели на основе обращенного во времени Медленного %К, выше приведены только два измененных блока. В первом блоке обращен ный Медленный %К не используется, а вместо этого рассчитывается цель — серия нулей или единиц, указывающая на наличие (1) или отсут ствие (0) минимумов. При записи фактов вместо значения Медленного %К записываются значения цели. Во втором блоке вводятся правила для срав нения выхода нейронной сети с соответствующим порогом и генерации собственно сигналов входа в рынок. В обоих блоках включен код, препят ствующий записи фактов и использованию прогнозирования в случае, когда завтрашняя цена открытия не может образовать минимум согласно правилам. В коде ниже приведены аналогичные правила прогнозирова ния максимумов.

ГЛАВА 11 НЕЙРОННЫЕ СЕТИ if(dt[cb+10] > OOS_DATE) break;

/ / игнорируем данные вне пределов // выборки if(opn[cb+l] <= Highest(opn, 3, cb)) continue;

// пропускаем эти факты fprintf{fil, "%6d", ++factcount);

// номер факта PrepareNeurallnputs(var, cls, cb) ;

for (k = 1;

k <= 18;

k++) fprintf(fil, "%7.3f", var[k]);

// стандартные входные значения if{opn[cb+l] > Highest(opn, 9, cb+10)) netout = 1.0;

else netout =0.0;

// считаем цель fprintf(fil, "%6.1f\n", netout);

// цель if({cb % 500) == 1) printf("CB = %d\n", cb);

// информация о прогрессе } // генерируем входные сигналы, цены лимитных приказов и стоп- приказов signal=0;

if(opn[cb+l] > Highest(opn, 3, cb)) { // запускаем только эти PrepareNeurallnputs{var, cls, cb) ;

// обрабатываем данные ntlset_inputv(nnet, &var[l]);

// передаем в сеть входные значения ntlfire (nnet);

// запускаем сеть netout = ntlget_output(nnet, 0);

// получаем выходные значения netout *= 100.О;

// переводим в проценты if(netout > thresh) signal = -1;

// сигнал на продажу } limprice = 0.5 * (hi[cb] + lo[cb]);

stpprice = cls[cb] + 0.5 * signal * exitatr[cb];

Методология тестирования модели, основанной на точке разворота Методология идентична использованной для модели на обращенном во времени Медленном %К. Набор фактов генерируется, загружается в N-TRAIN, масштабируется и перетасовывается. Набор сетей по 3 — 4 слоя нейронов обучается до максимальной сходимости и «полируется». Рас считываются статистические показатели, такие как скорректированная на избыточную подгонку корреляция.

Результаты тестирования моделей, основанных на точке разворота Прогнозирование минимумов. Структура табл. 11-2 идентична табл. 11-1.

Как и в случае с нейронной сетью, обучавшейся прогнозированию обра щенного во времени Медленного %К, между числом связей в сети и мно жественной корреляцией выхода с целью наблюдалось растущая связь;

т.е.

корреляция была выше для более крупных сетей. Сеть, в общем, обучалась на наборе из 23 900 фактов, что меньше, чем сеть для прогноза обращенно го Медленного %К. Различие в количестве фактов объясняется тем, что ис пользовались только случаи, где завтрашняя цена открытия могла представ лять точку разворота. Поскольку факты для прогнозирования минимумов ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК Таблица 11—2. Показатели обучения нейронных сетей для прогнозирования нижних точек разворота Корреляция Название Размер Число связей Корреляция после коррекции NN1.NET 18-4-1 76 0,109 0,094 0, NN2.NET 18-6-1 114 0,121 0,100 0, NN3.NET 18-8-1 152 0,146 0,122 0, NN4.NET 18-10-1 190 0,166 0,141 0, NN5.NET 18-12-1 228 0,167 0,137 -0, NN6.NET 18-16-1 304 0,185 0,148 -0, NN7.NET 18-20-1 380 0,225 0,188 0, NN8.NET 18-14-4-1 312 0,219 0,188 0, NN9.NET 18-20-6-1 486 0,294 0,260 0, Реальное число 23900 Подразумевалось 23900 Таблица 11—3. Показатели обучения нейронных сетей для прогнозирования верхних точек разворота Корреляция Название Размер Число связей Корреляция после коррекции NN1.NET 18-4-1 76 0,103 0,088 0, NN2.NET 18-6-1 114 0,117 0,097 -0, NN3.NET 18-8-1 152 0,138 0,116 0, NN4.NET 18-10-1 190 0,158 0,133 0, NN5.NET 18-12-1 228 0,166 0,138 -0, NN6.NET 18-16-1 304 0,197 0,166 0, NN7.NET 18-20-1 380 0,218 0,183 0, NN8.NET 18-14-4-1 312 0,229 0,202 0, NN9.NET 18-20-6-1 486 0,274 0,240 0, Реальное число 25919 Подразумевалось 25919 ГЛАВА 11 НЕЙРОННЫЕ СЕТИ отстояли дальше друг от друга, резонно заключить, что избыточность в этой выборке будет ниже. При коррекции использовались следующие эффек тивные размеры выборок: 23 919 фактов (исходная) и 8000 (эффективная выборка со сниженным количеством фактов). После коррекции наилуч шие результаты были показаны самой большой из двух 4-слойных сетей, вторая 4-слойная сеть также была весьма результативной. Кроме этих двух сетей 3-слойная сеть с 10 нейронами среднего слоя также показала хоро шие результаты. Для тестирования торговой эффективности была выбра на большая сеть из 4 слоев (nn9.net) и маленькая сеть из трех слоев (nn4.net).

Прогнозирование максимумов. В табл. 11-3 приводятся показатели раз личных нейронных сетей, обученных на наборе из 25 919 фактов. Пока затели и здесь были напрямую связаны с размером сети — большее ко личество связей приводило к лучшему результату. После умеренной кор рекции коэффициентов корреляции только малая 4-слойная сеть не под чинилась этой закономерности, показав большую, чем ожидалось, кор реляцию. При более сильной коррекции (в расчете на высокую степень излишней подгонки под исходные данные) выделялись только две 4-слой ные сети, причем наибольшая сеть (nn9.net) показала самую высокую кор реляцию. Одна из 3-слойных сетей (nn4.net) также показала достаточно высокий результат и была отобрана для проведения собственно теста.

РЕЗУЛЬТАТЫ ТОРГОВЛИ ДЛЯ ВСЕХ МОДЕЛЕЙ В табл. 11-4 приведены лучшие показатели, полученные для данных, на ходящихся в пределах выборки, а также эффективность портфеля на дан ных в пределах и вне пределов выборки. Приведены показатели для всех комбинаций приказов, сетей и моделей. В таблице: ВЫБ — вид выборки данных (В — в пределах, ВНЕ — вне пределов выборки);

ДОХ% — доход ность в процентах годовых;

Р/ПРИБ — соотношение риска/прибыли в годовом исчислении;

ВЕР — ассоциированная вероятность статистичес кой достоверности;

СДЕЛ — число сделок на всех рынках в составе порт феля;

ПРИБ% — процент прибыльных сделок;

$СДЕЛ — средняя прибыль/ убыток со сделки;

ДНИ — средняя длительность сделки в днях;

ПРИБДЛ — общая прибыль от длинных позиций в тысячах долларов;

ПРИБКР— об щая прибыль от коротких позиций в тысячах долларов. Столбцы PI, P2, РЗ представляют значения параметров: Р1 — пороговое значение, Р2 — но мер нейронной сети (согласно табл. 11-1 — 11-3), РЗ— не использовался.

Во всех случаях приведены те пороговые значения Р1, которые обеспечи вали максимальную эффективность в пределах выборки. Вне пределов выборки были использованы те же значения.

Порог для обращенного во времени Медленного %К оптимизировал ся для каждого вида приказов с помощью прогонки параметра Р1 от 50 до ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК Таблица 11—4. Эффективность портфеля с лучшими параметрами по данным выборки для каждого из тестов в пределах и вне пределов выборки ГЛАВА 11 НЕЙРОННЫЕ СЕТИ Таблица 11—4. Эффективность портфеля с лучшими параметрами по данным выборки для каждого из тестов в пределах и вне пределов выборки (продолжение) 90 с шагом 1. Для моделей прогнозирования разворотных точек порого вые значения прогонялись от 20 до 80 с шагом 2. В обоих случаях оптими зация проводилась только в пределах выборки, и лучшие параметры за тем использовались и в пределах, и вне пределов выборки во время тести рования, как и в других главах этой книги.

Результаты торговли для модели, основанной на обращенном Медленном %К Две выбранные нейронные сети с максимальной вероятностью устойчи вой работы вне пределов выборки (согласно их скорректированным кор реляциям) были исследованы в отношении их торговой эффективности.

Первая сеть была 3-слойной (18-6-1 нейронов), вторая 4-слойной (18-14-4- нейронов).

272 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК Результаты для сети 18-6-1. В пределах выборки, как и ожидалось, результаты были великолепными. Средняя сделка приносила более $ прибыли при всех видах входов, годовая прибыль составляла от 192,9% (вход по цене открытия, тест 1) до 134,6% (вход по стоп-приказу, тест 3).

Такие результаты были получены на основе подгонки под данные слож ной модели из 114 свободных параметров. Стоит ли за этим что-то, кроме излишней подгонки? Видимо, да. При использовании входа по стоп-при казу вне пределов выборки удалось получить некоторую прибыль — сред няя сделка принесла $362. Хотя вне пределов выборки другие виды вхо дов были убыточными, эти убытки были меньше, чем наблюдавшиеся при тестировании других систем в предыдущих главах: при входе по цене от крытия убытки составляли только $233 в сделке, а при входе по лимитно му приказу (тест 2) — $331. Как это случалось и с другими моделями, вход по стоп-приказу работал лучше,чем вход по лимитному приказу. Вне пре делов выборки система была прибыльна со всеми видами входов при тор говле только длинными позициями. Короткие позиции были убыточны со всеми видами входов.

Эффективность системы в пределах выборки была потрясающей для всех видов входов и на всех рынках с несколькими исключениями. Наи худшей была эффективность на рынке евродоллара, видимо, ввиду свой ственных этому рынку высоких транзакционных расходов. Слабо рабо тала система на рынках серебра, соевого масла, казначейских облигаций и векселей, канадского доллара, британского фунта, золота и какао. Ви димо, особенности этих рынков затрудняют нейросети, поскольку осталь ные рынки были высокоприбыльными. Многие из этих рынков также работали плохо с другими моделями.

Вне пределов выборки торговля была успешной для всех видов прика зов на рынках казначейских облигаций (неприбыльных в пределах вы борки), немецкой марки, швейцарского франка, иены, неэтилированно го бензина, золота (также неприбыльного в пределах выборки), палладия и кофе. Многие другие рынки также были прибыльны с двумя или тремя видами входов. При использовании входа по стоп-приказу (наилучшего в целом) значительную прибыль приносили даже рынки S&P 500 и NYFE, а также живого скота, соевых бобов, соевой муки и овса.

На рис. 11-1 изображен график изменения капитала для модели на основе прогнозирования обращенного во времени Медленного %К с вхо дом по стоп-приказу. Как видно, капитал увеличивается в пределах вы борки и в течение половины периода вне выборки, после чего начинается медленное снижение.

Результаты для сети 18-14-4-1. Эта сеть в пределах выборки работала значительно лучше, чем вне ее пределов. В пределах выборки прибыль варьировалась от 328,9% в год (при входе по стоп-приказу, тест 6) до 534,7% (вход по цене открытия, тест 4). Во всех случаях средняя Прибыль в сделке Рисунок 11-1. График изменения капитала для модели, основанной на обращенном во времени Медлен ном %К, нейронная сеть 18-6-1, вход по стоп-приказу.

274 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК превышала $6000. Как обычно, длинные позиции были прибыльнее ко ротких. Вне пределов выборки все виды входов были убыточны, но, как и в предыдущем наборе тестов, эти убытки были меньше, чем характерные для торговых систем, описанных в других главах, т.е. ближе к $1000, чем к $2000. Эта сеть также проводила гораздо больше сделок, чем предыдущая, причем лучше всего работал вход по лимитному приказу (тест 5). Убытки длинных позиций были меньше, чем коротких, за исключением входа по стоп-приказу, где убыток коротких позиций был сравнительно неболь шим. Повышенная эффективность в пределах выборки и резкое падение эффективности за ее пределами — четкий признак избыточной подгон ки под данные, которой достигла большая сеть с 320 параметрами, под строившись под особенности учебного набора данных, но потеряв эффек тивность вне выборки.

В пределах выборки практически все рынки были прибыльны со все ми видами входов за тремя исключениями: серебро, канадский доллар и какао. Эти рынки в целом трудно поддаются любой системе. Вне преде лов выборки система была прибыльна со всеми видами входов на ряде рынков: немецкой марки, канадского доллара, сырой нефти, мазута, пал ладия, откормленного скота, живого скота и леса. По крайней мере с од ним из видов входов работали прибыльно еще несколько рынков.

График изменения капитала показывал постоянный рост вплоть до конца периода выборки, откуда начиналось плавное снижение, что харак терно для поведения переоптимизированной системы. Для выборки из 88 092 фактов такая нейронная сеть, возможно, была слишком большой.

Результаты торговли для модели, основанной на нижней точке разворота Две выбранные нейронные сети с максимальной вероятностью устойчи вой работы вне пределов выборки (согласно их скорректированным кор реляциям) были исследованы в отношении их торговой эффективности.

Ниже рассмотрена эффективность большей (18-20-6-1) и меньшей из них (18-10-1).

Результаты для сети 18-10-1. В пределах выборки эта сеть работала чрезвычайно прибыльно, что при такой степени подгонки неудивитель но. Вне пределов выборки и эта система относилась к числу сильно убы точных. Для всех трех видов входов (по цене открытия, по лимитному при казу и по стоп-приказу — тесты 7, 8 и 9 соответственно) средний убыток в сделке составил около $2000, что типично для многих рассмотренных ра нее убыточных моделей. Убытки были тем более примечательны, что мо дель вела торговлю только длинными позициями, обычно более выгодны ми, чем короткие.

ГЛАВА 11 НЕЙРОННЫЕ СЕТИ В пределах выборки только четыре рынка не были высокоприбыль ными: британский фунт, серебро, живой скот и кукуруза. Рынок сереб ра, как известно, вызывал проблемы у всех испытанных моделей. Вне пре делов выборки сеть приносила прибыль при всех видах входов на рынках S&P 500, иены, сырой нефти, неэтилированного бензина, палладия, соевых бобов и соевого масла. По крайней мере с одним из видов входов работа ли прибыльно еще несколько рынков. График изменения капитала пока зывал постоянный рост вплоть до конца периода выборки, откуда начи налось постоянное снижение.

Результаты для сети 18-20-6-1. Эти данные получены в тестах 10, 11 и 12 (вход по цене открытия, по лимитному приказу и стоп-приказу соот ветственно). Эффективность этой сети в пределах выборки взлетела до невероятного уровня. При входе по цене открытия годовая прибыль со ставила 768%, причем 83% из 699 сделок были прибыльны. Средняя при быль в сделке составила $18 588. Как ни странно, при большем размере этой сети и, следовательно, большей возможности подгонки под данные ее эффективность вне пределов выборки по показателю средней прибы ли в сделке превосходила меньшую по размерам сеть, особенно в случае входа по стоп-приказу, где убыток составил всего $518.

Все рынки в пределах выборки без исключения были прибыльными с использованием любых входов. Вне пределов выборки со всеми видами входов прибыльными были рынки S&P 500, британского фунта, платины, палладия, соевой муки, пшеницы, канзасской пшеницы, миннесотской пшеницы и леса.

Результаты торговли для модели, основанной на верхней точке разворота Две выбранные нейронные сети с максимальной вероятностью устойчивой работы вне пределов выборки (согласно их скорректированным корреляци ям) были исследованы в отношении их торговой эффективности. Ниже рас смотрена эффективность большей (18-20-6-1) и меньшей из них (18-10-1).

Результаты для сети 18-10-1. Как обычно, в пределах выборки эта сеть была чрезвычайно прибыльной. Вне пределов выборки прибыль была получена с использованием двух видов входных приказов — по цене от крытия (тест 13) и по лимитному приказу (тест 14). При использовании входа по стоп-приказу (тест 15) были получены умеренные убытки. Это неожиданно, учитывая то, что короткие позиции обычно бывали менее прибыльными, чем длинные.

Разбор отдельных рынков показывает, что в пределах выборки толь ко рынки канадского доллара, откормленного скота, соевого масла, пше 276 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК ницы и какао не были прибыльны со всеми тремя видами входов. Вне пре делов выборки при использовании всех трех входов значительные при были были получены на рынках немецкой марки, иены, сырой нефти, мазута, откормленного скота, живого скота и кукурузы. Прибыльность рынков иены, сырой нефти и до некоторой степени кукурузы соответ ствовала хорошей работе на этих рынках модели нижней точки разворо та. Вне пределов выборки эти рынки работали прибыльно с обеими моде лями точек разворота (нижней и верхней).

График изменения капитала (рис. 11-2 для входа по цене открытия) показывает резкий рост капитала до августа 1993 г., а затем более медлен ный подъем в течение всего остального периода выборки и двух третей периода вне выборки. После этого начинается плавное снижение.

Результаты для сети 18-20-6-1. Как и ожидалось, эта сеть, наибольшая из двух выбранных, показала самую высокую эффективность в пределах выборки. Вне пределов выборки эта сеть работала со всеми видами вхо дов отвратительно (тесты 16, 17и 18 — вход по цене открытия, по лимит ному приказу и стоп-приказу соответственно). Наименее убыточные ре зультаты были получены при использовании входа по стоп-приказу.

В пределах выборки только рынки серебра, пшеницы, сахара и апель синового сока не приносили прибыли со всеми тремя видами входов. Вне пределов выборки только рынок какао был прибылен со всеми тремя вхо дами. Как ни странно, все рынки металлов показывали высокие прибыли при входе по цене открытия и по лимитному приказу вне пределов вы борки, равно как и рынки откормленного скота, какао и хлопка.

Анализ капитала портфеля показывает невероятно гладкую и устой чивую прибыль в пределах выборки и убытки вне пределов выборки для всех видов входов.

ОБЗОР РЕЗУЛЬТАТОВ В табл. 11-5 и 11-6 приведены результаты работы всех моделей, основан ных на нейронных сетях на различных рынках. В первом столбце указано обозначение рынка, средний и правый столбцы содержат количество вы годных тестов для данного рынка. Цифры в первой строке указывают на номер теста. Последняя строка показывает, на скольких рынках данная модель была выгодной. Степень прибыльности и убыточности рынков для каждой модели указана следующим образом: один минус (—) означает убыток в $2000 — 4000, два минуса ( ) — убыток более $4000;

один плюс (+) означает прибыль от $1000 до $2000, два плюса (+ +) — прибыль бо лее $2000;

пустая ячейка означает прибыль до $1000 или убыток не более $1999 со сделки. (Названия рынков и их символы соответствуют обозна чениям табл. II-1;

часть II, введение.) В пределах выборки все виды входов Рисунок 11-2. График изменения капитала для модели, основанной на обращенном Медленном %К, нейронная сеть 18-10-1, вход по цене открытия.

ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК Таблица 11—5. Эффективность в пределах выборки по тестам и рынкам ГЛАВА 11 НЕЙРОННЫЕ СЕТИ Таблица 11—6. Эффективность вне пределов выборки по тестам и рынкам ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК Таблица 11—7. Эффективность нейронных сетей, распределенная по модели, виду приказа и выборке Модель В пределах выборки Вне пределов выборки Среднее По По По По По По В Вне открытию лимитному стоп- открытию лимитному стоп- пределах пределов приказу приказу приказу приказу Медленный обращенный %К, сеть 18-6- ДОХ% 129,9 181,9 153,9 -2,9 -2,9 2,7 176,2 -1, $СДЕЛ 6917 7879 6764 -233 -331 362 7187 - Медленный обращенный %К, сеть 18-14-4- ДОХ% 534,7 547,4 328,9 -17,7 -17,4 -16,2 470,3 -17, $СДЕЛ 7080 8203 6304 -1214 -961 -1154 7196 - Точка разворота, длинные сделки, сеть 18-10- ДОХ% 311.1 308,4 236,8 -16,8 -16,1 -11,1 285,4 -14, $СДЕЛ 9316 9373 10630 -2327 -2197 -2868 9773 - Точка разворота, длинные сделки, сеть 18-20-6- ДОХ% 768,0 742,0 468,8 -13,4 -12,7 -1,8 659,6 -9, $СДЕЛ 18588 18569 16392 -2001 -1886 -518 17516 - Точка разворота, короткие сделки, сеть 18-10- ДОХ% 206,8 209,0 175,4 12,1 8,0 -6,2 197,1 4, $СДЕЛ 8448 8701 12553 580 405 -1138 9901 - Точка разворота, короткие сделки, сеть 18-20-6- ДОХ% 601,9 603,8 387,3 -19,4 -19,7 -22,5 531,0 -20, $СДЕЛ 18550 18905 6320 -5314 -5163 -2076 14592 - Среднее ДОХ% 435,9 432,1 291,8 -9,7 -10,1 -9,2 386,6 -9, $СДЕЛ 11483 11938 9661 -1752 -1689 -1232 11027 - со всеми моделями давали огромные прибыли (табл. 11-7). При усредне нии по всем моделям лучше всего работали входы по цене открытия и по лимитному приказу, а хуже всего вход по стоп-приказу, но разница была очень небольшой. В пределах выборки наибольшая средняя прибыль в сделке отмечена для больших сетей на принципе максимальной и мини мальной точек разворота. Вне пределов выборки лучше всего работал вход по стоп-приказу. В общем, лучше всего при усреднении по входам работа ли модель на обращенном во времени Медленном %К и модель на верх ней точке разворота.

ГЛАВА 11 НЕЙРОННЫЕ СЕТИ ЗАКЛЮЧЕНИЕ При первой попытке применить для анализа индивидуальных рынков нейронную сеть (Katz, McCormick, ноябрь 1996) мы пришли к выводу о полной бесполезности такого подхода. Поведение некоторых из прове денных сейчас тестов вне пределов выборки немного обнадеживает по сравнению с нашим опытом исследования простых нейронных сетей.

Эти результаты, почти несомненно, обусловлены большим количеством точек данных в обучающем наборе, включающем все рынки в составе портфеля, а не какой-либо один рынок. В общем, чем больше выборка, используемая для обучения (или оптимизации), тем больше вероятность сохранения положительной эффективности вне ее пределов. Увеличить размер выборки можно, используя более старые данные, что вполне воз можно для ряда включенных в наше исследование рынков. Кроме того, можно ввести в портфель дополнительные рынки, что, возможно, пред ставляет собой оптимальный способ улучшения обучающего набора.

Принцип оптимизации состоит в том, что вероятность устойчивых ре зультатов повышается со снижением количества параметров модели. Учи тывая в чем-то положительные результаты некоторых из тестов, возмож но, имеет смысл продолжать исследования с более усложненными моделя ми. Как вариант можно было бы улучшить предварительную обработку данных в смысле уменьшения общего числа вводов без потери важной про гностической информации — это может сделать систему очень прибыль ной. При меньшем количестве вводов в сети будет меньше связей для оцен ки, следовательно, подгонка под кривую — важная проблема, судя по ре зультатам и уровням усадки, — будет представлять меньшую угрозу.

ЧТО МЫ УЗНАЛИ?

При выполнении некоторых условий нейронные сети могут использоваться в системной торговле. Критическим моментом для избежания вредной подгонки под исторические данные (в противоположность полезной оптимизации) является дости жение адекватного соотношения размера выборки данных и количества свободных параметров сети.

• Подгонка под исторические данные является значительной проблемой при использовании нейронных сетей. Следует об ращать внимание на любой метод, способный уменьшить об щее количество свободных параметров без потери важной информации, например тщательную предварительную обра ботку и сжатие информации.

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

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

Одни рынки, следовательно, больше подходят для применения определенных методов, чем другие. Поиск подходящих рын ков на основе эффективности вне пределов выборки может стать полезным подходом при разработке и использовании тор говых систем на основе нейронных сетей.

ГЛАВА Генетические алгоритмы Основываясь на моделях, используемых в биологии и экономике, мате матик и психолог Джон Холланд (John Holland) разработал алгоритм ге нетической оптимизации. Алгоритм впервые был опубликован в книге Холланда «Адаптация в естественных и искусственных системах» (J. Holland, Adaptation in Natural and Artificial Systems, 1975). Генетичес кие алгоритмы (ГА) впервые стали применяться в компьютерных дисцип линах в начале 1990-х годов (Yuret and de la Maza, 1994). Торговое сообще ство впервые обратило на них внимание около 1993г., когда появилось несколько статей (Burke, 1993;

Katz and McCormick, 1994;

Oliver, 1994) и компьютерных программ. С тех пор несколько фирм добавили генетичес кое обучение в свои программные пакеты, а у некоторых есть даже про граммы генетической оптимизации профессионального уровня.

В торговом обществе ГА никогда не пользовались таким успехом, как нейронные сети. Популярность этой технологии никогда не росла из-за самой ее природы. Среднему человеку трудно понять генетический алго ритм и более чем сложно применять его правильно. Однако, по нашему мнению, ГА могут быть крайне выгодны для проектировщиков торговых систем.

В данной книге представлен общий обзор ГА и их применения в торгов ле. Читателям, заинтересованным в детальном изучении этого предмета, следует прочитать книгу Девиса (Davis, 1991), а также нашу главу в книге «Virtual Trading» (Katz, McCormick, 1995a, 1995b) и наши статьи (Katz, McCormick, июль/август 1994, декабрь 1996, январь 1997, февраль 1997).

ЧТО ТАКОЕ ГЕНЕТИЧЕСКИЕ АЛГОРИТМЫ?

Генетический алгоритм решает проблему, используя процесс, подобный биологическому развитию. Он работает как рекомбинация и мутация ге нетических последовательностей. Рекомбинация и мутация — генетичес кие операторы, т.е. они управляют генами. Ген — это последовательность кодов (генотипов), которая содержит всю информацию, необходимую для 284 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК того, чтобы создать функциональный организм с определенными харак теристиками (генотипом). Хромосома — последовательность генов. В слу чае генетической оптимизации, используемой для решения задач, связан ных с торговлей, последовательность кодов обычно принимает форму ряда чисел.

При моделировании эволюционного процесса ГА участвует в отборе и сопряжении членов из популяции (хромосом). Сопряжение — это про цесс, содержащий скрещивание и мутацию. При скрещивании элементы, которые включают гены различных хромосом (члены популяции или ре шения), комбинируются, чтобы создавать новые хромосомы. Мутацией называют возникновение случайных изменений в этих элементах. Это обеспечивает дополнительное изменение в наборах создаваемых хромо сом. Как и в процессе биологического отбора (где менее пригодные чле ны популяции оставляют меньше потомства), менее пригодные решения удаляются. При этом более пригодные решения размножаются, создавая другое поколение решений, которое может содержать несколько лучшие решения, чем предыдущие. Процесс рекомбинации, случайной мутации и отбора является чрезвычайно мощным механизмом решения задач.

РАЗВИТИЕ МОДЕЛЕЙ ВХОДА, ОСНОВАННЫХ НА ПРАВИЛАХ Что бы произошло, если ГА позволяли искать не просто лучшие парамет ры (именно так чаще всего используют ГА), но и лучшие правила? В этой главе приводится результат использования ГА для развития законченной модели входа путем поиска оптимальных правил и параметров для этих правил. Несмотря на сложность, эта методология оказалась эффективной в нашем первом исследовании (Katz, McCormick, февраль 1997).

Как можно использовать ГА для поиска наилучших торговых правил?

Доморощенный ГА просто жонглирует числами. Необходимо найти спо соб нумерации различных наборов правил. Этого можно достичь мно гими способами. Простой и эффективный метод включает в себя пост роение набора шаблонов правил. Шаблон правила — это частичное опи сание правила с оставленными пробелами, которые необходимо запол нить. Например, если некоторые из правил предыдущих глав рассмот реть как шаблоны правил, то пробелами будут значения периодов ус реднения, порогов и других параметров. Шаблоны правил, определен ные таким образом, несложно пронумеровать, поставив в соответствие каждому шаблону набор чисел. Первое число в наборе используется как индекс в таблице шаблонов правил. Оставшиеся числа набора исполь зуются для заполнения пробелов в шаблоне, в результате чего мы полу чаем четко определенное правило. Приведенный ниже компьютерный код содержит функцию C++ (Rules), которая производит нумерацию шаблонов;

она будет описана позже. Хотя в данном исследовании ис ГЛАВА 12 ГЕНЕТИЧЕСКИЕ АЛГОРИТМЫ пользовался язык C++, данный метод также можно реализовать в TradeStation с помощью программы TS-EVOLVE, созданной Scientific Consultant Services (516-696-3333).

Термин генетический поиск означает использование ГА для поиска са мых лучших решений, т.е. имеющих максимальную функцию пригоднос ти. Как правило, набор потенциальных решений, в котором ведется поиск, достигает огромных размеров. В данном приложении мы хотим использо вать эволюционный процесс, чтобы выявить набор чисел (генотипов), ко торые соответствуют основанным на правилах моделям входов (феноти пам) с максимальной функцией пригодности (или торговой эффективнос ти). Иными словами, мы собираемся заняться селективным выращивани ем методов входа, основанных на правилах! Вместо того чтобы начинать с конкретного принципа, на котором основывается модель (сезонность, про бой), в данном случае для начала возьмем набор идей, которые могут спо собствовать созданию выгодного метода входа. Вместо того чтобы после довательно проверять ценность этих подходов, будет сделано нечто не обычное: генетическому процессу эволюции представится возможность создать наилучшую модель входа из набора необработанных идей.

ГА будут искать в чрезвычайно большом множестве решений наилуч шую модель входа, которая может быть получена для определенных дан ных и шаблонов правил. Количество правил для каждой модели будет ог раничено во избежание подгонки под исторические данные. Данная за дача сводится к поиску оптимальных наборов чисел. Без использования ГА такой массированный поиск решений был бы практически невозмо жен и неразумен в любом смысле. Конечно, вместо ГА всегда можно осу ществить лобовую оптимизацию — особенно, если вы располагаете не сколькими тысячелетиями на проведение этой работы. В качестве другой альтернативы можно воспользоваться эмпирическим поиском оптималь ных правил, т.е. попытаться найти наилучшие правила с помощью наблю дений, однако этот подход не обязательно позволит максимизировать та кую сложную функцию, как соотношение риск/прибыль. ГА обеспечи вают эффективный способ выполнения очень больших поисков, особен но когда нет простых эвристических методов решения данной задачи.

ЭВОЛЮЦИОННЫЙ ПОИСК МОДЕЛИ ВХОДА В данном примере популяция моделей входа с тремя правилами была по лучена с помощью генетического оптимизатора OptEvolve, написанного на С ++ (Scientific Consultants Services, 516-696-3333). Каждый ген соответ ствует блоку из четырех чисел и шаблону правила — таким образом созда ется соответствие наборов чисел и наборов правил. Каждая хромосома со держит три гена и состоит из 12 чисел: первые четыре числа соответству ют первому гену (или правилу), следующие четыре соответствуют второ 286 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК му гену (или правилу), а последние четыре соответствуют третьему гену (или правилу). ГА должен знать размер гена, чтобы не разрушить важные гены при выполнении скрещивания. Скрещивание должно произойти толь ко на границах генов (блоков из четырех чисел). В настоящем примере это будет достигнуто путем приравнивания размера гена, который является параметром генетического оптимизатора, к четырем. Как упомянуто, каж дый ген составлен из четырех чисел. Первое число является индексом в таблице возможных шаблонов правил. Например, если это число 1, то вы бирается шаблон сравнения цен, в котором различие между двумя ценами закрытия сравнивается с некоторым порогом (см. код). Остальные три чис ла в гене соответствуют значению порога и двум анализируемым перио дам для сравниваемых цен. Если первое число из блока 4 чисел равно 2, то будет выбран шаблон сравнения цены и скользящего среднего. В этом слу чае два из оставшихся трех чисел контролировали бы период скользящего среднего и направление сравнения (должна ли цена быть выше или ниже скользящего среднего). Вообще, если первое число в блоке из четырех чи сел равно n, тогда используется шаблон для правила n, а любые требуемые параметры определены оставшимися тремя числами в блоке из четырех чисел. Эта схема кодирования облегчает поддержание расширяемой базы данных для шаблонов правил. Каждый из трех блоков четырех чисел свя зан с соответствующим правилом. Модель входа, состоящая из трех пра вил, соответствует любой хромосоме, состоящей из 12 чисел.

Шаблоны правил Первый шаблон правила (case l в функции Rules) определяет сравнение между двумя ценами и порогом: правило принимает значение ИСТИНА (TRUE), если цена закрытия 1b1 дней назад больше, чем некоторый поро говый фактор (thr) плюс цена закрытия 1b2 дней назад. В остальных случа ях правило принимает значение ЛОЖЬ (FALSE). Неизвестные (1b1, 1b2 и thr) оставлены пустыми для будущего использования при реализации про граммы. Этот шаблон был включен, потому что тот вид правил, которые он представляет, был полезен в предыдущих исследованиях.

Второй шаблон правила (case 2) включает простые скользящие сред ние, которые часто используются для определения тренда. Обычно счи тается, что рынок будет двигаться вверх, если цена выше ее скользящего среднего, и опускаться вниз, если цена ниже ее скользящего среднего. В шаблоне присутствуют только два неизвестных: первый (per) контроли рует число дней в скользящем среднем и второй (v4) контролирует на правление сравнения (выше или ниже).

Третий шаблон правила (case 3) идентичен второму (case 2), за исклю чением того, что вместо простого скользящего среднего используется экс поненциальное.

ГЛАВА 12 ГЕНЕТИЧЕСКИЕ АЛГОРИТМЫ Было много рассуждений относительно важности данных по суммар ной величине открытых позиций на рынке (открытому интересу). Лэрри Виллиамс (Larry Williams, 1979) упомянул, что снижение открытого инте реса в течение периодов застоя цен указывает на потенциал для сильного подъема. Сокращение открытого интереса может быть интерпретирова но как снижение количества обращающихся на рынке контрактов, созда вая условия, когда спрос на контракты может перевесить предложение.

Четвертый шаблон правила (case 4) просто вычисляет процентное сниже ние открытого интереса за период от 1Ь1 дней назад до 1 дня назад (откры тый интерес, как правило, не публикуется для текущего дня) и сравнива ет эту величину с порогом (thr). Если снижение больше, чем порог, то пра вило принимает значение ИСТИНА. В остальных случаях оно принимает значение ЛОЖЬ. Порог и период (1b1) — неизвестные, которые будут ис пользованы при реализации программы.

Пятый шаблон правила (case 5) подобен четвертому шаблону, но рас считывает повышение, а не падение открытого интереса. Если происхо дит увеличение, большее чем пороговое значение, то правило возвра щает значение ИСТИНА. Другие ситуации соответствуют значению ЛОЖЬ.

Шестой шаблон правила (case 6) может называться условием «нового максимума». Шаблон запрашивает, отмечен ли 1b1-дневный новый мак симум за период последних 1b2 дней. К примеру, правило может звучать так: «Если достигнут новый 50-дневный максимум в пределах последних 10 дней, то правило принимает значение ИСТИНА, в других случаях — ЛОЖЬ». Это правило пытается найти простое условие пробоя, учитывая пробои, которые произошли несколько дней назад (возможно, сопровож даемые откатами к предыдущим уровням сопротивления, ставшими уров нями поддержки, что расценивается другим правилом как хорошая точка входа). В данном правиле есть два пробела, которые необходимо будет заполнить при проведении расчетов: 1b1 и 1b2.

Седьмой шаблон правила (case 7) идентичен шестому, за исключени ем того, что определяются новые минимумы, а не новые максимумы.

Восьмой шаблон правила (case 8) исследует индекс среднего направ ленного движения относительно двух порогов (thr1 и thr2). Этот индика тор является мерой наличия тренда, как обсуждалось в главе, посвящен ной пробоям. Если среднее направленное движение (ADX) выше нижне го порога и ниже верхнего порога, то правило возвращает значение ИС ТИНА. В других случаях правило возвращает значение ЛОЖЬ.

Девятый шаблон правила (case 9) выполняет сравнение порогов со значением стохастического осциллятора, аналогично шаблону 8.

Десятый шаблон правила (case 10) оценивает направление наклона осциллятора MACD. Длины (1b1 и 1b2) двух скользящих средних, которые составляют MACD, и направление наклона (v4) необходимы для выбора значения ИСТИНА или ЛОЖЬ и определены как параметры.

288 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК МЕТОДОЛОГИЯ ТЕСТИРОВАНИЯ Ниже приводятся шаги, необходимые для эволюционного создания мо дели входа, основанной на шаблонах правил, используемых в этом иссле довании:

1. Выберите произвольную хромосому с 12 элементами. Она представляет собой потенциальное решение (случайное и, ве роятно, не очень хорошее).

2. Поставьте в соответствие каждому параметру правил опреде ленное число, чтобы получить три полностью определенных правила (одно для каждого гена), и определите значение ИСТИНА/ЛОЖЬ для всех дней во временном ряду.

3. Обработайте ценовые данные день за днем. Если в данный день все три правила возвращают значение ИСТИНА и если нет те кущей длинной (или короткий) позиции, то модель получает рыночный приказ на покупку (или продажу) при завтрашнем открытии.

4. Если имеется позиция, используйте стандартную стратегию выхода для осуществления выхода.

5. Оцените торговую эффективность потенциального решения.

Для этого определите «пригодность решения» как соотноше ние риск/прибыль в годовом выражении — величина, кото рая фактически является значением {-критерия.

6.. Сообщите генетическому оптимизатору, насколько пригодно (в вышеупомянутом смысле) потенциальное решение (хромо сома). Это позволит генетическому оптимизатору обновить по пуляцию хромосом.

7. Если решение отвечает определенным критериям, то следует сгенерировать сводку эффективности системы и другую ин формацию и сохранить эти данные в файле для последующе го рассмотрения.

8. Повторять вышеупомянутые шаги снова и снова до тех пор, пока не пройдет достаточное число «поколений».

Так как вышеупомянутые шаги повторяются, решения или «поколе ния», созданные генетическим оптимизатором, в среднем становятся луч ше и лучше. Большое количество отдельных эффективных решений по явится в течение эволюционного процесса. Большинство решений будет записано в файле, созданном в ходе неоднократного выполнения первых семи вычислительных шагов. Ниже будет рассмотрен код, написанный на C++, который осуществляет вышеупомянутые шаги.

ГЛАВА 12 ГЕНЕТИЧЕСКИЕ АЛГОРИТМЫ Из-за природы правил, вероятно, будет различным поведение моде лей при открытии длинных и коротких позиций. В связи с этим модели входа для длинных позиций найдены и проверены отдельно от моделей входа для коротких позиций. Эффективность модели оценивается на всем портфеле. Цель состоит в том, чтобы найти набор правил, которые обес печивают наилучшую эффективность торговли всем портфелем финан совых инструментов. Процедура, используемая здесь, отличается от на ших более ранних исследований (Katz, McCormick, февраль 1997), где по иск оптимальных правил проводился на каждом рынке в отдельности -— подход, в большей степени подверженный эффектам «вредной» подгон ки под исторические данные. Напомним вывод, полученный в отноше нии нескольких моделей, которые были первоначально оптимизированы на индивидуальных инструментах: при использовании одной модели для всех рынков без оптимизации или настройки под отдельный рынок эф фективность данной модели может существенно понизиться. В нижесле дующих тестах использовалась стандартная платформа C++, стандарт ные приказы входа и стратегия выхода.

static int EventPresent (int *es, int m, int cb) { // Используется функцией Rules для облегчения кодирования int i ;

for(i=cb-m+l;

i<=cb;

i++) if(es[i]) return TRUE;

return FALSE ;

} static void Rules (float *opn, float *hi, float *lo, float *cls, float *vol, float *oi, float *atr, int nb, int vl, float v2, float v3, float v4, int *ans) { // Процедура определяет шаблоны правил, используемых // в генетическом процессе эволюции модели, основанной на правилах.

// opn, hi, lo, cls — стандартные ценовые данные [l..nb] // vol, oi — объем и открытый интерес [l..nb] // nb — количество дней // vl, v2, v3, v4 — селектор правил и параметры // ans — выходные ценовые данные [l..nb] // локальные макрофункции #define LinearScale(х,a,b) ( (х)* ( {b}-(а))/1000.0+(а) ) #define BiasedPosScale(х,а) (0. 000001*(х)*(х)*{а}) #define Compare{a,b,dir) (((dir)> = 0)?((a)>(b) }: (fa)<(b))) // локальные переменные static int lbl, lb2, per, cb, maxlb=100;

static float thr, fac, thr2, thrl, tmp, tiny=l.ОЕ-20;

static int IsNewHigh[MAXBAR+l], IsNewLow[MAXBAR+l];

static float Serl[MAXBAR+1] ;

// шаблоны правил switch(vl} { // выбираем правило case 1: // сравнение изменения цены с порогом 290 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК lb1 = (int)BiasedPosScale(v2, 50. 0);

lb2 = (int)BiasedPosScale(v3, 50. 0);

fac = LinearScale(v4, -2.5, 2. 5) * sqrt(abs(lbl - Ib2)>;

for(cb-maxlb;

cb<=nb;

cb++) { thr = fac * atr [cb];

ans[cb] = cls[cb-lbl] - cls[cb-lb2] > thr;

] break;

case 2: // сравнение цены с простым скользящим средним per = 2 + (int)BiasedPosScale(v2, 48.0);

Averages(Serl, cls, per, nb) ;

for(cb=maxlb;

cb<=nb;

cb++) ans[cb] = Compare(cls[cb], Serl[cb], V4-500.0);

break;

case 3: // сравнение цены с экспоненциальным скользящим средним per = 2 + (int)BiasedPosScale(v2, 48.0);

XAverageS(Serl, cls, per, nb) ;

for(cb-maxlb;

cb<=nb;

cb++) ans[cb] = Compare(cls[cb], Serl[cb], V4-500.0);

break;

case 4: // сравнение падения открытого интереса с пороговым значением 1b1 = 2 + (int)BiasedPosScale (v2, 48.0);

thr = LinearScale(v3, 0.01, 0.50);

for{cb=maxlb;

cb<=nb;

cb++) { tmp = (oi[cb-lbl] - oi[cb-l]) / (oi [cb-lbl] + tiny);

ans [cb] = tmp > thr;

] break;

case 5: // сравнение увеличения открытого интереса с пороговым значением 1b1 = 2 + (int) BiasedPosScale(v2, 48.0);

thr = LinearScale(v3, 0.01, 0.99);

for(cb=maxlb;

cb<=nb;

cb++) { tmp = (oi [cb-1] - oi[cb-lblj) / (oi [cb-lbl] + tiny) ;

ans [cb] = tmp > thr;

} break;

case 6: // недавние новые максимумы 1bl = 2 + (int)BiasedPosScale(v2, 48.0);

1b2 = 1 + (int)BiasedPosScale(v3, 8.0);

for(cb=lbl+3;

cb<=nb;

cb++) IsNewHigh[cb] = hi [cb] > Highest(hi, 1b1, cb-1);

for(cb-maxlb;

cb<=nb;

cb++) ans[cb] = EventPresent(IsNewHigh, 1b2, cb) ;

break;

case 7: // недавние новые минимумы 1bl = 2 + (int)BiasedPosScale(v2, 48.0);

1b2 = 1 + (int)BiasedPosScale(v3, 8.0);

for(cb=lbl+3;

cb<=nb;

cb++) IsNewLow[cb] = lo[cb] < Lowest(lo, 1b1, cb-1) ;

for(cb=maxlb;

cb<=nb;

cb++) ans[cb] = EventPresent(IsNewLow, 1b2, cb);

break;

case 8: // среднее направленное движение thrl = LinearScale(v2, 5.0, 50.0);

thr2 = thrl + LinearScale(v3, 5.0, 20.0);

ГЛАВА 12 ГЕНЕТИЧЕСКИЕ АЛГОРИТМЫ AvgDirMov{hi, lo, cls, nb, 14, Serl);

for(cb=maxlb;

cb<=nb;

cb++) ans [cb] = (Serl[cb] > thrl && Serl [cb] < thr2) && Compare (Serl[cb], Serl[cb-l], v4-500.0);

break;

case 9: // Медленный %К thr = LinearScale(v2, 5.0, 95.0);

fac = LinearScale(v3, 1.0, 20.0);

thrl = thr - fac;

thr2 = thr + fac;

StochOsc(Serl, hi, lo, cls, 2, 10, nb) ;

for(cb=maxlb;

cb<=nb;

cb++) ans [cb] = (Serl[cb) > thrl && Serl [cb] < thr2) && Compare(Serl[cb], Serl[cb-1], V4-500.0);

break ;

case 10: // направление наклона MACD lb1 = 2 + (int)BiasedPosScale(v2, 18.0);

lb2 = lbl + 1 + (int)BiasedPosScale(v3, 48.0);

MacdOsc(Serl, cls, 1, lbl, lb2, nb) ;

for(cb=maxlb;

cb<=nb;

cb++) ans[cb] = Compare(Serl[cb], Serl[cb-2], v4-500. 0),• break;

default:

nrerror("Undefined rule template selected");

break;

] // первые maxlb элементов результата должны иметь значение ЛОЖЬ memset (&ans [1], 0, sizeof(*ans) * maxlb);

#undef BiasedPosScale #undef LinearScale } 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 = xl6modOl.c // parms — набор [1..MAXPRM] параметров // dt — набор [1..nb] дат в формате ГГММДД // орn - набор [l..nb] цен открытия // hi — набор [l..nb] максимальных цен // 1о — набор [l..nb] минимальных цен // cls - набор [l..nb] цен закрытия // vol — набор [l..nb] значений объема // oi - набор [l..nb] значений открытого интереса // dlrv — набор [l..nb] средней долларовой волатильности // nb — количество дней в наборе данных // ts — ссылка на класс торгового симулятора // eqcls — набор [l..nb] уровней капитала при закрытых позициях // описываем локальные переменные static int rc, cb, ncontracts, maxhold, ordertype, signal;

static int disp, k, modeltype;

static float mmstp, ptlim, stpprice, limprice, tmp;

static float exitatr[MAXBAR+1] ;

static int rulel[MAXBAR+1], rule2[MAXBAR+1], rule3[MAXBAR+1];

292 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК // копируем параметры в локальные переменные для более удобного обращения к ним modeltype = parms[14];

// модель: 1=длинная позиция, 2=короткая ordertype = parms[15];

// вход: 1=на открытии, 2=по лимитному приказу, // 3=по стоп- приказу maxhold =10;

// максимальный период удержания позиции ptlim = 4;

// целевая прибыль в единицах волатильности mmstp = 1;

// защитная остановка в единицах волатильности // выполнение расчетов для всей ценовой информации AvgTrueRangeS(exitatr,hi,lo,cls,50,nb);

// средний истинный диапазон для // выхода switch(modeltype) { case 1: case 2: // для моделей открытия длинных и коротких позиций // для каждого дня отдельно оценить три правила Rules (opn, hi, lo, cls, vol, oi, exitatr, nb, parms[1], parms[2], parms[3], parms[4], rulel);

Rules (opn, hi, lo, cls, vol, oi, exitatr, nb, parms[5], parms[6], parms[7], parms[8], rule2);

Rules (opn, hi, lo, cls, vol, oi, exitatr, nb, parms[9], parms[10], parms[11], parms[12], rule3};

break;

default: nrerror("Invalid model type");

/ проходим через дни, чтобы моделировать настоящую торговлю or(cb = 1;

cb <= nb;

cb++) { // не открываем позиций до начала периода выборки //... то же самое, что установка MaxBarsBack в TradeStation if(dt[cb] < IS_DATE) { eqcls[cb] = 0.0;

continue;

} // выполняем все ожидающие приказы и сохраняем значение капитала по // закрытию rс = ts.update(opn[cb], hi[cb], lo [cb], cls[cb], cb};

if(rc != 0) nrerror("Trade buffer overflow");

eqcls[cb] = ts.currentequity {EQCLOSETOTAL};

// подсчитываем количество контрактов для торговли //... мы хотим торговать долларовым эквивалентом волатильности //... 2 новых контрактов S&P-500 на 12/31/ ncontracts - RoundToInteger(5673.О / dlrv[cb] ) ;

if(ncontracts < 1) ncontracts = 1;

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

// генерируем входные сигналы, цены стоп- и лимитных приказов signal = 0;

switch(modeltype) { case 1: // только длинные позиции if(rulel[cb] && rule2 [cb] && rule3[cb]) signal = 1;

break;

case 2: // только короткие позиции if(rulel[cb] && rule2 [cb] && rule3[cb]} signal = -1;

break;

] limprice = 0.5 * (hi[cb] + lo [cb]);

stpprice = cls[cb] + 0.5 * signal * exitatr[cb] ;

// открываем позицию, используя определенные типы приказов if(ts.position(} <= 0 && signal == 1} { switch(ordertype) { // выбираем нужный тип приказа ГЛАВА 12 ГЕНЕТИЧЕСКИЕ АЛГОРИТМЫ 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);

] // обрабатываем следующий день ] C++ код описывает шаблоны правил и стратегию торговой системы.

Шаблоны правил определяются с помощью функции Rules. Аргументы v1, v2, v3 и v4 (четыре числа, которые содержит каждый ген) несут всю ин формацию, требуемую для реализации шаблонов правил. Аргумент v используется для выбора требуемого шаблона правила из 10 доступных;

аргументы v2, v3 и v4 используются для определения требуемых парамет ров каждого правила (направления сравнения, периоды скользящих сред них и т.д.). Затем правило оценивается на всех днях, и оценки (1 для ИСТИНА, 0 для ЛОЖЬ) помещаются в вектор cms, возвращающий резуль таты функции.

Макрос BiasedPosScale (x, а) используется для создания соответствия между целыми числами от 0 до 1000 и непрерывным диапазоном от 0 до а.

Макрос используется, чтобы вычислить периоды обратного обзора для определения ценовых экстремумов и периоды скользящих средних v2, v или v4, значения которых получены из генетического алгоритма и прону мерованы целыми числами от 0 до 1000. Соответствие между номерами от 1 до 1000 и числами из диапазона от 0 до а нелинейно — оно устроено так, чтобы можно было более детально исследовать меньшие значения параметров. Например, предположим, что период скользящего среднего изменяется от 2 до 100 дней. Необходимо с одинаковой точностью произ водить выбор лучшего решения между периодами 2, 3 и 4 и периодами 30, 50 и 90. Точность поиска должна быть выше для маленьких чисел. Это свя зано с тем, что изменение периода скользящего среднего от 2 до 5 дней сильнее повлияет на результаты торговли, чем изменение от 50 до 60.

Макрос LinearScale (x, а, b) выполняет линейную адресацию целочис ленного диапазона 0... 1000 к диапазону а.... Макрос обычно использу ется при вычислении порогов или отклонений. В коде шаблона правила все параметры вычислены внутри функции Rules, а не внутри ГА. Генети 294 ЧАСТЬ II ИССЛЕДОВАНИЕ входов в РЫНОК ческии алгоритм имеет инструкцию генерировать числа в диапазоне от 0 до 1000, за исключением элементов хромосом 1, 5 и 9, которые являются первыми числами в каждом гене и используются в качестве селекторов шаблонов правил. Масштабирование проводится внутри функции Rules, так как шаблоны для различных видов правил имеют различные диапазо ны изменения параметров и контрольных значений.

Процесс эволюции торговых систем начинается со случайного выбо ра значений хромосомы. Генетический оптимизатор выбирает два члена популяции и спаривает их (исходя из определения скрещивания, нормы мутации и размера гена). Затем полученное потомство возвращается как потенциальное решение. Когда компоненту ГА сообщают об эффектив ности полученного решения, он сравнивает ее с наименее пригодным чле ном популяции. Если пригодность потомства больше, чем у наименее при годного члена, то ГА заменяет наименее пригодный член решения полу ченным потомством. Этот процесс повторяется в течение нескольких по колений и осуществляется с помощью программной оболочки (не приве денной в данной книге), которая, в свою очередь, делает повторные запросы к функции Model для моделирования торговли и оценки пригод ности системы.

Код функции Model почти идентичен используемому в более ранних главах. До цикла индексации дней, в котором генерируются приказы для торговли, функция Rules вызывается три раза (один раз для каждого гена), и результаты помещаются во временные ряды rule1, rule2 и ruleЗ. При этом также подсчитывается средний истинный диапазон за последние 50 дней, поскольку это необходимо для стандартного выхода и оценки правил. Внут ри цикла оценивание правил производится для текущего дня (rulel[cb], rule2[cb], rule3[cb]), и если все оценки возвращают значение ИСТИНА, то генерируется сигнал на покупку (или продажу, если исследуются входы в короткую позицию). Входы запрограммированы стандартным способом для каждого из трех тестируемых приказов. В эволюционном процессе используются только данные из выборки.

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

Pages:     | 1 |   ...   | 3 | 4 || 6 | 7 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.