Discussão do artigo "R quadrado como uma estimativa da qualidade da curva de saldo da estratégia"
Именно поэтому количество сделок должно быть достаточно большим. Но что подразумевать под достаточностью? Принято считать, что любая выборка должна содержать как минимум 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().
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);
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.
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).
//+------------------------------------------------------------------+ //| 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.
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.
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)); }
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.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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