Оптимизация.

В главе Тестирование стратегий мы рассмотрели, как протестировать систему. В качестве основного индикатора был взят ценовой канал (Price Channel) длиной 20 дней. Понятно, что 20 дней это примерно торговый месяц, но возникает вопрос, вдруг, если взять ценовой канал длинной 1 неделя или 2 месяца или квартал, результаты торговли будут лучше. Чтобы это проверить, можно, конечно, изменить цифру 20 в этих строках
Top = Ref(HHV(H, 20), -1);
Bot = Ref(LLV(L, 20), -1);
на интересующую и проделать тест заново, но это может потребовать значительного времени и трудозатрат, как при проведении множества тестов, так и при сравнении полученных результатов. Для проведения такого рода исследований торговых систем существует специальный инструмент «оптимизатор». Попробуем оптимизировать нашу торговую систему.
Для начала нужно немного изменить код торговой системы.
Period = Optimize("Period", 20, 5, 65, 5);
Top = Ref(HHV(H, Period), -1);
Bot = Ref(LLV(L, Period), -1);
Mid = (Top+Bot)/2;

Buy = Cross(C, Top);
/* покупка когда цена закрытия пересекает верхнюю линию ценового канала снизу вверх */
Sell = Cross(Mid, C);
/* продажа когда цена закрытия пересекает среднюю линию ценового канала сверху вниз */
Как видите, основное изменение заключается в том, что добавилась строка Optimize("Period", 20, 5, 65, 5);
Функция Optimize обозначает, что АмиБрокер должен провести несколько тестов системы, изменяя Period от 5 до 65 с шагом 5. Таким образом, период будет равен 5, 10, 15 и т.д. до 65. 20 - это значение по умолчанию, значение, которому будет равен Period, если мы решим сделать обычный тест вместо оптимизации.
Все дальнейшие действия по настройке Автоматического Анализатора аналогичны действиям при проведении обычного теста за исключением последнего шага. Вместо кнопки Back Test жмем Optimize. В результате в таблице АА увидим строки суммарного отчета по проведенным тестам.

Которые можно отсортировать по интересующему нас параметру, кликнув на заголовке соответствующего столбца.

В последнем столбце таблицы будут значения оптимизируемой переменной, соответствующие этому тесту.

Часто при оптимизации торговой системы большое значение имеет то, как результаты торговой системы изменяются при изменении её параметров. Для визуальной оценки такого влияния служит 3D optimization graph. Он строит трехмерную поверхность выбранного параметра торговой системы (параметра по которому отсортированы результаты оптимизации) в зависимости от двух оптимизируемых переменных. В нашем случае мы оптимизировали только одну переменную, и посмотреть этот замечательный график не можем.
Для того чтобы его увидеть, можно ввести в код системы лишнюю, пустую оптимизируемую переменную.
Period = Optimize("Period", 20, 5, 65, 5);
empty = Optimize("empty", 1, 1, 5, 1);
Top = Ref(HHV(H, Period), -1);
Bot = Ref(LLV(L, Period), -1);
Mid = (Top+Bot)/2;

Buy = Cross(C, Top);
/* покупка когда цена закрытия пересекает верхнюю линию ценового канала снизу вверх */
Sell = Cross(Mid, C);
/* продажа когда цена закрытия пересекает среднюю линию ценового канала сверху вниз */
В результате, после оптимизации получим много тестов системы с одинаковыми результатами, но зато сможем увидеть поверхность зависимости



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