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

15 августа 2016, 19:41
Stanislav Korotky
22
578

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

 Частые вопросы

 

В. Зачем мне использовать WFO?

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


В. Есть ли библиотеки WFO для MetaTrader 5?

О. Да. Она имеет некоторые преимущества перед версия для МТ4: большая степень автоматизации, в частности ручные операции (такие как удаление глобальных переменных и копирование файлов) исключены, рабочие параметры EA автоматически получаются из тестера, включая названия и значения (в МТ4 их нужно передавать в библиотеку явным образом из вашего кода), поддерживается оптимизация на нескольких ядрах, включая агентов локальной сети и облака MQL5. Это делает версию для МТ5 более удобной и эффективной. Мне не известно, будет ли поддержка режима пошаговой форвард-оптимизации добавлена во встроенный тестер в обозримом будущем.


В. Как правильно установить библиотеку?

О. Процесс покупки и скачивания продуктов подробно описан в документации: Справка по MetaTrader 5 и Справка по MetaTrader 4. Аренда производится аналогичным образом.

После покупки Вы увидите продукт в окне Маркет внутри терминала, и с правой стороны строки будет кнопка Установить. По её нажатию должно произойти скачивание ex4/ex5 файла. Если на этой стадии происходят какие-либо ошибки, они выводятся в лог.

Все MQL-программы скачиваются внутрь иерархии рабочей папки терминала с несколькими уровнями вложенности: папку MQL5, затем в ней - в соответствующую подпапку в зависимости от типа программы, и далее в подпапку с именем Market. Например, индикаторы попадают в MQL5/Indicators/Market/, эксперты - в MQL5/Experts/Market/ и т.д. К сожалению, с библиотеками это может не сработать.

В некоторых случаях MQL маркет трактует библиотеки как скрипты (это особенность сайта, мы на неё не можем повлиять), из-за чего они скачиваются в папку MQL5/Scripts/Market/. Вы должны вручную скопировать файл в MQL5/Libraries/. Между прочим, можно скопировать библиотеку во все экземпляры терминала на том же компьютере и они будут работать без дополнительных активаций (виртуальные PC не считаются, они являются компьютерами с другим "железом" и требуют отдельной привязки).

После скачивания библиотека может иметь имя, отличное от стандартного "WalkForwardOptimizer.ex5", например, "WalkForwardOptimizer MT5.ex5". В этом случае переименуйте её в "WalkForwardOptimizer.ex5", потому что имя должно соответствовать директиве #import в заголовочном файле WalkForwardOptimizer.mqh.

Альтернативно Вы можете иметь несколько версий библиотеки под разными именами (например, с целью бэкапа, тестирования) и использовать их в своем коде при условии, что директива #import соответствующим образом редактируется.

Всегда проверяйте, что используете последнюю версию заголовочного файла WalkForwardOptimizer.mqh - она публикуется в разделе Обсуждений продуктовой страницы (версия MT5, версия MT4).



В. Почему периоды оптимизации и тестирования объединены в рамках одного прогона тестера?

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


В. Почему при использовании библиотеки WFO нельзя использовать стандартные ограничения оптимизации?

О. Действительно, при использовании библиотеки следует снять все флаги на вкладке Оптимизации диалога Свойств эксперта в тестере. Это связано с тем, что ограничения применяются к соответствующим величинам, рассчитываемым на всем периоде, но он внутри библиотеки делится на период оптимизации и тестирования, причем только показатели оптимизации должны приниматься во внимание. Библиотека WFO вычисляет все важные показатели для обоих периодов независимо и предоставляет доступ к показателям оптимизации через специальные переменные, которые можно использовать в формулах. Если вы хотите использовать ограничение, задайте выражение для основного показателя успешности торговли с учетом конкретного параметра, на который нужно наложить ограничение, и если условие не будет выполнено, устанавливайте показатель в 0. Например, если нужно отбросить все прогоны с относительной просадкой больше 50%, умножьте показатель на следующее выражение "min(max(50 - DDREL, 0), 1)".

 

В. Некоторые значения профит-фактора выглядят странно. Почему?

О. Поскольку профит-фактор вычисляется как отношение прибыли к убытку, может случиться, что он неопределён, если убытков нет вообще. По умолчанию, МетаТрейдер 4 присваивает профит-фактору в таких случаях значение DBL_MAX, но это не очень хорошо, потому что тест с прибылью 1 и тест с прибылью 10 получают одинаковый профит-фактор. Более того, если профит-фактор используется в вычислении составного показателя эффективности, DBL_MAX скорее всего приведет к появлению нерегулярности. Поэтому библиотека предоставляет 2 способа обработки "переполнения" профит-фактора. Когда оценка производится по wfo_built_in_loose или wfo_built_in_strict, профит-фактор больше 10 пересчитывается как 10, умноженное на квадратный корень из количества сделок. Когда используются другие оценки, можно с помощью функции wfo_setPFmax указать относительно большое число в качестве верхнего предела профит-фактора, но оно должно быть значительно меньше DBL_MAX, например, 100. Наконец, при использовании wfo_expression, можно обрабатывать особые случаи, вычисляя аналог профит-фактора на основе общей прибыли (переменная GP) и общих убытков (переменная GL) в произвольной формуле.

 

В. Как определить, успешно ли пройден форвард-тест или нет?

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

 

В. Почему форвард просадка помечена словами "примерная оценка, нормализованная"?

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

Просадка названа нормализованной, потому что она рассчитывается от приведенной к году прибыли на оптимизированном участке, а не от начального депозита. Обычная просадка может существенно меняться в зависимости от произвольной суммы, которую трейдер укажет. Это усложняет оценку рисков. Например, при начальном депозите 10000 просадка в 1000 составляет только 10%, но при 2000 - она уже 50%. Когда годовая прибыль (из прошлого периода) берется вместо депозита, просадка выражат риски в виде универсальной меры, отмасштабированной в соответствии с потенциальной эффективностью торговой системы.

 

В. Что означает девиация в отчетах, как её интерпретировать?

О. Строка в таблицах с девиацией (стандартным отклонением, σ) дает оценку разброса соответствующей величины, то есть насколько далеко она может колебаться относительно среднего значения. Если отклонение равно или больше среднего (матожидания), значение параметра ненадежно, поскольку может легко менять знак, а это очень важно, например, для прибыли. Например, если средняя прибыль равна 100 и отклонение - 100, вероятность убытков равна примерно 15.8%, если отклонение - 50, то вероятность убытков - ~2.2%, а если отклонение - 33, то вероятность убытков - всего ~0.1%. И наоборот, если отклонение равно 200, вероятность убытков увеличивается до ~31%. Это иллюстрирует грфик.

Gauss distribution for expected payoff and its dispersion (standard deviation)

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

 

В. Оптимизация прервалась с ошибкой "Tester memory handler: tester stopped because not enough memory". Что делать?

О. Вы пытаетесь выполнить слишком массивную оптимизацию, она "съела" все ресурсы, доступные для тестера MetaTrader 4. Это не ошибка библиотеки. Это ограничение тестера и операционной системы. Вам нужно каким-либо образом упростить настройки оптимизации или добавить больше ресурсов на компьютер. Вот некоторые предложения:

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


В. Почему в лог выводятся ошибки "incorrect input parameters" во время оптимизации?

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

  • Custom step size is not specified -- wfo_stepSize равно custom и wfo_customStepSize равно 0
  • Custom window size is not specified -- wfo_windowSize равно custom и wfo_customWindowSizeDays равно 0
  • Window size is less than step -- wfo_windowSize > 0 и wfo_windowSize < wfo_stepSize
  • Window size is less than custom step -- wfo_windowSize > 0 и wfo_stepSize равно custom и wfo_windowSize < wfo_customStepSize
  • Custom window size is less than step -- wfo_stepSize > 0 и wfo_windowSize равно custom и wfo_stepSize > wfo_customWindowSizeDays
  • Custom window size is less than custom step -- wfo_stepSize равно custom и wfo_windowSize равно custom и wfo_customStepSize > wfo_customWindowSizeDays
  • Datetime overflow: [tester time] [real time] -- TimeCurrent() плюс wfo_stepOffset умноженный на (wfo_stepSize или wfo_customStepSize) больше или равно текущему времени [real time]

Все ошибки кроме последней являются критическими и требует исправления параметров.

Последний случай является не ошибкой, а предусмотренным поведением. Оно введено для улучшения производительности оптимизации путем раннего отбрасывания проходов, для которых окно in-sample "залезает" за конечную дату тестера. Если бы не данная особенность, все подобные проходы выполнялись бы полностью, но представляли бы собой пустую трату времени, потому что генерируют нулевой результат (без торговли).

Эта ошибка может стать важной, если используется генетическая оптимизация. Проблема в том, что генетика реализована в MetaTrader особым образом: он обрывает создание новых поколений, если в текущем поколении собрано слишком мало значащих результатов. Каждый проход с ошибкой "incorrect input parameters" считается пустым, но тестер не делает попытку попробовать другую мутацию параметров и получить валидное потомство. Вместо этого тестер просто пропускает экземпляр и количество "живых" особей уменьшается. К сожалению, если количество продуктивных проходов меньше, чем предопределенный размер популяции (например, для первого поколения тестер может запросить всего лишь 512 экземпляров), то оптимизация просто останавливается без единого решения. Полагаю, что это ошибка проектирования тестера MetaTrader, но мы не можем её исправить. В качестве частичного решения проблемы можно попробовать увеличить общий период WFO, сократить число шагов, или уменьшить размер окна и/или шага. Все эти меры уменьшат количество проходов, которые попадают на конечную дату. Таким образом, количество валидных результатов увеличится и тестер не остановит оптимизацию. Другой возможный подход - использовать полную (медленную) оптимизацию.



В. Каковы минимальные размеры окна оптимизации и шага форвард теста при "кастом" (произвольных) настройках?

О. Рекомендуемый размер окна начинается от 1 месяца, в крайнем случае - две недели. Минимальный шаг, а также приращение шага (оба значения устанавливаются в этом случае в процентах) следует выбирать такими, чтобы при пересчете во время (относительно размера окна) получался как минимум 1 день. Если минимальный шаг выбран 10%, то не имеет смысла брать окно менее 10 дней. Это же касается и их приращений. Например, можно поставить минимальное окно 10 дней, с приращением 10 дней. При этом если сделать минимальный шаг 10% и увеличивать тоже по 10%, то дробных частей дней не будет. Если требуется минимальный шаг 5% и приращение по 5%, то минимальный размер окна должен быть 20 дней и его приращение 20 дней.


В. Почему в некоторых строках отчета WFO могут встречаться расхождения в данных?

О. Действительно, иногда общая прибыль Profit(1/2) может отличаться от комбинации чистого дохода и чистого убытка, т.е. P(1/2)-L(1/2). Существует несколько причин для этого.

Например, это может произойти, если используется показатель wfo_built_in_strict. Его назначение - исключить из общей прибыли аномальные сделки (выбросы). Если такая непривычно большая сделка встречается в конкретном проходе тестера, она исключается из общей прибыли, но остается в составе чистого дохода или чистого убытка (в зависимости, от знака). Начиная с версии 1.9 библиотеки, такие проходы помечаются знаком ª . Подробности о подобных сделках можно увидеть в логе тестера при одиночном тестировании.

Другая причина, почему чистая прибыль и убыток могут отличаться, связана с принципом, по которому строятся окно оптимизации (in-sample, IS) и шаг тестирования (out-of-sample, OOS). Поскольку они обрабатываются в едином проходе тестера, некоторые входы в рынок могут случиться до момента разграничения окна и форвард-шага, а соответствующие им выходы из рынка - после этого момента. Библиотека позволяет опционально закрыть все позиции автоматически в разделительной точке путем вызова wfo_setCloseTradesOnSeparationLine(true) в OnInit. Тогда данная ситуация не сможет возникнуть. Однако если этот режим не включен, позиции могут "перетекать" через границу, и в результате статистика IS и OOS (включая количество сделок) будет слегка искажена. Опять же, искажения могут вызываться разными факторами, в частности, теми, что описаны далее.

Как правило, функция wfo_OnTick вызывается до торгующего кода (это необходимо, потому что данная функция возвращает признак, разрешена ли в данный момент торговля или нет). Внутри данного вызова библиотека мониторит текущую статистику (нарастающий итог и количество совершенных торговых операций). После него ваш код может закрыть открытую позицию (если она есть) на этом же тике, что изменит статистику, однако обновленный "status quo" будет обнаружен библиотекой только на следующем тике. Но что если тестер работает в режиме "цен открытия"? Тогда следующий тик произойдет только на следующем баре. И если следующий бар идет уже за разграничительной линией, то библиотека отнесет изменения к форвард-шагу вместо окна оптимизации.

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

Как правило, количество подобных пограничных торгов невелико (или даже равно 0), а потому их влияние на статистику пренебрежимо мало, если общее количество торгов велико. Для правильного WF-анализа рекомендуется иметь как минимум несколько сотен сделок.

Начиная с версии 1.9 библиотека автоматически исправляет в отчете все разночтения, возникшие по описанным причинам (еще раз напомним, что это относится только к режиму, когда пограничные сделки не закрываются; если они закрываются - разночтений нет). Если требуется особая обработка в процессе закрытия позиций, Вы можете закрывать их из своего кода вместо включения опции wfo_setCloseTradesOnSeparationLine(true).

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


 

В. Похоже, я нашел баг. Что делать?

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

Поделитесь с друзьями: