Aprendizaje automático en el trading: teoría, práctica, operaciones y más - página 198

 
Dr.Trader:

He encontrado otro error en R. R no divide por 0 correctamente.

Este es el guión:

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#property script_show_inputs

input double div = 0.0;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Print(1.0/div);
  }
//+------------------------------------------------------------------+

La respuesta correcta, en mql es.
división cero en 'test.mq5' (20,13)
con
el script parado

No patentado, en R:
> 1/0
Inf
con
la continuación del guión

Me refiero a lo mismo que Alexey - el comportamiento de los programas en condiciones indefinidas puede ser diferente, y no es un error. Tal y como se supone que es la arquitectura, así será el resultado.


Te equivocas al decir que "no es la respuesta correcta".

La respuesta en R es absolutamente correcta y muy conveniente. La cuestión es que R lleva el concepto de "valor de la variable" a su conclusión lógica y tiene tres valores específicos para la variable: NA (hay un valor, pero no se conoce), NaN (sin valor numérico) e Inf - infinito. Este es un valor y es totalmente erróneo interrumpir el trabajo del programa. Si se tienen en cuenta las limitaciones del ordenador en cuanto a la precisión real, Inf puede tener un valor finito. Y es muy natural seguir trabajando y un programa bien escrito debería comprobar esos resultados si se suponen.

Por ejemplo, la documentación de MQL da un ejemplo sobre arcoseno y afirma que arcoseno(2) = infinito. Esto no es exacto. Precisamente: arcsinus(2) = NaN, es decir, no hay valor numérico, arcsinus(1) = Inf, pero las cotizaciones que faltan durante la negociación = NA, es decir, deberían estar (o podrían estar en el fin de semana) y no lo están.

 
Alexey Burnakov:

Lo que dice Wolfram 0 no es la verdad final. Quiero decir que la palabra "error" en la redacción es redundante...

Aquí no se trata de Wolfram. La integral de los valores positivos no nulos no puede ser cero.

Las comprobaciones también han revelado errores en los algoritmos.

Por ejemplo, para la distribución t no central los cuantiles no se convierten:


> n <- 10> k <- seq(0,1,by=1/n)> nt_pdf<-dt(k, 10,8, log = FALSE)> nt_cdf<-pt(k, 10,8, log = FALSE)> nt_quantile<-qt(nt_cdf, 10,8, log = FALSE)> nt_pdf [1] 4.927733e-15 1,130226e-14 2,641608e-14 6,281015e-14 1,516342e-13 3,708688e-13 9,166299e-13 [8] 2,283319e-12 5,716198e-12 1,433893e-11 3,593699e-11> nt_cdf [1] 6,220961e-16 1.388760e-15 3,166372e-15 7,362630e-15 1,742915e-14 4,191776e-14 1,021850e-13 [8] 2,518433e-13 6,257956e-13 1,563360e-12 3,914610e-12> k [1] 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1.0> nt_quantile [1] -Inf -1.340781e+154 -1.340781e+154 -1.340781e+154 -1.340781e+154 [7] -1.340781e+154 7.000000e-01 8 .000000e-01 9.000000e-01 1.000000e+154


Aquí los cuantiles 0-0,6 se calculan incorrectamente.

Un ejemplo de un cálculo similar en MQL5:

