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

 
Alexey Burnakov:
  • Попробую отбирать модели на основе максимального ФВ (сейчас отбираю по МО). То есть, сменю функцию оценки качества модели. ХЗ....

Правильно подобранная функция для оценки качества модели очень важна, ведь что ищем и пытаемся максимизировать, то в конце и получим. Если использовать точность модели - можно легко скатиться в локальный максимум в котором модель всегда возвращает класс с наибольшим числом примеров. Для обучающих данных с несбалансированными классами лучше использовать F-score или Cohen's Kappa. Но даже с ними у меня были проблемы, ведь рост цены за бар может быть разным, и даже имея положительную оценку, можно оказаться в минус - число выигрышных сделок будет больше чем проигрышных, но при этом несколько проигрышных сделок могут иметь большие, невосполнимые потери. Симуляция торговли, и оценка модели по результатам торговли это правильное решение, я с вами согласен, недавно тоже начал так делать. Нужна прибыльность с маленькой просадкой - значит оценка модели должна использовать эти понятия.

MO мне кажется не очень хороший выбор, ведь не учитывается просадка, которая важна. Из тех функция для оценки советников что есть в MT5 мне больше всего нравятся Recovery Factor и Sharpe ratio.
Recovery Factor - итоговый профит поделить на максимальную за всё время просадку. Довольно просто, но эффективно.
Sharpe Ratio - в интернете много описаний словами ,но формул не особо много нашёл. Есть такой код для MT4, я думаю стоит перенести его в R и попробовать.

double GetSharpeRatioFromHistory(double riskFreeYearlyIncome = 0.01){
   double profitsArray[];
   int profitsArraySize = 0;
   
   double profitsAvg = 0.0;
   int profitsAvgCount = 0;
   
   int ordersHistoryTotal = OrdersHistoryTotal();
   if(ordersHistoryTotal == 0){
      return 0.0;
   }
   for(int i=0; i<ordersHistoryTotal; i++){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
         if((OrderSymbol() == _Symbol) && (OrderMagicNumber() == magic)){
            double profitForTrade = (OrderProfit() + OrderCommission() + OrderSwap());
            double seconds = double(OrderCloseTime() - OrderOpenTime());
            double riskFreeRate = riskFreeYearlyIncome / double(365*24*60*60) * seconds;
            double tradeResult = profitForTrade - riskFreeRate;
            
            profitsArraySize = ArrayResize(profitsArray, profitsArraySize+1);
            if(profitsArraySize>0){
               profitsArray[profitsArraySize-1] = tradeResult;
            }
            
            profitsAvg += tradeResult;
            profitsAvgCount++;
         }
      }
   }
   
   if(profitsArraySize == 0){
      return 0.0;
   }
   
   profitsAvg /= double(profitsAvgCount);
   
   double stdDev = 0.0;
   for(int i=0; i<profitsArraySize; i++){
      stdDev += ((profitsArray[i]-profitsAvg)*(profitsArray[i]-profitsAvg)/double(profitsArraySize));
   }
   
   if(stdDev == 0.0){
      return 0.0;
   }

   return profitsAvg/stdDev;
}

параметр riskFreeYearlyIncome - годовая прибыль для безрискового вложения (вклад в банк), в примере это 1%. Sharpe Ratio учитывает насколько стратегия лучше чем такое вложение.
double seconds = double(OrderCloseTime() - OrderOpenTime()) - сколько была открыта сделка по времени в секундах. Для торговли на барах - это соответственно сколько секунд в баре.

 
Dr.Trader:

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

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

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

4) 

MO мне кажется не очень хороший выбор, ведь не учитывается просадка, которая важна. Из тех функция для оценки советников что есть в MT5 мне больше всего нравятся Recovery Factor и Sharpe ratio.
Recovery Factor - итоговый профит поделить на максимальную за всё время просадку. Довольно просто, но эффективно.
Sharpe Ratio - в интернете много описаний словами ,но формул не особо много нашёл. Есть такой код для MT4, я думаю стоит перенести его в R и попробовать.


1) Абсолютно

2) точно.

3) да, помогает избавиться от starting-point bias в оценке.

4) ФВ это и есть recovery factor. Я его вообще уважаю сильно. Запилю его в функцию оценки, это легко. 

По Шарпу. Все просто! Объясняю.

а) Получили вы вектор исходов сделок в пунктах, так? 

б) Надо симулировать торговлю с РЕИНВЕСТИРОВАНИЕМ и вектор пунктов преобразовать в вектор процентных приращений депозита. Пример. начинаем со 100 000 долларов. Торгуем лотом 0.1 получили 0.001 (десять пунктов). Это 10 долларов в пересчет на лот. Значит, это значение превращается в 10 / 100 000. И так далее с учетом роста или прадения лотности.

в) По полученному вектору процентных приращений считаем: среднее, ст.отклонение.

г) вводим некий безрисковый доход в год (3%) - число условное число, небольшое.

д) нужно либо перевести ваши сделки в среднегодовой доход, либо безрисковый доход в год разложить на среднюю доходность на сделку. Сделали.

е) (ваша средняя доходность на сделку (на период) - безриск.доходность) / ст.отклонение 

Кода на R пока нет у меня. Но написать такую функцию не должно быть сложно. 

 

На фин.рынках переобучается все! Даже то, что говорят не переобучается, там переобучается.

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

 
Alexey Burnakov:

 

Ваша идея классифицировать приросты цены с самого начала встречала у меня чисто эмоциональное неприятие. Если мы предсказываем тренды, то смотрим на ЗЗ и понятно: вот один класс, а вот другой класс. Если посмотреть на график приростов цены, то это хаотичное дерганье вокруг нуля. Где здесь явно видные классы?

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

Кроме этого для приростов цены на финансовых рынках много лет разрабатывался и довольно хорошо работает аппарат ARIMA-ARCH. В этой опере даже есть модели учитывающие Херста. Чем лучше классификация?

Классификация - это паттерны - "голова и плечи", поиск которых мы автоматизировали и которые предсказывают ясно видимый глазу класс. С помощью классификации мы находим паттерн (в виде дерева, например) и говорим: "после этого паттерна будет рост. Если мы правильно сформулировали целевую переменную, то так и будет. Вот ЗЗ не правильная целевая переменная. Здесь была высказана идея предсказывать будущий рост в 100 пипсов. Такая целевая переменная мне кажется гораздо более правильно. 

 

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

 
СанСаныч Фоменко:

Ваша идея классифицировать приросты цены с самого начала встречала у меня чисто эмоциональное неприятие. Если мы предсказываем тренды, то смотрим на ЗЗ и понятно: вот один класс, а вот другой класс. Если посмотреть на график приростов цены, то это хаотичное дерганье вокруг нуля. Где здесь явно видные классы?

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

Кроме этого для приростов цены на финансовых рынках много лет разрабатывался и довольно хорошо работает аппарат ARIMA-ARCH. В этой опере даже есть модели учитывающие Херста. Чем лучше классификация?

Классификация - это паттерны - "голова и плечи", поиск которых мы автоматизировали и которые предсказывают ясно видимый глазу класс. С помощью классификации мы находим паттерн (в виде дерева, например) и говорим: "после этого паттерна будет рост. Если мы правильно сформулировали целевую переменную, то так и будет. Вот ЗЗ не правильная целевая переменная. Здесь была высказана идея предсказывать будущий рост в 100 пипсов. Такая целевая переменная мне кажется гораздо более правильно. 

 

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

 Я не знаю, что в этом эмоционально не верно. Это один из вариантов. Цвет свечи это еще называется.

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

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

  Вот это и есть очень близко к тому, чтобы предсказывать будущий рост в 100 пипсов. Только мне самому не понятно, как вы видите формализацию такой целевки. Что значит рост, а если перед ростом было падение на 90 пунктов, а если этот рост достигается только через неделю?

У меня на горизонте 9 часов сильный рост это где-то 20 пунктов. После 9 часов сделка закрывается. 

И по факту я сейчас вообще не прогнозирую класс (рост / падение / болтание / сильный рост). Я по факту строю систему, чья оценка на этапе обучения меряется мат.ожиданием торговли. То есть, классификационная точность может быть низкой (53% у меня), но попадание в верное направление дает чуть больший прирост, чем не попадание. Чувствуете разницу в постановке задачи? Точность классификации коррелирует но не полностью совпадает с прибыльностью торговли.

 

