Техника оптимизации
Видимо, ни для кого не является большой тайной, что подбор адекватных параметров - не менее важный этап, чем выбор торговой тактики и написание самого эксперта. Подтверждением тому служит постоянное обращение к этой теме на множестве форумов, в той или иной мере связанных по тематике с автоматической торговлей. Но если с автоматизацией торговых операций все достаточно очевидно и прозрачно, то сколько-нибудь приемлемого для пользователя автоматизированного алгоритма обработки результатов оптимизации, объединенного в логически завершенную цепочку, мне не встретилось.
А процесс, согласитесь, очень трудоемкий, и затраты времени на него заслуживают попытки, как минимум, максимально автоматизировать все операции и привести их к единому алгоритму. Этот подход и метод и будет изложен в статье.
Идея
Задача.
Анализ и отбраковка заведомо непригодных для реальной торговли
параметров эксперта, полученных во время оптимизации. Максимальное
использование возможностей терминала и автоматизация ручных операций.
Весь процесс подразделяется на несколько этапов. Такое разделение связано не столько со сложностью реализации непрерывного автоматического алгоритма, сколько с невозможностью заранее, на этапе оптимизации, сформулировать необходимые требования (допуски и фильтры) к параметрам системы. Да и необходимости такой, в общем-то, нет.
На мой взгляд, заставлять машину принимать стратегические решения - это "не самая хорошая мысль". А выбор параметров (групп параметров) - это стратегия. Считает, торгует, жизнь облегчает - вот пусть этим и занимается, а по каким правилам "железу" работать, решать должен трейдер.
Каждый из этапов и переходы между ними максимально, насколько это представилось возможным, автоматизированы.
Этап
1. Оптимизация. Стандартный вариант, с настройками по
желанию пользователя.
Опять-таки, не секрет, но упомянуть об этом
необходимо.
Генетика, безусловно, штука полезная, но в разумных пределах. Дело в
том, что ее алгоритм может сыграть злую шутку - определится какой-то
выигрышный, с её точки зрения, набор параметров, и вся дальнейшая
оптимизация будет до самого окончания проходить "вокруг него". Чем это
грозит, думаю, понятно. Большинство по-настоящему хороших
вариантов, которые будут работать за пределами участка оптимизации,
останутся "за бортом" и в таблицу "Результаты оптимизации" не попадут.
Выходов здесь несколько. Один кардинальный - отказаться от применения генетического алгоритма при оптимизации. Но это не всегда, по тем или иным причинам, подходит. Два следующих - это полумеры, но хотя бы что-то:
- провести оптимизацию не один раз, а два или больше. Первый раз, допустим, по "Balance", следующий по "Maximal Drawdown" или чему-то еще. Окно "Оптимизируемый параметр" на вкладке "Тестирование" в свойствах эксперта позволяет сделать такой выбор. После этого объединить полученные таблицы результатов и работать уже с объединенной.
- максимально уменьшить количество комбинаций параметров.
Есть еще один нюанс, который нужно учесть при проведении оптимизации. Возможно, кому-нибудь это окажется полезным.
В свойствах эксперта, на вкладке "Оптимизация"
можно
выставить различные ограничения, хочу сказать про одно из них:
"Максимальная просадка". При использовании этого параметра нужно
помнить, что это просадка в процентах от текущего баланса. Что
здесь нужно учесть. Если, к примеру, выставить ограничение 10% и взять
начальный баланс 10000, то в процессе оптимизации, когда баланс
вырастет хотя бы до 15000, первоначальная 1000 превратится в полторы -
согласитесь, это разные цифры. И начальный депозит (а где
гарантия, что такой просадки не будет в самом начале торговли?) будет
реагировать на них по-разному. Если же начальный депозит установить
1000000, а ограничение 0,1%, эта тысяча так и останется приблизительно
тысячей.
Этап
2. Работа с "Результатами оптимизации".
Все результаты копируются в Excel и обрабатываются уже там. Наборов
получится много, их нужно сократить. "Обрезание" можно проводить по
любой графе отчета - дело за трейдером.
Этап 3. Тест. Выбирается участок истории для тестирования и
"прогоняется" автоматический групповой тест "выживших" после отбраковки
на предыдущем этапе наборов. Подчеркиваю: групповой. На этом
этапе еще нет необходимости рассматривать каждый тест в отдельности,
задача стоит в получении результатов тестирования всех оставшихся
наборов разом. Фактически, терминал будет проводить ту же оптимизацию,
только ему будут "скармливаться" параметры из предварительно
записанного файла.
Аналогично этапу 2, все полученные результаты
копируются в Excel, в ту же таблицу, где уже расположены результаты
оптимизации.
Этап 4. Анализ и Отбраковка.
Очевидно, что тесты с отрицательными результатом безжалостно отсекаются (строки удаляются). Вопрос в том, как оценить оставшиеся?
Наверное, многие замечали, что визуальное восприятие графика баланса дает не меньшее, а иной раз и большее представление о характеристиках системы, чем цифры в отчете. Как правило, если эта кривая "хороша", то и цифры в отчете "красивые", а если в ней не наблюдается монотонной растущей тенденции, то никакие цифры убедить в том, что это "хорошо", не смогут.
Проблема в том, что оставшихся вариантов много, и провести отдельный тест, чтобы проанализировать отчет и глазами посмотреть на график каждого, очень затруднительно... Хотя, если упереться, то...
Чтобы обойти эту проблему и еще больше
сократить количество наборов, я придумал для себя некий критерий "пропорциональности"
сравниваемых участков. Сравниваются три величины: прибыль в день,
количество сделок в день и максимальная просадка, соответственно, на
участках оптимизации и тестирования. Если они приблизительно, в
пределах какого-то допуска, соответствуют друг другу, то набор остается
в работе, если нет - исключается из дальнейшего анализа. Кроме того,
при определенных условиях, а конкретно - не очень продолжительных
участках тестирования, могут, в какой-то степени, дать представление о
"гладкости" кривой баланса.
3-й и 4-й этапы можно и нужно повторить
несколько
раз на разных участках истории, во-первых, чтобы убедиться в надежности
выбранных результатов, а во-вторых, чтобы максимально сократить их
количество. Оставшихся 3-5 вариантов вполне достаточно для проведения
осознанного окончательного выбора.
Завершением 3-го и 4-го этапов будет формирование set-файлов из оставшихся наборов, проведение индивидуальных тестов на любых участках истории, сравнение между собой, выбор и т.д.
В общем, это уже вопрос квалификации, вкусов и пристрастий каждого трейдера и выходит за рамки этой статьи.
Техника
Ничего сложного и особо заумного нет, все что требуется - это внимание и аккуратность. Приступим.
1. Подготовка компьютера - Панель управления/Язык и региональные стандарты/Региональные настройки/Русский - настройки/Числа/Разделитель целой и дробной части - вместо "запятой" необходимо выбрать "точку" - это делается для того, чтобы при копировании результатов оптимизации (тестов) из Терминала в таблицу Exсel данные отображались без искажений;
- На компьютере должен быть установлен пакет Microsoft Office (Exсel обязательно) - версия от 2000 и выше.
- В Exсel, в настройках безопасности включены
макросы и импортирован модуль Analise.bas
(в приложении к статье). Сам модуль и его структура в статье не
рассматриваются, т.к. рядовому пользователю нет никакой необходимости в
нем что-то изменять или править, а "не рядовые" смогут, при желании,
разобраться в нем самостоятельно.
2. Подготовка эксперта
Пример подготовленного эксперта в приложении.
В самом начале кода перед внешними параметрами необходимо вставить следующее:
// Параметры теста и оптимизации
extern int VarOptimTest = 0; // 0 - обычная оптимизация (штатная работа экперта)
// 1 - тестовый прогон отобранных наборов
// 2 - формирование сет файлов
extern int Counter = 1; // счетчик
extern string nameEA = "MA"; // имя эксперта
Эти переменные будут управлять режимами оптимизации и тестирования.
Функция init() должна выглядеть так:
int init()
{
// БЛОК ВЫЗОВА ФУНКЦИЙ ОПТИМИЗАЦИИ И ТЕСТИРОВАНИЯ
if(IsOptimization() && VarOptimTest !=0)
{
if (VarOptimTest == 1 && Counter !=0) _ReadParametrs();
if (VarOptimTest == 2 && Counter !=0)
{_ReadParametrs(); _WriteSet();}
}
...........
...........
return (0);
}
Отсюда вызываются две функции, обеспечивающие автоматизацию всего процесса.
В функцию start() добавлена строка:
int start()
{
if(IsOptimization() && VarOptimTest ==2) return(0);
..........
1. Функция чтения параметров из файла, который будет создан в Excel, после анализа результатов оптимизации (тестирования).
Изменяемая часть функции выделена. Здесь
необходимо
аккуратно и внимательно, с соблюдением аналогичной структуры и
синтаксиса, перечислить все входные параметры эксперта, за исключением
первых трех, которые отвечают за оптимизацию и тестирование, а также,
если имеются, переменных типа bool и string.
void _ReadParametrs()
{
string FileName="test.csv";
int handle=FileOpen(FileName,FILE_READ||FILE_CSV);//,'');
if(handle<1) return(0);
FileSeek(handle,0,SEEK_SET);
int str = StrToInteger(FileReadString(handle));
int data = StrToInteger(FileReadString(handle));
if (data < Counter)
{
Alert("Введено некорректное количество тестовых проходов. Sorry");
return(0);
}
for (int y=1; y <=Counter; y++)
{
for (int x=1; x <= str; x++)
{
string s = FileReadString(handle);
string ds = FileReadString(handle);
if (y != Counter) continue;
s=StringTrimLeft(s);s=StringTrimRight(s);
ds = StringTrimLeft(ds);ds=StringTrimRight(ds);
double d = StrToDouble(ds);
if (s == "Lots"){Lots=d;continue;}
if (s == "MaximumRisk"){MaximumRisk=d;continue;}
if (s == "DecreaseFactor"){DecreaseFactor=d;continue;}
if (s == "MovingPeriod"){MovingPeriod=d;continue;}
if (s == "MovingShift"){MovingShift=d;continue;}
}
}
FileClose(handle);
return(0);
}
2. Функция формирования и записи set-файлов.
Должна полностью повторять структуру сет-файла эксперта. Изменяемая
часть функции выделена.
void _WriteSet ()
{
string FileName=nameEA+"_"+Symbol()+Period()+"_"+Counter+".set";
int handle=FileOpen(FileName,FILE_WRITE|FILE_CSV);
if(handle<1) return(0);
FileWrite(handle,"VarOptimTest="+0);
FileWrite(handle,"VarOptimTest,F="+0);
FileWrite(handle,"VarOptimTest,1="+0);
FileWrite(handle,"VarOptimTest,2="+0);
FileWrite(handle,"VarOptimTest,3="+0);
FileWrite(handle,"Counter="+0);
FileWrite(handle,"Counter,F="+0);
FileWrite(handle,"Counter,1="+1);
FileWrite(handle,"Counter,2="+1);
FileWrite(handle,"Counter,3="+100);
FileWrite(handle,"nameEA="+nameEA+"_"+Symbol()+Period()+"_"+Counter);
FileWrite(handle,"Lots="+Lots);
FileWrite(handle,"Lots,F="+0);
FileWrite(handle,"Lots,1="+0.00000000);
FileWrite(handle,"Lots,2="+0.00000000);
FileWrite(handle,"Lots,3="+0.00000000);
.................................
FileWrite(handle,"MovingShift="+MovingShift);
FileWrite(handle,"MovingShift,F="+1);
FileWrite(handle,"MovingShift,1="+2);
FileWrite(handle,"MovingShift,2="+1);
FileWrite(handle,"MovingShift,3="+4);
FileClose(handle);
return(0);
}
3. Процесс
ВНИМАНИЕ! Очень рекомендую, перед выполнением всех операций, сделать дубликат листа или всей книги. Исполнение макросов в Excel - операция необратимая, и в случае ошибки можно потерять результаты оптимизации, а это - потерянное время. Не повредит и периодическое сохранение промежуточных результатов.
3.1. Оптимизация.
Об особенностях написано достаточно, теперь о том, как это сделать. В свойствах эксперта параметры оптимизации и тестирования должны быть выставлены, как на скриншоте:
Рис.1 Свойства эксперта, вкладка "Входные параметры".
Параметры оптимизации и тестирования.
3.2. Анализ результатов оптимизации и
первичная отбраковка параметров.

Рис.2 Копирование результатов оптимизации.
открыть Excel и вставить на чистый лист.
После копирования необходимо выполнить макрос Optim_1. Если все правильно сделано, то картинка на листе будет подобная этой:

Рис.3 Выполнение макроса Excel.
Во время выполнения макроса в диалоговом окне необходимо будет ввести количество дней в периоде оптимизации. Это нужно для расчета дополнительных критериев.
Рис.4 Диалоговое окно ввода количества дней.
Как видите, в получившейся таблице нет наименований столбцов. Сделано это вполне умышленно. Во-первых, так легче не ошибиться при вводе количества параметров (это потребуется в дальнейшем), а во-вторых - не так уж сильно они и нужны. Все здесь знакомо, кроме двух столбцов, голубого и зеленого. Слева направо: Номер прохода, Прибыль, Прибыль в день, Всего сделок, Сделок в день, Прибыльность, Матожидание, Просадка $, Просадка %.
После того, как в таблице останутся только
отобранные для дальнейшей работы параметры (т.е. будут удалены ненужные
строки), переходим к следующему пункту.
Для облегчения манипуляций по сортировке в
модуле
присутствует целая группа макросов для сортировки по отдельным
столбцам. Назначайте горячие клавиши и ....
3.3. Запись параметров в файл.
Необходимо запустить на исполнение макрос "Write", в появившемся диалоговом окне ввести путь, куда будет сохранен файл с параметрами (.... terminal\tester\files\)

Рис.5 Диалоговое окно сохранения файла с параметрами.
В окне "Имя фала" уже будет предопределенное имя "test", не меняйте его без крайней необходимости, но если поменяете, то это же необходимо сделать и в функциях, которые добавлены в ваш эксперт.
После выполнения этой операции в указанном каталоге появится (или перезапишется, если уже был) файл "test.csv".
Внимание, это важно. После создания файла не изменяйте в таблице положение строк, в противном случае результаты тестирования потеряют свою привязку к параметрам, по которым это тестирование производилось.
3.4. Проведение тестирования.


Рис.6-8 Настройки эксперта для проведения группового
теста.
Наверное, пояснения, если и требуются, то минимальные: Ограничений быть не должно, Генетический алгоритм отключен, переменная Counter от 1 до N, где N - количество строк, оставшихся в таблице, Включена оптимизация только по этому параметру.
И еще одна настройка:

Рис.9 Настройка вкладки "Результаты оптимизации"
Теперь, если установлен период тестирования и все остальные необходимые параметры оптимизации, можно нажать кнопку "Старт" и запустить тестер стратегий в режиме "Оптимизация".
После окончания тестирования, а это может занять довольно продолжительное время, особенно на первом "прогоне", когда таблица еще большая, можем перейти к следующему пункту.
3.5. Работа с результатами теста.
Прежде всего, необходимо подготовить нашу таблицу в Excel к вводу новых данных, для этого необходимо выполнить макрос "Optim_2", после этого в левой части таблицы появятся 7 пустых столбцов. Полученные результаты необходимо отсортировать по возрастанию номера прохода:

Рис. 10 Сортировка результатов теста.
После этого необходимо скопировать результаты (как мы это уже делали в п.2) и вставить данные на чистый лист Excel, затем скопировать 7 первых столбцов и вставить на подготовленное место листа с нашей таблицей.
После этого последовательно выполняем макросы "Optim_3",
"Optim_4". Если все сделано без ошибок, то таблица должна
приобрести следующую структуру:

Рис.11 Структура таблицы после сохранения и обработки
результатов оптимизации и тестирования.
Про столбцы L-T мы уже говорили, столбцы
D-K аналогичны М-T, только данные в них относятся к
тестовому участку.
А вот прежде чем говорить о первых трех столбцах, видимо, стоит
объяснить, зачем вводились такие критерии как "Прибыль в день" и
"Сделок в день".
Периоды оптимизации и тестирования могут иметь
разную продолжительность. В этом случае возникает закономерный вопрос:
как сравнивать результаты? Вот эти два параметра и призваны хотя бы
частично решить эту проблему и облегчить сам процесс сравнения
результатов.
Итак, столбцы: А = N/E (отношение
профитов в день), B = P/G (отношение сделок в день), С
=S/J ( отношение просадок).
Как видите, сейчас в этих столбцах единички
-
идеальный вариант, который может быть только в одном случае - когда
тестовый участок истории совпадает с участком оптимизации. Это не
недосмотр, а сделано специально, чтобы показать один из способов
проверки правильности подготовки эксперта. Аналогично можно будет
проверить правильность формирования set-файлов.
Таким образом, все готово для анализа. Вся информация есть. Все в руках трейдера, а кому еще, как не ему, знать всю подноготную работы своего эксперта, и в соответствии с этим установить необходимые допуски в разбросе результатов, по которым и произвести отбраковку параметров.
Идем дальше. Таблица еще больше сократилась, но
еще недостаточно. Нам ничто не мешает провести еще один тест.
Удаляем столбцы A-K и возвращаемся к пункту 3.
После 3-4 тестов у нас останется табличка,
состоящая из 3-5-8 строчек. Остановимся на этом и пойдем дальше.
3.6. Формирование set-файлов.
Возможно кто-то скажет, что в этом нет никакой необходимости, и 5-8 наборов параметров можно обработать вручную. Не возражаю - обрабатывайте. Я же предпочитаю, чтобы рутинную работу за меня делала машина. Для этого всего лишь нужно еще раз выполнить макрос "Write" и еще раз, уже последний, запустить тестер стратегий в режиме "Оптимизация" со следующими настройками эксперта:

Рис.12 Настройки эксперта для формирования
set-файлов.
Настройки почти полностью совпадают с режимом тестирования, отличаются значением одной переменной да конечным значением счетчика.

Рис.13 Вид сформированных файлов настроек.
С ними можно работать как с обычными файлами настройки эксперта.
Собственно, на этом тема статьи исчерпана.
Заключение
Изложенный материал не претендует на открытия в
области, условно
названной: "Теория оптимизации".... Это чисто практическое руководство,
не более того, но и не менее... Наверное, это понятно, но тем не
менее, считаю нужным отметить это.
Все, что здесь представлено, - это всего лишь инструмент, назначение
которого - максимально облегчить труд трейдера. Никто и никогда не даст
100% гарантии того, что за правым краем графика кривая баланса будет
такой же "симпатичной", как и на видимом участке.
И еще одно. Не пугайтесь обилия слов и картинок. На самом деле все достаточно просто и, один-два раза проведя такую оптимизацию, вы научитесь это делать автоматически.
Есть идея и мысль, что у кого-нибудь возникнет
идея и мысль о наиболее оптимальных окнах оптимизации и тестирования....
вдруг :)
Удачи и профитов.