2016.11.10 17:53:32.645 TestStatNCT (EURUSD,H1) Pruebas unitarias para el paquete Stat
2016.11.10 17:53:32.645 TestStatNCT (EURUSD,H1)
2016.11.10 17:53:32.645 TestStatNCT (EURUSD,H1) Se ha iniciado la prueba de distribución T no central
2016.11.10 17:53:32.645 TestStatNCT (EURUSD,H1) Prueba de distribución T no central: Prueba 1: Cálculos para valores individuales
2016.11.10 17:53:53:32.645 TestStatNCT (EURUSD,H1) 1 0, PDF=4.92773299108629100851e-15, CDF=6.23274905782904190070e-16, Q=1.51119154775858715131e-18,
2016.11.10 17:53:32.646 TestStatNCT (EURUSD,H1) 1 1, PDF=1,130226163094897516453e-14, CDF=1,38993895779573769266e-15, Q=9,999999999989369615e-02,
2016.11.10 17:53:32.647 TestStatNCT (EURUSD,H1) 1 2, PDF=2.64161256619123119969e-14, CDF=3.16755115913693189175e-15, Q=2.0000000000004840572e-01,
2016.11.10 17:53:32.648 TestStatNCT (EURUSD,H1) 1 3, PDF=6.28106243570810575054e-14, CDF=7.36381790305861902898e-15, Q=2.9999999998601119e-01
2016.11.10 17:53:32.648 TestStatNCT (EURUSD,H1) 1 4, PDF=1.51636983962646374250e-13, CDF=1.7430393590907449069191e-14, Q=4.0000000005184742e-01
2016.11.10 17:53:32.648 TestStatNCT (EURUSD,H1) 1 5, PDF=3.70864175555731463525e-13, CDF=4.19192812277470617962e-14, Q=5.0000000000000000e-01,
2016.11.10 17:53:32.649 TestStatNCT (EURUSD,H1) 1 6, PDF=9.16615229573755101565e-13, CDF=1.021877277044947465e-13, Q=5.9999999998867573e-01,
2016.11.10 17:53:32.651 TestStatNCT (EURUSD,H1) 1 7, PDF=2.28327725393015114329e-12, CDF=2.51850847368662607692e-13, Q=6.999999999999289457e-01,
2016.11.10 17:53:32.652 TestStatNCT (EURUSD,H1) 1 8, PDF=5.71609303970751591223e-12, CDF=6.258214361289428232e-13, Q=7.999999999999299967253e-01,
2016.11.10 17:53:32.653 TestStatNCT (EURUSD,H1) 1 9, PDF=1.43395037240077606742e-11, CDF=1.56338059375202603523e-12, Q=8.999999999998578915e-01,
2016.11.10 17:53:32.655 TestStatNCT (EURUSD,H1) 1 10, PDF=3.59391445912256345050e-11, CDF=3.91468724033560601170e-12, Q=9.9999999998889777e-01,
2016.11.10 17:53:32.655 TestStatNCT (EURUSD,H1) Prueba de distribución T no central: Prueba 2: Cálculos en matrices
2016.11.10 17:53:53:32.665 TestStatNCT (EURUSD,H1) 2 0, PDF=4.92773299108629100851e-15, CDF=6.23274905782904190070e-16, Q=1.51119154775858715131e-18,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 1, PDF=1,130226163094897516453e-14, CDF=1,38993895779573769266e-15, Q=9,999999999989369615e-02,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 2, PDF=2.64161256619123119969e-14, CDF=3.16755115913693189175e-15, Q=2.0000000000004840572e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 3, PDF=6.28106243570810575054e-14, CDF=7.36381790305861902898e-15, Q=2.9999999998601119e-01
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 4, PDF=1.51636983962646374250e-13, CDF=1.7430393590907449069191e-14, Q=4.0000000005184742e-01
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 5, PDF=3.70864175555731463525e-13, CDF=4.19192812277470617962e-14, Q=5.0000000000000000e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 6, PDF=9.16615229573755101565e-13, CDF=1.021877277044947465e-13, Q=5.9999999998867573e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 7, PDF=2.28327725393015114329e-12, CDF=2.51850847368662607692e-13, Q=6.999999999999289457e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 8, PDF=5.71609303970751591223e-12, CDF=6.258214361289428232e-13, Q=7.999999999999299967253e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 9, PDF=1.43395037240077606742e-11, CDF=1.56338059375202603523e-12, Q=8.999999999998578915e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 10, PDF=3.59391445912256345050e-11, CDF=3.91468724033560601170e-12, Q=9.9999999998889777e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) Prueba de distribución T no central: Prueba 3: funciones sobrecargadas tipo R
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 0, PDF=-3,29438973521509552711e+01, CDF=-3,50115439911437320575e+01, Q=9,32008491370933962264e-15,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 1, PDF=-3.211377354488684684779e+01, CDF=-3.42095165639872504926e+01, Q=9.999999999992561506e-02
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 2, PDF=-3.12648017507063613607e+01, CDF=-3.33858176105613679852e+01, Q=2.0000000004563017e-01
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 3, PDF=-3,03986521580849320401e+01, CDF=-3,25421978598387227066e+01, Q=2,999999999998490097e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 4, PDF=-2.95172869939179705057e+01, CDF=-3.16805609544090991392e+01, Q=4.00000000005240253e-01
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 5, PDF=-2,86229405029589081266e+01, CDF=-3,080305013295588878e+01, Q=5,0000000000000000e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 6, PDF=-2.77180886076848480570e+01, CDF=-2.99119647118446110312e+01, Q=5.999999999998756550e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 7, PDF=-2.680540931294946693489897e+01, CDF=-2.90099393581479034765e+01, Q=6.999999999999400480e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 8, PDF=-2.58877355789277032727e+01, CDF=-2.80997113402901490531e+01, Q=7.9999999999489297e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 9, PDF=-2.49680028891657173062e+01, CDF=-2.71841705920503962091e+01, Q=8.999999999998689937e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 10, PDF=-2.404919403587959979193e+01, CDF=-2.62662856772029869035e+01, Q=9.9999999998889777e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) Prueba de distribución T no central: Prueba 4: Generadores de valores aleatorios
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Prueba de distribución T no central superada
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Prueba de distribución T no central: PDF error máximo : 1.48634016318122160328e-25
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Prueba de distribución T no central: error máximo de CDF : 2.7596643939222108e-18
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Prueba de distribución T no central: Error máximo del cuantil : 5.16253706450697791297e-15
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Prueba de distribución T no central: PDF dígitos correctos : 24
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Prueba de distribución T no central: Dígitos correctos CDF : 17
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Prueba de distribución T no central: Dígitos correctos del cuantil : 14
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1)
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) 1 de 1 aprobado

Resultado del script TestStatNCT.mq5 (prueba de TestStat.mq5, salida añadida de los valores calculados en la función TestNoncentralTDistribution)

Como se puede ver, se abordan los cuantiles y se superan las pruebas.

En cuanto a los errores, son los siguientes:

//--- precision
double calc_precision_pdf=10 E-15;
double calc_precision_cdf=10 E-15;
double calc_precision_quantile=10 E-14;

En Denise Benton, K. Krishnamoorthy, "Computing discrete mixtures of continuous distributions: noncentral chisquare, noncentral t and the distribution of the square of the sample multiple correlation coefficient", se demostró que el algoritmo AS 243 tiene errores:


Así que hay errores en R y su causa probable está en el algoritmo AS 243, que se utiliza en el cálculo de la CDF.

Archivos adjuntos:
TestStatNCT.mq5  16 kb
 
Quantum:

1)No se trata de Wolfram. La integral de valores positivos no nulos no puede ser cero.

2)También hubo errores en los algoritmos durante las pruebas.

3)Por ejemplo, para una distribución t no central los cuantiles no son reversibles:


1 - Si tú también escribes sobre un error respecto a la distribución gamma, entonces te dirijo mi reclamación. Es incorrecto decir que en R es con error. Veo un intento de etiquetado en este post. Por lo visto, no has consultado a los estudiosos que utilizan paquetes y no ven ningún error en ellos. La función en Python también produce 1 densidad en cero.

Una vez más. El valor de la densidad no está definido en cero. Wolfram piensa que es 0 y tú simplemente estás de acuerdo con eso sin hacer ninguna deducción independiente.

Dices que el tungsteno no tiene nada que ver, pero no puedes responder a mi pregunta sobre llevar el cero a la potencia de cero. En lugar de eso, me muestras el tungsteno...

Tú mismo ves que en la aproximación correcta el valor va a la unidad, lo que significa que la integral en la aproximación tampoco es cero. Y no está en cero, como tampoco lo está la densidad, ya que no tiene sentido integrar un valor indeterminado.

2 - Esto se puede seguir comprobando y establecer un error en el algoritmo, por ejemplo.

3)Por ejemplo, se puede comprobar.

 
Quantum:


Por ejemplo, para la distribución t no central los cuantiles no se invierten:


Los cuantiles 0-0,6 no se calculan correctamente aquí.

> n <- 10> k <- seq(0,1,by=1/n)> nt_pdf<-dt(k, 10,8, log = FALSE)> nt_cdf<-pt(k, 10,8, log = FALSE)> quantile<-qt(nt_cdf, 10,8, log = FALSE)> nt_pdf [1] 4.927733e-15 1,130226e-14 2,641608e-14 6,281015e-14 1,516342e-13 3,708688e-13 9,166299e-13 [8] 2,283319e-12 5,716198e-12 1,433893e-11 3,593699e-11> nt_cdf [1] 6,220961e-16 1.388760e-15 3,166372e-15 7,362630e-15 1,742915e-14 4,191776e-14 1,021850e-13 [8] 2,518433e-13 6,257956e-13 1,563360e-12 3,914610e-12> k [1] 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1.0> nt_quantile [1] -Inf -1.340781e+154 -1.340781e+154-1.340781e+154 -1.340781e+154 [7] -1.340781e+154 7 .000000e-01 8.000000e-01 9.000000e-01
Perdona, ¿en qué parte de tu código se inicializa la variable nt_quantile? es decir, ¿de dónde sale?
 

1) ¿Cómo se explica que en un punto cdf=0, mientras que el pdf es distinto de cero?

> n <- 5> k <- seq(0,1,by=1/n)> gamma_pdf<-dgamma(k, 1,1, log =FALSE) > gamma_cdf<-pgamma(k, 1,1, log = FALSE)> k[1] 0,0 0,2 0,4 0.6 0.8 1.0> gamma_pdf[1] 1.00 00000 0.8187308 0.6703200 0.5488116 0.4493290 0.3678794> gamma_cdf[1] 0.0000000 0.1812692 0.3296800 0.4511884 0.5506710 0.6321206

2) ¿Cómo se explica que los cuantiles no coincidan con los originales?

> n <- 10> k <- seq(0,1,by=1/n)> nt_pdf<-dt(k, 10,8, log = FALSE)> nt_cdf<-pt(k, 10,8, log = FALSE)> nt_quantile<-qt(nt_cdf, 10,8, log = FALSE)> nt_pdf [1] 4.927733e-15 1,130226e-14 2,641608e-14 6,281015e-14 1,516342e-13 3,708688e-13 9,166299e-13 [8] 2,283319e-12 5,716198e-12 1,433893e-11 3,593699e-11> nt_cdf [1] 6,220961e-16 1.388760e-15 3,166372e-15 7,362630e-15 1,742915e-14 4,191776e-14 1,021850e-13 [8] 2,518433e-13 6,257956e-13 1,563360e-12 3,914610e-12> k [1] 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1.0> nt_quantile [1] -Inf -1.340781e+154 -1.340781e+154 -1.340781e+154 -1.340781e+154 [7] -1.340781e+154 7.000000e-01 8.000000e-01 9.000000e-01
 
Alexey Burnakov:
Perdona, ¿en qué parte de tu código se inicializa la variable nt_quantile? es decir, ¿de dónde sale?

Lo siento, había una errata en el guión, lo he corregido.

El guión es así:

> n <- 10> k <- seq(0,1,by=1/n)> nt_pdf<-dt(k, 10,8, log = FALSE)> nt_cdf<-pt(k, 10,8, log = FALSE)> nt_quantile<-qt(nt_cdf, 10,8, log = FALSE)> nt_pdf [1] 4.927733e-15 1,130226e-14 2,641608e-14 6,281015e-14 1,516342e-13 3,708688e-13 9,166299e-13 [8] 2,283319e-12 5,716198e-12 1,433893e-11 3,593699e-11> nt_cdf [1] 6,220961e-16 1.388760e-15 3,166372e-15 7,362630e-15 1,742915e-14 4,191776e-14 1,021850e-13 [8] 2,518433e-13 6,257956e-13 1,563360e-12 3,914610e-12> k [1] 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1.0> nt_quantile [1] -Inf -1.340781e+154 -1.340781e+154 -1.340781e+154 -1.340781e+154 -1.340781e+154 [7] -1.340781e+154 7.000000e-01 8.000000e-01 9.000000e-01
 
Quantum:

1) ¿Cómo podemos explicar que en el punto cdf=0, mientras que el pdf es distinto de cero?

2) ¿Cómo se explica que los cuantiles no sean los mismos que los originales?

Lo pensaré y te responderé. ¿Siempre responde a una pregunta con una pregunta? ¿Dónde están sus propios pensamientos estadísticos?
 
Alexey Burnakov:

La cuestión es que @Quantum se ocupa exclusivamente de la implementación y verificación completa del análogo de R de las bibliotecas matemáticas en MQL5.

Este no es el razonamiento de un teórico. Y profundiza en la escritura de las pruebas unitarias que proporcionan la garantía de que la biblioteca es correcta.


No hay que asumir a priori que todo es correcto en R. Por el contrario, yo diría que aunque haya una implementación de las funciones en C++, todo es bastante primitivo. Y en términos de velocidad, se puede ver que la biblioteca MQL5 en el código fuente en nuestro compilador gana por 3 veces en promedio.

Nos hemos tomado la molestia de comprobarlo todo y hemos encontrado errores evidentes. Estos errores han sido confirmados:

El algoritmo AS 243 propuesto por Lenth [Lenth, R.V., "Cumulative distribution function of the noncentral t distribution", Applied Statistics, vol. 38 (1989), 185-189]. La ventaja de este método es el rápido cálculo de recurrencia de términos de series infinitas con funciones beta incompletas. Pero en el artículo [D. Benton, K. Krishnamoorthy, "Computing discrete mixtures of continuous distributions: noncentral chisquare, noncentral t and the distribution of the square of the sample multiple correlation coefficient", Computational Statistics & Data Analysis, 43, (2003), 249-267], se demostró, que este algoritmo conduce a errores debido al error de evaluación de la precisión al sumar los términos de las series, especialmente para grandes valores del parámetro delta no central. Los autores del trabajo propusieron un algoritmo corregido para el cálculo basado en la recurrencia de la probabilidad de distribución T no central.

Utilizamos en la biblioteca estadística MQL5 el algoritmo correcto para el cálculo de probabilidades del artículo [D. Benton, K. Krishnamoorthy, "Computing discrete mixtures of continuous distributions: noncentral chisquare, noncentral t and the distribution of the sample multiple correlation coefficient", Computational Statistics & Data Analysis, 43, (2003), 249-267]. que da resultados exactos.

Para garantizar la exactitud de los cálculos y permitir que los desarrolladores de terceros comprueben la calidad de la biblioteca, hemos incluido varios scripts de pruebas unitarias en la entrega. Puede encontrarlos en /Scripts/UnitTests/Stat.

Echa un vistazo a las fechas de publicación, por favor. Verás cómo se va trabajando con los consejos de los científicos.

Además, sería un error no considerar a @Quantum un científico.

 

Comenta entonces, por orden de literalidad, cómo para una distribución continua uniforme la densidad en el punto extremo es positiva y la integral es cero: https://en.wikipedia.org/wiki/Uniform_distribution_(continuo)

 
Renat Fatkhullin:

La cuestión es que @Quantum se ocupa exclusivamente de la implementación y validación completa del análogo de R de las bibliotecas matemáticas en MQL5.

Este no es el razonamiento de un teórico. Y profundiza en la escritura de las pruebas unitarias que proporcionan la garantía de que la biblioteca es correcta.


No hay que asumir a priori que todo es correcto en R. Por el contrario, yo diría que aunque haya una implementación de las funciones en C++, todo es bastante primitivo. Y en términos de velocidad, se puede ver que la biblioteca MQL5 en el código fuente en nuestro compilador gana por 3 veces en promedio.

Nos hemos tomado la molestia de comprobarlo todo y hemos encontrado errores evidentes. Estos errores han sido confirmados:

Mira las fechas de las publicaciones, por favor. Verás cómo el trabajo se desarrolla con el asesoramiento de los científicos.

Además, sería un error no considerar a @Quantum un científico.

No he dicho nada sobre este error. Hay tanto que hay tanto que hay.

Sobre la distribución gamma - eso es lo que entendí que hacía con su implementación. Y reitero que su afirmación al respecto es pura literalidad.

Razón de la queja: