Стратегии и роботы > Скользящая (непрерывная, автоматическая) оптимизация

Обсуждение, описание стратегий и роботов, идеи для стратегий
Prohar
Сообщения: 19
Зарегистрирован: 03 фев 2020, 15:10
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Скользящая (непрерывная, автоматическая) оптимизация

Непрочитанное сообщение Prohar » 15 фев 2020, 19:24

Здравствуйте!
Возникла идея проверки дрейфа оптимальной настройки во времени. Чтот-то типа оконного анализа и вывода результатов в одном окне оптимизатора.
Например проверка периода HMA (https://alfadirect4.ru/viewtopic.php?f=16&t=13&p=3151&hilit=hull#p15) на инструменте SNGS.

недостатки - возможна проверка только одного параметра робота
достоинства
- видна степень случайности успеха и достижения робота в границах сразу нескольких интервалов:)
- инерционность исслелуемого параметра или целесообразность его подстройки по предыущему периоду и т.п.

Код: Выделить всё

/**
проверка оптимального параметра во времени

сигналы это экстремумы hma;
период N - период HMA;
month - количество интервалов для проверки
d1 дата начала интервала проверки = месяц + год * 12

1) нажимаем кнопку оптимизировать
2) Задаем инструмент, тайм фрейм, даты интервала оптимизации входного инструмента
3) по началу интервала рассчитываем d1 = месяц + год * 12
4) в последнем окне указываем d1 и исследуемые параметры
Algorithm = hma;
**/

function Initialize()
{
   StrategyName = "My_hma_interval";
   AddParameter("N", 10, "период HMA", 1);
   AddParameter("month", 12, "Интервал, проверки месяцев", 1);
   AddParameter("d1", 24337, "(09.2019 -> 24237  = 2019 * 12 + 9", 1);
   AddInput("Input1", Inputs.Candle, 20, true, "SNGS=МБ ЦК");
   LongLimit = 1;
   ShortLimit = -1;
   AddChartIndicator("MY.HMA", new Dictionary <string, string>{{"P", "N"}});
}

function OnUpdate()
{
if (((BarDate().Year * 12 + BarDate().Month- d1) > (month-1)) && ((BarDate().Year * 12 + BarDate().Month-d1) <= month))
{

   /// ПРАВИЛО 1
   if ( (CurrentPosition() == 0) && (MY.HMA(Input1.Close, N).GetValue("HMA", 0) > MY.HMA(Input1.Close, N).GetValue("HMA", 1)) )
   {
      EnterLong();
   }

   /// ПРАВИЛО 2
   if ( (CurrentPosition() == 0) && (MY.HMA(Input1.Close, N).GetValue("HMA", 0) < MY.HMA(Input1.Close, N).GetValue("HMA", 1)) )
   {
      EnterShort();
   }

   /// ПРАВИЛО 3
   if ( (CurrentPosition() < 0) && (MY.HMA(Input1.Close, N).GetValue("HMA", 0) > MY.HMA(Input1.Close, N).GetValue("HMA", 1)) )
   {
      EnterLong();
   }

   /// ПРАВИЛО 4
   if ( (CurrentPosition() > 0) && (MY.HMA(Input1.Close, N).GetValue("HMA", 0) < MY.HMA(Input1.Close, N).GetValue("HMA", 1)) )
   {
      EnterShort();
   }
   
   
}
else
{
   if (CurrentPosition() != 0) ClosePosition();
}
}


вроде работает
Безымянный1.png


но есть проблема. через раз появляется сообщение
Безымянный.png
Безымянный.png (3.29 КБ) 4964 просмотра


Вопросы:
1) как купировать ошибку?
2) может у кого то возникнут идеи как универсализировать эту штуку для всех роботов
3) более удобной настройки интервалов, напр автоматическое определение d1
Последний раз редактировалось Prohar 21 фев 2020, 23:17, всего редактировалось 1 раз.

Prohar
Сообщения: 19
Зарегистрирован: 03 фев 2020, 15:10
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Re: Поинтервальная оптимизация

Непрочитанное сообщение Prohar » 16 фев 2020, 01:26

Обновления :D
1) ошибка перестает появляться если выполнить оптимизацию другой стратегии
2)переписал код. теперь ширина окна и шаг его перемещения настраиваются отдельно. Шаг может быть уже окна, тогда окно двигается подобно скользящему среднему
3) d1 вычисляется сам

Код: Выделить всё

/**
проверка оптимального параметра во времени

сигналы это экстремумы hma;
период N - период HMA;
day- количество интервалов для проверки

1) нажимаем кнопку оптимизировать
2) Задаем инструмент, тайм фрейм, даты интервала оптимизации входного инструмента
3) ширина окна - интервал на котором исследуется параметр
4) в настройке оптимизации задаем номера шагов мин = 1 /макс = интервал оптимизации в днях(можно с запасом) и размер шага. если размер шага == ширене окна, то окна не накладываются друг на друга
Algorithm = hma;
**/

function Initialize()
{
   StrategyName = "My_Opt_hma_var_interval";
   AddParameter("N", 10, "период HMA", 1);
   //AddParameter("kl", -1, "", 1);
   //AddParameter("kp", 1, "", 1);

   AddParameter("day_in_w", 30, "дней в окне", 1);
   AddParameter("step", 180,"количество шагов шаги", 1);
   // AddParameter("d1", 727110.0, "(09.2019 = 24237  *начала = год*12+месяц", 1);
   AddInput("Input1", Inputs.Candle, 20, true, "SNGS=МБ ЦК");
   LongLimit = 1;
   ShortLimit = -1;
   AddChartIndicator("MY.HMA", new Dictionary <string, string>{{"P", "N"}});
   
   AddGlobalVariable("d1", Types.Double, 0);
    AddGlobalVariable("b", Types.Int, 0);
   
}

function OnUpdate()
{

if (b == 0) //первый запуск
{
   b = 1;
   //d1 = BarDate().Year * 12.0 + BarDate().Month;
   d1 = ((BarDate().Year * 12.0 + BarDate().Month)  * 30 + BarDate().Day);
}

if (( ( ( (BarDate().Year * 12.0 + BarDate().Month)  * 30 + BarDate().Day)- d1) > ((step)) ) && ( ((BarDate().Year * 12.0 + BarDate().Month)  * 30 + BarDate().Day- d1) <= (day_in_w+step)))
{

   /// ПРАВИЛО 1
   if ( (CurrentPosition() == 0) && (MY.HMA(Input1.Close, N).GetValue("HMA", 0) > MY.HMA(Input1.Close, N).GetValue("HMA", 1)) )
   {
      EnterLong();
   }

   /// ПРАВИЛО 2
   if ( (CurrentPosition() == 0) && (MY.HMA(Input1.Close, N).GetValue("HMA", 0) < MY.HMA(Input1.Close, N).GetValue("HMA", 1)) )
   {
      EnterShort();
   }

   /// ПРАВИЛО 3
   if ( (CurrentPosition() < 0) && (MY.HMA(Input1.Close, N).GetValue("HMA", 0) > MY.HMA(Input1.Close, N).GetValue("HMA", 1))  )
   {
      EnterLong();
   }

   /// ПРАВИЛО 4
   if ( (CurrentPosition() > 0) && (MY.HMA(Input1.Close, N).GetValue("HMA", 0) < MY.HMA(Input1.Close, N).GetValue("HMA", 1)))
   {
      EnterShort();
   }

}
else
{
   //if (CurrentPosition() != 0) ClosePosition();
}
}





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

ниже исследования изменения оптимального периода HMA с сентября по настоящее время для инструмента SNGS 20мин
ширина окна 30 дней, шаг 30 дней
30_30.png
30_30.png (53.43 КБ) 4946 просмотров



ширина окна 30 дней, шаг 7 дней
30_7.png
30_7.png (65.18 КБ) 4946 просмотров



ширина окна 30 дней, шаг 1 дннь
30_1.png
30_1.png (110.32 КБ) 4946 просмотров



ширина окна 7 дней, шаг 1 дннь
7_1.png


не разобрался как прятать эти простыни под сполер
up: исправил

Код: Выделить всё

if (( ( ( (BarDate().Year * 12.0 + BarDate().Month)  * 30 + BarDate().Day)- d1) >= ((step)) ) && ( ((BarDate().Year * 12.0 + BarDate().Month)  * 30 + BarDate().Day- d1) <= (day_in_w+step)))

на

Код: Выделить всё

if (( ( ( (BarDate().Year * 12.0 + BarDate().Month)  * 30 + BarDate().Day)- d1) > ((step)) ) && ( ((BarDate().Year * 12.0 + BarDate().Month)  * 30 + BarDate().Day- d1) <= (day_in_w+step)))
Последний раз редактировалось Prohar 16 фев 2020, 13:45, всего редактировалось 1 раз.

BugsDigger
Сообщения: 332
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 41 раз

Re: Поинтервальная оптимизация

Непрочитанное сообщение BugsDigger » 16 фев 2020, 12:11

Интересно, спасибо за идею.

Для ловли ошибок подозрительный участок кода или весь код можно заключить в блок try, например:

Код: Выделить всё

function OnUpdate()
{
  // название файла лога д.б. уникальным, т.к. оптимизация идет одновременно в нескольких потоках, и м.б. коллизии доступа к файлу;
  // уместно в имени файла указать имя стратегии и текущие параметры, например:
  LogFile=String.Format("D:\\ADdebug\\{0} N={1} M={2} Q={3}.txt", StrategyName, N, M, Q);

  try
  {     
   // ... ваш код
  }
  catch(System.Exception e)
  {
   WriteLine(LogFile, "Exception: "+e.ToString());
  }
}

Для ускорения оптимизации можно сразу останавливать стратегию, если изменяемые параметры оказались вне нужного интервала (часто. например, если длина "короткого" периода >= длине "длинного" периода):

Код: Выделить всё

function OnUpdate()
{
  // проверка соотношения параметров (при оптимизации)
  if(...) Stop(); // параметры не в нужном диапазоне, гнать вычисления нет смысла

  // параметры OK
  // ...
}

Prohar
Сообщения: 19
Зарегистрирован: 03 фев 2020, 15:10
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Re: Поинтервальная оптимизация

Непрочитанное сообщение Prohar » 17 фев 2020, 12:53

Спасибо!
Я не программист, отладка в АД4 для меня - это ад )))

Из предварительных тестов видно, что Значение оптимального параметра = грааля во времени больше похоже на шум. Теоритически так и должно быть, но!..
:idea: Допустим, что шумность грааля - следствие шума самого ряда, и чтоб это проверить можно попробывать уменьшить этот шум сглаживанием с коротким периодом, а его результат скормить оптимизатору.

Вопрос. Кок это сделать простым способом?

BugsDigger
Сообщения: 332
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 41 раз

Re: Поинтервальная оптимизация

Непрочитанное сообщение BugsDigger » 17 фев 2020, 15:29

Грааля не существует. Иначе все только бы стригли профит, а вкалывать было бы некому.

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

Насчет дополнительного сглаживания входных данных - в чем проблема? У вас же уже HMA. т.е. сглаживание. Ну можно вместо Input.Close использовать бегущее среднее SMA(Input.Close, N), где N - небольшое число, скажем, 3...

Prohar
Сообщения: 19
Зарегистрирован: 03 фев 2020, 15:10
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Re: Поинтервальная оптимизация

Непрочитанное сообщение Prohar » 20 фев 2020, 23:12

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

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

BugsDigger
Сообщения: 332
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 41 раз

Re: Поинтервальная оптимизация

Непрочитанное сообщение BugsDigger » 21 фев 2020, 07:54

> оптимизационные массивы

Эээ... Не совсем понятно.

Если хотите получить цифру дохода на последнем баре в вашем бегущем окне, то
- закройте позицию
- дождитесь следующего бара, т.к. закрытие произойдет именно на следующем баре
- double PL=RealizedPLAfterCommission(); // реализованный доход по индексу по закрытым сделкам робота
- запишите это число в отдельный файл (либо в какой-то общий лог, но надо пробовать, что из этого получится, т.к. оптимизация с разными параметрами идет в несколько потоков) с указанием значения оптимизируемого параметра
- теперь можно сказать стратегии Stop(), ведь окно обработано, другие окна обрабатываются отдельно
- уже не в терминале, естественно, прочесть файлы (например, можно сконкатенировать файлы в один стандартными командами командной строки/PowerShell) и засунуть в Excel. Enjoy.

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

Вообще, если бы разработчики открыли спецификацию формата, было бы неплохо (что там скрывать-то).
Еще можно через .net - дизассемблер посмотреть, что и как там сохраняется, но это отдельная песня.

> неслучайные влияющие факторы

Как раз случайные, особенно на нашем мелком рынке. А то еще вирус, торговая или настоящая война...
По вашим картам видно, как какая-то бегущая средняя (некая HMA, где MA намекает на moving avg) то попадает в резонанс с изменениями (тогда что-то идет в +), то попадает в противофазу (тогда все идет в -). Т.е. случайный процесс заведомо нестационарный (а кто бы сомневался), переключение его частот идет малопонятным образом, когда и как переключать параметры предсказать трудновато (если вообще возможно). Но мы-то надеемся на лучшее. :mrgreen:

Prohar
Сообщения: 19
Зарегистрирован: 03 фев 2020, 15:10
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Re: Поинтервальная оптимизация

Непрочитанное сообщение Prohar » 21 фев 2020, 14:24

Сделал
1) перед роботом прогоняем вложенным циклом модель робота по истории
Внешний цикл - диапазон оптимизируемого параметра. Можно использ много внешних циклов - если много оптимизир параметров)
внутренний - исторические бары
а) внешний цикл(циклы) на каждом шаге обновляет параметры
б) внутренний цикл прогоняет модель алгоритма по историческому окну шириной К баров, начиная со старого, заканчивая [-1]
и "совершает" лонги шорты (просто суммирует значения соотв баров в по сигналам) согласно алгоритму по цене открытия след бара [0]
в) после внутреннего цикла мы отбрасываем незакрытую сделку и вычисляем результат как разность сумм шортов и лонгов
г) сравниваем с максимальным значением, если больше или равно, то меняем максимум и запоминаем текущие параметры
д) переходим к выполнению след шага внешнего цикла

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

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

Вобщем.Если деньги жмут карманы, то приведенная выше методика торговли достаточно быстро решит вашу проблему ;)

Prohar
Сообщения: 19
Зарегистрирован: 03 фев 2020, 15:10
Благодарил (а): 4 раза
Поблагодарили: 1 раз

Re: Поинтервальная оптимизация

Непрочитанное сообщение Prohar » 21 фев 2020, 14:40

следующий этап - это применение данного скользящего многопараметрического окна к статистическому анализу и реализации известных решений оптимального выбора, там всяких стохастических ДУ, диффузий и броуновск движений, переборчивых невест, игр на разорение и тп :geek:


Вернуться в «Стратегии и роботы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей