Discusión sobre el artículo "R cuadrado como evaluación de la calidad de la curva del balance de la estrategia"
Именно поэтому количество сделок должно быть достаточно большим. Но что подразумевать под достаточностью? Принято считать, что любая выборка должна содержать как минимум 37 измерений. Это магическое число в статистике, именно оно является нижней границей репрезентативности параметра. Конечно, для оценки торговой системы этого количества сделок недостаточно. Для надежного результата желательно совершить не менее 100 — 150 сделок. Более того, для многих профессиональных трейдеров и этого недостаточно. Они проектируют системы, совершающие не менее 500-1000 сделок, и уже потом, на основании этих результатов, рассматривают возможность запуска системы на реальных торгах...
¡Oh! Siempre pensé que era 100. Gracias, interesante artículo.
Por lo tanto, es seguro decir que el coeficiente R-cuadrado de determinación es una adición importante al conjunto existente de MetaTrader 5 métricas de prueba. Le permite evaluar la suavidad de la curva de la línea de equilibrio de una estrategia, que es una métrica no trivial en sí misma. R-cuadrado es fácil de usar: su rango de valores es fijo y va de -1,0 a +1,0, señalando una tendencia negativa del balance de la estrategia (valores cercanos a -1,0), ninguna tendencia (valores cercanos a 0,0) y una tendencia positiva (valores que tienden a +1,0). Debido a todas estas propiedades, fiabilidad y simplicidad, R-cuadrado puede ser recomendado para su uso en la construcción de un sistema de comercio rentable.
¡Vaya! Siempre pensé que Ryx - Coeficiente de Determinación - se utiliza para evaluar la calidad de la regresión lineal. El coeficiente dedeterminaciónpara unmodelocon unaconstantetomavaloresde0a1.
También es habitual realizar pruebas de significación sobre el coeficiente de regresión. Incluso Alglib las tiene :-)
PearsonCorrelationSignificance(), SpearmanRankCorrelationSignificance().
¿Qué significa?
Hay una métrica estadística especial en el informe de la terminal MetaTrader. Se llama Correlación LR y muestra la correlación entre la línea de equilibrio y la regresión lineal encontrada para esta línea.
La forma de calcular el coeficiente de determinación R^2 es similar a la forma de calcular la Correlación LR. Pero el número final se eleva adicionalmente al cuadrado.
El número que más nos interesa aquí es R-cuadrado o R-cuadrado. Esta métrica muestra un valor de 0,5903. Por lo tanto, la regresión lineal explica el 59,03% de todos los valores y el 41% restante queda sin explicar.
De las citas anteriores se deduce que R^2 = LR^2. Así pues, el criterio para encontrar una función lineal llamada "Regresión lineal" es el MNC de las varianzas o, lo que es lo mismo, maximizar el valor absoluto del RQ de Pearson, que es MathAbs(LR). Y maximizar MathAbs (LR) es lo mismo que maximizar R^2, ya que MathAbs(LR) = MathSqrt(R^2).
Total tenemos que la regresión lineal se encuentra por el criterio de maximización MathAbs(R)^n, donde n es cualquier número positivo.
Bueno, entonces ¿qué sentido tiene hablar de 59,03% de todos los valores explicados por LR, cuando se puede, por ejemplo, en n = 1 obtener 76,8%, y en n = 4 - 34,8%?
Afirmación errónea
R^2 no es más que la correlación entre un gráfico y su modelo lineal
//-- Encuentra R^2 y su signo double r2 = MathPow(corr, 2.0);
Los gráficos de las distribuciones LR Correlation y R^2 para los 10.000 ejemplos independientes que se presentan en el artículo muestran que R^2 != LR^2.
Lo sorprendente es que por una simple acción matemática (segundo grado) hemos eliminado completamente los efectos marginales indeseables de la distribución.
¿Por qué usar Excel para esto, cuando todo está ordenado en el propio Comprobador?
| Недостатки | Решение |
|---|---|
| Применим исключительно для оценки линейных процессов, или систем, торгующих фиксированным лотом. | Не применять для торговых систем, использующих систему капитализации (мани-менеджемент). |
La equidad para el cálculo de R^2 no debe contarse como EquidadCuenta ( == SaldoCuenta + Suma( Ganancia [i])), sino como Suma(Ganancia[i] / Lotes[i]) (para TS de un carácter).
//+------------------------------------------------------------------+ //| Devuelve la puntuación R^2 calculada en base a la equidad de la estrategia || //| Los valores de equidad se pasan como un array de equidad | //+------------------------------------------------------------------+ double CustomR2Equity(double& equity[], ENUM_CORR_TYPE corr_type = CORR_PEARSON) { int total = ArraySize(equity); if(total == 0) return 0.0; //-- Rellenar la matriz Y - valor de equidad, X - número ordinal del valor CMatrixDouble xy(total, 2); for(int i = 0; i < total; i++) { xy[i].Set(0, i); xy[i].Set(1, equity[i]); } //-- Halla los coeficientes a y b del modelo lineal y = a*x + b; int retcode = 0; double a, b; CLinReg::LRLine(xy, total, retcode, a, b); //-- Generar valores de regresión lineal para cada X; double estimate[]; ArrayResize(estimate, total); for(int x = 0; x < total; x++) estimate[x] = x*a+b; //-- Hallar el coeficiente de correlación de los valores con su regresión lineal double corr = 0.0; if(corr_type == CORR_PEARSON) corr = CAlglib::PearsonCorr2(equity, estimate); else corr = CAlglib::SpearmanCorr2(equity, estimate); //-- Encuentra R^2 y su signo double r2 = MathPow(corr, 2.0); int sign = 1; if(equity[0] > equity[total-1]) sign = -1; r2 *= sign; //-- Devuelve la estimación normalizada de R^2, con precisión de centésimas return NormalizeDouble(r2,2); }
Es universal - es adecuado para cualquier doble matrices (no sólo la equidad).
Cuando se mira a todos los demás MQL-códigos, usted no entiende por qué se dan, porque no son legibles en absoluto sin el conocimiento de CStrategy.
Gracias al autor por el artículo, me hizo pensar.
ZY Las líneas resaltadas en amarillo en el código fuente son controvertidas.
Muy interesante, gracias. Nunca pensé en el hecho de que las métricas de los probadores están distorsionadas por la captialización, por lo que la optimización será menos eficiente que con volumen fijo. Y R^2 es, por supuesto, muy útil, me pregunto si va a acelerar el proceso de optimización en comparación con el factor de beneficio + saldo máximo, por ejemplo.
De todos los fuentes MQL en el artículo, sólo uno es útil
Estoy de acuerdo con eso, todo el resto tendrá que ser arrancado de clases para añadirlo a tu sistema... sería mejor tenerlo todo en fs separados o en un includnik separado.
La equidad para el cálculo de R^2 debe calcularse no como EquidadCuenta ( == SaldoCuenta + Suma(Beneficio[i])), sino como Suma(Beneficio[i] / Lotes[i]) (para TS de un solo carácter).
Código para calcular la "equidad" adecuado para R^2. Está escrito en estilo MT4, no es difícil traducirlo a MT5...
// Cálculo del capital propio sin MM (variante para TS de un solo carácter) class EQUITY { protected: int PrevHistoryTotal; double Balance; double PrevEquity; // Añadir un elemento al final de un array arbitrario 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()); // a veces conviene ignorar la comisión y el canje } 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 "equity" adecuado para R^2. Escrito en estilo MT4, no es difícil traducirlo a MT5....
Uso
Genial, puedes simplemente llamarlo en cada nueva barra, para que el sistema no se cargue con un temporizador. Para sistemas con control de nueva barra.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado R cuadrado como evaluación de la calidad de la curva del balance de la estrategia:
En este artículo se describe cómo construir el criterio personalizado de la optimización de R². Usando este criterio se puede evaluar la calidad de la curva del balance de la estrategia y eligir las estrategias más estables y crecientes regularmente. Se describen los principios de su construcción, así como los métodos estadísticos que se usan para evaluar las propiedades y la calidad de esta métrica.
A la regresión lineal la llaman a la dependencia lineal de una variable y de otra variable independiente x, expresada con la fórmula y = ax+b. En esta fórmula, а es el multiplicador, b es el coeficiente del desplazamiento. En realidad, puede haber varias variables independientes, este modelo regresivo se llama multiregresivo. No obstante, nosotros vamos a analizar sólo el caso más simple.
La dependencia lineal puede ser representada en forma de un gráfico simple. Vamos a coger el gráfico del día EURUSD de 2017.06.21 a 2017.09.21. Esta sección no ha sido elegida por casualidad: precisamente durante este período en este par se observaba una moderada tendencia alcista. Ejemplo en MetaTrader:
Fig. 11. Dinámica de precio de EURUSD de 21.06.2017 a 21.08.2017, timeframe D1
Autor: Vasiliy Sokolov