Кстати, фактор восстановления как функция оценки качества модели тоже однобок. Я могу получить 10 сделок и 1 из них убыточную, или 500 сделок и 10 убыточных. Во втором случае ФВ может быть ниже, а прибыль в 50 раз выше.

Как вариант, можно взять суммарный профит и вычесть из него макс.просадку. Тут хотя бы профит будет максимизироваться. 

Или традиционный фактор прибыльности: общая прибыль / общий убыток. 

 
Alexey Burnakov:

Во втором случае ФВ может быть ниже, а прибыль в 50 раз выше.

Всё дело в риске на который вы хотите пойти. Например есть два сигнала: первый приносит 100% прибыли в год при максимальной просадке в 10%. Второй сигнал - приносит 300% прибыли в год при просадке в 40%. Так-то по прибыли второй сигнал лидирует.
Но если посчитать ФВ, то лидером будет первый сигнал, и это правильно, потому что можно просто увеличить размер сделок (в лотах) первого сигнала в четыре раза, что даст такую-же просадку как у второго сигнала, но с большей прибылью. Или если не хочется рисковать большим процентом от баланса на счету, то можно уменьшить размер лотов второго сигнала в 4 раза, что даст риск в желаемых 10% от баланса, но и профит будет тоже меньше по сравнению с первым сигналом

То есть план торговли по стратегии может быть таким: Определить валк-форвардом максимально возможную просадку при торговле по стратегии; посчитать во сколько раз эта просадка больше/меньше допустимого вами значения для баланса на счёте; рассчитать размер лота так чтобы эти числа сошлись.
Использование ФВ подразумевает что вы перед началом торговли рассчитаете все риски и определите подходящий размер лота. Чем меньшую просадку имеет стратегия при торговле - тем больший размер сделок вы можете использовать.

 
Alexey Burnakov:

Или традиционный фактор прибыльности: общая прибыль / общий убыток. 

ИМХО, более приемлемым является:

критерий_оценки_ТС = сумма_прибыльных_сделок / (сумма_прибыльных_сделок + сумма_убыточных_сделок)

при условии трейдинга фиксированным лотом.

В таком случае, если критерий выше значения 0.5, то ТС показала итоговый профит, в противном случае - убыток.

Преимущество критерия в том, что он жёстко нормирован и его значение не может выйти за пределы диапазона от 0 до 1.0 включительно.

Просадки, даже несмотря на итоговый профит ТС оказывают своё негативное влияние на  значение этого критерия, т.е. учитываются им как отрицательный фактор.

 
Yury Reshetov:

ИМХО, более приемлемым является:

критерий_оценки_ТС = сумма_прибыльных_сделок / (сумма_прибыльных_сделок + сумма_убыточных_сделок)

при условии трейдинга фиксированным лотом.

В таком случае, если критерий выше значения 0.5, то ТС показала итоговый профит, в противном случае - убыток.

Преимущество критерия в том, что он жёстко нормирован и его значение не может выйти за пределы диапазона от 0 до 1.0 включительно.

Просадки, даже несмотря на итоговый профит ТС оказывают своё негативное влияние на  значение этого критерия, т.е. учитываются им как отрицательный фактор.

"сумма_убыточных_сделок" - уточню, имеется в виду абсолютное значение. Спасибо, не видел раньше такой нормализованный критерий.
 
Yury Reshetov:

ИМХО, более приемлемым является:

критерий_оценки_ТС = сумма_прибыльных_сделок / (сумма_прибыльных_сделок + сумма_убыточных_сделок)

при условии трейдинга фиксированным лотом.

В таком случае, если критерий выше значения 0.5, то ТС показала итоговый профит, в противном случае - убыток.

Преимущество критерия в том, что он жёстко нормирован и его значение не может выйти за пределы диапазона от 0 до 1.0 включительно.

Просадки, даже несмотря на итоговый профит ТС оказывают своё негативное влияние на  значение этого критерия, т.е. учитываются им как отрицательный фактор.

А если в паре сделок прибыль основная получится, а в тысячах других мелкие убытки? - вроде как не айс.
Причина обращения: