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

 
Maxim Dmitrievsky:

там нет теста\трейна. Он просто торгует в тестере (хорошо). Ставишь на реал - плохо.

Максим, вы хотели свой код выложить. Выложите в блог, как это делал основатель этой ветки. Может кто-то когда-то и захочет разобраться. А тут это затеряется...
 
Maxim Dmitrievsky:
Ну шо ты, разобрался в питоне-то? У меня не пашет в Реале, не знаю в чем проблема. Или исходники сюда скинуть? Может кто-нибудь поковыряет ещё 

выкладывай

 
Maxim Dmitrievsky:

В архиве 2 программы. Тестер просто для настройки системы, т.е. тестирует нейросеть на исторических данных и выводит результат в виде графика баланса (в виде накопленной суммы пунктов).

Трейдер торгует на счете, предварительно запуская тестер. Меняя seed, можно добиться наилучших результатов тестера. Также, меняя конфигурацию НС.

Описание проблемы: результаты тестера и трейдера не совпадают, трейдер почему-то не выходит в +. Ошибка либо в трейдере, либо в тестере. Либо есть какая-то неочевидная ошибка/подводный камень, связанные с работой самой НС библиотеки. Отловить не удалось (нет времени).

Сама библиотека с НС. Можно использовать в личных целях. Если найдете ошибку, свяжитесь со мной (есть варианты улучшения, если ТС начнет работать)

Что можно проверить: 

  1. корректность работы тестера
  2. сравнить логику тестера с логикой трейдера, найти несовпадение
  3. разобраться в особенностях НС, подумать почему может быть разница. Возможно из-за какой-то рандомизации, влияния seed при реальной торговле (есть такое подозрение)
Меняя Seed можно получить сливной результат? Возможно что он является одним из параметров для подгонки.
[Удален]  
elibrarius:
Меняя Seed можно получить сливной результат? Возможно что он является одним из параметров для подгонки.

Нельзя, но улучшить кривую можно

по крайней мере не получал сливных
 



Подготовка данных при обучении и работе отличается строкой

prices = prices.reindex(pd.date_range(start, end, freq='15min')).dropna()

Питона нет и я с ним не имею опыта, что это за команды не знаю. Поэтому спрошу.

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

[Удален]  
elibrarius:



Подготовка данных при обучении и работе отличается строкой

prices = prices.reindex(pd.date_range(start, end, freq='15min')).dropna()

Питона нет и я с ним не имею опыта, что это за команды не знаю. Поэтому спрошу.

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

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

в трейдере пропусков нет, т.к. берутся n последний баров. Не должны быть перевернуты.

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

 
Maxim Dmitrievsky:

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

в трейдере пропусков нет, т.к. берутся n последний баров. Не должны быть перевернуты.

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

Ну не переделать, а просто распечатать и сравнить с оригинальным - не нарушилось ли направление
 
По типу того, что тут писали, что прогнозировать прошлый неизвестный бар проще, чем будущий
[Удален]  
elibrarius:
Ну не переделать, а просто распечатать и сравнить с оригинальным - не нарушилось ли направление
...        ...      ...
3267  0.001091  1.18140
3268  0.000421  1.18077
3269  0.001455  1.18191
3270  0.001636  1.18225
3271  0.001829  1.18258

[3258 rows x 2 columns]
>>>
...        ...      ...
3225  0.001091  1.18140
3226  0.000421  1.18077
3227  0.001455  1.18191
3228  0.001636  1.18225
3229  0.001829  1.18258

[3230 rows x 2 columns]

все ок, последнее значение соответствует цене последнего бара в терминале

 

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

Сделал функцию, которая решает эту проблему, делюсь

//+------------------------------------------------------------------+
//|Получение информации о ценах OHLC текущего бара                   |
//+------------------------------------------------------------------+
void Get_OHLC(string symbol,ENUM_TIMEFRAMES TF, double &arr_OHLC[])
{
   ArrayResize(arr_OHLC,4);
   arr_OHLC[0]=iOpen(symbol,TF,0);
   arr_OHLC[3]=iOpen(symbol,PERIOD_M1,0);
   if(TF!=PERIOD_M1)
   {
      double arr_High[];
      double arr_Low[];
      int copied=0;
      datetime s=iTime(symbol,TF,0);
      datetime f=iTime(symbol,PERIOD_M1,1);
      if(s<f)
      {
         copied=CopyHigh(symbol,PERIOD_M1,s,f,arr_High);
         if (copied>0)
         {
            arr_OHLC[1]=arr_High[ArrayMaximum(arr_High,0,WHOLE_ARRAY)];
         }
         else
         {
            Print("Ошибка копирования в массив arr_High");
         }
         copied=CopyLow(symbol,PERIOD_M1,s,f,arr_Low);
         if (copied>0)
         {
            arr_OHLC[2]=arr_Low[ArrayMinimum(arr_Low,0,WHOLE_ARRAY)];
         }
         else
         {
            Print("Ошибка копирования в массив arr_Low");
         }
      }
      else
      {
         if(s==f)//Если ТФ открылся на прошлом минутном баре
         {
            arr_OHLC[1]=iHigh(symbol,PERIOD_M1,1);
            arr_OHLC[2]=iLow(symbol,PERIOD_M1,1);
         }
         if(s>f)//Если ТФ открылся на текущем минутном баре
         {
            arr_OHLC[1]=iOpen(symbol,PERIOD_M1,0);
            arr_OHLC[2]=iOpen(symbol,PERIOD_M1,0);
         }
      }
   }
   else
   {
      arr_OHLC[0]=iOpen(symbol,PERIOD_M1,0);
      arr_OHLC[1]=iOpen(symbol,PERIOD_M1,0);
      arr_OHLC[2]=iOpen(symbol,PERIOD_M1,0);
      arr_OHLC[3]=iOpen(symbol,PERIOD_M1,0);
   }
}