Тестирование и оптимизация торговых стратегий в Excel. Тестирование торговой системы

Как тестировать торговые системы форекс?

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

Правило первое.

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

Правило второе.

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

Правило третье.

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

Правило четвертое.

Наиболее объективный метод тестирования- по всем тикам. Однако он же самый затратный по времени. Если вы проводите оптимизацию нескольких параметров, то такое тестирование займёт у вас несколько часов или даже сутки. Системы построенные с использованием только сформированных баров можно тестировать и оптимизировать не прибегая к этому методу. Достаточно по завершению оптимизации устраивать контрольный прогон по всем тикам. Результат не должен сильно отличаться.

Правило пятое.

Параметры торговой системы, заданные вами в тесте не должны противоречить свойствам инструмента (символа) на котором осуществляется тестирование. Речь идет об уровнях StopLoss, TakeProfit, а также размерах лотов. Каждая валютная пара имеет индивидуальный уровень стопов, спрэд, минимальный размер контракта и т.д. Посмотреть их значение можно в терминале МетаТрейдера: "Обзор рынка” - "Символы” - "Свойства”.

Если установки стопов или размеры лотов в вашем тесте превосходят эти значения, тестирование будет проходить с ошибками, наиболее распространённые из которых:

  • 130 - Invalid stops (неправильные стопы).
  • 131 - Invalid trade volume (неправильный торговый объём).
В "ненормальных” рыночных условия (например сильные ценовые движения после выхода важных макроэкономических новостей) уровни стопов и спрэд могут изменяться в сторону увеличения. Если вы проводите тест в такие периоды, ориентируясь на свойства символа в нормальных рыночных условиях, тестирование также может проходить с ошибками.
Некоторые ДЦ (например "Альпари”) имеют плавающий спрэд, например по паре EURUSD в нормальных рыночных спрэд может колебаться от 0,5 до 1,8 пунктов в течении нескольких минут. Если ваш терминал подключен к серверу ДЦ и вы проводите тестирование, то результаты тестов при одних и тех же параметрах будут отличаться, особенно сильно в торговых система с малым значение матожидания выигрыша.

Правило шестое.

Самый ценный участок истории котировок- последний год. На нём надо проводить «слепое» тестирование, его по другому называют «тестированием за пределами выборки». Разрабатываете вашу систему на начальном участке данных (4-5 лет) и затем тестируете без изменения то, что вы считаете вашей лучшей комбинацией параметров и правил на более свежем вре-менном периоде (последний год). Если результат не устраивает- процесс повторяется. Этим вы минимизируете вероятность подгонки. Торговая система, подвергаемая простому тестированию или оптимизации без «слепого» тестиро-вания, скорее всего будет обречена на провал.

Правило седьмое.

Тестирование входов и выходов торговой системы надо проводить отдельно. Несмотря на то, что систе-ма по своему составу и определению есть совокупность взаимосвязанных частей, и кажется разумным, что она должна тестироваться в комплексе, существует проблема, заключающаяся в том, что один элемент системы может улучшать или ухудшать результаты относительно остальных. У вас может быть прекрасный метод вхождений, однако, если у вас слабые выходы, это забракует ваши вхождения вместе с оставшей-ся частью системы. Изолировать выходы от входов можно, например, используя простой выход по времени, скажем через 5, 10 или 15 свечей после входа.

Торговля акциями

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

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

Другое дело при дискреционном подходе к трейдингу. Так как здесь все подряд не торгуется, хотя установлены конкретные правила, тестирование на исторических данных сильно утруднено, а иногда и вовсе невозможно. Например, стратегию свинг трейдинга , которая представлена на этом сайте, мне не удалось протестировать. Какой выход?

Далее в этой статье мы поговорим о таком способе тестирование, как «paper trading» или трейдинг на бумаге. Он поможет не только проанализировать стратегию, но и покажет результаты, которые можно реально ожидать.

Бэктестинг

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

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

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

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

Правильный бэктестинг или форвард тестирование

Вам нужно взять достаточно длинный исторический период, не менее 5 лет и разделить его на три части. Две трети вы оставите для тестирования и оптимизации, и называться эта часть будет – данные в выборке. Одну треть нужно зарезервировать для контроля под названием – данные вне выборки.

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

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

Тестирование на текущих данных

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

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

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

Добрый день. Очень небольшое количество трейдеров уделяет должное внимание торговой системе, а ведь это один из основных факторов успешной торговли на бирже. Многие, конечно, знают, что такое торговая система, но почему-то продолжают торговать на интуиции. Почему так происходит? Потому-что большинству трейдеров банально лень над ней поработать, протестировать. Все это отнимает не мало сил и времени. Трейдинг по торговой системе – рутинное занятие. Другое дело – торговля на интуиции. Никаких правил, полная свобода. Хочешь-покупаешь, хочешь-продаешь. Адреналин, азарт 🙂 . Но торговля без системы-это путь в никуда. Поэтому от таких мыслей лучше избавляться.
Следующая причина отсутствия системы у основной массы трейдеров заключается в дисциплине, точнее в ее отсутствии. Подавляющее большинство людей просто не может следовать определенным правилам. Подробнее об этом читайте в статье “”.
Еще, достаточно распространенная проблема тех, кто все-таки старается торговать системно — это неправильно разработанная торговая стратегия. В системе не должно быть и доли интуиции, все должно быть формализовано как можно лучше. Субъективная составляющая полностью должна отсутствовать. Мы не должны думать о том, входить нам в позицию или нет, система должна давать нам исчерпывающий ответ на данный вопрос. А теперь более подробно о том, что такое правильная торговая система и как ее тестировать.

Построение торговой системы

Торговая система — это набор правил для принятия решения. Чем подробнее все правила будут прописаны, тем лучше. Например, правила типа: я торгую только по тренду и продаю/покупаю на пробое уровня — не будут являться торговой системой. Что же должная включать в себя хорошая торговая система? Итак:

(1) Риск менеджмент. Распишите все риски на сделку, на день, на месяц.
(2) Пропишите правила для входа в позицию. Все как можно подробнее. Например, вход выполняется при пробое таких-то уровней. Описание каждого уровня, как он чертится, каким количеством баров должен быть подтвержден и тд. Затем описание точки входа. К примеру, при пробое, откате к уровню и ретесте данного уровня таким-то количеством баров, на таких-то объемах и так далее.
(3) Затем расписываем как вести себя в позиции, как ее протягивать и где выходить.
(4) Стараемся прописать до мелочей все детали. Как мы ведем себя если выйдут макроэкономические новости, используем ли поводыри в своей торговле, на каком таймфрейме выполняем вход в позицию и так далее.
Естественно со временем, система может дополняться, видоизменяться. Но все изменения в нее необходимо вносить только после тестирования.

Как тестировать торговую систему?

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

О том, как протестировать торговую систему на истории, на более длительном интервале времени, читайте в статье ««.

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

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

Зачем прогонять торговую систему на истории?

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

Если у вас еще нет торговой системы, то надеюсь после прочтения данной статьи вы начнете над ней работать. Все профита.

С уважением, Станислав Станишевский.

PS. Коротко о том, как тестировать торговую систему на истории, смотрите в данном видео.

Всем привет! Только что с тренировки, сил осталось немного, как раз на новую статью! Постараюсь сделать её интересной, тем более тема имеет значение для всех системных трейдеров. Как правильно провести тестирование торговой стратегии? На каком интервале времени проводить проверку? Как узнать реальные результаты системы, а не торговать по убыточной, веря в её доходность? Ответы на все эти вопросы найдёте далее!

Как уже упоминал в прошлых статьях, я тестирую свои стратегии с 2000 года по настоящее время. Этого срока вполне хватает. Можно ли уменьшить время проверки и к чему это приведёт? Смотря насколько уменьшать. Давайте возьмём за пример, результаты тестов моей трендовой стратегии и прикинем различные варианты.

Тестирование моей торговой стратегии

Тестирование этой стратегии я проводил ещё в 2010-начале 2011. С тех пор её и применяю. Посмотрите на график с 2001 по 2010 годы включительно на четырёх валютных парах.


10-летний период неплохо показывает различные состояния системы. Можно было проверить за более долгий срок, но моего терпения немного не хватило. :-)

Посмотрите внимательнее на 2008 год – это год кризиса. За этот промежуток стратегия принесла бы более 100%! Это очень хороший показатель, намного больше, чем в другие годы. Представим, что я придумал бы этот способ торговли именно в конце 2008 года. Причём моя лень настолько была бы велика, что после проведения тестирования за 1 год мои руки опустились, и я превратился в овоща. Что было бы тогда? Тогда был бы график только за 2008 год, а это +100% прибыли! Я бы подумал: «здорово, теперь я смогу зарабатывать ежегодно 100%!». Но это на самом деле не так…

А теперь посмотрите на 2009 год – эквити колеблется практически на месте и только к концу немного повышается. Посмотрев на тест только 2009 года, я бы подумал: «хм, не очень-то хорошая », и отказался бы от её применения. Но на самом деле система неплохая, просто один год слишком маленький промежуток, чтобы оценивать её работоспособность.

Всего один год на финансовых рынках может сложиться по-разному, посмотрим на примере.


2008 – год кризиса, резкие движения на большие расстояния становятся нормой, особенно во второй половине. Какая трендовая система не будет зарабатывать на таком рынке? Это же мечта, а не рынок!

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

один год (два) очень маленький срок для оценки эффективности системы, так как на рынке в это время может преобладать одно состояние, например тренд. Я бы советовал проверять как минимум на 5-летнем промежутке, включающем и трендовые и флэтовые состояния рынка, это даст возможность посмотреть на поведение системы в «экстремальных» условиях.

Ещё один важный момент при тестировании стратегий – количество сделок за тест. В интернете встречал результаты, включающие 100-200 сделок, считаю, это очень мало! Здесь ситуация сложнее, минимальное количество сделок зависит от характеристик стратегии. Например, если прибыль/риск вашей системы 2/1, то 300-400 сделок уже дают предварительные данные, их стоит принимать в расчёт. А если у вас трендовая система, где прибыль делается в одной сделке из 50, то 300-400 позиций ни о чём не скажут! Посмотрите характеристики проверяемого способа торговли, и убедитесь, что бэк-тесты включают достаточное количество как положительных, так и отрицательных сделок, чем больше – тем лучше. Кстати, интересный случай из моей практики, как раз в тему:

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

Основные правила для тестирования торговых стратегий

Теперь давайте соберём всё в кучу! Итак, тест должен быть как минимум за 5 лет, более длительный промежуток даёт больше информации, это приветствуется. А вот более маленький – повышает вероятность неадекватного тестирования. Постарайтесь включить трендовое и флэтовое состояние рынка. Существенным плюсом будет количество сделок за 1000, нужно сопоставлять с характеристиками вашей системы, однозначно – чем больше, тем лучше! И не забывайте проводить проверку на других ликвидных инструментах. Пример грамотной проверки системы можете посмотреть в статье:

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

P.S. Классный мультик, что-то нравится мне в последнее время их смотреть! :-)

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

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

Методы оптимизации стратегий

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

Есть уже готовые оптимизаторы стратегий в других программных продуктах типа Wealth-Lab , AmiBroker . Но в них применяются свои скриптовые языки и как правило возникают какие-то другие ограничения, и протестировать стратегии полностью не получается. Как в них перевести свои стратегии? Все ли может этот тестировщик, что нам нужно? Будут ли тесты отражать реальность? И еще много других вопросов возникает, когда начинаешь изучать эту тему подробнее.

