Авторизация  
11bish

Как правильно тестировать и оптимизировать советник

Рекомендуемые сообщения

Сразу скажу, что в данном вопросе являюсь полным (точнее - пустым)) чайником.

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

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

Но здесь стал упираться в вопросы, которые не связаны с программированием, но связаны с проверкой роботоспособности советника. А именно - тестирование и оптимизация. Вот здесь, например, прозвучало такое слова, как "бектест". Сразу отнес его по отношению к советнику, а потом подумал, что мог быть и неправ. 

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

2019-10-12-085352.jpg

но навряд ли такое тестирование можно отнести к нормальному, т.к., если правильно понимаю, то у советника стоят в этом случае настройки по умолчанию.

Конечно, есть возможность порыть в Гугле, но, скажу я вам, ничего этим не достиг. Во-первых, информация нескольких лет давности, т.е. не особо актуальна, во-вторых - как-то уж замудренно выложена. Да и видно, что выкладывали ее те, кому нужна была просто посещаемость блога/сайта.

Тут буду потихоньку выкладывать свои грабли, если кто-то что-то понимает в этом деле, то - просвящайте))) учиться, оно, никогда не поздно)

 

Как скачать правильные котировки: https://forum.ice-fx.com/topic/997-kak-pravilno-testirovat-i-optimizirovat-sovetnik/?tab=comments#comment-3688

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно выбрать свойства эксперта, это и есть настройки советника, с которыми он будет тестироваться. Там есть пункт оптимизация. При оптимизации выбирается диапазон настроек различных параметров. Советник при тесте протестируется с разными настройками по каждому параметру. Затем выбирается лучший результат и с настройками, показавшими его, тестируем уже на другом участке времени. Цель, подобрать настройки, которые будут оптимальны для различных временных периодов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тестер МТ4 весьма ограничен по функционалу, поэтому иногда что-то приходится доделывать напильником.

Бывает так, что хорошие по мнению тестера варианты оказываются ерундой, где 90% сделок убыточны, и только несколько сделок дают хороший профит. При этом они распределены не равномерно, а где-то с краю теста. График же у хорошей системы должен иметь наклон вверх и быть более-менее равномерен. Но как заставить тестер выбирать именно такие варианты? Благо, у нас есть возможность оптимизировать по критерию "Custom", а сам критерий прописывать в коде с помощью функции OnTester(). 
SNAG-0166.png.a402c7af668bcac3226936bd63a2a530.png

Вставьте этот код в начало или конец вашего советника:

enum OPTCVAR
{
   OPTCVAR0=0,                            //  Сделки+ПФ+Профит+ДД
   OPTCVAR1=1,                            //  Сделки+ПФ+Профит+СтД
   OPTCVAR2=2,                            //  Сделки+ПФ+Профит+М+СтД
   OPTCVAR3=3,                            //  Сделки+ПФ+Профит+М+СтД+ДД
};
input OPTCVAR              OptCriteria =                  0;
double OnTester()
{
   double ret=0.0;
   if (TesterStatistics(STAT_BALANCE_DD)>0)
   {
      if(OptCriteria==0)
         ret=TesterStatistics(STAT_TRADES)*TesterStatistics(STAT_PROFIT_FACTOR)*TesterStatistics(STAT_PROFIT)/TesterStatistics(STAT_BALANCE_DD);
      if(OptCriteria==1)
         ret=(MathPow(TesterStatistics(STAT_TRADES),2)*MathPow(TesterStatistics(STAT_PROFIT_FACTOR),3)*TesterStatistics(STAT_PROFIT)/CountStdDev())/100000;
      if(OptCriteria==2)
         ret=(MathPow(TesterStatistics(STAT_TRADES),2)*MathPow(TesterStatistics(STAT_PROFIT_FACTOR),3)*TesterStatistics(STAT_PROFIT)*MathAbs(TesterStatistics(STAT_EXPECTED_PAYOFF))/CountStdDev())/100000;
      if(OptCriteria==3)
         ret=(MathPow(TesterStatistics(STAT_TRADES),2)*MathPow(TesterStatistics(STAT_PROFIT_FACTOR),3)*TesterStatistics(STAT_PROFIT)*MathAbs(TesterStatistics(STAT_EXPECTED_PAYOFF))/(CountStdDev()*TesterStatistics(STAT_BALANCE_DD)))/1000;
   }
   return(ret);
}
double CountStdDev()
{
   if (TesterStatistics(STAT_TRADES) == 0) return(0.0);
   double StdDev = 0;
   for(int pos = 0; pos < TesterStatistics(STAT_TRADES); pos++)
   {
      if (OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
      {
         StdDev = StdDev + MathPow((OrderProfit()+OrderCommission()+OrderSwap()-TesterStatistics(STAT_EXPECTED_PAYOFF)),2);
      }
   }
   StdDev = MathSqrt(StdDev/TesterStatistics(STAT_TRADES)); 
   return(StdDev);
}

У вас появится новая настройка "OptCriteria" во входных параметрах советника. Попросту говоря, советник сам оценивает результат торговли по окончанию прогона и сообщает свою расчетную оценку терминалу. А терминал уже на основе этой оценки понимает, какой прогон был лучше. 

Примечание: данный код не мой, но решение весьма удачное.

Также стоит учитывать еще и время оптимизации. Код не должен быть избыточным, а оптимизацию лучше делать "По ценам открытия" для экономии времени. Убедитесь, что результаты вашего советника не очень отличаются в режимах "По ценам открытия" и "Все тики". Для этого сделайте тест, допустим, за год на стандартных настройках в этих двух режимах и сравните результаты. Сильного отличия быть не должно. Если отличия значительны, то ваш советник не имеет смысла оптимизировать "по ценам открытия".

Итак, вы провели оптимизацию по выбранным параметрам и получили множество результатов:
SNAG-0209.thumb.png.cb8ed9a637f47aa472c04d1db74d9392.png

Но что же с этим делать? Ставить советник с лучшими настройками? Почти всегда это гарантирует убытки, потому что вы просто подогнали параметры к данному промежутку времени. Как убедиться, что этого не произошло? Вот тут нам и нужен бэк и форвард тесты. Мы прогоняем полученные результаты по периоду больше, чем тот, на котором оптимизировались, и обращаем внимание на хвосты. Допустим, сейчас 31 октября. Мы делаем оптимизацию за 8 месяцев, и условились, что соотношение отрезков тестирования будет 1:4:1.

Получаем:
- бэктест: 01.11.2018 - 31.12.2019 (2 месяца);
- период оптимизации: 01.01.2019 - 31.08.2019 (8 месяцев);
- форвард: 01.09.2019 - 31.10.2019 (2 месяца).

Теперь в основном окне тестера меняем период: начало - на 01.11.2018, окончание - на 31.10.2019.  Сортируем таблицу результатов тестирования по колонке "Результат OnTester". Если кликнуть дважды на какую-либо строчку, тестер установит параметры этого прогона в настройки советника и перебросит нас на свою основную страницу, где останется нажать "Старт".  Таким образом мы проверяем самые лучшие результаты оптимизации и находим те, которые не являются "подгонкой" под историю. Начало и окончание теста на кривой баланса не должно значительно отличаться от середины тестирования. В идеале нужно получить примерно равную наклонную линию за весь период.  Вы можете использовать любое другое соотношение от 1:2:1 до 1:5:1 и любые другие периоды в месяцах. Но учитывайте, что количество ордеров на периоде оптимизации не должно быть меньше 50.

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

Например, сделаем оптимизацию на периоде 01.01.2018 - 31.08.2018. Выберем настройки с помощью бектеста и форвардтеста за период 01.11.2017 - 31.10.2018. А теперь проверим результаты в будущие 2 месяца: 01.11.2018 - 31.01.2019. Это уже реальные цифры, которые вы можете получить на своем счете. Если они вас устраивают, смещайтесь вперед на 1-2 месяца и проводите такие же тесты. Убедитесь, что ваш метод оптимизации подходит под эту стратегию. Если результаты вам не нравятся, возможно стоит подобрать другой период оптимизации и соотношение периодов. Или отказаться от стратегии ввиду ее убыточности.

P.S. Да, оптимизация - это долгий и кропотливый труд.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 10.11.2019 в 19:10, Jake Green сказал:

за период 01.11.2017 - 31.10.2018

Как-то народ все время искал котировки, помню. Чуть ли не обменивались ими на форумах, типо самые точные. Уж не помню, чьих они были, но считалось хорошим тоном тестироваться именно на них. Самое интересное, что метаквотовские котировки не котировались (масло в масле)) совсем, якобы они кривые (непонятно, правда, почему). Т.е. "чистота" должна гарантировать наиболее приближенный к реальности результат. Это действительно так? как котировки могут быть вообще "кривыми"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, 11bish сказал:

Как-то народ все время искал котировки, помню. Чуть ли не обменивались ими на форумах, типо самые точные. Уж не помню, чьих они были, но считалось хорошим тоном тестироваться именно на них. Самое интересное, что метаквотовские котировки не котировались (масло в масле)) совсем, якобы они кривые (непонятно, правда, почему). Т.е. "чистота" должна гарантировать наиболее приближенный к реальности результат. Это действительно так? как котировки могут быть вообще "кривыми"?

Наличие нерыночных свечей может создать Грааль или наоборот Грааль угробить, на практике я ничего особоенного на форексе в плане данных последние годы не наблюдаю вообще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
6 часов назад, 11bish сказал:

Как-то народ все время искал котировки, помню. Чуть ли не обменивались ими на форумах, типо самые точные. Уж не помню, чьих они были, но считалось хорошим тоном тестироваться именно на них. Самое интересное, что метаквотовские котировки не котировались (масло в масле)) совсем, якобы они кривые (непонятно, правда, почему). Т.е. "чистота" должна гарантировать наиболее приближенный к реальности результат. Это действительно так? как котировки могут быть вообще "кривыми"?

Есть такой момент. MQ (метаквоты) не заинтересованы в дальнейшем развитии MT4 и уже более 10 лет пытаются пропихнуть свой МТ5, думаю по этому с историей на своих серверах они тоже не занимаются. Все усложняется еще тем что и болшинство брокеров не дают скачать с их серверов адекватную историю.
Выходит один нормальный способ - брать котировки у поставщиков ликвидности и загружать в МТ4. Например DucasCopy. Я пользуюсь утилитой QuantDataManager которая позволяет скачивать нужные котировки и экспортирует их в формате читаемом терминалом МТ4.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
10 часов назад, Jake Green сказал:

такой момент

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

Как в таких случаях протестироваться?

Разбежка комиссий, кстати, на демо и реале так же присутствует на некоторых инструментах, к сожалению. Что не может не сказаться на тестировании даже в реальном времени. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, 11bish сказал:

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

Как в таких случаях протестироваться?

Разбежка комиссий, кстати, на демо и реале так же присутствует на некоторых инструментах, к сожалению. Что не может не сказаться на тестировании даже в реальном времени. 

Тестер сейчас учитывает своп, в том числе тройной. Комиссию не считает, но ее можно добавтиь в ручную, так как она зависит от объема или сразу заложить ее в спред увеличив последний.

Изменено пользователем Jake Green

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

QuantDataManager

После установки бесплатной версии в окне нажать следующее

2019-12-08-175921.jpg
 

После чего появится окошко для выбора пары, по которой необходимо скачать котировки (допускается выбор нескольких пар)

2019-12-08-175957.jpg

После этого они добавятся в программу

2019-12-08-180139.jpg

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

2019-12-08-180337.jpg

Дальше - старт и начнется сам процесс

2019-12-08-180519.jpg
 

Счетчики показывали разную скорость Интернета

2019-12-08-180902.jpg
2019-12-08-181011.jpg
2019-12-08-181041.jpg
2019-12-08-181117.jpg
2019-12-08-181351.jpg

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

2019-12-08-182706.jpg

Далее жмем вкладку Экспорт - отмечаем галочкой нужную пару - Экспорт мт4, появится окно, в котором необходимо (если это делается в первый раз, затем настройки сохранятся) указать путь к терминалу, так же период котировок и жмем Старт

2019-12-08-191104.jpg

Попробовал совместить два процесса: скачивания и экспорта

2019-12-08-191735.jpg
 

Оперативка возмутилась

2019-12-08-193531.jpg

Комп стал подвисать. После такого опыта стал разделять эти два момента. 

 

 

 

Изменено пользователем 11bish

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Столкнулся с интересной ситуацией у одного заказчика, он попросил меня исправить блок выставления стоп лоса в его советнике. В тестере по его словам блок работал без проблем, а вот на реальном счете не всегда удавалось выставить стоп лосс.
Так как код был низкого качества, я просто написал блок управления стоп лосом рядом с основным кодом. 
И тут самое интересное. С моим блоком советник в тестере стал сильно сливать, а без него зарабатывает. Но как такое возможно, ведь блок не должен был повлиять на торговлю в тестере никоим образом? При детальном рассмотрении оказалось что его советник считал стоп лосс не верно, не от той цены. Для бай от цены Bid, для селл от цены Ask. Другим словами стоп лосс был увеличен на спред.
Прогнал тест с моим блоком, но стоп лосс увеличил на спред - получились результаты как без блока.

А суть тут вот в чем. Какая ценность у оптимизации, если такие крошечные изменения в условиях кардинально меняют результаты теста? Изменение стоп лоса было меньше чем на 10%. На лицо переоптимизация, или подгонка на истории.

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

Как это применить? Допустим вы прооптимизировали свой советник с учетом всего что было озвучено в этой теме и получили какие то параметры. Теперь в свойствах тестера убираем галочку "генетический алгоритм". 
Во входных параметрах оставляем галочки на против каждого параметра который вы оптимизировали, но вилку возможных параметров ставим узкую.
Например, какой то параметр какого то индикатора в результате оптимизации у вас оказался равен 45. ставим начальное значение 44, конечное 46, шаг 1. Или 43/47/1 соответственно, и так с каждым параметром.
Проводим оптимизации в таком режиме и анализируем результаты всех прогонов вместе взятых.
Если нет значительных отклонений от результатов полученных при оптимизации - все отлично, можете смело ставить на реальный счет.
Если есть значительные изменения, или даже отрицательные результаты - либо ваша стратегия заведомо убыточная, либо вы переоптимизировали параметры. Ставить такой советник на реальный счет нельзя.

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

Изменено пользователем Jake Green

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Авторизация