Обсуждение статьи "Математика в трейдинге: Коэффициенты Шарпа и Сортино" - страница 2

 
Ivan Titov #:
Не нашел ни в одном источнике необходимости при расчете коэффициента Шарпа и приводить его к годовому значению.

Еще цитата

Что касается приведения коэффициента Шарпа к годовому значению, это делается для стандартизации показателя, позволяющей сравнивать его между различными инвестиционными стратегиями и портфелями, независимо от изначального временного масштаба инвестиций. Это обычная практика, которая помогает инвесторам оценивать эффективность инвестиций в рамках единого стандарта, особенно в условиях, когда сравнение проводится между различными видами активов или стратегиями с разной частотой торгов

 
Rashid Umarov #:
Отвечу цитатой

Под источниками я имел в виду информацию о коэффициентах Шарпа и Сортино за пределами данной статьи.

Rashid Umarov #:
Что касается приведения коэффициента Шарпа к годовому значению, это делается для стандартизации показателя, позволяющей сравнивать его между различными инвестиционными стратегиями и портфелями, независимо от изначального временного масштаба инвестиций.
Коэффициент Шарпа - это отношение средней доходности на отрезках заданного периода к стандартному отклонению на ЭТИХ ЖЕ отрезках. То есть длина отрезков большого значения не имеет для возможности сравнения стратегий между собой. На мой взгляд ее просто целесообразно выбрать больше в несколько раз средней продолжительности сделки, чтобы убрать ненужный шум.
Rashid Umarov #:
попробуйте без логарифмов и расскажите потом о необычном побочном ээфекте. Вы должны с этим столкнуться

Попробовал: ничего необычного. Правда одну ошибку нашел, прилагаю исправленный вариант.

Файлы:
Sortino.mqh  10 kb
 
Rashid Umarov #:

Отвечу цитатой

От себя добавлю - попробуйте без логарифмов и расскажите потом о необычном побочном ээфекте. Вы должны с этим столкнуться.

Любопытно, что вот для такой эквити этот скрипт выдает шарпа 2.08:

А для такой (то же самое с реинвестом) 3.66:

Хотя очевидно, что качество 2й эквити хуже (реинвест вообще всегда ухудшает качество эквити).

А если вместо логарифмов приращений эквити воспользоваться самими приращениями:

         log_return = (m_equities[i] - prev_equity); // increment      
         //log_return = MathLog(m_equities[i] / prev_equity); // increment logarithm

То получится 3.85 для первой и 2.1 для второй. Намного более адекватно.

 
Кроме того, шарп на логарифмах существенно зависит от размера начального депозита. В приведенном выше примере (эквити 1) при исходном депо 4000 он дает 2.08. При депо 400000 он дает 3.83. Хотя форма эквити никоим образом не изменилась (торговля фикс.лотом).
 

Шарп на логарифмах не зависит от размера депо только в случае, если идет торговля с реинвестом.

Но в этом случае и шарп на простых приращениях не зависит от размера депо.

Следовательно, пока не понимаю, зачем использовать шарп на логарифмах.

 

Почитайте логарифм цены

Другие упоминания сами найдете

 
Rashid Umarov #:

Почитайте логарифм цены

Другие упоминания сами найдете

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

     
      //--- add only if equity has changed
      if(m_equities[i] != prev_equity)
        {  
         log_return = MathLog(m_equities[i] / prev_equity); // increment logarithm
         aver += log_return;            // average logarithm of increments
         AddReturn(log_return);         // fill the array of increment logarithms
         counter++;                     // counter of returns
        }
      prev_equity = m_equities[i];

Затем среднее изменение находится делением на число таких баров:

//--- average value of the increment logarithm
   aver /= counter;

Однако переход к годовому шарпу происходит на основе отношения таймфреймов, как если бы в расчете учитывались все бары текущего тф:

//--- recalculate the Sharpe ratio to annual value in all other cases
//--- how many periods of the current timeframe fit into D1
   double factor = double(PeriodSeconds(PERIOD_D1)) / PeriodSeconds(timeframe);
   sharpe = sharpe * MathSqrt(factor);     // recalculate to daily value
   sharpe = sharpe * MathSqrt(252);        // obtain annual from daily

Т.е., еще раз: скрипт находит усредненный шарп на 1 бар с изменением эквити, а затем, чтобы найти годовой, умножает его не на число таких баров в году, а на общее число баров этого тф в году (его корень, естественно). Что ошибочно и завышает итоговый показатель.

Видимо в тестере шарп считается так же?

 
Kristian Kafarov #:
скрипт находит усредненный шарп на 1 бар с изменением эквити, а затем, чтобы найти годовой, умножает его не на число таких баров в году, а на общее число баров этого тф в году (его корень, естественно). Что ошибочно и завышает итоговый показатель

Тоже заметил. Поэтому в своей версии добавил опцию учета нулевых баров.