d9e5a92d

Пробои на основе цен закрытия

Тест 1. Система на основе пробоя канала. Используются только цены закрытия; вход по рыночной цене при открытии биржи на следующий день и стоимость сделок (комиссия, проскальзывание) не учитываются.
Правила системы таковы: Если текущая позиция короткая или нейтральная, а рынок поднимается выше максимальной цены закрытия за последние n дней, то при завтрашнем открытии следует покупать, или же, соответственно, Если текущая позиция длинная или нейтральная, а рынок опускается ниже минимальной цены закрытия за последние n дней, то при завтрашнем открытии следует продавать (открывать короткую позицию). У этой системы только один параметр — период n, количество анализируемых дней. Количество контрактов для покупки или продажи (ncontracts) было выбрано таким, чтобы для данного рынка сохранялась долларовая волатильность, примерно соответствующая двум новым контрактам S&P 500 на конец 1998 г.
Выходы производятся, когда случается пробой в направлении, противоположном текущей открытой позиции, или срабатывает стандартный выход (например, защитная остановка, целевая прибыль или выход по рыночной цене, если позиция была открыта дольше указанного количества дней). Защитная остановка определяется как входная цена плюс (для коротких) или минус (для длинных позиций) параметр mmstp, величина которого линейно зависит от размеров среднего истинного ценового диапазона последних 50 дней. Границы целевой прибыли представляют собой входную цену плюс (для длинных) или минус (для коротких позиций) еще один параметр — ptlim, также связанный с величиной среднего истинного диапазона последних 50 дней. Выход при закрытии (вид рыночного приказа) представляет собой приказ, который отдается, если позиция удерживалась определенное количество дней (maxhold). Все выходные приказы исполняются только при закрытии; это ограничение позволяет избежать исполнения приказа при случайном внутридневном движении цены. Если бы выходы осуществлялись внутри ценового бара (дня), то существовала бы возможность отдать несколько приказов в одном баре.
Моделирование такой ситуации невозможно, поскольку движение цен в пределаходного бара неизвестно, и, следовательно, порядок исполнения отданных приказов оказывается неопределенным.
Средний истинный диапазон (мера волатильности) рассчитывается как среднее значение истинного диапазона за несколько предыдущих дней (в данном случае 50 дней). Истинный диапазон представляет собой наибольшую из следующих трех величин: разность между максимальной и минимальной ценами за день, разность между максимумом и ценой закрытия предыдущего дня и разность между ценой закрытия предыдущего дня и минимальной ценой текущего дня.
Ниже приводится компьютерный код на C++ для системы пробоя канала по ценам закрытия со стандартной стратегией выхода. При расчете количества контрактов сплит S&P 500 отдельно не учитывался. Новый контракт считается идентичным предыдущему. Моделирование, тем не менее, корректно, если считать, что трейдер (а не симулятор) продает или покупает два новых контракта вместо одного старого: симулятор настроен так, что он продает вдвое меньше новых контрактов, чем следовало бы, но считает их размер удвоенным. На фьючерсных рынках иногда имеет место административная остановка торгов (запрет на дальнейший рост или падение цены), вызванная чрезмерным изменением цены, превышающим максимально допустимое изменение, установленное правилами данной торговой площадки. Наша программа определяет эти дни проверкой диапазона: нулевой диапазон (максимум равен минимуму) позволяет предположить малую ликвидность и, возможно, остановленные торги.
Хотя эта схема не идеальна, при ее использовании в моделировании получаются результаты, похожие на реальную торговлю. Сбор точной информации о днях с ограниченной торговлей со всех бирж — задача практически непосильная, поэтому мы использовали метод нулевого диапазона.

Код позволяет проводить повторный вход в рынок при возникновении новых максимумов или минимумов.

// Выполнение тестирования модели
// parms - набор [1..MAXPRM] параметров
// dt — набор [1..nb] дат в формате ГГММДД
// орn — набор [1..nb] цен открытия
// hi — набор [l..nb] максимальных цен
// 1о — набор [1..nb] минимальных цен
// cls — набор [l..nb] цен закрытия
// vol — набор [l..nb] значений объема
// oi — набор [l..nb] значений открытого интереса


// dlrv — набор [1..nb] средних долларовой волатильности
// nb — количество дней в наборе данных
// ts — ссылка на класс торгового симулятора
// eqcls — набор [l..nb] уровней капитала при закрытых позициях
//объявляем локальные переменные static int cb, n, neontracts, maxhold; static float mmstp, ptlim, atr;
// копируем параметры в локальные переменные для удобного обращения
n = parms [1]; // параметр ширины канала
maxhold = 10; // период максимального удержания позиции
ptlim = 4.О; // целевая прибыль в единицах волатильности
mmstp = 1.0; // защитная остановка в единицах волатильности
// file - x09mod01.c
// только для этого теста выставляем транзакционные издержки равными нулю ts.commission(0.0); ts.slippage (0.0);
// проходим через бары (дни}, чтобы смоделировать реальную торговлю for(cb = 1; cb <= nb- 1; cb++) [
//не открываем позиций до начала выборки
//... то же самое, что установка MaxBarsBack в TradeStation if(dt[cb] < IS_DATE) { eqcls[cb] = 0.0; continue; }
// выполняем ожидающие приказы и считаем кумулятивный капитал ts.update(opn[cb] , hi[cb], lo [cb] , cls [cb], cb) ; eqcls [cb] = ts.currentequity{EQ_CLOSETOTAL);
// считаем количество контрактов для позиции
//... мы хотим торговать эквивалентом долларовой волатильности
//... равным 2 новым контрактам S&P- 500 от 12/31/98 ncontracts = RoundToInteger(5673.0 / dlrv[cb]) ; if (ncontracts < 1) ncontracts = 1;
// избегаем устанавливать приказы на дни с ограниченной торговлей if(hi[cb+1] == lo[cb+1]} continue;
// file = x09mod01.c
// пробой канала но основе цены закрытия с входом на завтрашнем открытии if (cls [cb]>Highest(cls,n,cb- l) && ts.position {) < = 0) { ts.buyopen('1' , ncontracts) ;}
else if (cls [cb]<Lowest(cls,n,cb- l) && ts.position{)>=0) {ts . sellopen ('2 ', ncontracts) ;}
// симулятор использует стандартную стратегию выхода atr = AvgTrueRange(hi, lo, cls, 50, cb} ; ts.stdexitcls('X', ptlim*atr, mmstp*atr, maxhold);
] // обрабатываем следующий день

Этот код был скомпилирован и связан с оболочкой и библиотеками для разработчика; в TradeStation это называется верификацией системы. При помощи команд оболочки проводилась оптимизация параметра n с лобовым подходом. Лучшее по показателями риска/прибыли решение проверялось на данных, взятых вне пределов выборки. Оптимизация состояла в прогонке параметра n через значения от 5 до 100 с шагом в 5. Параметр защитной остановки mmstp был установлен на уровне 1 (т.е. одной единицы волатильности или среднего истинного диапазона), параметр целевой прибыли ptlim — на уровне 4 (4 единицы), а максимальный период удержания позиции maxdays был равен 10 дням. Эти значения использовались для стандартных параметров выхода во всех тестах методик входа, если не указано иначе. Чтобы осознать масштаб целевой прибыли и защитных остановок, укажем, что фьючерсы S&P 500 на конец 1998 г. имели средний истинный диапазон 17,83 пункта, или около $4457 за один новый контракт. Для первого теста комиссия и проскальзывание приняты равными нулю.
Для такой простой системы результаты были неожиданно хороши: годовая прибыль составила 76%. Все параметры n были прибыльными, в отношении риска/прибыли оптимальное значение составило 80 дней. Т- тест дневной прибыли (по соотношению риска/прибыли) показывает, что вероятность случайной эффективности составляет менее одной тысячной, а после коррекций на оптимизацию — менее одной сотой. Как и следовало ожидать по таким показателям, в тесте вне пределов выборки система также была прибыльной. Длинные позиции (покупки) принесли больше прибыли, чем короткие (продажи), возможно, в связи с ложными сигналами с короткой стороны, вызванными постоянным снижением цены при приближении срока истечения контрактов. Другое объяснение состоит в том, что цены на товары обычно более подвержены влиянию кризисов и дефицита, чем избытка. Как и при использовании других систем, основанных на пробое, процент прибыльных сделок был невелик (43%), причем крупные прибыли от редких удачных сделок компенсировали частые мелкие убытки. Хотя некоторым психологически трудно воспринимать систему, которая терпит убыток за убытком в ожидании большой прибыли, ожидание того стоит.
Капиталпортфеля при использовании оптимального для выборки параметра n стабильно рос как в пределах выборки данных, так и вне его; избыточная оптимизация здесь не представляла проблемы. График изменения капитала показывает некоторое снижение эффективности системы со временем. Впрочем, система, основанная на простом пробое канала, все еще может извлекать из рынка неплохую прибыль. Или нет? Учтите, что тест 1 проводился без учета расходов на сделки. В следующем тесте учтены комиссионные и проскальзывание.


