Торговая система — разработка и тестирование. Как избежать переоптимизации торговой системы. Стратегия торговли с возвратом к среднему

Торговая система — разработка и тестирование. Как избежать переоптимизации торговой системы. Стратегия торговли с возвратом к среднему

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

Как уже упоминал в прошлых статьях, я тестирую свои стратегии с 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. Классный мультик, что-то нравится мне в последнее время их смотреть! :-)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Пример: если на всем периоде наблюдается среднее количество убыточных сделок — 3-4 раза подряд и на одном участке 8 раз, то второе значение с большой вероятностью является аномалией и в расчет приниматься не должно.

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

  1. Не доверяйте глазам. Кривая депозита может быть и красивой, но при большем приближении могут вырисоваться явные минимумы и максимумы. Оценка системы «на глаз» не даст полного представления об этих параметрах, тогда как статистические методы позволят вывести усредненное количество прибыльных и убыточных сделок, достижения уровней поддержки и сопротивления и т.д. Имея под рукой конкретные цифры, проще понимать, как строить риск-менеджмент.
  2. Тестирование торговой системы выполняется без использования нулевого бара, то есть бара, который только формируется. Пока вы не знаете котировок внутри бара, не используйте его значения в тестировании.
  3. Убедитесь в правильности котировок. Несмотря на то, что брокеры гарантируют поставку котировок в онлайн режиме, после чего переходят в архив. По факту, архив котировок по непонятным причинам у разных брокеров отличается. И если взять один и тот же инструмент и подгрузить котировки разных ДЦ, результат может оказаться разный. Тестирование торговой системы допустимо только после анализа котировок на предмет «дыр» и «битых участков».
  4. В идеале тестирование торговых систем должно охватывать 5-6 лет. Только так можно охватить наибольший диапазон поведенческих факторов рынка. Некоторые трейдеры с этим не согласны, считая, что за 5 лет может произойти коренное изменение рыночной ситуации и система будет к этому времени нерабочей. Теория цикличности рынков пока опровергнута не была, но период тестирования оставляем на ваш выбор.
  5. Наиболее объективным будет тестирование по всем тикам. Оптимизация нескольких параметров может занять больше 24 часов, но это оправдано.
  6. Параметры торговой системы не должны противоречить свойствам актива, на котором осуществляется тестирование. Каждая валютная пара имеет индивидуальный уровень ордеров стоп-лосс, тейк-профит, спред и т.д. В МТ 4 это можно увидеть, перейдя по меню «Обзор рынка — Символы — Свойства». Если в тестировании будут установлены значения, превышающие указанные параметры, возникнет ошибка:
  • 130 — неправильные стопы;
  • 131 — неправильный торговый объем.

Аномальные показатели параметров МТ4 возможны в период выхода новостей, потому в такие моменты возможны погрешности при тестировании.

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

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

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

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

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

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

Отлично! Сделки совершены верно и даже получена неплохая в виде 31%. Что в этом случае сделает начинающий трейдер? Правильно – продолжит торговлю на бирже по той же схеме. Торговля продолжается в течение месяца и, как результат 105% прибыли (см. картинку ниже).

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

На графике показан результат применения торговой стратегии в %, начиная с месяца, который попался трейдеру первым (отмечен красным цветом) и до конца года. Несмотря на первый положительный месяц, в целом стратегия оказалась убыточной и ее применять просто нельзя. А можно ли было узнать это заранее? Конечно можно. Протестируем стратегию с самого начала года и вот, что получим.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В работе:

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

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

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

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

Все вместе:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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