Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 1848

 
mytarmailS:

Их сотни, что вам поведать?  Вы с задачу свою сформулируйте для начала

text mining

santiment analysis 

Ну вот хотя бы названия от чего отталкиваться, и что искать. Благодарю.

 
Mihail Marchukajtes:

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

А как собирается ОИ не на открытии разве бара за прошлый бар? Если так, то смещение логично же.

 
elibrarius:
Спасибо. Я пользовался Precision, называя (для себя) его Accuracy для класса. Буду называть общепринятыми терминами теперь).
А в целом Precision можно считать основной метрикой при наличии класса "ждать". Ошибки по Precision - это прямые убытки от неправильной классификации.
А Recall - означает упущенная прибыль, т.е. мы ждали вместо того, чтобы действовать.
В итоге нужно максимизировать F1, который найдет лучшее значение при минимуме ошибок предсказания и минимуме упущенной прибыли.

Если говорить об обучении на бустинге (CatBoost), то обычно, Precision очень быстро подымается, а вот Recall это делает медленно, и пока растет Recall падает Precision. Это я к тому, что при обучении хорошо бы контролировать два показателя отдельно, допустим установив границы 80<Precision>60 и  Recall>50 и пытаться останавливать обучение в этих границах. Разными коэффициентными показателями, типа F1, это сделать сложней. Жаль, что разработчики такой возможности не предусмотрели, а с обрезанием деревьев готовой модели я пока не разобрался.

Ещё есть идея разбить выборку на участков 10 и обучить 10 моделей по каждому участку, посмотреть поведение модели на каждом участке и подрезать деревья модели, по среднему показатели переобучения, а потом как то свести все модели вместе. Таким образом произойдет зачистка переобученности моделей и использоваться будут данные только имеющие устойчивую информацию о тенденции.

 
Aleksey Vyazmikin:

А как собирается ОИ не на открытии разве бара за прошлый бар? Если так, то смещение логично же.

Нет он пишется каждый тик
 
Mihail Marchukajtes:
Нет он пишется каждый тик

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

 
Aleksey Vyazmikin:

Ещё есть идея разбить выборку на участков 10 и обучить 10 моделей по каждому участку, посмотреть поведение модели на каждом участке и подрезать деревья модели, по среднему показатели переобучения, а потом как то свести все модели вместе. Таким образом произойдет зачистка переобученности моделей и использоваться будут данные только имеющие устойчивую информацию о тенденции.

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

 
Aleksey Vyazmikin:

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

Стандартно через икустом... просто он читает данные из файла в котором записан каждый тик, а индикатор читает при появлении нового бара и получается что он берет немного не то значение которое нужно. вспомнил...
 
Roman:

Ну вот хотя бы названия от чего отталкиваться, и что искать. Благодарю.

это не названия , а ссылки на все что вам надо, готовое... и даже больше

 
Mihail Marchukajtes:
Стандартно через икустом... просто он читает данные из файла в котором записан каждый тик, а индикатор читает при появлении нового бара и получается что он берет немного не то значение которое нужно. вспомнил...

Начнем с того, что пишется не каждый тик

  if ((interest!=inter))
  {

   MqlTick last_tick;
   if(SymbolInfoTick(Name_instrFS,last_tick)) 
    StartDate=last_tick.time;
    else StartDate=TimeCurrent();
    for (int i=0;i<100 && !IsStopped();i++)
    { 
      h=FileOpen("OpenI\\"+Name_instr+"_OI.csv",FILE_WRITE|FILE_READ|FILE_ANSI|FILE_CSV|FILE_COMMON|FILE_SHARE_READ,",");
       if(h!=INVALID_HANDLE)                                                         
       {  
         
         FileSeek(h,0,SEEK_END);
         FileWrite(h,StartDate,DoubleToString(interest,0)); 
         FileClose(h); 
         Sleep(100);
         break; 
       }
    }   
    inter=interest;
   // byOR=byORD;
   // sellOR=sellORD;
  }

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

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


По индикатору - что то там отрисовали на истории - допустим правильно.

А дальше на нулевом баре такая петрушка идет

  BufOI[0]=SymbolInfoDouble(Symbol(),SYMBOL_SESSION_INTEREST);
 LastUPdate=FileGetInteger("OpenI\\"+FileName1,FILE_MODIFY_DATE,true);
  if ((LastUPdate!=UPdate))
     {
       int h=FileOpen("OpenI\\"+FileName1,FILE_READ|FILE_ANSI|FILE_CSV|FILE_COMMON,",");
       string str=FileReadString(h);                            // читаем очередную строку из файла

    BufOI[1]=StringToDouble(str);
       FileClose(h);
   BufOI[0]=BufOI[1];

 UPdate=LastUPdate;   

Берем данные ОИ тикущие с сервера, в тестере их нет - да и не используются они.

Потом, если появилась новая дата модификации файла, который обнавляется раз в 15 минут в прямом эфире, но не в тестере, считываем данные из файла (последнюю строку) FileName1=_Symbol+FileNames+"_TMP.csv"; и присваиваем значение полученных данных первому бару, закрываем файл и присваиваем значение ещё и нулевому бару. Ну понятно, что такой вариант в тестере никак работать не будет.

Вам нужно два режима индикатора - для работы на истории и для работы в реальном времени, я так думаю.


Проверяли корректность данных на истории - а то странно считываются данные из файла...

         while(!FileIsEnding(h))
           {
            ArrayResize(oi,ct+2,1000);
            string str=FileReadString(h);                            // читаем очередную строку из файла
            if(cnt==0) oi[ct].time=StringToTime(str);                 //если запись первая, т.е. дата, то конвертируем из стринга в дататайм
            else if(cnt==2) oi[ct].oi=StringToDouble(str);   //если запсиь вторая, т.е. ОИ, то конвертируем в инт и 

            cnt++; // увеличиваем счетчик прочитанных строк
            if(FileIsLineEnding(h)) {cnt=0; ct++;}
           }

Получается что считались данные 

 
Aleksey Vyazmikin:

Начнем с того, что пишется не каждый тик

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

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


По индикатору - что то там отрисовали на истории - допустим правильно.

А дальше на нулевом баре такая петрушка идет

Берем данные ОИ тикущие с сервера, в тестере их нет - да и не используются они.

Потом, если появилась новая дата модификации файла, который обнавляется раз в 15 минут в прямом эфире, но не в тестере, считываем данные из файла (последнюю строку) FileName1=_Symbol+FileNames+"_TMP.csv"; и присваиваем значение полученных данных первому бару, закрываем файл и присваиваем значение ещё и нулевому бару. Ну понятно, что такой вариант в тестере никак работать не будет.

Вам нужно два режима индикатора - для работы на истории и для работы в реальном времени, я так думаю.


Проверяли корректность данных на истории - а то странно считываются данные из файла...

Получается что считались данные 

Тут с Вами абсолютно согласен. А данные он пишет несколько значений внутри минуты, это не каждый тик, но всё же. Потом строит из этих данных любой ТФ

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

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

Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха,  ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
Причина обращения: