<< Пред. стр.

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

ОГЛАВЛЕНИЕ

След. стр. >>

if(rc != 0) nrerror("Trade buffer overflow");
eqcls[cb] = ts.currentequity {EQ__CLOSETOTAL};

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

// избегаем устанавливать приказы на дни с ограниченной торговлей
if(hi[cb+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) { // выбираем нужный тип приказа
ГЕНЕТИЧЕСКИЕ АЛГОРИТМЫ 293
ГЛАВА 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 (четыре числа, которые содержит каждый ген) несут всю ин-
формацию, требуемую для реализации шаблонов правил. Аргумент v1
используется для выбора требуемого шаблона правила из 10 доступных;
аргументы v2, v3 и v4 используются для определения требуемых парамет-
ров каждого правила (направления сравнения, периоды скользящих сред-
них и т.д.). Затем правило оценивается на всех днях, и оценки (1 для
ИСТИНА, 0 для ЛОЖЬ) помещаются в вектор cms, возвращающий резуль-
таты функции.
Макрос BiasedPosScale (x, а) используется для создания соответствия
между целыми числами от 0 до 1000 и непрерывным диапазоном от 0 до а.
Макрос используется, чтобы вычислить периоды обратного обзора для
определения ценовых экстремумов и периоды скользящих средних v2, v3
или 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]), и если все оценки возвращают значение ИСТИНА, то
генерируется сигнал на покупку (или продажу, если исследуются входы в
короткую позицию). Входы запрограммированы стандартным способом
для каждого из трех тестируемых приказов. В эволюционном процессе
используются только данные из выборки.
Выходные данные, полученные от программной оболочки, позволяют
выбрать желаемое решение, которое можно использовать в торговле от-
дельно или в группе моделей. Решения могут быть легко сформулирова-
ны как понятные правила для оценки их «физического смысла» и исполь-
зования их в качестве элементов других систем.


РЕЗУЛЬТАТЫ ТЕСТОВ
Были выполнены шесть тестов. Эволюционный процесс использовался для
поиска оптимальных правил входа в длинные и короткие позиции с каж-
дым из трех приказов для входа: по цене открытия, стоп-приказу и лимит-
ному приказу. Во всех случаях было создано 2500 поколений генетичес-
ГЕНЕТИЧЕСКИЕ АЛГОРИТМЫ 295
ГЛАВА 12




кой обработки. Задача вычисления всех решений и сохранения их в фай-
лы потребовала всего несколько часов на быстром Pentium, что демонст-
рирует практическую пригодность этого метода. Для каждого теста гене-
тический процесс произвел табличный файл (GFiles от 1 до 6), состоящий
из строк, соответствующих каждому из поколений. Таким образом, каж-
дая строка представляет определенное решение. Большинство ранних
решений были мало пригодными для торговли, но качество решений улуч-
шалось с появлением новых поколений, что характерно для ГА. Каждая
строка содержит информацию относительно эффективности отдельного
решения — набора параметров, который представляет ген, содержащий-
ся в полной хромосоме.
Были выбраны лучшие решения для входа в длинную и короткую по-
зицию по цене открытия. Эти решения использовались для проведения
шести тестов, результаты которых приведены ниже. В частности, было
протестировано решение, которое обеспечивало лучший вход в длинную
позицию по цене открытия, и его эффективность была оценена обычным
способом на обеих выборках. То же самое решение было проверено и
оценено с входом по стоп-приказу и лимитному приказу. Такая же про-
цедура была проведена для коротких позиций: было определено лучшее
решение для входа в короткую позицию по цене открытия. Затем реше-
ние было проверено на обеих выборках с каждым из двух типов прика-
зов. Мы не отбирали отдельное оптимальное решение для каждого типа
приказа, потому что такие действия не позволят сравнить эффективность
различных видов приказов. Например, оптимальный вход по цене откры-
тия может давать модель пробоя, в то время как оптимальный вход по
стоп-приказу может наблюдаться при использовании противотрендовой
модели ценового импульса. Эти модели никак не связаны друг с другом, и
их результаты ничего не говорят об общей эффективности различных
видов приказов. Поэтому мы сначала искали наилучшую модель с рыноч-
ным приказом по цене открытия, а затем тестировали найденную модель
с другими видами приказов. Поскольку модель остается неизменной, этот
подход позволяет делать значимые сравнения различных типов приказов.


Решения для входов в длинную позицию
Табл. 12-1 представляет торговые результаты 20 лучших решений для вхо-
дов в длинные позиции по цене открытия (GFile 1). Каждая строка пред-
ставляет различную торговую модель. Параметры не указываются, но
представлены номера поколений (НОМЕР), вероятность или статистичес-
кая значимость (ВЕР, десятичный знак опущен, но подразумевается), сред-
няя прибыль в долларах за сделку ($СДЕЛ), общее количество сделок
(СДЕЛ), фактор прибыли (Ф.ПРИБ), доходность в процентах годовых
(ДОХ%) и чистая прибыль или убыток (П/У).
296 ИССЛЕДОВАНИЕ входов в РЫНОК
ЧАСТЬ II




Таблица 12—1. Лучшие 20 решений, полученные для длинных позиций с
входом по цене открытия




Эффективность большинства из этих моделей, по меньшей мере, впе-
чатляет. Лучшие модели имеют статистическую значимость выше 0,00007,
что означает, что эти решения имеют очень высокую вероятность при-
быльной торговли в будущем. Многие решения заработали более 50% го-
довых. В некоторых случаях прибыли достигли значительно более высо-
ких уровней. Хотя лимитный приказ дал много наилучших решений, ос-
тальные приказы также показали много хороших, если не великолепных
результатов. Как и в предыдущих исследованиях, ГА превосходно обна-
руживает многие пригодные для торговли модели.


Решения для входов в короткие позиции

Табл. 12-2 представляет маленькую часть файла GFfile 4, в котором пред-
ставлены найденные модели входов в короткие позиции по цене открытия.
Как и в тесте 1, представлены 20 наилучших решений (отобранных по ста-
тистической значимости или соотношению риск/прибыль). И в этом слу-
чае налицо много хороших решений. Однако они уже не столь впечатляют,
как решения для длинных позиций. Модели, приведенные в табл. 12-2, об-
ладают меньшей статистической значимостью и доходностью. Другое от-
ГЕНЕТИЧЕСКИЕ АЛГОРИТМЫ
ГЛАВА 12 297



Лучшие 20 решений, полученные для коротких позиций с
Таблица 12—2.
входом по цене открытия




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


Результаты тестирования для стандартного портфеля

Лучшее решение, показанное в табл. 12-1 (длинные позиции), и лучшее
решение из табл. 12-2 (короткие позиции) были протестированы со всеми
тремя видами приказов. Тесты с 1 по 3 представляют лучшую модель для
длинных позиций с входом по цене открытия, протестированную с вхо-
дом по цене открытия, лимитному приказу и стоп-приказу соответствен-
но. Тесты с 4 по 6 представляют лучшую модель для коротких позиций со
всеми тремя видами приказов. Табл. 12-3 содержит результаты лучших
моделей с входом по цене открытия. Результаты приведены для длинных
и коротких позиций на данных в пределах выборки и вне ее со всеми ви-
дами входных приказов.
В таблице: ВЫБ— вид выборки данных (В— в пределах, ВНЕ— вне
пределов выборки); ДОХ% — доходность в процентах годовых; Р/ПРИБ —
ИССЛЕДОВАНИЕ входов в РЫНОК
ЧАСТЬ II
298



Таблица 12—3. Эффективность лучшей модели с входом по цене открытия,
испытанной на выборке и вне ее пределов со всеми видами
входных приказов
ПРИБКР
ПРИБДЛ
ДНИ
$СДЕЛ
ПРИБ%
ВЕР
Р/ПРИБ СДЕЛ
ДОХ%
ВЫ Б

Тест 01. Длинная позиция, вход по цене открытия
0.000 17264
82.2 1.22 43 62 7 742 0
В
0.089
63.0 0.66 17 47 10231 173 0
Вне 6

Тест 02. Длинная позиция, вход по лимитному приказу
14846
65.8 0.99 0.001 534
36 61 8 0
В
14920
0.038
87.7 0.86 14 50 6 208 0
Вне

Тест 03. Длинная позиция, вход по стоп-приказу
16247
0.003
42.2 0.88 22 72 8 357 0
В
с
4246
0.344
11.7 0.20
Вне 8 50 6 33

Тест 04. Короткая позиция, вход по цене открытия
0.003
54.8 0.87 69 0 429
36 11929 8
В
0.669
-10.0 -0.21 -2711
17 35 6 0 -46
Вне

Тест 05. Короткая позиция, вход по лимитному приказу
0.056 7424
0.51
16.5 64
34 8 0 252
В
0.686
-10.8 -0.24 -3351 0
Вне 14 42 6 -46

Тест 06. Короткая позиция, вход по стоп-приказу
7493
23.1 0.60 0.031 24 54 6 0 179
0.696 -3704
-0.25
-13.0 30 -48
13 5 0




соотношение риска/прибыли в годовом исчислении; ВЕР — ассоцииро-
ванная вероятность статистической достоверности; СДЕЛ — число сде-
лок на всех рынках в составе портфеля; ПРИБ% — процент прибыльных
сделок; $СДЕЛ— средняя прибыль/убыток со сделки; ДНИ— средняя
длительность сделки в днях; ПРИБДЛ — общая прибыль от длинных пози-
ций в тысячах долларов; ПРИБКР— общая прибыль от коротких позиций
в тысячах долларов.

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




было прибыли меньше 42% (в годовом исчислении) для любого вида при-
каза. Все значения средней прибыли в сделке были больше чем $14 000, и
ни одна система не имела меньше 60% прибыльных сделок! Вне выборки
результаты были довольно разнообразны. С входами по цене открытия
или по лимитному приказу система по-прежнему показывала выдающие-
ся результаты: средняя прибыль в сделке была выше $10 000, а доход-
ность — выше 60% годовых. Со стоп-приказом модель работала не так
хорошо: доходность не превысила 11%, а средняя сделка принесла всего
$4246. Единственным внушающим беспокойство аспектом результатов
является малое количество сделок. Например, в пределах выборки с вхо-
дом на открытии было произведено только 43 сделки за 10-летний период
для портфеля из 36 товаров. Вне выборки было только 17 сделок в течение
5-летнего периода; частота торговли была постоянна и составляла около
4 сделок в год.
По-видимому, правила обнаруживали необычные (но пригодные для
торговли) рыночные события; подобную модель можно назвать моделью
для «торговли в нетипичных случаях». Эта модель не так бесполезна, как
может показаться на первый взгляд. Ассортимент систем, каждая их ко-
торых торгует при различных редких событиях, может давать превосход-
ную прибыль. При работе с системой такого типа рекомендуется торгов-
ля как портфелем систем, так и портфелем финансовых инструментов.
Однако небольшое количество сделок может поставить под сомнение ста-
тистическую значимость полученных результатов. Данная задача, веро-
ятно, может быть решена при использовании более сложного способа
обработки больших комбинаций правил.

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



Результаты тестирования для каждого рынка
Табл. 12-4 содержит результаты по рынкам для лучших моделей как для
длинных, так и для коротких позиций, протестированных на оптимиза-
ционных и проверочных выборках, с использованием трех видов прика-
зов для входа в рынок. Пустые ячейки в этой таблице отражают отсут-
ствие сделок. Первая колонка содержит обозначения изучаемых рынков.
Центральная и правые колонки содержат количество прибыльных тестов
для данного рынка. Числа в первой строке представляют идентификато-
ры тестов: 01, 02 и 03 означают тесты для длинных позиций с входом на
открытии, по лимитному приказу и стоп-приказу соответственно; 04, 05 и
06 представляют соответствующие тесты для коротких позиций. Послед-
няя строка содержит количество рынков, на которых данная модель была
прибыльна. Данные в этой таблице представляют относительно деталь-
ную информацию о том, какие рынки прибыльны, а какие нет, для каж-
дой конкретной модели: один минус ( — ) указывает на умеренный сред-

<< Пред. стр.

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

ОГЛАВЛЕНИЕ

След. стр. >>