К тому же это «черные ящики» и как они делают подсчёты на самом деле, никто не знает. А когда дело касается денег не должно быть места всяким случайностям и неопределенностям. “На слово” создателям такого программного обеспечения я не верю. Сколько раз я сталкивался в самых серьезных продуктах с всякими глюками и багами, письмами и звонками в техподдержку. При этом мы становимся зависимыми от совершенно не нужных нам людей. В общем, доверия у меня к ним никакого. Все эти проблемы сильно замедляют реализацию алгоритмов, и соответственно отнимают наше время и деньги.

И я задался вопросом: «А почему бы не написать свой оптимизатор? Неужели так сложно?» Как оказалось сложно, но вполне реально. К тому же появляется уверенность в результатах и свобода в настройках и модернизациях и модификациях программы. Собственно с этими мыслями я взялся за работу.

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

Ознакомился с основными применяемыми стохастическими способами оптимизации – генетика, монте-карло, рой частиц, их разновидностями и прочими методами. Вообще разновидностей стохастических методов очень много. Например, метод «Роя частиц» или столь популярные «Генетические алгоритмы» . Есть также элегантные решения типа алгоритма «Имитации отжига» (красивая гифка справа, советую посмотреть).

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

Поиск экстремумов

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

Все стохастические методы оптимизации имеют один общий недостаток – могут упереться в какой-то локальный экстремум, а тот самый оптимальный упустить из вида. Чтобы этого избежать, нужно максимально увеличивать области выборок и количество итераций. Но от этого страдает скорость расчетов. Так что нужно всегда искать золотую середину.
Из-за сложности и не очевидности расчетов, методы «Имитации отжиги» и прочие «Рои частиц» я отложил в сторону. В итоге пришел к выводу, что самый доступный и удобный способ в моем случае - это оптимизация методом «Монте-Карло».

Первая версия тестера-оптимизатора «Монте-Карло»

Классический поиск максимума
За основу своего первого тестера-оптимизатора решил взять логику из статьи «Нелинейная стохастическая оптимизация методом Монте-Карло» из сборника Санкт-Петербургского Государственного Университета. Кого интересует это направление, советую почитать их сборники. Много интересных разноплановых статей про оптимизацию в самых разных областях. Где эти стохастические методы только не применяют!

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

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

Но как я уже выше заметил важно изучить область вокруг экстремума, и поэтому, решил сходиться до конца, и на последней итерации проверить полностью все соседние стратегии. Я не стал мудрить с градиентами и сделал сходимость статичной в процентах от начальной выборки. То есть на сколько резать многомерную матрицу после каждой итерации на 1% или на 20% мы решаем в самом начале. Также, мы сразу, учитывая наши возможности по времени, решаем, сколько стратегий мы будем брать из матрицы на каждой итерации для тестирования. Таким образом, нам вообще не важен размер матрицы, мы точно знаем сколько итераций и в каком объеме проведем! В этом и есть вся прелесть стохастических методов.
Основываясь на вышесказанном, написал программу для поиска лучших параметров стратегий.
Исходные данные для оптимизации:

  • тестируемый торговый инструмент,
  • диапазон истории,
  • таймфреймы свечек (хоть все, от 5 сек до нескольких часов),
  • диапазоны рассматриваемых параметров стратегии,
  • шаг в этих диапазонах,
  • процент уменьшения области выборки после итерации,
  • количество элементов в выборке,
  • количество стратегий отправляемых для тестирования.
Консольные тестеры (их у меня несколько, полностью загружают процессор) получают на вход параметры стратегий, тестируют их и результаты в конце сохраняют в бинарные файлы. Сделано это для промежуточного сохранения данных тестирования на случай ошибки, а также защита от утечек памяти и других глюков. И вообще диверсификация риска выхода чего-то из строя. Программа сама передает все данные, делит нагрузку так чтобы тестировшики работали одновременно на полную мощность и при завершении одного сразу запускался другой. Долго мучился, как все синхронизировать, но все получилось автономно, быстро и удобно!
При этом все параметры и результаты выводятся на главное окно программы Монте-Карло. Так что, видно и понятно все что там происходит. Есть окно логирования и окно с итогами тестирования. После каждой итерации программа открывает сериализованные файлы, считает по ним статистику, сортирует и выводит на экран.

Интерфейс тестера-оптимизатора «Монте-Карло»:

В работе:

Конец, тестирования. Лучший результат стал с матожиданием 88%. Причем из 6060 вариантов протестировали только 778, из них 116 повторилось.

Стратегии перед тестированием проверяются, не тестировались ли они раньше, потому что к экстремуму плотность увеличивается и в конце полностью покрывается область вокруг максимума. А одно и тоже повторно тестировать мы не будем. Все результаты тестирования без проблем обрабатываются программой для визуализации стратегий «Анализатор». Всегда можно в ручную подправить ГО (гарантированное обеспечение), комиссию или изменить стартовый депозит:

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

Окно результатов тестирования:

Все вместе:

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

Условная схема работы стохастического алгоритма поиска максимума по методу Монте-Карло:

Усовершенствованный алгоритм

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

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

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

Как тогда обрезать матрицу? Будем обрезать только те области, которые исследовали! То есть мы будем удалять микро области вокруг худших исследованных стратегий. Суть алгоритма сводится к тому, что мы не исследуем хорошие области стратегий, мы не исследуем плохие. А лучшие стратегии мы дополнительно можем исследовать в конце оптимизации.

Здесь показана работа такого алгоритма:

На самом деле матрица многомерная (в моем случае максимум 9 измерений), но для объяснения принципа работы воспользуемся всеми нами любимыми тремя измерениями:

  • Ось Х – параметры «длинной» скользящей средней
  • Ось Y – параметры «короткой» скользящей средней
  • Ось Z – результат тестирования стратегии пересечения «короткой» и «длинной» скользящих средних, в данном случае я взял мат ожидание
Точки в этом пространстве это уже протестированные варианты стратегий с разными значениями «длинной» и «короткой» скользящих. Чем светлее точка, тем лучше ее матожидание.

В принципе это можно было изобразить и в двух координатах:

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

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

Преимущества алгоритма:

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

В итоге получаем что-то такое:

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

«Длинная - матожидание»

«Короткая - матожидание»

Внешний вид тестера-оптимизатора «Исследователь»:

Все приложения были написаны полностью на С#. Перед запуском оптимизации настраиваем следующие параметры:

  • диапазоны параметров стратегии, а также шаг этих параметров,
  • на каких таймфреймах будем исследовать (можно выбрать сразу несколько),
  • диапазон истории,
  • инструмент,
  • путь для сохранения результатов оптимизации,
  • параметры расчёта комиссии и др.
  • критерий останова исследования в процентах от начального размера матрицы,
  • на сколько % мы будем уменьшать область выборки после каждой итерации. От этого зависит общее число итераций и точность оптимизации.
  • сколько случайных стратегий мы будем исследовать из области выборки на каждой итерации,
  • сколько стратегий будем отправлять в тестеры (возможно несколько заходов). Зависит от мощности ПК, объема оперативной памяти, глубины исторических данных.
  • вокруг скольких худших стратегий будем удалять локальные области,
  • сколько лучших стратегий будем исследовать на сходимость,
  • размер локальной области вокруг лучших стратегий, которые будем исследовать дополнительно.
Можно запустить вместо оптимизации «случайный перебор». Здесь тестирутся стратегии не по сетке, а в случайном порядке. То есть мы можем в любой момент остановить исследование и оценить результат. Конечно, чем больше стратегий протестируем, тем яснее получим представление о пространстве.

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

P.S. Не много о себе. С трейдингом познакомился около года назад, сначала торговал вручную, потом понял, что это не мое. Пришел к выводу, что лучше торговать по чётким правилам и автоматизировано. Первый алгоритм написал на скриптовом языке терминала Quik, но этот язык