MQL4: Расчет статистических коэффициентов и их использование для оптимизации советников

Приветствую вас, друзья!

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

Кастомный критерий оптимизации

К счастью, в MetaTrader предусмотрена возможность тестирования советников по кастомному критерию оптимизации. Найти эту функцию можно в «Свойствах эксперта» на вкладе «Тестирование»:

Сам параметр, относительно которого происходит оптимизация, вычисляется в теле эксперта при помощи специального метода onTester().

Коэффициент Кальмара

Вот расчет классического коэффициента Кальмара:

double OnTester() {     double AvProfit = 0;     double Kalmar = 0;         if (TesterStatistics(STAT_PROFIT_TRADES) > 0) {        AvProfit = NormalizeDouble(TesterStatistics(STAT_GROSS_PROFIT ) / TesterStatistics(STAT_TRADES),Digits) ;         Kalmar = NormalizeDouble(AvProfit/TesterStatistics(STAT_BALANCE_DD),Digits); }     return(Kalmar); }

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

Впервые коэффициент Кальмара был представлен в одном из известнейших биржевых журналов «Фьючерс» автором колонки по доверительному управлению и инвестированию в хедж фонды Терри Янгом. Этот показатель основывается на таком всем известном трейдерам понятии, как просадка.

Основной недостаток данного показателя заключается в том, что риск определяется только одним единственным событием (максимальной просадкой) уменьшая, таким образом, свою статистическую значимость и репрезентативность. Использование максимальной просадки как единственной оценки риска может привезти к предвзятому мнению при оценке результатов благодаря выбросам. Поэтому можно немного модифицировать формулу, введя в нее некоторые дополнительные данные:

double OnTester() { double AvProfit = 0; double Kalmar = 0; if (TesterStatistics(STAT_PROFIT_TRADES) > 0) { AvProfit = NormalizeDouble(TesterStatistics(STAT_GROSS_PROFIT ) / TesterStatistics(STAT_TRADES), Digits) ; } Kalmar = NormalizeDouble(-AvProfit*(TesterStatistics(STAT_CONPROFITMAX_TRADES)/ TesterStatistics(STAT_TRADES))/(TesterStatistics(STAT_MAX_LOSSTRADE)* (TesterStatistics(STAT_CONLOSSMAX_TRADES)/TesterStatistics(STAT_TRADES))), Digits); return(Kalmar); }

Коэффициент Сортино

Для оценки торговых систем применяется множество различных метрик. Каждая из них нацелена на выявление того или иного фактора и одним из таких показателей выступает коэффициент Сортино.

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

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

Давайте напишем код, который будет подсчитывать и возвращать значение коэффициента Сортино:

double OnTester() { double AvProfit = 0; double Sortino  = 0; double AvLoss = 0; double MaxLoss = 0; if (TesterStatistics(STAT_PROFIT_TRADES) > 0) AvProfit = NormalizeDouble(TesterStatistics(STAT_GROSS_PROFIT ) / TesterStatistics(STAT_PROFIT_TRADES),Digits) ; AvLoss = NormalizeDouble(TesterStatistics(STAT_GROSS_LOSS ) / TesterStatistics(STAT_LOSS_TRADES),Digits) ; MaxLoss = NormalizeDouble(TesterStatistics(STAT_MAX_LOSSTRADE ),Digits) ; Sortino = NormalizeDouble(((AvProfit-MaxLoss)/-AvLoss),Digits) ; return(Sortino); }

Коэффициент Трейнора

Коэффициент Трейнора (Treynor 1965) еще называют коэффициентом «доходности — изменчивости» (reward to volatility ratio) и представляет собой отношение избыточной доходности к рыночному риску. В отличие от Коэффициент Шарпа, в данном показателе доходность соотносится не с общим риском, а только с систематическим (недиверсифицируемым).

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

Давайте взглянем на код:

double OnTester() { double AvProfit = 0; double Treynor  = 0; double AvLoss = 0; double MaxProfit= 0; if (TesterStatistics(STAT_PROFIT_TRADES) > 0) AvProfit = NormalizeDouble(TesterStatistics(STAT_GROSS_PROFIT ) / TesterStatistics(STAT_PROFIT_TRADES),Digits) ; AvLoss = NormalizeDouble(TesterStatistics(STAT_GROSS_LOSS ) / TesterStatistics(STAT_LOSS_TRADES),Digits) ; MaxProfit = NormalizeDouble(TesterStatistics(STAT_MAX_PROFITTRADE ),Digits) ; Treynor = NormalizeDouble(((AvProfit-MaxProfit)/-AvLoss),Digits) ; return(Treynor); }

Коэффициент Шарпа

Коэффициент Шарпа придумал известный американский экономист – Уильям Шарп. На сегодня это один из наиболее часто используемых показателей отношения риска к доходности. Про коэффициент Шарпа вы можете подробнее прочесть в отдельной статье. Ну а мы посмотрим на код:

double OnTester() { double AvProfit = 0; double Sharp  = 0; double ObLoss = 0; double MaxProfit = 0; if (TesterStatistics(STAT_PROFIT_TRADES) > 0) AvProfit = NormalizeDouble(TesterStatistics(STAT_GROSS_PROFIT ) / TesterStatistics(STAT_PROFIT_TRADES),Digits) ; MaxProfit = NormalizeDouble(TesterStatistics(STAT_MAX_PROFITTRADE ),Digits) ; ObLoss = NormalizeDouble(TesterStatistics(STAT_GROSS_LOSS ),Digits) ; Sharp = NormalizeDouble(((AvProfit-MaxProfit)/-ObLoss),Digits) ; return(Sharp); }

Заключение

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

Тема на форуме

С уважением, Дмитрий аkа Silentspec
TradeLikeaPro.ru

Уроки по MQL , ,