Будет ли хорошая стратегия работать на случайно сгенерированных данных?

 
  • 31% (16)
  • 69% (35)
Всего проголосовало: 49
 

Сегодня вот подумалось мне, что если стратегия использует особенность торгового инструмента, т.е. настоящую торговую закономерность, то такая стратегия не будет работать на случайно сгенерированных данных. Работоспособность проверяется через оптимизацию, допустим есть 2-3 параметра и если их удаётся накрутить в оптимизаторе для появления нужных сетов, то стратегия и вовсе не стратегия, а случайно найденные настройки.

Что думаете по этому поводу? Знаю, что есть обратное мнение, что мол на рандоме хорошая стратегия должна работать, так-как ранок - это случайное блуждание.

Ещё интересны методы генерации правдоподобного рандома.

Я сделал сейчас так

   datetime Start_Copy_Data=D'01.01.2006';
   datetime Stop_Copy_Data=D'01.09.2024';
//--- получим в массив MqlRates данные всех баров минутного таймфрейма стандартного символа
   MqlRates rates[]= {};
   ResetLastError();
   int bars=CopyRates(CUSTOM_SYMBOL_ORIGIN, PERIOD_M1, Start_Copy_Data, Stop_Copy_Data, rates);
   MathSrand(GetTickCount());
   double Cust_digits=0.00001;
   int Get_High=0;
   int Get_Low=0;
   int Get_Close=0;
   rates[0].open=1;
   rates[0].high=1;
   rates[0].low=1;
   rates[0].close=1;

   int calc_posiriv=0;
   int calc_negativ=0;
   for(int i=1;i<bars;i++)
   {
      Get_High=RandomInteger(50);//Возвращает от 0 до 49 вкючительно
      Get_Low=RandomInteger(50);//Возвращает от 0 до 49 вкючительно
      switch(RandomInteger(2))
      {
      case 0://Падение
         if((Get_Low)>0)Get_Close=Get_High+(Get_Low-RandomInteger(Get_Low+1));
         else Get_Close=0;
         switch(RandomInteger(5))
         {
         case 3://Падение
            Get_Close+=2;
            break;
         }
         break;
      case 1://Рост
         if((Get_High)>0)Get_Close=RandomInteger(Get_High+1);
         else Get_Close=0;
         break;
      }
      rates[i].open=rates[i-1].close;
      rates[i].high=rates[i].open+(double)Get_High*Cust_digits;
      rates[i].low=rates[i].open-(double)Get_Low*Cust_digits;
      rates[i].close=rates[i].high-(double)Get_Close*Cust_digits;
   }

Функция для генерации рандома, кажется имеет смещение к большим числам.

int RandomInteger(int max_vl)
{
   static ulong rnd=0;
   static int bits_count=0;
   int bits=int(MathCeil(MathLog(max_vl)/MathLog(2.0)));

   if(bits_count<bits)
   {
      rnd=(ulong(MathRand())<<60)|(ulong(MathRand())<<45)|(ulong(MathRand())<<30)|(ulong(MathRand())<<15)|(ulong(MathRand())<<0);
      bits_count=64;
   }
   int result=int(rnd%max_vl);
   rnd=rnd/(ulong(1)<<bits);
   bits_count=bits_count-bits;
   return result;
}


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

На нижних ТФ получше дело, но не нравится много пин баров - ниже M15 и M1.


 
Aleksey Vyazmikin:
  • Да
  • Нет

на совсем случайных конечно-же не будет.

Но если генератор старается:

- соответствовать стат.характеристикам оригинальной котировки

- и при этом эмулирует сезонность, волатильность, календарные события

- воспроизводит известные артефакты (иногда 2-х/3-х дневные качели туда-обратно например, или пики раз в месяц)

- иногда запускать "чёрных лебедей"

то генератор остаётся случайным, но часть стратегий будет работать

 
Maxim Kuznetsov #:

на совсем случайных конечно-же не будет.

Не будет только хорошая, но и "плохая" то же?

Maxim Kuznetsov #:

Но если генератор старается:

Есть ли такие старания в моём коде? Вроде нет.

Однако, да, тема сделать по подобию генерацию весьма интересна!

 
Aleksey Vyazmikin #:

Не будет только хорошая, но и "плохая" то же?

Есть ли такие старания в моём коде? Вроде нет.

Однако, да, тема сделать по подобию генерацию весьма интересна!

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

 

Взял простую стратегию на отбой/пробой от процентного канала, вход на покупку/продажу определяется по вектору текущего отрезка ZZ и оптимизировал на рандоме:

  • Ширину процентного канала
  • Тайм фрейм ZZ
  • Период ZZ
  • Переворот сигнала на противоположный
Период оптимизации с 01.01.2010 по 01.09.2024, ТФ M1

Получилось вот так

Рисунок 1 Ширина процентного канала


Рисунок 2 TF ZZ


Рисунок 3 Период ZZ


Рисунок 4  Переворот сигнала на противоположный

По результатам лучшие настройки при оценке по балансу

  • Ширина процентного канала - 0,5
  • Тайм фрейм ZZ - M2
  • Период ZZ - 16
  • Переворот сигнала на противоположный - true

График баланса ниже на рисунке ниже - видим участки устойчивого роста - можно применить МО или накинуть фильтры - и грааль готов :))


Рисунок 5 график баланса

Рисунок 6 финансовые показатели часть 1

Рисунок 7 финансовые показатели часть 2

Финансовые показатели не так плахи - даже прибыльных сделок 53%, а не 50%/50% , мат ожидание хорошее, но прибыльность маловата - в остальном не плохо. Даже число максимальных проигрышей в два раза меньше выигравшей!

Странным кажется время входа в позицию по часам - при смене нового дня очень много входов - странно. Выход в 23 часа происходит в связи с тем, что позиции закрываются в конце для на ночь принудительно.

Дни недели устойчиво прибыльны, но только понедельник чуть убыточен, а вот август, март, сентябрь, октябрь и ноябрь - убыточны немного, возможно дело в окончании финансового года в США и публикации отчетности :)))

 
Maxim Kuznetsov #:

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

Почему у меня работает, или данные как то не случайны?

 
Aleksey Vyazmikin #:

Почему у меня работает, или данные как то не случайны?

данные как-то не случайны.

или вы криптограф, находка для спец.служб :-) 

 

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

Рисунок 1 График рассеивания EURUSD GBPUSD


Рисунок 2  График рассеивания EURUSD RANDOM


Рисунок 3   График рассеивания GBPUSD RANDOM

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

 
Aleksey Vyazmikin #:

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

Рисунок 1 График рассеивания EURUSD GBPUSD


Рисунок 2  График рассеивания EURUSD RANDOM


Рисунок 3   График рассеивания GBPUSD RANDOM

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

ещё оптимизатор так устроен, чтобы вам казалось

 
Maxim Kuznetsov #:

данные как-то не случайны.

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

Maxim Kuznetsov #:

ещё оптимизатор так устроен, чтобы вам казалось

Вот в этом то и главный вопрос ветки, может нет вообще никаких закономерностей и всё можно найти на рандоме?