Библиотека пошаговой форвард-оптимизации для МетаТрейдер 4: руководство пользователя

15 августа 2016, 19:40
Stanislav Korotky
0
66

Это часть документации библиотеки WalkForwardOptimizer для МетаТрейдер 4 - оглавление.

Последовательная пошаговая форвард-оптимизация

После того как библиотека WFO подключена к советнику (заголовочный файл приложен внизу), последующий процесс организуется следующим образом. Настраивается желаемый период оптимизации (например, 2001-2015 годы на таймфрейме D1). Далее - выбирается окно оптимизации и размер шага с помощью мета-параметров wfo_windowSize и wfo_stepSize, предоставляемых библиотекой. Оба могут быть выбраны из списка предопределенных констант (год, полгода, квартал, месяц, неделя, день), но шаг должен быть меньше окна. Например, мы можем выбрать окно размером в год и шаг, равный кварталу. Далее необходимо задать для тестера, как много повторяющихся форвард-шагов следует выполнить, с помощью wfo_stepOffset - это еще один мета-параметр бибилиотеки, и наиболее важно, что для него должна быть включена оптимизация. Для оптимизации wfo_stepOffset следует всегда ставить приращение, равное 1, потому что это обеспечивает бесшовное объединение всех форвард шагов в консолидированный форвард тест. Все мета-параметры определены в заголовочном файле.

Из-за ограничений тестера нельзя заранее определить дату окончания оптимизации из самого советника средствами MQL. Поэтому пользователь должен сам рассчитать, сколько шагов укладывается в общий период. Период 2001-2015 содержит 1 целое окно (год), а остальная "дистанция" покрывается форвард-шагами длиной в квартал, что дает (15 - 1) лет умноженных на 4 квартала в году = 14*4 = 56. Таким образом, пользователь должен включить оптимизацию для wfo_stepOffset в диапазоне 0 - 56 с шагом 1. Строго говоря, конечное значение - 56 - тоже обрабатывается и попадет на 1-й квартал уже 2016 года. Это проиcходит потому, что библиотека WFO считает шаг форвард-тестирования находящимся вне окна оптимизации. В нашем примере, поскольку 1-й квартал 2016 года существует, выходом за границы "истории" можно пренебречь. Однако за этим следует следить, если WFO запускается на периоде впритык к последней известной дате. В таком случае важно не задавать шагов больше, чем доступно.

Описанные выше настройки соответствуют так называемому последовательному (rolling) форвард-тестированию. Кроме него библиотека также поддерживает кластерный (cluster) и "якорный" (anchored) анализ, рассмотренные ниже.

 

Общие инструкции 

Прежде чем начать оптимизацию, откройте первую закладку в диалоге тестера со свойствами советника и установите Оптимизируемый параметр в Custom. Значение этого показателя нужно будет выбрать с помощью мета-параметра wfo_estimation на второй вкладке с входными параметрами. Также, как правило, требуется включить флаг Использовать даты и выбрать их в полях От / До на вкладке тестера Настройки. На закладке Результаты оптимизации (она, к сожалению, доступна только после начала оптимизации) в контекстном меню должна быть обязательно отключена опция Пропустить бесполезные результаты.

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

Когда все настроено, запустите оптимизацию и дождитесь окончания её работы. В результате будет сформирован csv-файл с показателями каждого прогона (прибыль, фактор прибыли, количество сделок и другие, включая значение OnTester - все они указываются для соответствующего окна оптимизации и форвард-теста в одной строке). Кроме того, будут созданы специальные глобальные переменные с номерами прогонов с лучшими параметрами (продолжая все тот же пример, будет получено 57 наборов).

Тип главного оценивающего показателя, который используется для оптимизации и характеризует успешность торговли, выбирается с помощью мета-параметра библиотеки wfo_estimation. Его можно выбрать из списка, включающего сумму прибыли, фактор прибыли, коэффициент Шарпа, процент просадки (инвертированный как 100-ВВ, рассчитываемый по линии баланса), или задать как произвольное выражение, составленное из всех этих величин (подробности см. в разделе с описанием формул). Библиотека также предоставляет 2 комплексных встроенных показателя (loose и strict): их формулы включают коэффициент Шарпа, фактор прибыли, размер прибыли и количество сделок. Разница между loose и strict заключается в том, что первый учитывает все сделки, а второй предварительно исключает сделки, в которых прибыль больше, чем средний ожидаемый выигрыш плюс 3 сигма. Другими словами, strict-метод удаляет случайные удачные сделки перед расчетом показателя.

Для анализа результатов следует запустить скрипт WFR, который читает csv-файл и глобальные переменные, и формирует на их основе html-страницу с отчетом.

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

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


Генетический алгоритм

При необходимости можно включить генетическую оптимизацию, однако это потребует явным образом удалять старые "WF_" глобальные переменные перед каждой новой оптимизацией - либо вручную, либо с помощью скрипта построения отчетов. Если генетика не применяется, можно добавить вызов библиотечной функции wfo_setGVAutomaticCleanup(true) в свой код, и библиотека автоматически удалит глобальные переменные перед каждой оптимизацией. К сожалению, MQL API не предоставляет средств для проверки того, включена ли генетическая оптимизация, из-за чего невозможно выбрать передаваемое в функцию wfo_setGVAutomaticCleanup значение на лету, и оно должно быть в явном виде прописано в соответствии с предполагаемым режимом оптимизации. Начиная с версии 1.2 можно использовать функцию wfo_setCleanUpTimeout.

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

В целях повышения производительности можно применять метод тестирования по контрольным точкам - он достаточно быстр и точен для стратегий с длинными сделками. Это компромисс между режимами "по ценам открытия" и "по тикам". "По ценам открытия" допустим только для роботов, специально разработанных для торговли на открытии бара, а "тиковый" режим может оказаться слишком медленным при форвард-оптимизации. Обратите внимание, что пошаговая форвард-оптимизация фактически реализована с помощью оптимизации дополнительных мета-параметров:  wfo_stepOffset,  wfo_customWindowSizeDays,  wfo_customStepSizePercent, которые способны потребовать множество дополнительных проходов тестера.

 

Кластерная пошаговая форвард-оптимизация

Библиотека WFO поддерживает расширенный режим кластерного анализа форвард-оптимизации.

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

Замечание

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

Якорная пошаговая форвард-оптимизация

Библиотека WFO имеет еще один режим оптимизации, когда начальная дата окна оптимизации остается неизменной, но размер окна увеличивается на размер шага. Это так называемая якорная (anchored) форвард-оптимизация. Для этого режима форвард-шаг должен быть выбран из списка предопределенных констант (а не в процентах), а размер окна должен оптимизироваться с помощью мета-параметра wfo_customWindowSizeDays с шагом, равным количеству дней в выбранной константе. Это ограничение связано с тем, что в противном случае относительная длина шага (после пересчета из процентов в дни) различалась бы на разных прогонах и соседние шаги накладывались бы друг на друга. Например, можно оптимизировать  wfo_customWindowSizeDays  в диапазоне от 60 до 150 дней с шагом 30, и выбрать константу month в качестве значения wfo_stepSize (она тоже равна 30, поэтому каждый раз, когда размер окна будет увеличиваться на 30 дней, оно будет дополнительно поглощать в точности один шаг с предыдущего форвард-теста, и все форвард-тесты сформируют непрерывную последовательность). Если запустить оптимизацию с начала 2016 года, то такая якорная оптимизация сделает форвард тест марта (по оптимизации за январь, февраль), апреля (по оптимизации за январь, февраль, март), мая (по оптимизации за январь, февраль, март, апрель), и наконец июня (по оптимизации за январь, февраль, март, апрель, май).

Более подробно про настройки разных режимов см. раздел  Сценарии использования .


Файлы:
Поделитесь с друзьями: