Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 198

 
Dr. Trader:

Encontrei outro erro no R. R não se divide por 0 corretamente.

Aqui está o roteiro:

//+------------------------------------------------------------------+
//|                                                         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);
  }
//+------------------------------------------------------------------+

A resposta correcta, em mql é.
divisão zero em 'test.mq5' (20,13)
com
o script parado

Não-proprietário, em R:
> 1/0
Inf
com a
continuação do roteiro

Quero dizer a mesma coisa que Alexey - o comportamento de programas sob condições indefinidas pode ser diferente, e não é um erro. Do jeito que a arquitetura deve ser, é assim que o resultado será.


Estás errado sobre "não é a resposta certa".

A resposta em R é absolutamente correta e muito conveniente. A questão é que R leva o conceito de "valor variável" à sua conclusão lógica e tem três valores específicos para a variável: NA (existe um valor, mas não é conhecido), NaN (sem valor numérico) e Inf - infinito. Este é um valor tão grande e é completamente errado interromper o trabalho do programa. Se você levar em conta as limitações do computador na precisão real, o Inf pode muito bem ter um valor finito. E é bastante natural continuar a trabalhar e um programa bem escrito deve verificar esses resultados se eles forem assumidos.

Por exemplo, a documentação MQL dá um exemplo em arcsine e afirma que arcsine(2) = infinito. Isto não é exacto. Precisamente: arcsinus(2) = NaN, ou seja, sem valor numérico, arcsinus(1) = Inf, mas faltando citações durante a negociação = NA, ou seja, deve ser (ou pode ser no fim de semana) e não é.

 
Alexey Burnakov:

O que a Wolfram diz 0 não é a verdade final. Quero dizer que a palavra "erro" no texto é redundante...

Não se trata aqui da Wolfram. O integral dos valores positivos não zeros não pode ser zero.

As verificações também revelaram erros nos algoritmos.

Por exemplo, para a distribuição não central em t, os quantis não se convertem:


> n <- 10> k <- seq(0,1,by=1/n)> nt_pdf<-dt(k, 10,8, log = FALSO)> 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


Aqui os quantis 0-0,6 são calculados incorretamente.

Um exemplo de um cálculo semelhante em MQL5:

2016.11.10 17:53:32.645 TestStatNCT (EURUSD,H1) Testes unitários para o pacote Stat
2016.11.10 17:53:32.645 TestStatNCT (EURUSD,H1)
2016.11.10 17:53:32.645 TestStatNCT (EURUSD,H1) Teste de distribuição T não central iniciado
2016.11.10 17:53:32.645 TestStatNCT (EURUSD,H1) Teste de distribuição T não central: Teste 1: Cálculos para valores individuais
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 1, PDF=1.130226163094897516453e-14, CDF=1.3899389577777373769266e-15, Q=9.999999999999999989369615e-02,
2016.11.10 17:53:32.647 TestStatNCT (EURUSD,H1) 1 2, PDF=2,64161256619123119969e-14, CDF=3,16755115913693189175e-15, Q=2,00000000000000004840572e-01,
2016.11.10 17:53:32.648 TestStatNCT (EURUSD,H1) 1 3, PDF=6.28106243570810575054e-14, CDF=7.3638179090305861902898e-15, Q=2.99999999999999999998601119e-01
2016.11.10 17:53:32.648 TestStatNCT (EURUSD,H1) 1 4, PDF=1,5163698393962646374250e-13, CDF=1,743039359090744906969191e-14, Q=4,00000000000005184742e-01
2016.11.10 17:53:32.648 TestStatNCT (EURUSD,H1) 1 5, PDF=3.70864175555731463525e-13, CDF=4.19192812277470617962e-14, Q=5.00000000000000000000e-01,
2016.11.10 17:53:32.649 TestStatNCT (EURUSD,H1) 1 6, PDF=9.16615229573755101565e-13, CDF=1.0218773727704494747465e-13, Q=5.999999999999999998867573e-01,
2016.11.10 17:53:32.651 TestStatNCT (EURUSD,H1) 1 7, PDF=2,28327725393015114329e-12, CDF=2,51850847368662607692e-13, Q=6,99999999999999999999289457e-01,
2016.11.10 17:53:32.652 TestStatNCT (EURUSD,H1) 1 8, PDF=5.7160930393970751591223e-12, CDF=6.25821417361289428232e-13, Q=7.999999999999999999299967253e-01,
2016.11.10 17:53:32.653 TestStatNCT (EURUSD,H1) 1 9, PDF=1.43395037240077606742e-11, CDF=1.56338059375202603523e-12, Q=8.9999999999999999999998578915e-01,
2016.11.10 17:53:32.655 TestStatNCT (EURUSD,H1) 1 10, PDF=3.59391445912256345050e-11, CDF=3.91468724033560601170e-12, Q=9.999999999999999998889777e-01,
2016.11.10 17:53:32.655 TestStatNCT (EURUSD,H1) Teste de distribuição T não central: Teste 2: Cálculos em arrays
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.3899389577777373769266e-15, Q=9.999999999999999989369615e-02,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 2, PDF=2,64161256619123119969e-14, CDF=3,16755115913693189175e-15, Q=2,00000000000000004840572e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 3, PDF=6.28106243570810575054e-14, CDF=7.3638179090305861902898e-15, Q=2.99999999999999999998601119e-01
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 4, PDF=1,5163698393962646374250e-13, CDF=1,743039359090744906969191e-14, Q=4,00000000000005184742e-01
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 5, PDF=3.70864175555731463525e-13, CDF=4.19192812277470617962e-14, Q=5.00000000000000000000e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 6, PDF=9.16615229573755101565e-13, CDF=1.0218773727704494747465e-13, Q=5.999999999999999998867573e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 7, PDF=2,28327725393015114329e-12, CDF=2,51850847368662607692e-13, Q=6,99999999999999999999289457e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 8, PDF=5.7160930393970751591223e-12, CDF=6.25821417361289428232e-13, Q=7.999999999999999999299967253e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 9, PDF=1.43395037240077606742e-11, CDF=1.56338059375202603523e-12, Q=8.9999999999999999999998578915e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 10, PDF=3.59391445912256345050e-11, CDF=3.91468724033560601170e-12, Q=9.999999999999999998889777e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) Teste de distribuição T não central: Teste 3: Funções sobrecarregadas do 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.21137735448868468468468779e+01, CDF=-3.42095165639872504926e+01, Q=9.99999999999999999992561506e-02
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 2, PDF=-3.12648017507063613607e+01, CDF=-3.33858176105613679852e+01, Q=2.00000000000004563017e-01
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 3, PDF=-3.03986521580849320401e+01, CDF=-3.25421978598387227066e+01, Q=2.99999999999999999998490097e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 4, PDF=-2.95172869939179705057e+01, CDF=-3.16805609544090991392e+01, Q=4.00000000000005240253e-01
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 5, PDF=-2.862294050295890812866e+01, CDF=-3.08030305013295588878e+01, Q=5.00000000000000000000e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 6, PDF=-2.77180886076848480570e+01, CDF=-2.99119647118446110312e+01, Q=5.9999999999999999999875656550e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 7, PDF=-2.680540931294946693489897e+01, CDF=-2.90099393581479034765e+01, Q=6.999999999999999999999999400480e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 8, PDF=-2.58877355789277032727e+01, CDF=-2.80997113402901490531e+01, Q=7.99999999999999999999489297e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 9, PDF=-2.49680028891657173062e+01, CDF=-2.71841705920503962091e+01, Q=8.99999999999999999998689937e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 10, PDF=-2,4049194035879597997979193e+01, CDF=-2,62662856772029869035e+01, Q=9,99999999999999999998889777e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) Teste de distribuição T não central: Teste 4: Geradores de valores aleatórios
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Teste de distribuição T não central aprovado
2016.11.10 17:53:32.683 TesteStatNCT (EURUSD,H1) Teste de distribuição T não central: PDF erro máximo : 1.4863401631818122160328e-25
2016.11.10 17:53:32.683 TesteStatNCT (EURUSD,H1) Teste de distribuição T não central: CDF erro máximo : 2,759664393739223922392108e-18
2016.11.10 17:53:32.683 TesteStatNCT (EURUSD,H1) Teste de distribuição T não central: Quantidade máxima de erro : 5.16253706450697791297e-15
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Teste de distribuição T não central: Dígitos correctos em PDF : 24
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Teste de distribuição T não central: Dígitos correctos do CDF : 17
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Teste de distribuição T não central: Quantidade de dígitos corretos : 14
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1)
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) 1 de 1 passou

Resultado do script TestStatNCT.mq5 (teste do TestStat.mq5, saída adicionada dos valores calculados na função TestNoncentralTDistribution)

Como se pode ver, os quantis são abordados e os testes são aprovados.

Quanto aos erros, eles são os seguintes:

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

Em 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", foi mostrado que o algoritmo AS 243 tem erros:


Portanto, há erros em R e a sua causa provável está no algoritmo AS 243, que é utilizado no cálculo do CDF.

Arquivos anexados:
TestStatNCT.mq5  16 kb
 
Quantum:

1)Isto não é sobre a Wolfram. O integral dos valores positivos não zeros não pode ser zero.

2) Também houve erros nos algoritmos durante os testes.

3) Por exemplo, para uma distribuição t não central, os quantis não são reversíveis:


1 - Se você também escrever sobre um erro relativo à distribuição gama, então eu lhe dirijo a minha reclamação. É incorreto dizer que em R é com erro. Vejo algumas tentativas de etiquetagem neste posto. Aparentemente você não consultou os estudiosos que usam pacotes e não vê nenhum erro lá. A função em Python também produz 1 densidade em zero.

Mais uma vez. O valor da densidade não é definido a zero. Wolfram pensa que é 0 e você apenas concorda com isso sem fazer nenhuma dedução independente.

Você diz que Tungsten não tem nada a ver com isso, mas não pode responder à minha pergunta sobre levar zero ao poder do zero. Em vez disso, mostra-me tungsténio...

Você mesmo vê que na aproximação certa o valor vai para a unidade, o que significa que o integral na aproximação também não é zero. E não está em zero, nem a densidade, pois não faz sentido integrar uma quantidade indeterminada.

2 - Isto pode ser verificado e um erro no algoritmo pode ser estabelecido, por exemplo.

3)Por exemplo, pode ser verificado.

 
Quantum:


Por exemplo, para a distribuição não central em t, os quantis não são invertidos:


Os quantis 0-0.6 não são computados corretamente aqui.

> n <- 10> k <- seq(0,1,by=1/n)> nt_pdf<-dt(k, 10,8, log = FALSO)> 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
Desculpe, onde em seu código está a variável nt_quantile inicializada? ou seja, de onde ela vem?
 

1) Como podemos explicar que em um ponto cdf=0, enquanto o pdf é diferente de zero?

> n <- 5> k <- seq(0,1,by=1/n)> gamma_pdf<-dgamma(k, 1,1, log = FALSO)> gamma_cdf<-pgamma(k, 1,1, log = FALSO)> k[1] 0,0 0,2 0,4 0.6 0,8 1,0> gamma_pdf[1] 1,0000000 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) Como podemos explicar que os quantiles não coincidiram com os originais?

> n <- 10> k <- seq(0,1,by=1/n)> nt_pdf<-dt(k, 10,8, log = FALSO)> 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:
Desculpe, onde em seu código está a variável nt_quantile inicializada? ou seja, de onde ela vem?

Desculpe, havia uma gralha no guião, corrigi-a.

O guião é assim:

> n <- 10> k <- seq(0,1,by=1/n)> nt_pdf<-dt(k, 10,8, log = FALSO)> 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) Como podemos explicar que no ponto cdf=0, enquanto o pdf não é zero?

2) Como podemos explicar que os quantitativos não são os mesmos que os originais?

Vou pensar no assunto e responder-te. Você sempre responde a uma pergunta com uma pergunta? Onde estão os seus próprios pensamentos estatísticos?
 
Alexey Burnakov:

A questão é que @Quantum está puramente preocupado com a implementação e verificação completa do análogo de R das bibliotecas matemáticas em MQL5.

Este não é o raciocínio de um teórico. E ele está cavando fundo quando escreve testes unitários que dão garantia de que a biblioteca está correta.


Não se deve assumir a priori que tudo está correto em R. Pelo contrário, eu diria que mesmo que haja uma implementação em C++ das funções lá, tudo é bastante primitivo. E em termos de velocidade, você pode ver que a biblioteca MQL5 no código fonte do nosso compilador vence por 3 vezes em média.

Demos-nos ao trabalho de verificar tudo de novo e encontrámos erros óbvios. Estes erros foram confirmados:

O algoritmo AS 243 proposto por Lenth [Lenth, R.V., "Função de distribuição cumulativa da distribuição t não central ", Applied Statistics, vol. 38 (1989), 185-189]. A vantagem deste método é o rápido cálculo de recorrência de termos de séries infinitas com funções beta incompletas. Mas no artigo [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], foi mostrado que este algoritmo leva a erros devido ao erro de avaliação da precisão na soma dos termos das séries, especialmente para grandes valores do parâmetro delta não central. Os autores do trabalho propuseram um algoritmo corrigido para o cálculo da probabilidade não central de distribuição em T com base na recorrência.

Usamos na biblioteca estatística MQL5 o algoritmo correto para o cálculo das probabilidades a partir do artigo [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]. o que dá resultados exactos.

Para garantir a precisão dos cálculos e para permitir que desenvolvedores de terceiros verifiquem a qualidade da biblioteca, incluímos vários scripts de teste de unidade na entrega. Você pode encontrá-los em /Scripts/UnitTests/Stat.

Dê uma olhada nas datas de publicação, por favor. Você vai ver como está indo o trabalho com as dicas dos cientistas.

Além disso, seria um erro não considerar @Quantum um cientista.

 

Comente então, por ordem de literalismo, como para uma distribuição uniforme contínua a densidade no ponto extremo é positiva e a integral é zero: https://en.wikipedia.org/wiki/Uniform_distribution_(contínuo)

 
Renat Fatkhullin:

A questão é que @Quantum está puramente preocupado com a implementação e validação completa do análogo de R das bibliotecas matemáticas em MQL5.

Este não é o raciocínio de um teórico. E ele está cavando fundo quando escreve testes unitários que dão garantia de que a biblioteca está correta.


Não se deve assumir a priori que tudo está correto em R. Pelo contrário, eu diria que mesmo que haja uma implementação em C++ das funções lá, tudo é bastante primitivo. E em termos de velocidade, você pode ver que a biblioteca MQL5 no código fonte do nosso compilador vence por 3 vezes em média.

Demos-nos ao trabalho de verificar tudo de novo e encontrámos erros óbvios. Estes erros foram confirmados:

Veja as datas das publicações, por favor. Você vai ver como o trabalho está indo com o conselho dos cientistas.

Além disso, seria um erro não considerar @Quantum um cientista.

Eu não disse nada sobre este erro. Há sim, há sim, há sim.

Sobre a distribuição gama - foi o que eu entendi que ele estava fazendo com sua implementação. E eu reitero que a sua afirmação sobre isso é puro literalismo.