Техника оптимизации (тестирования) и некоторые критерии выбора рабочих параметров эксперта
Введение
Видимо, ни для кого не является большой тайной, что подбор адекватных параметров - не менее важный этап, чем выбор торговой тактики и написание самого эксперта. Подтверждением тому служит постоянное обращение к этой теме на множестве форумов, в той или иной мере связанных по тематике с автоматической торговлей. Но если с автоматизацией торговых операций все достаточно очевидно и прозрачно, то сколько-нибудь приемлемого для пользователя автоматизированного алгоритма обработки результатов оптимизации, объединенного в логически завершенную цепочку, мне не встретилось.
А процесс, согласитесь, очень трудоемкий, и затраты времени на него заслуживают попытки, как минимум, максимально автоматизировать все операции и привести их к единому алгоритму. Этот подход и метод и будет изложен в статье.
Идея
Задача. Анализ и отбраковка заведомо непригодных для реальной торговли параметров эксперта, полученных во время оптимизации. Максимальное использование возможностей терминала и автоматизация ручных операций.
Весь процесс подразделяется на несколько этапов. Такое разделение связано не столько со сложностью реализации непрерывного автоматического алгоритма, сколько с невозможностью заранее, на этапе оптимизации, сформулировать необходимые требования (допуски и фильтры) к параметрам системы. Да и необходимости такой, в общем-то, нет.
На мой взгляд, заставлять машину принимать стратегические решения - это "не самая хорошая мысль". А выбор параметров (групп параметров) - это стратегия. Считает, торгует, жизнь облегчает - вот пусть этим и занимается, а по каким правилам "железу" работать, решать должен трейдер.
Каждый из этапов и переходы между ними максимально, насколько это представилось возможным, автоматизированы.
Этап 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-файлов.
Настройки почти полностью совпадают с режимом тестирования, отличаются значением одной переменной да конечным значением счетчика.
После окончания процесса оптимизации в каталоге tester\files будут созданы файлы настройки эксперта. Последняя цифра в имени - номер строки в нашей таблице.
Рис.13 Вид сформированных файлов настроек.
С ними можно работать как с обычными файлами настройки эксперта.
Собственно, на этом тема статьи исчерпана.
Заключение
Изложенный материал не претендует на открытия в области, условно названной: "Теория оптимизации".... Это чисто практическое руководство, не более того, но и не менее... Наверное, это понятно, но тем не менее, считаю нужным отметить это.
Все, что здесь представлено, - это всего лишь инструмент, назначение которого - максимально облегчить труд трейдера. Никто и никогда не даст 100% гарантии того, что за правым краем графика кривая баланса будет такой же "симпатичной", как и на видимом участке.
И еще одно. Не пугайтесь обилия слов и картинок. На самом деле все достаточно просто и, один-два раза проведя такую оптимизацию, вы научитесь это делать автоматически.
Есть идея и мысль, что у кого-нибудь возникнет идея и мысль о наиболее оптимальных окнах оптимизации и тестирования.... вдруг :)
Удачи и профитов.
P.S. Никогда не думал, что понадобится так много слов для того, чтобы описать пару десятков манипуляций "мышкой". :)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вот, сначала сам сделал что-то подобное, а потом уж наткнулся на эту статью. Должен признать, что здесь реализован более глубокий подход.
Но кратко скажу о своем методе (всё в Экселе):
- применяю формулу: "Прибыль" * "Всего сделок" * "Прибыльность" * "Матожидание" / "Просадка $" / "Просадка %" (символы: * и / - соответственно умножить и разделить)
- лучшими считаются варианты с максимальным значением этого выражения
- в отдельную таблицу делается выборка 10 лучших вариантов (по убыванию)
- можно установить минимальное число сделок за исследуемый период (желтая клетка на листе "Результат")
Работа с таблицей:
- как и предлагает автор, копируем результаты оптимизации в лист "Данные" (предварительной подготовки компьютера делать не надо)
- и смотрим на лист "Результат"
Прикреплен файл для Excel 7
Спасибо за статью, вопрос такой:
3.1. Оптимизация - например мы берем период с 2010 01 01 по 2010 06 01
а параметр 3.4. Проведение тестирования - за тот же период делать или уже на не знакомом? И параметры оптимизации только Counter или все которые тестировал?
внутри макросов есть такой
Извиняюсь, может быть и туплю, но где-же макрос "write" найти? В прикреплённом файле его нет.