Создание торговой системы: главные шаги

Автор: Кондратенко Юрий

Трейдер всегда находится в поиске и создании своего "Святого Грааля" - торговой системы, удовлетворяющей его отношение к доходу и риску. Здесь я расскажу о главных этапах создания системы, начиная от задумки, идеи и заканчивая готовым кодом для Омеги. Данный материал ни в коем случае не претендует на звание идеального пособия по созданию МТС. Это мой взгляд на процесс создания МТС, и, надеюсь, Вы найдете в нем что-то интересное и для себя. Итак...

Самое начало

Сначала должна быть "идея". Без нее никак. А вот появится она может откуда угодно - после просмотра графиков, прочтения новой статьи или книги, общения с коллегами трейдерами или еще как. Идея стратегии, на примере которой я буду рассказывать, родилась довольно банально. Во время просмотра статей по форексу, я натолкнулся на торговую стратегию на британском фунте. Там высчитывался торговый диапазон во время торгов в Токио, и затем игра велась на пробой этого диапазона. Я подумал, а почему бы не проверить данную идею на нашем фондовом рынке, внеся в нее ряд доработок. Позднее из любимой книги Арта Симпсона "Призрак биржи" я узнал, что это чуть ли не самая старинная стратегия на Уолл Стрит. Но это было позднее. :-)

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

Программа для тестинга

Теперь нужно выбрать инструмент для теста закономерности. Можно просто на бумаге, но как мы уже выяснили - не самый лучший и быстрый способ. Можно с помощью программы Excel - это уже намного мощнее, но требует определьнных знаний и по-прежнему остается много ручной работы. Своя программа (на Delphi, C или еще что) для бэктестинга. Это интересный вариант, для некоторых может единственный. В своё время я пошел по этому пути. Было затрачено огромное количество времени на создание интерфейса, процедуры обработки данных, собственно, создание самого движка программы. Не буду говорить про моё состояние, когда я узнал - это все уже создано до меня и покрывает все мои запросы. Omega Research, Wealth Lab - вот одни из самых удобных средств для бэктестинга. Вообщем, мы остановимся на Омеге - функционала этой программы нам хвтит за глаза.

Базовый сигнал

Пришло время оформить идею на языке Easy Language, который по сути является тем же Паскалем (кто помнит что это? :-) ).

Для начала определимся, какой период будем считать открытием - 10, 30, 60 минут? Первое, что пришло мне в голову - это 10:30 - 12:00, первые полтора часа. Все правильно в 12:00 открываются торги в Лондоне, которые зачастую вносят существенные коррективы в настроение наших игроков. Тем не менее, пусть 12:00 - это будет параметр tmOpen, который мы потом оптимизируем. Значит, до 12:00 нам надо вычислить максимальную и минимальную цену. Остановимся на 30-минутном графике ГМК Норильский Никель (ГМК). Начинаем писать сигнал 1sig_OpenBreak:

{-------------------------------------------------}
inputs: tmOpen(12), tmClose(17.3), p(0.002), sl(1), pSL(0.03);
vars: up(0), dn(0);

if Time = 1100 then
begin
    up = H;
    dn = L;
    sd = 0;
end;
if Time <= tm*100 then
begin
    if H > up then up = H;
    if L < dn then dn = L;
end;
{-------------------------------------------------}

После времени tmOpen и до времени tmClose будем выставлять стоп-приказы на пробой вычисленного диапазона up/dn. Причем установим величину пробоя p. На Easy это выглядит так:

{-------------------------------------------------}
if Time >= tmOpen*100 and Time<= tmClose*100 then
begin
if MarketPosition <= 0 then BUY("B") at up*(1+p) STOP;
if MarketPosition >= 0 then SELL("S") at dn*(1-p) STOP;
end;
{-------------------------------------------------}

Какая же система без стоп-лоссов. Давайте добавим и их. Первый стоп-лосс возьмем обычный в pSL процентов. Кроме этого, будем еще устанавливать стоп-лосс в единицах sl диапазона (up-dn). Позже разберемся, какой способ более эффективен. Наши стопы:

{-------------------------------------------------}
if MarketPosition = 1 then ExitLong("LX_SL") at EntryPrice*(1-pSL) STOP;
if MarketPosition = -1 then ExitShort("SX_SL") at EntryPrice*(1+pSL) STOP;

if MarketPosition <> 0 and BarsSinceEntry(1) = 1 then
begin
    lx = EntryPrice - (up-dn)*sl;
    sx = EntryPrice + (up-dn)*sl;
end;
if MarketPosition = 1 and Time > tmOpen*100 then
   ExitLong("LX") at EntryPrice - (up-dn)*sl STOP;
if MarketPosition = -1 and time > tm*100 then
    ExitShort("SX") at EntryPrice + (up-dn)*sl STOP;
{-------------------------------------------------}

Поздравляю, стратегия пробой диапазона открытия готова в первом приближении!

Открываем чарт с акциями ГМК 30-минутные свечки. Глубина истории 1000 дней, это примерно 3 года. Это рекомендуемый мной минимальный отрезок времени для тестов, так как за этот период рынок, как правило, успевает побывать и в трендах вверх-вниз и в боковике. Система должна работать на любых состояниях рынка. Смотрим первые результаты работы стратегии. Стартовый капитал 100 000 рублей, без реинвестирования. Комиссия 120 рублей на круг, это соответствует 0,045% комиссии брокера без НДС и 0,01% комиссии биржи ММВБ.

Так-с. Прибыль есть и не маленькая, значит идея рабочая, что уже не может не радовать. Обычно одного взгляда на кривую капитала бывает достаточно, чтобы сделать вывод о качестве стратегии. Плавный рост - это все, что мы хотим видеть (или кому-то нравится вертикальный? ;-) ). Здесь вроде с этим все нормально, кроме участка осень 2008 года (сделки с 400-500), но там и волатильность была очень высокая. Что по цифрам. Чистая прибыль 321 тыс руб., максимальная просадка 42,8 тыс руб., средняя сделка 0,580 тыс руб. Вместо "тыс руб." можно читать "процентов" - это тоже будет верно. Рост более чем в 3 раза за три года, это 100% годовых - здорово для начала, при том что Buy&Hold за это время всего 8%. Вот вам еще один аргумент за активный трейдинг!

Просадка большая, но по времени она была очень короткая, и рынок с 20% гэпами еще не скоро повторится. Средняя сделка 0,58% - не очень много, но и стратегия краткосрочная. Среднюю сделку желательно поднять до 1%, тогда работа системы будет более стабильна, так как даже исполнение приказа с проскальзыванием не будет сильно сказываться на итоговых показателях системы. Еще о показателях системы. Среднее время в сделке 1.9 дня - самое то для нервного рынка, когда движение в одну сторону не длится более 1-2 дней. Среднее время между новыми пиками кривой капитала (обновление максимума) 33 дня - очень не плохо.

Оптимизация

Не люблю я оптимизировать, но придется. Первый параметр tmOpen. Мы его положили равным 12:00. Давайте проверим.

Уменьшая интервал открытия, в данном случае мы несколько выигрываем в прибыли, но получаем больше сделок и большую просадку. Кроме этого, на других бумагах уменьшение интервала не является оправданным. Так что я оставил 12:00.

Оптимальные стоп-лоссы получились следующие: 2% процентный стоп-лосс и 2 единицы диапазона открытия. При этих параметрах чистая прибыль 340 тыс руб., просадка 32 тыс руб., средняя сделка 0,611 тыс руб. Если не использовать процентный стоп, то оптимальный стоп в единицах (up-dn) равняется 1.

Доводка системы напильником

Основные этапы пройдены. Осталось доработать нюансы. Первый такой нюанс - это количество входов в позицию в течение дня. Сейчас оно не ограничено. Анализ сделок показывает, что бывают "разводные дни", когда рынок сам не знает, куда хочет идти. Для этих случаев введем ограничение на открытие новых позиций в течение дня, если первая сделка закрылась по стоп-лоссу. В переменной sd будем хранить 0 - не было сделок сегодня и 1 - были. И не открывать новых позиций, если sd = 1, то есть в конструкцию if добавится еще одно условие sd=0. После этой доработки чистая прибыль выросла до 375 тыс руб., просадка сократилась до 26 тыс руб., средняя сделка поднялась до 0,795 тыс руб. На рынке нет места суете ;-).

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

{-------------------------------------------------}
if Time = 1845 then
begin
  if C < EntryPrice then ExitLong at C;
  if C > EntryPrice then ExitShort at C;
end;
{-------------------------------------------------}

Итак ... фанфары ... что мы получили в итоге. Чистая прибыль 404 тыс руб., просадка всего 20,7 тыс руб., средняя сделка 0,796 тыс руб., среднее время между пиками 18 дней. Каково, а? :-) Все результаты в студию.

Все параметры системы одним файлом xls.

Визуализация

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

Код индикатора 1ind_OpenBreak:

{-------------------------------------------------}
inputs: tmOpen(12);
vars: up(0), dn(0);
if time=1100 then
begin
  up = H;
  dn = L;
end;
if Time <= tmOpen*100 then
begin
  if H > up then up = H;
  if L < dn then dn = L;
end;
if time = tmOpen*100 then
begin
  plot1(up,"up");
  plot2(dn, "dn");
end;
{-------------------------------------------------}

Резюме

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

Отмечу, что на акциях ГМК эта система показывает самые лучше результаты. Рекомендую самостоятельно сделать следующее:

(1) проверить работу системы на остальных голубых фишках;
(2) с помощью XpressAnalizator KonKop`а проанализировать результаты системы на портфеле бумаг;
(3) при желании создать робота на базе этой стратегии.

Материалы:

Стратегия 1str_OpenBreak и индикатор 1ind_OpenBreak Скачать
Архив котировок ГМК за 3 года по 17.04.2009 Скачать
Инструкция по Easy Language Скачать

Удачных Вам сделок!

P.S. Естественно, ни о каких гарантиях дохода при использовании данной системы не может быть и речи! Все взрослые люди и сами решают на что поставить деньги.

20.04.2009
Кондратенко Юрий