Тест 2. Система на основе пробоя канала. Используются только цены закрытия; вход по рыночной цене при открытии биржи на следующий день, комиссия и проскальзывание учитываются.
Этот тест проведен точно так же, как и предыдущий, за исключением учета проскальзывания (3 тика) и комиссионных ($15 за цикл сделки). Хотя эта модель работала успешно без учета расходов на сделки, на практике она с треском провалилась. Даже лучшее в выборке решение принесло только убытки, и, как и следовало ожидать, вне пределов выборки система также работала с убытком. Почему же относительно небольшие комиссионные и проскальзывание приводят к разрушению производительности системы, которая без них зарабатывает тысячи долларов на средней прибыльной сделке? Потому что на многих рынках сделки включают множественные контракты, а комиссионные и проскальзывания влияют на каждый контракт по отдельности. В данном случае опять именно длинные сделки приносили наибольшую прибыль. Модель была умеренно доходной в 1980х годах, но потом стала убыточной. Учитывая прибыльные результаты прошлого теста, можно предположить, что модель постепенно перестала окупать расходы на совершение сделок. Когда простые компьютеризованные системы пробоев вошли в моду в конце 1980- х годов, возможно, именно они с течением времени изменили природу рынков, что привело к падению эффективности данных систем.
В табл. 5- 1 приведены результаты портфеля для системы, основанной на пробое канала. Результаты распределены по разным рынкам для различных выборок данных (названия рынков и их символы соответствуют обозначениям табл. II- 1; часть II, введение): ПРИБДЛ — общая прибыль длинных позиций в тысячах долларов; ПРИБКР— общая прибыль коротких позиций в тысячах долларов; ДОХ% — прибыль в процентах годовых; ВЕР — статистическая достоверность; $СДЕЛ — средняя прибыль/убыток в сделке.
Методы следования за трендом, такие как системы пробоев, предположительно хорошо работают на валютных рынках. Данный тест подтверждает это предположение: положительная прибыль на нескольких рынках валют была получена и в пределах выборки данных, и вне ее. На многих рынках (нефть и нефтепродукты, кофе, лес) также отмечена положительная прибыль. Прибыльное поведение индексов (S&P 500 и NYFE), видимо, обусловлено сильным бычьим рынком 1990- х годов. На каждом рынке в год проводилось около 10 сделок. Процент прибыльных сделок был подобен наблюдавшемуся в первом тесте (около 40%).
Тест 3. Система на основе пробоя цены закрытия, вход по лимитному приказу на следующий день, расходы на сделки учитываются.
Для улучшения эффективности модели путем контроля над проскальзыванием и получения входов по более выгодной цене мы использовали лимитный приказ для входа на следующий день по указанной или более выгодной цене. Полагая, что рынок скорректирует по крайней мере половину ценового диапазона дня, в который был произведен пробой (cb), перед тем как продолжить дальнейшее движение, мы размещаем лимитный приказ (limprice) на уровне середины этого диапазона. Поскольку большая часть кода остается неизменной, приведем только наиболее сильно изменившиеся участки:

// file = x09mod03.c
// пробой канала на основе только цен закрытия с входом на следующий день,
// используя лимитный приказ limprice = 0.5 * (hi[cb] + lo [cb]);
if (cls[cb]>Highest(cls,n,cb- l) && ts.position{)<=0) {ts.buylimit('1' , limprice, ncontracts);
)
else if (cls[cb]<Lowest(cls,n,cb- l) && ts.position{)>=0) {ts.selllimit('2', limprice, ncontracts);
)
// симулятор использует стандартную стратегию выхода atr = AvgTrueRange{hi, lo, cls, 50, cb} ;
ts.stdexitcls ('X', ptlim*atr, mmstp*atr, maxhold);

Вход производится по лимитному приказу в пределах бара. Если бы использовались целевая прибыль и защитная остановка в пределах бара, то возникли бы проблемы. Помещение многих приказов внутри одного бара может сделать моделирование недостоверным: последовательность выполнения этих приказов невозможно отследить по данным на конец дня, а повлиять на результат они могут серьезно. Поэтому стандартный выход основан на приказах, использующих только цены закрытия.
Как и ранее, параметр n (количество дней для усреднения) оптимизировался от 5 до 100 с шагом 5, и выбиралось лучшее решение по соотношению риска/прибыли (и t- вероятности). Комиссионные, проскальзывание, параметры выхода и возможность снова войти в продолжающийся тренд, хотя и с запаздыванием, остались неизменными.
При оптимальном n = 80 (как и тесте 1) эта модель давала около 33% прибыли в год в пределах выборки. Вероятность случайности этих показателей была 5% без коррекции и 61% после коррекции на 21 тесте оптимизации. Хотя в пределах выборки система была выгодной, статистические данные показывают, что в будущем возможен провал; в самом деле, на данных вне пределов выборки система была убыточной. Как и в тестах 1 и 2, сделки длившиеся 7 и более баров, были прибыльнее, чем короткие. Процент прибыльных сделок составил 42%. Хотя вход с использованием лимитного приказа не снял отрицательного влияния комиссии и проскальзывания, тем не менее эффективность улучшилась. Лимитный приказ не особенно уменьшил количество сделок и не привел к пропуску выгодных трендов; обычно после пробоев рынок возвращался обратно, позволяя входить по более выгодной цене. То, что такая произвольная и, почти наверняка, неоптимальная методика смогла улучшить эффективность системы, весьма обнадеживает. График изменения капитала также показывает, что подобная система когда- то работала хорошо, но теперь бесполезна.
Из табл. 5- 2 видно, что прибыльные результаты были получены на рынке нефти как в пределах, так и вне пределов выборки, что соответствует данным предыдущих тестов. Рынок кофе также был прибыльным в обоих случаях. В пределах выборки фьючерсы на S&P 500 также принесли прибыль.

VBA для тех кто любит думатьСодержание раздела