Discussão do artigo "R quadrado como uma estimativa da qualidade da curva de saldo da estratégia"

 

Novo artigo R quadrado como uma estimativa da qualidade da curva de saldo da estratégia foi publicado:

Este artigo descreve a construção do R² - critério de otimização personalizado. Esse critério pode ser usado para estimar a qualidade da curva de saldo de uma estratégia e para selecionar as estratégias mais consistentes e lucrativas. O trabalho discute os princípios de sua construção e os métodos estatísticos utilizados na estimativa de propriedades e qualidade desta métrica.

A função rnorm retorna dados diferentes a cada vez, então, se você quiser repetir esta experiência, o gráfico terá um aspecto diferente. 

O resultado do código apresentado:

Fig. 15. Passeio aleatório e regressão linear para isso

Autor: Vasiliy Sokolov

 

Именно поэтому количество сделок должно быть достаточно большим. Но что подразумевать под достаточностью? Принято считать, что любая выборка должна содержать как минимум 37 измерений. Это магическое число в статистике, именно оно является нижней границей репрезентативности параметра. Конечно, для оценки торговой системы этого количества сделок недостаточно. Для надежного результата желательно совершить не менее 100 — 150 сделок. Более того, для многих профессиональных трейдеров и этого недостаточно. Они проектируют системы, совершающие не менее 500-1000 сделок, и уже потом, на основании этих результатов, рассматривают возможность запуска системы на реальных торгах...

Ah! Eu sempre pensei que fosse 100. Obrigado, artigo interessante.

Portanto, é seguro dizer que o coeficiente de determinação R-quadrado é uma adição importante ao conjunto existente de métricas de teste do MetaTrader 5. Ele permite que você avalie a suavidade da curva da linha de equilíbrio de uma estratégia, que é uma métrica não trivial por si só. O R-quadrado é fácil de usar: sua faixa de valores é fixa e varia de -1,0 a +1,0, sinalizando uma tendência negativa do equilíbrio da estratégia (valores próximos a -1,0), nenhuma tendência (valores próximos a 0,0) e uma tendência positiva (valores tendendo a +1,0). Devido a todas essas propriedades, confiabilidade e simplicidade, o R-quadrado pode ser recomendado para uso na criação de um sistema de negociação lucrativo.

Uau! Sempre pensei que o Ryx - Coeficiente de Determinação - fosse usado para avaliar a qualidade da regressão linear. O coeficiente dedeterminaçãode ummodelocom umaconstanteassumevaloresde0a1.

Também é comum realizar testes de significância no coeficiente de regressão. Até mesmo o Alglib os tem :-)

PearsonCorrelationSignificance(), SpearmanRankCorrelationSignificance().

 
Usaremos o Expert Advisor pronto CImpulse 2.0, cujo trabalho está descrito no artigo"Universal Trading Expert Advisor: Working with Pending Orders". Ele foi escolhido por sua simplicidade e pelo fato de que, diferentemente dos Expert Advisors da versão padrão do MetaTrader 5, ele pode ser otimizado, o que é extremamente importante para os propósitos do nosso artigo

O que significa isso?

Há uma métrica estatística especial no relatório do terminal MetaTrader. Ela é chamada de Correlação LR e mostra a correlação entre a linha de equilíbrio e a regressão linear encontrada para essa linha.

A maneira de calcular o coeficiente de determinação R^2 é semelhante à maneira de calcular a correlação LR. Mas o número final é adicionalmente elevado ao quadrado.

Um número que mais nos interessa aqui é o R-quadrado ou R-squared. Essa métrica mostra um valor de 0,5903. Portanto, a regressão linear explica 59,03% de todos os valores e os 41% restantes permanecem sem explicação.

Com base nas citações acima, conclui-se que R^2 = LR^2. Assim, o critério para encontrar uma função linear chamada "Regressão linear" é o MNC de variâncias ou, o que é a mesma coisa, maximizar o valor absoluto do RQ de Pearson, que é MathAbs(LR). E maximizar MathAbs(LR) é o mesmo que maximizar R^2, já que MathAbs(LR) = MathSqrt(R^2).


