Обсуждение статьи "Оптимизируем стратегию по графику баланса и сравниваем результаты с критерием "Balance + max Sharpe Ratio""

 

Опубликована статья Оптимизируем стратегию по графику баланса и сравниваем результаты с критерием "Balance + max Sharpe Ratio":

Рассмотрен еще один пользовательский критерий оптимизации торговых стратегий, основанный на анализе графика баланса. Для этого использовалось вычисление линейной регрессии с помощью функции из библиотеки ALGLIB.

MACD Sample balance regression.mq5, EURUSD, H4, без форвард-тестирования

Для оптимизации выбраны следующие параметры:

Pic. 19. Tester, Inputs tab

Рис. 19. Тестер, вкладка Параметры

Для советника MACD Sample balance regression проведу уже привычные три теста:

  • Тест №1: оптимизация стандартного параметра "Balance + max Sharp Ratio"
  • Тест №2: оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов false
  • Тест №3: оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов true

Автор: Vladimir Karputov

 

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

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

 

Недавно была опубликована статья (лень искать), в которой также использовалась "линейная регрессия". По ней я давал развернутый комментарий, повторю.

Оба автора совершают идентичные ошибки: они путают качественно разные понятие "линейная регрессия" и "линейная аппроксимация". Первая относится к случайным величинам, а вторая к детерминированным. Уравнения у них разнятся на случайную величину, которая суть ошибка. Не знаю как в Алглибе, но в любом нормальном пакете статистики учет ошибки выливается в ОЦЕНКУ коэффициентов регрессии, так как для них существует ошибка, которая может быть кратно больше номинала вычисленного коэффициента, что приводит к печальному результату: значение коэффициента вычислили, видим его, а в реальности его нет, и  использовать то, что видим, нельзя Это обстоятельство не учитывается в статье и для терминологии "линейная регрессия" статья совершенно не верна.


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

 

По какой-то причине мой файл не включает регрессию баланса. Есть способ устранить неполадки? Он сохранен в моих файлах и находится в разделе include.


 
Scott David Maclean :

По какой-то причине мой файл не включает регрессию баланса. Есть способ устранить неполадки? Он сохранен в моих файлах и находится в разделе include.


1. Прочитайте описание ошибки и проверьте пути.

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

 

есть общий вопрос: почему при заполнении массивов результатов торговли мы учитываем только сделки с положительным влиянием на баланс? т.е. почему arr_profits заполняется только сделками с (комиссия + своп + прибыль) > 0.0?

Не влияют ли провалы в кривой баланса (которые являются результатами убыточных сделок) также на линию LR и, следовательно, на GetProfitStability?

 

При попытке скомпилировать BalanceRegression.mph у меня возникли ошибки:


Две закомментированные строки выдавали следующую ошибку - покопавшись немного, я обнаружил, что библиотека alglib была обновлена.

Обновленные строки компилируются, и код запускается, но я никогда раньше не использовал CMatrixDouble, поэтому не уверен на 100%, что исправление корректно.


operator[] constant variable cannot be passed as reference


 CMatrixDouble xy(arr_size,2);
   for(int i=0;i<arr_size;i++)
     {
      //xy[i].Set(0,i+1);
      //xy[i].Set(1, arr_profits[i]);
      
      xy.Set(i, 0, i+1);
      xy.Set(i, 1, arr_profits[i]);


Кроме того, закомментированная строка в том же файле возвращала неопределенную переменную - опять же, я думаю, что это связано с обновлением alglib:

//double TrendMSE=linear_report.m_rmserror;

double TrendMSE=linear_report.m_RMSError;