Как тестировать торговые системы форекс? О тестировании торговых стратегий.

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

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

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

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

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

Бэктестинг

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В работе:

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

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

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

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

Все вместе:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Почему Торговые роботы.

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

ВВЕДЕНИЕ

Занимайтесь исследованием рынка

Многие новички, приходя на рынок, не имеют четкой торговой системы для принятия решений – покупать или продавать бумагу; когда выходить из сделки, если она прибыльная; когда выходить из сделки, если он показывает убыток. Новоиспеченный трейдер обучается прямо во время торгов – он принимает решения, основываясь на интуиции и на своём небольшом торговом опыте. Заработав на сделке, он запоминает определенный случай и старается применить его в будущем; получив убыток, он будет стараться избегать таких ситуаций. Но был ли тот случай, когда он смог заработать, действительной закономерностью или всего лишь единичным случаем из ста, когда ошибившись два раза, мы получили нужный результат? То же самое можно сказать по поводу отрицательного опыта – возможно, всё было сделано правильно, но именно в этот раз что-то сработало не так как надо, и мы не заработали. Начинающий трейдер не задается этим вопросом, и может взять за правило избегать прибыльных стратегий и следовать убыточным, основываясь на своём опыте. Причем те ситуации, которые наблюдает новичок, складываются на основе множества факторов: новости, индикаторы (часто это не один индикатор), наблюдение за стаканом, наблюдение за американским рынком, поведение самой цены. Человеку свойственно окружать себя тоннами информации, чтобы быть уверенным в своей правоте. Но, принимая решение на основе всех этих данных, и заработав или потеряв на сделке, как можно понять, благодаря чему именно мы заработали, и где была совершена ошибка, если мы потеряли деньги? Возникает множество сочетаний информации, которой вы используете, вычленить нужные моменты из этой массы становиться трудно. Осознание своих ошибок и создание прибыльной торговой системы при таком подходе занимает огромное количество времени и стоит немалых денег.
Итак, как же нам научиться зарабатывать на рынке, затратив при этом наименьшее количество времени и денег? Ответ настолько очевиден и прост, что я недоумеваю, почему этим занимается так мало людей! Чтобы научиться работать на рынке, обрести понимание рынка, надо заниматься его исследованием. Под исследованием я подразумеваю не просто наблюдение за рынком, а проверка сделанных выводов на основе прошлой истории, путем совершения бумажных сделок в прошлом, и анализом всех полученных результатов. Если вы недавно пришли на рынок, и у вас нет торговой системы, то вам необходимо придумать стратегию самим или взять за основу чужую систему. После чего требуется исследование, насколько хорошо эта система работает. Проверяя идею на истории, нам не надо ждать следующего дня, недели, месяца, чтобы увидеть первые результаты. Работая с историей, можно прогнать год торгов за несколько часов и узнать, какой результат можно ожидать от вашей системы. Так почему же этим занимается так мало людей? Проанализировав систему, вы лишаетесь иллюзий по поводу того, сможете ли вы заработать деньги, у вас не остается надежды на какое-то чудо. А также, работа на рынке лишается азарта, элемента игры. Мало кому хочется терять надежду на то, что “на рынке заработать просто”, не хочется превращать интересную игру в работу. Именно эти два желания – быстро разбогатеть и получить адреналин являются причиной постоянного потока “мяса” на рынок. На фондовом рынке находиться не меньше мечтателей, чем в любом казино.

ПОДГОТОВКА К ТЕСТИРОВАНИЮ

Выбор бумаги для тестирования

На фондовом рынке большое количество ценных бумаг и производных от этих ценных бумаг. У каждой бумаги своя специфика, свой характер движения. Это значит, что торговые системы, которые работают на одной бумаге, могут быть бесполезны на другой. Есть похожие по своему “характеру” бумаги, на которых будет работать один и тот же подход. Перед тем как создавать торговую систему, нам надо определиться, с каким инструментом мы будем работать. Советовать, чтобы на бумаге были сильные, резкие движения, или же наоборот, движения были плавные, нельзя. К какому рынку подойдет ваша система выясняется только тестированием. Желательно, чтобы бумага была ликвидная. Как вы позже сможете убедиться, потери при входе и выходе из-за проскальзывания значительно уменьшают прибыль и увеличивают убыток. Также стоит обращать внимание на комиссию – комиссия также может сильно сказываться на доходности системы.
Свои системы мы создаем для фьючерса на индекс РТС. Он был выбран как наиболее ликвидный инструмент на российском рынке. Проскальзывание для систем устанавливается в размере 50п для входа и 50п для выхода. Реальное проскальзывание устанавливается опытным путем.

ТЕСТИРОВАНИЕ ТОРГОВОЙ СИСТЕМЫ. ПОДГОТОВКА ПЛАТФОРМЫ

Выбор программы для тестирования стратегии

Для графического отображения исторических данных и тестирования стратегии нам понадобится программа. Выбор программы зависит от разных факторов, каждая программа имеет свои плюсы и минусы. Ниже перечислены наиболее распространенные программы для разработки систем.
Omega Tradestation, Metastock, Amibroker, Wealth-Lab Developer
В апреле 2012 года выходит StockSharp Studio, и вы сможете создавать и тестировать системы в одном месте. А пока мы будем тестировать систему на другой платформе.

Мы работаем на Wealth-Lab. Это один из признанных лидеров среди программ-тестировщиков. Основной его плюс – язык C#. Только ради этого плюса можно остановить свой выбор на этой программе. Данный язык – стандартный язык программирования, помощь по нему вы можете найти не столько на сайте программы wealth-lab, сколько на программистских сайтах и всемирно известных библиотеках (MSDN).

Данный язык позволяет

  • с лёгкостью тестировать написанный код на наличие ошибок;
  • писать стратегии любой сложности – от стандартных систем на свечках, до стратегий на объёмах (маркет профиль);
  • легко переносить протестированную стратегию в вашего робота (об этом на следующих семинарах).

После выбора программы нам необходимо загрузить котировки.

Скачать котировки можно с помощью Гидры (https://stocksharp.ru/doc/ Подробное описание работы с программой по ссылке)

На выходе мы получим текстовый файл с примерно следующим содержанием
ТФ 5 минут, тиккер – РТС. Формат даты, как можно увидеть, ГГГГММДД, формат времени ЧЧММСС.
Разделитель – запятая.

Код

,

Покажем, как загрузить данные в эту программу.

При первом запуске вы увидите примерно следующую картинку.

Мы собираемся загрузить котировки, для этого нажимаем на Data Manager . Next -> Create a new DataSet .
В красном прямоугольнике выделены уже существующие DataSet. Также их видно правее в окошке DataSet. Когда мы проделаем всю операцию, новый датасет появится в этом окне.

После нажатия Create a new DataSet, появится окно. У нас txt файл, поэтому выбираем ASCII Files.
Next -> указываем путь к котировкам.
Next -> после выбора папки в окошке появятся файлы, которые можно использовать.

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

Next -> выбираем интервал, который мы выбрали при загрузке. У нас это 5 минут. Если у вас файл с 5 минутами, то из него можно создавать файлы старшего ТФ, но не наоборот. Создавать файлы старшего ТФ из младших тоже не советуется, т.к. Велс криво склеивает. Лучше отдельно загрузить старший ТФ.
Next -> появится окно, где нам надо прописать формат для программы. В нашем случае нам надо добавить 1 - Add Field в список Field Order. Наш формат ,

Для того, чтобы написанная на коде стратегия работала корректно, необходимо занести информацию об инструменте в Велс. Для этого заходим в Tools -> Sumbol info Manager , появится окошко. Сюда необходимо заносить данные для всех новых DataSet. Тип, устанавливаем Фьючерс (или акции, елси вы будете тестировать их). Маржа - сейчас среднее значение 9000 (минус в том, что маржа считается постоянной, и при 50 000 по РТС и при 100 000, при этом мы понимаем, что фактически она меняется). Point Value для фьючерсов 0,6. Тик равен 5 в нашем случае. Decimilars (знаков после запятой) у нас 0 . В Symbol нужно написать точно такое же название как в DataSet.
После того как мы прописали информацию, Велс будет знать как именно расчитавать профиты и лоси для системы.

Осталось задать проскальзывание. Tools -> Preferences -> Slippage . Ставим галочку для первого случая и ставим нужное нам проскальзывание. For Futures - > 10, проскальзывание в тиках = 50п.

ТЕСТИРОВАНИЕ ТОРГОВОЙ СТРАТЕГИИ. ПРИМЕР

К этому моменту у нас всё готово для тестирования стратегии. Но самой торговой системы у нас нет. Откуда же брать идеи для создания торговых систем? Лучший способ для начинающего системщика – взять за основу чужую торговую систему и попытаться поработать с ней. Позже, на основе ваших собственных наблюдений, вы будете создавать уникальные ТС.
Создание стратегии
Идея
Для создания ТС у нас должна быть идея, предположение, которое необходимо проверить. Наша идея основывается на наблюдении, что на рынке бывают дни с большим диапазоном, когда цена практически с самого открытия идет в одном направлении и закрывается рядом с максимальной точкой. Задача торговой системы состоит в том, чтобы поймать это движение – ударный день.
Центральные условия стратегии
Станет ли день ударным мы не знаем. Мы должны найти правила, соблюдение которых позволит нам получить систему с положительным матожиданием. На данном этапе, у нас есть только примерное представление, как стратегия должна работать. Все наши предположения нам предстоит проверить.
Предположения
- Если день ударный, то мы должны войти в него с самого утра. Если нам не удалось войти до определенного времени, день скорее всего не ударный.
- вход в лонг осуществляется выше уровня открытия, вход в шорт осуществляется ниже открытия. Уровень открытия служит как фильтр – если мы находимся выше, вероятность расти больше чем вероятность упасть и наоборот.
- вход в лонг осуществляется выше средней скользящей, вход в шорт осуществляется ниже средней скользящей. Средняя скользящая (157 – МА), используется как дополнительный фактор определения тренда.

Написание кода по алгоритму

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

Методы расчета размера позиции в системе

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

Нас интересует результаты системы, её доходность и просадка. Чтобы увидеть нужные нам результаты, необходимо зайти во вкладку Performance. Тут нужно сказать о способах, которыми расчитаываются результаты выполнения кода. При выборе разных способов, мы будем получать разные результаты на одной стратегии. Рассмотрим вкладку – Position Size.

Starting Capital – сумма с который вы будете тестировать систему.

1 – первый тип расчета позиции. Размер позиции будет постоянно выполнятся исходя из суммы указаной в fixed dollar . Если у нас ГО 7500, и в fixed dollar прописано 10 000, то размер позиции всегда будет = 1 контракту.

2- Размер позиции постоянно равен определенному количеству контрактов. 100 cоntracts в нашем случае было бы равносильно 750 000 в fixed dollars.

Эти два метода используются для того, чтобы увидеть – как было бы если вы постоянно торговали фиксированной суммой/сайзом. Третий способ отличается от передидущих двух, для тестирования систем мы используем именно его. Percent of Equity – размер позиции расчитывается изходя из имеющейся суммы, которая меняется по ходу тестирования. Если изначально у нас было 100 000 и на 50% от депозита размер позиции равен 6 контрактам, на сумме 200 000, он будет равен 12 контрактам. Тоесть в этом методе используется реинвестирование, и мы увидим какую доходность покажет система, если постоянно вкладывать заработаные деньги в систему. Также при таком подходе мы видим, какая может быть действительная просадка у системы. Этот вопрос расмотрим поподробнее.

Размер просадки при 1 и 2 методе расчета размера позиции в сравнение с 3 методом.

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

Картинки приведены с другой системы, не с той, что сейчас разбираем мы!

Посмотрим на эту же систему, где размер позиции рассчитывался исходя из процента размера депозита.

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

Это одна из причин, почему мы используем третий метод расчета размера позиции при тестировании.
Performance
Наиболее полную информацию о результатах тестирования системы можно увидеть на вкладке Performance.
Рассмотрим некоторые строки из данной вкладки.

Backtest Performance Report | Range – временные рамки, в которых проводилось тестирование. * Сами временные рамки задаются слева в Data Range. Data Range заданный вами может не совпадать с Range.

Net profit – сколько денег заработала система с момента начала тестирования.

Net profit % - сколько процентов заработала система с момента начала тестирования.

Annualized Gain – Средний % годовых от стратегии. * если стратегия тестируется на промежутке меньше чем год, в данной строке пишется, сколько было бы на конец года, если стратегия продолжала работать с такой доходностью, как и в доступный тестируемый промежуток.

Number of trades – количество совершенных сделок.

Average Profit – средняя прибыль за одну сделку.

Win/Loss Rate – процент прибыльных/убыточных сделок

Average Profit/Loss – средний профит/лосс по итогам всех
прибыльных/убыточных сделок.

Max consecutive Winners/Losses – максимальное количество подряд прибыльных/убыточных сделок.

Maximum drawdown – максимальная просадка системы.

Итак, на картинке снизу, мы видим результаты тестирования стратегии (тестирование проводилось на промежутке 2009 – 2010 год). Результаты совсем не те, на что мы рассчитывали: огромная просадка, при практически нулевом профите. В чем проблема, почему стратегия, так плохо работает, ведь были соблюдены все условия, и код проверен, работает правильно?!

Результаты тестирования нас не удовлетворили. Давайте попробуем улучшить нашу стратегию. Существует несколько способов улучшения результатов стратегии
– тестирование параметров.
– изменение условий работы стратегии.

Сначала попробуем оптимизировать параметры системы. Параметров в нашей системе 3 (5)
– МА период скользящей средней: Может так оказаться, что МА с другим периодом лучше работает.
– Время, до какого времени мы ищем сигнал: Возможно, что ждать сигнала до 2х часов излишне. Параметр время разбит отдельно для коротких и длинных позиций.
– Риск. Размер стопа после входа в позу: Стоп в нашем случае не превышает заданного параметра.
Оптимизация параметров
Важно научиться, по результатам оптимизации не только выбирать наиболее прибыльные значения параметров, но и также находить некоторые закономерности, которые могут помочь нам улучшить стратегию.

В любой системе есть параметры. Про параметры в системе следует сказать следующее:
А – параметры должны иметь под собой какое-то обоснование. Например, параметр время – работать после N часов дня, не имеет смысла, т.к. если это ударный день, то мы уже должны были войти в позицию, и нас не должно было выбить по стопу. Иначе – это не ударный день, искать входов не имеет смысла. Назначение этого параметра – найти время, до которого стоит искать признаки ударного дня, и после которого становится больше ложных сигналов.
Б – параметр можно переоптимизировать – подогнать под определенный промежуток времени, когда он будет хорошо работать, но в другое время будет работать намного хуже. Нужно избегать таких ситуаций.
В – система должна работать прибыльно на большом наборе значений параметра. Что значит - если есть параметр с 10ю различными значениями, система должна работать на большинстве из этих значений.
Г – чем их меньше, тем лучше. Увеличение количества параметров делает систему менее устойчивой.

Проведем оптимизацию наших параметров

Для того чтобы открылась вкладка Optimization, необходимо нажать на Optimize в левом нижнем углу.

Optimization control – настройка, выбор тех параметров что мы будем тестировать. Чтобы оптимизация проходила быстрее, стоит выбирать один-два параметра и тестировать их. Чтобы удалить параметры, которые мы не хотим тестировать, выделяем его и нажимаем Remove Selected Parameter. Восстановить начальный вид можно нажав Rollback Changes. После того как мы произвели необходимые настройки, нажимаем Begin Optimization.

Results – результаты тестирования в текстовом виде.

1 Parameter Graph - на шкале отображается результат тестирования только одного параметра.

2 Parameter Graph – Отображаются сразу два параметра.

Быстрее и нагляднее всего тестировать пару параметров. Например, Время - Риск лонг, Время_S - Риск шорт, Время – Время_S . Надо понимать, что если мы изменим один параметр, то он потянет за собой другой параметр. Поэтому тестировать лучше всего как раз такие пары, где один параметр влияет на другой.

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

Я еще постараюсь сделать больше ошибок, чтобы их потом не сделали вы. А сейчас пойдем по более корректному пути.

Оптимизация Время – Риск Лонг

Черными линиями отмечена область, выше которой находятся положительные параметры, ниже отрицательные. Если вы помните, я говорил, что параметр должен быть прибыльным на большем наборе значений параметра. В данном случае у нас прибыльная стратегия, если параметр от 10 часов до 14 часов. Обратите внимание, - работа до 11 часов, находится в отрицательной зоне, но не потому, что стратегия сливает, если так работать, а потому что у нас сейчас плохо работают продажи. И если работать до 11 часов по покупкам, стратегия не выходит суммарно в плюс.

Если отключить в стратегии продажи, то картинка изменится именно таким образом – работа до 14 часов находится в положительной зоне при всех значениях риска.

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

График оптимизации с другой стороны, чтобы лучше рассмотреть результаты по риску.
Лучший параметр для риска по покупкам – 0,8-0,9%.

Какие выводы можно сделать по оптимизации Время – Риск

1 – Стратегия является прибыльной, если работать до 14 часов. При этом прибыль растет до 12 часов - посмотреть, почему прибыль начинает падать после 12 часов.
2 – При параметре время до 14 часов, на всех значениях риска, стратегия является прибыльной. Это хорошо, параметр должен быть прибыльным на большом наборе своих значений.
3 – Есть четкая тенденция, при увеличении параметра риска, прибыль растет – посмотреть, почему так происходит.

Проводя тестирование систем, и оптимизируя параметры, старайтесь понять, почему именно стратегия начинает лучше работать при тех или иных изменениях. По результатам оптимизации выбираем значение для Времени = 12 часам, для Риска по покупкам = 0,9%.

Для того чтобы понять, что именно изменилось, при новых параметрах, посмотрим Performance.

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

Если изменить риск с 0,2% до 0,8%, то количество сделок уменьшится еще больше, при том, что количество прибыльных сделок возрастет. Почему так произошло? Если просмотреть входы в сделки руками, то можно увидеть ситуации, когда поставим маленький стоп, мы получали после этого еще много лосей и в итоге так и не ловили УД. Если бы мы поставили больший стоп, то смогли бы поймать УД и не получили бы лосей.

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

Оптимизация Время – Риск Шорт

Повторяем процедуру для продаж.

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

В результате оптимизации я сделал следующие изменения в коде
- время для продаж до 14 часов.
- время для продаж с 11 часов
- риск для продаж 0,7%

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

Performance после изменений: времени работы, рисков для покупок и продаж.

Перед тем как приступить к проверке последнего параметра – Фильтра по МА, хочу сделать небольшое отступление и рассказать одну особенность WealthLab по расчету прибыли и просадок в Performance отдельно по покупкам и продажам.

Откуда -280%

В WealthLab есть отдельный расчет просадок и прибыли по покупкам и продажам. Это сделано для удобства, чтобы можно было видеть, как они работают по отдельности. Есть одна тонкость, которая не является критической, но которую следует понимать.

Посмотрите на картинку выше, слева, в столбце по продажам, указана просадка, как работает шорт. Справа тот же столбец, только NetProfit сильно изменился, при этом мы ничего не меняли в алгоритме для продаж, и, как видно из той же картинки, количество сделок не изменилось. Дело в том, что, несмотря на то, что статистика для покупок и продаж ведется отдельно, при работе кода и появлении сигнала на продажу, вход в позицию осуществляется объемом с учетом заработанных ранее денег. После того как мы прооптимизировали алгоритм для покупок, и результаты сильно выросли, в том месте где мы раньше входили объемом в 13 лотов (пример), мы теперь будет входить объемом 26, т.к. до этого мы успели заработать с помощью покупок. При этом просадка считается от суммы, которую заработали продажи.

МА служит как некий индикатор тренда – если цена находится ниже средней, значит краткосрочный тренд нисходящий, наоборот – восходящий. Нам необходимо входить в позицию там, где у нас есть перевес вероятности, фильтр должен помогать нам находить этот перевес.
Число 157 объясняется количеством пятиминуток за один рабочий день (сейчас время торгов изменилось, количество 5м. тоже изменилось). Посмотрим, как работает стратегия на других параметрах.
Сейчас мы тестируем только один параметр, поэтому смотрим результаты в
1 Graph Parametr.

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

Поставим значение параметра МА = 250.

Выводы после оптимизации параметров.

У нас получилось улучшить стратегию УД с помощью оптимизации параметров. Также, по графикам оптимизации мы смогли увидеть некоторые закономерности, которые помогли нам улучшить результаты системы.

Начальный Алгоритм:
- вход в лонг выше открытия дня, вход в шорт ниже открытия дня
- Цена выше/ниже 157 средней. +++ Параметр работает, оставляем.
- искать точку входа до определенного времени t. +++ Выявили оптимальное время работы. С 11 до 12 для покупок и с 11 до 14 для продаж.
- Вход в лонг по бычьей модели поглощения.
- Вход в шорт по медвежьей модели поглощения.
- стоп = 0,2 – 0,3% от точки входа. --- оказалось что вход с маленьким стопом не оправдывает себя. Параметр был существенно изменен.
- выход в конце дня.

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

Как еще улучшить стратегию?

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

Во время просмотра Chart, мне попадались случаи подобные этому – когда у нас был хороший профит (в данном случае чистых 4,5%), а потом нас выбивало по стопу. Сразу возникает мысль – а что если сделать перенос в БУ после прохождения ценой некоторого расстояния? Или, что если мы будем фиксировать цель не в конце дня, а по математической цели, например, после 4% движения.

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

Во вкладке trades, есть два столбца MAE% и MFE%.

МАЕ% - означает, на сколько процентов цена уходила в сторону стопа.

MFE% - означает, на сколько процентов максимально цена уходила в нужную нам сторону от точки входа.

На приведенной картинке, видно, что были трейды, когда цена уходили на 4,5% , 2,3%, 3,7%, потом разворачивалась и мы получали убыток. Если просмотреть все трейды, становится видно, что такие случаи имеют место быть, поэтому попробовать запрограммировать перенос в БУ после прохождения определенного %, стоит. Также попробуем запрограммировать выход по математической цели.

Перенос стопа в БУ, после прохождения ценой N%.
Если цена проходит определенный путь от точки входа, то стоп переносится в БУ. Зададим это условие как параметр, допишем в код тестера.
Удостоверившись, что код работает правильно, протестируем новый параметр.

По результатам теста видно, что существенно никаких изменений, при переносе стопа в БУ нет. В таких случаях лучше отказаться от параметра, т.к. больше количество параметров делает систему менее устойчивой.

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

По результатам теста видно, что лучшие значения параметра это 9%, что, по сути, является максимальным значением. Если фиксировать прибыль при достижении 5-6-7%, к увеличению профита это не приведет, к уменьшению просадки тоже.

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

Проверка правильности написания кода.

После изменений в коде надо удостовериться, что код работает правильно. После каждого изменения в коде, надо проверять, что код работает правильно, иначе есть большая и неприятная возможность заниматься анализированием и оптимизацией неправильно работающего кода. Проверять можно полностью ручным методом, можно в помощь ручному методу использовать возможности WealthLab.
Например, возьмём результаты работы кода до внесения изменений по переносу стопа в БУ и после, установив в новой версии параметр переноса на значение 10%. 10% у нас за время тестируемой истории не было ни разу, поэтому результаты работы кода в обоих случаях должны быть одинаковыми.
На приведенном ниже рисунке мы видим, что все значении остались прежними, это косвенно подтверждает, что явных ошибок в измененном коде нет.
Можно посмотреть во вкладке trades MAE% и MFE%. Установив параметр (например, 2%) при всех MFE больше 2%, в колонке Profit видно, что стопило нас на уровне безубытка.

Проверка кода на наличие ошибок по перфомансу.

Проверка кода на наличие ошибок по MAE – MFE.

Заключение

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

Удачи в ваших исследованиях

Горбунов Алексей

StockSharp Торговые роботы

Приложение: код для тестирования торговой системы

Код

using System; using System.Drawing; using WealthLab; using WealthLab.Indicators; using WealthLab.Properties; using System.Drawing; namespace WealthLab.Strategies { public class FirstStrategy: WealthScript { StrategyParameter paramMA; StrategyParameter paramTime; StrategyParameter paramTimeShort; StrategyParameter paramRisk; StrategyParameter paramRiskS; public FirstStrategy() { paramMA = CreateParameter("MA", 1, 1, 500, 10); paramTime = CreateParameter("Время", 12, 10, 19, 1); paramTimeShort = CreateParameter("Время_S", 11, 10, 19, 1); paramRisk = CreateParameter("Риск лонг", 0.2, 0.2, 1, 0.1); paramRiskS = CreateParameter("Риск шорт", 0.2, 0.2, 1, 0.1); } protected override void Execute() { DataSeries ma = SMA.Series(Open, paramMA.ValueInt); PlotSeries (PricePane, SMA.Series(Open, paramMA.ValueInt), Color.Blue, LineStyle.Solid, 2); double sp = 0; double stop = 0; PlotStops(); for(int bar = 1; bar < Bars.Count - 1; bar++) { if (Bars.IntradayBarNumber(bar) == 0) { sp = Bars.Open; } \ if (IsLastPositionActive) { Position p = LastPosition; if (p.PositionType == PositionType.Short) { if (!CoverAtStop(bar, p, stop)) { if (Bars.IsLastBarOfDay(bar)) { CoverAtMarket(bar, p); } } } else //Long { if (!SellAtStop(bar, p, stop)) { if (Bars.IsLastBarOfDay(bar)) { SellAtMarket(bar, p); } } } } else { double high = Bars.High; double low = Bars.Low; if (!Bars.IsLastBarOfDay(bar) && high < sp) { if (Bars.Open < Bars.Close && Bars.Open > Bars.Close && Bars.Date.Hour < paramTimeShort.ValueInt && Close < ma) { stop = Math.Max(Bars.High, Bars.High); double openPrice = Bars.Open; double exitPrice = stop; if (openPrice / exitPrice > 1 - paramRiskS.Value / 100) { RiskStopLevel = stop; ShortAtMarket(bar + 1); } else { stop = openPrice / (1 - paramRiskS.Value / 100); RiskStopLevel = stop; ShortAtMarket(bar + 1); } } } if (!Bars.IsLastBarOfDay(bar) && low > sp) { if (Bars.Open > Bars.Close && Bars.Open < Bars.Close && Bars.Date.Hour < paramTime.ValueInt && Close > ma) { stop = Math.Min(Bars.Low, Bars.Low); double openPrice = Bars.Open; double exitPrice = stop; if (exitPrice / openPrice > 1 - paramRisk.Value / 100) { RiskStopLevel = stop; BuyAtMarket(bar + 1); } else { stop = (1 - paramRisk.Value / 100) * openPrice; RiskStopLevel = stop; BuyAtMarket(bar + 1); } } } } } } } }

 
Статьи по теме:
Методические рекомендации по определению инвестиционной стоимости земельных участков
Методики Методические рекомендации по определению инвестиционной стоимости земельных участков 1. Общие положения Настоящие методические рекомендации по определению инвестиционной стоимости земельных участков разработаны ЗАО «Квинто-Консалтинг» в рамках
Измерение валового регионального продукта
Как отмечалось выше, основным макроэкономическим показателем результатов функционирования экономики в статистике многих стран, а также международных организаций (ООН, ОЭСР, МВФ и др.), является ВВП. На микроуровне (предприятий и секторов) показателю ВВП с
Экономика грузии после распада ссср и ее развитие (кратко)
Особенности промышленности ГрузииПромышленность Грузии включает ряд отраслей обрабатывающей и добывающей промышленности.Замечание 1 На сегодняшний день большая часть грузинских промышленных предприятий или простаивают, или загружены лишь частично. В соо
Корректирующие коэффициенты енвд
К2 - корректирующий коэффициент. С его помощью корректируют различные факторы, которые влияют на базовую доходность от различных видов предпринимательской деятельности . Например, ассортимент товаров, сезонность, режим работы, величину доходов и т. п. Об