No total, temos que a regressão linear é encontrada pelo critério de maximização MathAbs(R)^n, em que n é qualquer número positivo.

Bem, então qual é o sentido de falar sobre 59,03% de todos os valores explicados pela LR, quando você pode, por exemplo, em n = 1 obter 76,8% e em n = 4 - 34,8%?


Declaração incorreta

R^2 nada mais é do que a correlação entre um gráfico e seu modelo linear

   //-- Encontre R^2 e seu sinal
   double r2 = MathPow(corr, 2.0);
 
Способ расчета коэффициента детерминации R^2 аналогичен способу расчета LR Correlation. Но итоговое число дополнительно возводится в квадрат.

Os gráficos das distribuições de correlação LR e R^2 para os 10.000 exemplos independentes apresentados no artigo mostram que R^2 != LR^2.

O mais surpreendente é que, por meio de uma simples ação matemática (segundo grau), removemos completamente os efeitos marginais indesejáveis da distribuição.

Não entendo por que o segundo grau da distribuição "côncava" original a torna "plana"?
 
Agora vamos encontrar a melhor execução pelo parâmetro R-quadrado. Para fazer isso, salve as execuções de otimização em um arquivo XML. Se o Microsoft Excel estiver instalado em seu computador, o arquivo será aberto automaticamente. Trabalharemos com classificação e filtros, portanto, vamos destacar o cabeçalho da tabela e clicar no botão de mesmo nome (Home -> Sort and Filter -> Filter), após o que você poderá exibir as colunas de forma flexível. Отсортируем прогоны по пользовательскому критерию оптимизации

Por que usar o Excel para isso, se tudo é classificado no próprio Tester?

 
НедостаткиРешение
Применим исключительно для оценки линейных процессов, или систем, торгующих фиксированным лотом.Не применять для торговых систем, использующих систему капитализации (мани-менеджемент).

O patrimônio líquido para o cálculo de R^2 deve ser contado não como AccountEquity ( == AccountBalance + Sum(Profit[i])), mas como Sum(Profit[i] / Lots[i]) (para TS de um caractere).

 
De todas as fontes MQL do artigo, apenas uma é útil
//+------------------------------------------------------------------+
//| Retorna a pontuação R^2 calculada com base no patrimônio líquido da estratégia.
//| Os valores de patrimônio líquido são passados como uma matriz de patrimônio líquido.
//+------------------------------------------------------------------+
double CustomR2Equity(double& equity[], ENUM_CORR_TYPE corr_type = CORR_PEARSON)
{
   int total = ArraySize(equity);
   if(total == 0)
      return 0.0;
   //-- Preencher a matriz Y - valor do patrimônio líquido, X - número ordinal do valor
   CMatrixDouble xy(total, 2);
   for(int i = 0; i < total; i++)
   {
      xy[i].Set(0, i);
      xy[i].Set(1, equity[i]);
   }
   //-- Encontre os coeficientes a e b do modelo linear y = a*x + b;
   int retcode = 0;
   double a, b;
   CLinReg::LRLine(xy, total, retcode, a, b);
   //-- Gerar valores de regressão linear para cada X;
   double estimate[];
   ArrayResize(estimate, total);
   for(int x = 0; x < total; x++)
      estimate[x] = x*a+b;
   //-- Encontre o coeficiente de correlação dos valores com sua regressão linear
   double corr = 0.0;
   if(corr_type == CORR_PEARSON)
      corr = CAlglib::PearsonCorr2(equity, estimate);
   else
      corr = CAlglib::SpearmanCorr2(equity, estimate);
   //-- Encontre R^2 e seu sinal
   double r2 = MathPow(corr, 2.0);
   int sign = 1;
   if(equity[0] > equity[total-1])
      sign = -1;
   r2 *= sign;
   //-- Retorna a estimativa normalizada de R^2, com precisão de centésimos
   return NormalizeDouble(r2,2);
}

Ela é universal - é adequada para qualquer matriz dupla (não apenas Equity).

Quando você olha para todos os outros códigos MQL, não entende por que eles são fornecidos, pois não são legíveis sem o conhecimento de CStrategy.


Obrigado ao autor pelo artigo, ele me fez pensar.


ZY As linhas destacadas em amarelo no código-fonte são controversas.

 

Muito interessante, obrigado. Nunca pensei no fato de que as métricas do testador são distorcidas pela capitalização, portanto, a otimização será menos eficiente do que com o volume fixo. E o R^2 é, obviamente, muito útil. Gostaria de saber se ele acelerará o processo de otimização em comparação com o fator de lucro + saldo máximo, por exemplo.

 
fxsaber:
De todas as fontes MQL do artigo, apenas uma é útil

Concordo com isso, todo o restante terá que ser retirado das classes para ser adicionado ao seu sistema... seria melhor ter tudo em fs separados ou em um includnik separado.

 
fxsaber:

O patrimônio líquido para o cálculo do R^2 deve ser calculado não como AccountEquity ( == AccountBalance + Sum(Profit[i])), mas como Sum(Profit[i] / Lots[i]) (para TS de um único caractere).

Código para calcular o "patrimônio" adequado para R^2. Ele está escrito no estilo MT4, não é difícil traduzi-lo para o MT5...

// Cálculo do patrimônio líquido sem MM (variante para TS de caractere único)
class EQUITY
{
protected:
  int PrevHistoryTotal;
  double Balance;
  double PrevEquity;
  
  // Adicionar um elemento ao final de uma matriz arbitrária
  template <typename T>
  static void AddArrayElement( T &Array[], const T Value, const int Reserve = 0 )
  {
    const int Size = ::ArraySize(Array);
  
    ::ArrayResize(Array, Size + 1, Reserve);
  
    Array[Size] = Value;
  }

  static double GetOrderProfit( void )
  {
    return((OrderProfit()/* + OrderCommission() + OrderSwap()*/) / OrderLots()); // às vezes é útil ignorar a comissão e a troca
  }
  
  static double GetProfit( void )
  {
    double Res = 0;
    
    for (int i = OrdersTotal() - 1; i >= 0; i--)
      if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL))
        Res += EQUITY::GetOrderProfit();
    
    return(Res);
  }
  
  double GetBalance( void )
  {
    const int HistoryTotal = OrdersHistoryTotal();
    
    if (HistoryTotal != this.PrevHistoryTotal)
    {
      for (int i = HistoryTotal - 1; i >= PrevHistoryTotal; i--)
        if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL) && OrderLots()) // OrderLots - CloseBy
          this.Balance += EQUITY::GetOrderProfit();
      
      this.PrevHistoryTotal = HistoryTotal;
    }
    
    return(this.Balance);
  }
  
public:
  double Data[];

  EQUITY( void ) : PrevHistoryTotal(0), Balance(0), PrevEquity(0)
  {
  }
  
  virtual void OnTimer( void )
  {
    const double NewEquity = this.GetBalance() + EQUITY::GetProfit();
    
    if (NewEquity != this.PrevEquity)    
    {
      EQUITY::AddArrayElement(this.Data, NewEquity, 1 e4);
      
      this.PrevEquity = NewEquity;
    }
  }
};


Uso

EQUITY Equity;

void OnTimer()
{
  Equity.OnTimer();
}

double OnTester()
{
  return(CustomR2Equity(Equity.Data));
}
 
fxsaber:

Código para calcular o "patrimônio" adequado para R^2. Escrito no estilo MT4, não é difícil traduzi-lo para o MT5....


Uso


Legal, você pode simplesmente chamá-lo a cada nova barra, para que o sistema não seja carregado com um cronômetro. Para sistemas com controle de nova barra.