Иван Коваль-Зайцев
Иван Коваль-Зайцев личный блог
16 декабря 2013, 15:18

Пост четвертый. Про оптимизацию

Это третий по номеру и четвертый по порядку пост из серии про основы программирования торговых систем на языке Easy (power) language. Речь пойдет об оптимизации. Я расскажу как общие принципы и подход к этому делу, так и конкретные действия для программы Multicharts, которые надо совершить, чтобы оптимизировать стратегию. Ну и кусочек своей эквити в конце поста покажу – для иллюстрации одного явления.
 
Для начала хочу сказать спасибо тем, кто отреагировал на прошлый пост. Я не ожидал такой реакции. Это очень круто. А теперь про оптимизацию.


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


 
Во время подготовки этого текста я провел эксперимент, который заключался в том, чтобы посмотреть, какие идеи трейдеры хотели бы алгоритмизировать и торговать. У меня даже родилась мысль создать что-то в духе рубрики «это не работает», потому что на самом деле большинство трейдеров проходят через этап использования систем из книжек, систем, основанных на комплексе индикаторов. Некоторые, к сожалению для себя и к счастью для профитных трейдеров, так там и остаются…
 
Если отбросить из присланных идей те, которые базировались на мартингейле (это когда вход случаен, а после каждого убытка нужно удвоить размер следующей позиции, чтобы в любом случае быть в плюсе в любой серии) или маркетмейкинге, основная масса идей заключалась в наборе индикаторов.
 
Для многих не будет новостью, что ни один комплекс индикаторов не позволит вам стабильно зарабатывать на рынке. Конечно, у всякой системы возможен профитный период. Но это вовсе не значит, что вам повезет в него попасть и продолжительное время прокатиться на гребне этой волны.
 
Я не буду утверждать, что для того, чтобы найти работающую систему, обязательно понимать «логику рынка», что происходит и у кого вы отнимаете деньги… Как говорит достопочтенный Механизатор, если вам удалось найти профитную систему, которая не подогнана тупо под исторические данные и прошла все проверки – то не нужно ее выбрасывать только из-за того, что вы не понимаете ее логики. Ну, может и не совсем так говорит, но посыл был именно такой.
 
Смысл всей это тирады в том, что изначальная правильная логика системы позволит вам избежать иллюзий от курвафитинга (подгонка под кривую исторических ценовых данных). Что это значит? ИМХО, базовая идея любой системы должна показывать профит без дополнительных оптимизируемых параметров, без всяких дополнительных фильтров.
 
Возьмем простой пример не из трейдинга.
 
Базовая идея: если кинуть семечко к ногам, то вырастет дерево.
 
На самом деле, все знают, что такое может произойти. И график оценки деревьев по высоте в зависимости от количества брошенных семечек – он будет расти, хоть и будет много «шума» — потому что слишком большой % семечек не будет прорастать, либо ростки будут умирать на ранних этапах.
 
Чтобы повысить эффективность нашей «стратегии», нужно правильно выбрать сорт семечек – сосны-то выше, чем кусты. Нужно правильно хранить эти семечки – мертвые изначально не прорастут ни в какой почве. Нужно выбирать подходящую почву – на асфальт кидать семечки глупо. И много ещё разных параметров – подумайте сами, а то я сейчас рыночный грааль спалю, рассказывая тут про растениеводство…
 
Но смысл в том, что все ваши действия направлены на то, чтобы повысить эффективность от усилий «сеятеля». Если оставить его в покое и дать ему разбрасываться семечками везде, где ни попадя – деревья все равно будут расти. Но если указать ему линию «оптимального» поведения, «ваш сад» будет самым высоким по сумме всех посаженных деревьев (деленных на количество брошенных семечек).
 
Вот что такое оптимизация. Повышение эффективности – но никак не превращение вконец убыточной системы в профитную стратегию.
 
Поэтому, возвращаясь к первоначальной мысли: система, которая совсем не работает без оптимизации параметров, не будет работать и при наличии этих самых параметров, подогнанных под историю.
 
Время для небольшого дисклаймера: я никогда не сажал деревья. И никогда не торговал системы, основанные на пересечении скользящих средних, равно как и на других индикаторах. Возможно, я не прав. Но тот подход, который я использую к рынку, позволяет мне уже долгое время зарабатывать деньги. Я не считаю себя самым умным. И не считаю, что смогу обогнать по доходности тех, кто использует дивергенцию RSI с MACD… Но я точно знаю, что нужно делать, чтобы заработать денег на бирже. И именно этим знанием я и пытаюсь с вами поделиться. Если у вас получится на деле опровергнуть мои теории (не аксиомы – только лишь теории) – я вас поздравлю с удачным опытом, с заработанными деньгами и буду искренне рад, что у вас получилось! Я же всё-таки буду зарабатывать на понимании тех процессов, которые использую и попытаюсь объяснить их вам…
 
В прошлом постевот тут тоже) я уже говорил о том, что всякие величины, которые могут быть изначально разными, нужно выносить за пределы основного кода, подставляя вместо них переменные.
 
Чтобы получалось не «закрытие больше открытия на 200 пунктов», а «закрытие больше открытия на заранее установленный минимум пунктов».


Вспомним для примера не очень хорошую, как мы выснили,  стратегию из предыдущих постов: 
 
Inputs:
MinForLong(200),
MinForShort(200),
SL(400),
TP(250);
 
If MinutesFromDateTime(ELDateToDateTime(date)+ELtimetodatetime(time))=59 and close-open[59]>MinForShort then sell short next bar open;
 
If MinutesFromDateTime(ELDateToDateTime(date)+ELtimetodatetime(time))=59 and open[59]-close>MinForLong then buy next bar open;
 
If time=2349 then sell this bar close;
If time=2349 then buy to cover this bar close;
 
SetStopLoss(SL);
SetProfitTarget(TP);
 
Помимо очевидных 4 оптимизируемых параметров, у этой «стратегии» есть ещё один – таймфрейм.
 
В прошлых постах мы определили, что хотим торговать часовики. И только «классические» — в конце часа.
 
Переделаем код так, что 1) вход станет возможен в любую минуту, даже в середине часа. Потому что это ограничение – тоже своего рода оптимизация (в данном примере). Для этого достаточно будет удалить условие про 59-ю минуту часа.
 
И 2) заменим число 59, обозначающее количество периодов назад, новой переменной N.
 
Inputs:
MinForLong(200),
MinForShort(200),
SL(400),
TP(250),
N(59);
 
If time<>2349 and close-open[N]>MinForShort then sell short next bar open;
 
If time<>2349 and open[N]-close>MinForLong then buy next bar open;
 
If time=2349 then sell this bar close;
If time=2349 then buy to cover this bar close;
 
SetStopLoss(SL);
SetProfitTarget(TP);
 
Пришлось вспомнить про условие из предыдущего поста If time<>2349 для того, чтобы не происходило «входов» по цене открытия следующего дня.
 
Этот пример торговой стратегии, конечно же, не подходит под принцип «работающей базовой идеи», но для примера работы оптимизатора можно использовать и его.
 
Я не буду здесь разводить долгих дискуссий о том, как надо проводить проверку In sample/out of sample. Это уже из разряда моего видения рынка и трейдинга – а этого и так получилось уже слишком много в этом тексте.
 
Для тех, кто не в курсе: IS-OOS – это про то, что оптимизация параметров проводится на одном периоде, а проверка результатов этой работы – на другом.
 
Для примера в этом посте я просто использую 2012 год для оптимизации, а на 2013 потом посмотрим, что из этого получится.
 
Правая кнопка мышки на графике-> Insert new study, ставим галочку Format, выбираем нашу стратегию во вкладке signals и нажимаем ОК. Дальше справа жмем кнопку Optimize. Нам предлагают на выбор полную оптимизацию или «генетику». Первый вариант прогонит абсолютно все варианты, которые мы попросим его «прогнать». А при генетической оптимизации программа сама выбирает варианты, которые будут тестироваться. Для быстрой оптимизации целого комплекса параметров нужно выбирать Genetic, потому что это очень сильно ускоряет процесс проверки.
 
Прооптимизируем стратегию по всем параметрам так, как указано ниже на картинке – минимумы с 10 до 2000 пунктов с шагом 50, SL и TP также с шагом 50, а по количеству свечек в сигнальном периоде с 1 до 200 с шагом 1.
 
Если мы попросим тестер оптимизировать наши значения обычным методом, то вариантов получится 492 480 000 штук. Это на 50 лет по времени работы тестера примерно…
 
 Пост четвертый. Про оптимизацию
 
 
Поэтому имеет смысл всё же выбрать генетику… Тогда процесс займет всего сутки. Но это у меня комп на работе медленный. Так что я, пожалуй, ограничу возможные варианты ещё жестче…
 
Пока Мультичартс проводит оптимизацию, можно ещё немного порассуждать. Вообще, честно говоря, я редко вот так вот скопом пользуюсь оптимизацией всех параметров. Обычно стратегия создается поэтапно. И на каждом этапе нужно проверить какой-то один параметр. Имея 2 параметра с 100 разными вариантами каждый, мы получаем 10000 разных вариантов комбинаций. Но нам все эти варианты не нужны. Достаточно проверить вначале один параметр. И потом уже с оптимальным значением первого параметра начинать проверку второго. Тогда вместо 10000 разных прогонов тестер сделает лишь 200. Конечно, результаты всех возможных вариантов мы не увидим. Но этого и не нужно, когда стратегия выстраивается логически, а не подгонкой и компоновкой…
 
Вот и готовы наши тесты. Открываем Optimization report. Там много разных столбцов. Для каждого варианта свои значения. Посмотрите – разберетесь. Ну и график за исследуемый период.
 
 
 Пост четвертый. Про оптимизацию
 
 Пост четвертый. Про оптимизацию

 
А теперь, что называется, момент истины. То, зачем нужна проверка IS-OOS. Если оптимизация проводилась на одном периоде, и затем с оптимальными параметрами система хорошо работает на другом периоде, тогда это, скорей всего, хорошая система и хорошие параметры. Если же на новых данных система показывает слив – то вместо хорошей системы мы получили лишь «подгонку под кривую», откурвафитили систему…
  
Поэтому часто алготрейдеры, хвастаясь какой-нибудь очередной своей разработкой, указывают на графике: «Чистый OutOfSample». Или отмечают точку на графике, которая разделяет IS и OOS.
 
Мы проводили оптимизацию по данным 2012 года. Теперь переходим на год вперед и проверяем…
 
 Пост четвертый. Про оптимизацию
 
Что и требовалось доказать. Система абсолютна не торгабельна в данном виде.
 
Есть один интересный способ, позволяющий без IS-OOS определить, является ли оптимизируемый параметр справедливым, не подогнали ли мы просто систему под историю.
 
После оптимизации какого-то одного параметра я выгружаю результаты оптимизации в эксель и строю гистограмму по показателю прибыли, например. Если оптимальный параметр не является сильным выбросом, и если, выбрав соседние значения, мы не сильно потеряем в прибыли, и если график в целом получается гладким, не рваным – тогда мы скорей всего правильно прооптимизировали стратегию.
 
Хотел привести пример, но с этим кодом не получится хорошей оптимизации – все параметры лишь подгоняют под кривую, не давая нормальной стратегии. На платных курсах придется палить граали, чтоб нормально объяснять с примерами:)
 
Ну и последнее. Я об этом уже говорил, и не раз. И не только я один. Фишка трейдинга – в диверсификации. Вместо использования одной системы с оптимальными параметрами, запускайте три – оптимальную и парочку с соседними показателями. Таким образом вы сможете добиться гладкой эквити, пусть и пожертвуя (возможно) максимальной прибылью в короткой перспективе. Для примера тесты реально работающей торговой системы за 2 последних года – три отдельных графика различных комбинаций одной и той же идеи и один общий график совместного перфоманса за тот же период. Кстати, первым идет график с наиболее оптимальными когда-то параметрами. Если бы я не использовал этот метод в реальной жизни, я заработал бы с этой системы за два года не 15000 пунктов, а только 7000:
 
 Пост четвертый. Про оптимизацию
 
 
Цифры уж приводить не буду – и так визуально ясно. Интересно, что диверсифицироваться получается даже используя сильно коррелированные методы заработка на рынке.
  
Пост получился длинным. Писать его было долго. Но что-то выкидывать не хочется.
 
Тем, кто только что подключился, рассказываю. Серия постов:
 
1. Установка и настройка программы Multicharts.
2. Основы кодинга, структура кода.
3. (2,5) Исправление ошибок. Дата и время. Проскальзывание.
4. Основы оптимизации и практические примеры в Multicharts.
5. Динамические переменные.
6. Использование нескольких таймфреймов одновременно.
7. Настройка программы Multicharts, часть 2, атака роботов.
8. Что-нибудь ещё придумаю, если аудитория довольна останется. Примеры кусков кодов, разбор словаря с наиболее полезными функциями.
 
Профитов!
 
13 Комментариев
  • skatino
    16 декабря 2013, 16:24
    все по делу… ничего лишнего
  • NeroWolfe
    16 декабря 2013, 17:10
    Как технически у вас реализована сама робототорговля (автоматическое выставление заявок)? У вас МЧ с квиком связан или вы потом код куда то еще переносите?
  • Андрей Коган
    16 декабря 2013, 17:23
    Спасибо.

    А что означает «оптимальный параметр не является сильным выбросом» на гистограмме прибыли?
      • Андрей Коган
        16 декабря 2013, 17:35
        Иван Коваль-Зайцев,
        То есть, при параметре = 10 мы видим рост гистограммы. О чём это говорит? Что параметр плох или хорош? Или иногда хорош?
  • Denis StrJ
    16 декабря 2013, 19:40
    Спасибо.читаем
  • Алекс Майер
    19 сентября 2016, 20:18
    Если у кого-то отсутствует MultiCharts, взять можно здесь: http://getanyplatform.com

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн