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

 
Renat Fatkhullin:

Voltemos à declaração original sobre os erros R no artigo.

A nossa opinião ainda se mantém: há erros presentes, e eles foram causados por descuido na implementação.

O seu especialista não me quer responder sobre os méritos. Ele só me espetou com o tungsténio e pronto.

Vou repetir o nosso ponto de vista. Não há erro na distribuição gama. Isto é uma questão de convenção na comunidade matemática. Há uma frase de erro da sua parte que não está correcta.

A derivação de zero para densidade na sua versão é, em primeiro lugar, uma das opções possíveis (convenções). E, em segundo lugar, a essência da análise aplicada a partir da escolha deste valor (nan, 0 ou 1) não afecta nada. As funções de distribuição são usadas para estimar estatísticas. Neste, a distribuição é zero. E isso é suficiente.

Em relação à distribuição t. Reproduzi este erro na última versão do R. mas não cheguei à essência do algoritmo. Eu admito que a correcção era realmente necessária.

Vou tentar fazer uma pergunta à equipa de apoio R.
 

E você entra nele, recalcula tudo, passa algumas semanas a rever como ele fez. Mas em vez disso, ainda nem leu o nosso artigo.

Pela nossa parte, nós fizemos o trabalho. E nós fizemos um bom trabalho. Se a Wolfram não é uma autoridade para você também, então você está perdendo seu tempo com essa forma de comunicação.

Não confunda os criadores com os usuários, por favor.

 
Renat Fatkhullin:

E você entra nele, recalcula tudo, passa algumas semanas a rever, como ele fez. Mas em vez disso, ainda nem leu o nosso artigo.

Pela nossa parte, nós fizemos o trabalho. E nós fizemos um bom trabalho. Se a Wolfram não é uma autoridade para você também, então você está perdendo seu tempo com esta forma de comunicação.

Não confunda os criadores com os usuários, por favor.

Eu respeito a sua opinião. Mas por que você responde por isso?

Vou dizer novamente.

A derivação de zero para densidade na sua versão, em primeiro lugar, é uma das opções possíveis (convenções). E, em segundo lugar, a essência da análise aplicada a partir da escolha deste valor (nan, 0 ou 1) não afecta nada. As funções de distribuição são usadas para estimar estatísticas. Neste ponto, a distribuição é zero. E isto é o suficiente.

Eu acrescentaria em geral, acelerar os cálculos é uma vantagem. Ou seja, objetivamente a implementação de funções não é pior ou até melhor, de acordo com o seu artigo.
 
Espero que a parte emocional tenha terminado...

Já procurei por 0^0. Este é exatamente o ponto de disputa - contido na equação de densidade de probabilidade para a distribuição gama quando x = 0.


Nesta discussão, esta é a resposta:
0^0 e 0! são iguais a 1 por causa da regra do produto vazio. A norma IEEE diz que 0^0 deve avaliar 1. Por isso, a maioria dos softwares de computador irá avaliá-lo dessa forma. Não há situações em que a avaliação a 0 seja útil.

Há muitas fórmulas que assumem 0^0=1, por exemplo notação para polinómios e séries de potência, aritmética do número cardinal, o teorema binomial, etc., todos estes assumem 0^0=1. Por exemplo, substituindo x=0 por x^0+x^1+x^2+... = 1/(1-x) mostra 0^0 = 1.

Ou seja, o padrão para converter esta expressão em 1. E não há nenhum benefício ou dano em trazer a expressão para 0.

Acho que em R hardcoded 1... e você tem 0.

Essa é a questão e não vale a pena discutir sobre isso. Um computador não pode calcular o valor algebricamente.
 
Alexey Burnakov:

A derivação de zero para densidade na sua versão é, em primeiro lugar, uma possibilidade (convenções).

Pode-se assumir que definir uma função significa especificar uma forma de calculá-la.

Dada a expressão
Alexey Burnakov:

Além disso, de acordo com:

https://en.wikipedia.org/wiki/Gamma_distribution

se x = 0, alfa = 1, beta = 1, você obtém um valor indefinido no numerador, o que traz toda a fração para a incerteza.

Afirmamos que, estritamente falando, a densidade gama da distribuição no ponto zero é indefinida. E tomando o limite à direita, a densidade é uma só.

À luz disto, acreditamos que a formulação da declaração "erros de cálculo em R" não é correcta. Mais precisamente, é uma questão de convenções: do que considerar igual à expressão zero em grau zero. Equalizar a densidade da distribuição gama a zero no ponto zero não parece ser uma prática válida.

não se ajusta à definição da função porque contém uma incerteza no ponto x=0, como assinalaste.

Se a condição x>=0 for colocada em vez de x>0 então não há incerteza e você pode calcular valores usando esta fórmula.

Em relação à prática - Mathematica e Matlab podem ser considerados como padrões da indústria para cálculos de engenharia, eles produzem 0, ou seja, essa expressão é válida apenas para x>0.

 
Quantum:

Podemos assumir que definir uma função significa especificar uma forma de calculá-la.

A expressão dada é.

não é apropriado para definir uma função porque contém uma incerteza em x=0, como você apontou.

Se você colocar a condição x>=0 em vez de x>0, não há incerteza e você pode calcular valores usando esta fórmula.

Em relação à prática - Mathematica e Matlab podem ser considerados o padrão da indústria para cálculos de engenharia, eles dão 0, ou seja, essa expressão só é verdadeira para x>0.

Correcto. A função é definida na área positiva (0,inf).

Por que você ainda tem 0 no ponto 0? e por que o erro é um 1?


A propósito, interessante. Tungstênio define uma função de distribuição gama de probabilidade no espaço [0,inf]. E assim eles dão um certo valor a zero... O que é estranho.


 
Quantum:

O Mathematica e o Matlab podem ser considerados o padrão da indústria para cálculos de engenharia

Você pegou uma situação para a qual não há solução, procurou o resultado que a Wolfram retorna, e chamou todos os outros resultados errados. Isto não é um cálculo de engenharia, mas um dogma.

Eles poderiam tomar R como referência, e escrever sobre encontrar um erro na Wolfram. Eu acho que se você pegar todos os softwares de matemática, e dividi-los em dois grupos com base no que eles retornam nesta situação - haverá uma divisão de 50%/50%, você pode adicionar mais uma dúzia de softwares que o mql se sobressai em um artigo sobre mql.

Obrigado pelos erros mencionados noAS 243. Mas não se deve culpar o comportamento de outras funções com parâmetros, para os quais não existe uma solução clara.
Você deveria ter escrito no artigo sobre as vantagens do mql - R tem tal e tal função que tem um erro de 15 casas decimais. E nós temos outra função em mql que é mais precisa. Tudo seria culto e científico, não dogmático como é agora.

 
Alexey Burnakov:

Por que você ainda tem 0 no ponto 0? e por que o erro é um 1?

Vamos considerar um exemplo com os parâmetros a=0,5, b=1 no ponto x=0

> dgamma(0,0.5,1,log=FALSO)[1] Inf> pgamma(0,0.5,1,log=FALSO)[1] 0

Se não excluirmos o ponto x=0, a densidade diverge e a probabilidade é boa.

E, mais adiante, também não há problema:

> pgamma(0,00001,0,5,1,log=FALSO)[1] 0,003568236

Acontece que ao calcular o CDF R exclui o ponto x=0, o infinito desapareceu em algum lugar.

 
Quantum

Caro colega!

Para várias páginas há uma discussão sobre as diferenças entre os algoritmos do seu e do R nas bordas do domínio da função. Os pontos marginais são pontos marginais e, na prática, as diferenças podem ser negligenciadas.

Mas, neste caso, tenho uma pergunta muito mais substancial:

Onde está a documentação para todas as suas funções?

Anteriormente, eu pensava que nós pegávamos a sua função, depois pegávamos a documentação para R, já que suas funções são analógicas, e mergulhávamos nas partes da documentação de R que ou descrevem os algoritmos, ou vão para os links fornecidos por R. R tem uma documentação e um aparelho de referência de altíssima qualidade.

No decorrer do argumento, descobri que as suas funções são diferentes do R - são algumas outras funções cujos algoritmos dependem de outras fontes. Não há nada sobre isso no próprio artigo, nenhuma documentação. E aprendemos sobre isso com Renat num contexto completamente diferente.

Na prática, podemos tirar uma conclusão inequívoca de que o código não pode ser portado de R para MQL5.

E aqui está o porquê.

É claro para mim que se diz "analógico de R" e não há documentação sobre o analógico, então é 100% analógico e eu posso facilmente transferir o código do intérprete para o compilador sem me preocupar com isso. E se não for assim, então um caso é suficiente para pôr um fim à ideia de portar código de R para MQL5. Ninguém quer ter uma dor de cabeça completamente bloqueada ao transferir código de trabalho para R você recebe código MQL que não funciona por causa de sutilezas na implementação de algoritmos.

 
SanSanych Fomenko:

Onde está a documentação para todas as suas funções?

Anteriormente, eu pensava que nós pegávamos sua função, depois pegávamos a documentação para R, já que suas funções são analógicas, e entrávamos nas partes da documentação de R que descrevem os algoritmos, ou íamos para os links fornecidos por R. R tem uma documentação e um aparelho de referência de altíssima qualidade.

No decorrer do argumento, descobri que as suas funções são diferentes do R - são algumas outras funções cujos algoritmos dependem de outras fontes. Não há nada sobre isso no próprio artigo, nenhuma documentação. E aprendemos sobre isso com Renat num contexto completamente diferente.

Na prática, podemos tirar uma conclusão inequívoca de que o código não pode ser portado de R para MQL5.

E aqui está o porquê.

É claro para mim que se diz "analógico de R" e não há documentação sobre o analógico, então é 100% analógico e eu posso facilmente transferir o código do intérprete para o compilador sem me preocupar com isso. E se não for assim, é o suficiente para pôr fim à ideia de portar o código do R para o MQL5. Ninguém quer obter um impasse completo, quando após a migração do código de trabalho para R você obtém código MQL, que não funciona devido às sutilezas na implementação dos algoritmos.

No momento, as funções estão descritas no artigo https://www.mql5.com/ru/articles/2742

Considere o cálculo de uma distribuição normal com os parâmetros mu=2, sigma=1 como exemplo:

n <- 10
k <- seq(0,1,by=1/n)
mu=2
sigma=1
normal_pdf<-dnorm(k, mu, sigma, log = FALSE)
normal_cdf<-pnorm(k, mu, sigma, lower.tail=TRUE,log.p = FALSE)
normal_quantile <- qnorm(normal_cdf, mu,sigma, lower.tail=TRUE,log.p = FALSE)
normal_pdf
normal_cdf
normal_quantile


1) O análogo da função R dnorm() é uma função:

A função calcula os valores da função de densidade de probabilidade de distribuição normal com os parâmetros mu e sigma para o conjunto de variáveis aleatórias x[]. No caso de um erro, ele retorna falso. Um análogo de dnorm() em R.

bool MathProbabilityDensityNormal(
  const double   &x[],        // [in]  Массив со значениями случайной величины
  const double   mu,          // [in]  Параметр распределения  mean (математическое ожидание)
  const double   sigma,       // [in]  Параметр распределения sigma (среднеквадратическое отклонение)
  const bool     log_mode,    // [in]  Флаг расчета логарифма значения, если log_mode=true, то рассчитывается натуральный логарифм плотности вероятности
  double         &result[]    // [out] Массив для значений функции плотности вероятности
);

2) Anormalidade analógica:

A função calcula o valor da função de distribuição normal com os parâmetros mu e sigma para a matriz de variáveis aleatórias x[]. No caso de um erro, ela retorna falso. Analógico de pnorm() em R.

bool MathCumulativeDistributionNormal(
  const double   &x[],        // [in]  Массив со значениями случайной величины
  const double   mu,          // [in]  Математическое ожидание
  const double   sigma,       // [in]  Среднеквадратическое  отклонение
  const bool     tail,        // [in]  Флаг расчета, если lower_tail=true, то рассчитывается вероятность того, что случайная величина не превысит x
  const bool     log_mode,    // [in]  Флаг расчета логарифма значения, если log_mode=true, то рассчитывается натуральный логарифм вероятности
  double         &result[]    // [out] Массив для значений функции вероятности
);

3) Análogo da qnorm:

Esta função calcula os valores da função inversa da distribuição normal com os parâmetros mu e sigma para a matriz de valores de probabilidade[]. No caso de um erro, ele retorna falso. O análogo de qnorm() em R.

bool MathQuantileNormal(
  const double   &probability[],// [in]  Массив со значениями вероятностей случайной величины
  const double   mu,            // [in]  Математическое ожидание
  const double   sigma,         // [in]  Среднеквадратическое отклонение
  const bool     tail,          // [in]  Флаг расчета, если lower_tail=false, то расчет ведется для вероятности 1.0-probability
  const bool     log_mode,      // [in]  Флаг расчета, если log_mode=true, то расчет ведется для вероятности Exp(probability)
  double         &result[]      // [out] Массив со значениями квантилей
);

Este é um exemplo de como usá-lo:

#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- arrays for calculated values
   double x_values[];
   double normal_pdf[];
   double normal_cdf[];
   double normal_quantile[];
//--- prepare x values
   const int N=11;
   ArrayResize(x_values,N);
   for(int i=0;i<N;i++)
      x_values[i]=i*1.0/(N-1);
//--- set distribution parameters
   double mu=2.0;
   double sigma=1.0;
//--- calculate pdf, cdf and quantiles
   MathProbabilityDensityNormal(x_values,mu,sigma,false,normal_pdf);
   MathCumulativeDistributionNormal(x_values,mu,sigma,true,false,normal_cdf);
   MathQuantileNormal(normal_cdf,mu,sigma,true,false,normal_quantile);
//--- show calculated values
   for(int i=0;i<N;i++)
      PrintFormat("1 %d, x=%.20e PDF=%.20e, CDF=%.20e, Q=%.20e,",i,x_values[i],normal_pdf[i],normal_cdf[i],normal_quantile[i]);
  }

Resultado:

2016.11.11:56:46.413 Teste (EURUSD,H1) 1 0, x=0,00000000000000000000e+00 PDF=5,39909665131880628364e-02, CDF=2,27501319481792120547e-02, Q=0,00000000000000000000e+00,
2016.11.11 11:56:46.413 Teste (EURUSD,H1) 1 1, x=1.000000000000000000005551e-01 PDF=6.56158147746765951780e-02, CDF=2.87165598160018034624e-02, Q=1.00000000000000088818e-01
2016.11.11 11:56:46.413 Teste (EURUSD,H1) 1 2, x=2,000000000000000000011102e-01 PDF=7,89501583008941493214e-02, CDF=3,593031911292598098213e-02, Q=2,00000000000000177636e-01
2016.11.11 11:56:46.413 Teste (EURUSD,H1) 1 3, x=2,9999999999999999988898e-01 PDF=9,40490773768869470217e-02, CDF=4,456546247585430410108e-02, Q=3,00000000000000266454e-01
2016.11.11 11:56:46.413 Teste (EURUSD,H1) 1 4, x=4,00000000000000022204e-01 PDF=1,1092083434679455543315e-01, CDF=5,47992916995579740225e-02, Q=3,9999999999999999999999999999911182e-01
2016.11.11:56:46.413 Teste (EURUSD,H1) 1 5, x=5.00000000000000000000e-01 PDF=1.295175956656589174343772e-01, CDF=6.6807201268858071803080e-02, Q=5.0000000000000022202045e-01,
2016.11.11 11:56:46.413 Teste (EURUSD,H1) 1 6, x=5,9999999999999999999999977796e-01 PDF=1,4972727465635744877437e-01, CDF=8,07566592337710387195e-02, Q=6,00000000000000310862e-01
2016.11.11 11:56:46.413 Teste (EURUSD,H1) 1 7, x=6,999999999999999999955591e-01 PDF=1,71368592047807355438e-01, CDF=9,6800484585610344040793e-02, Q=7,00000000000000177636e-01
2016.11.11:56:46.413 Teste (EURUSD,H1) 1 8, x=8.0000000000000000044409e-01 PDF=1.94186054983212952330e-01, CDF=1.15069670221708289515e-01, Q=8.0000000000000000044409e-01,
2016.11.11 11:56:46.413 Teste (EURUSD,H1) 1 9, x=9.0000000000000000022204e-01 PDF=2.1785217177032550525793e-01, CDF=1.35666060946382671659e-01, Q=9.00000000000000133227e-01
2016.11.11:56:46.413 Teste (EURUSD,H1) 1 10, x=1.00000000000000000000e+00 PDF=2.41970724519143365328e-01, CDF=1.5865525253931457046468e-01, Q=1.00000000000000000000e+00,

Resultado do cálculo em R:

> n <- 10> k <- seq(0,1,by=1/n)> mu=2> sigma=1> normal_pdf<-dnorm(k, mu, sigma, log = FALSO)> normal_cdf<-pnorm(k, mu, sigma, lower.tail=TRUE,log.p = FALSO)> normal_quantile <- qnorm(normal_cdf, mu,sigma, lower.tail=TRUE,log.p = FALSO)> normal_pdf [1] 0,05399097 0,06561581 0.07895016 0,09404908 0,11092083 0,12951760 0,14972747 0,17136859 [9] 0,19418605 0,21785218 0,24197072> normal_cdf [1] 0,02275013 0,02871656 0,03593032 0.04456546 0,05479929 0,06680720 0,08075666 0,09680048 [9] 0,11506967 0,13566606 0,15865525> normal_quantile [1] 0,0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1,0
Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее
Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее
  • 2016.10.06
  • MetaQuotes Software Corp.
  • www.mql5.com
Рассмотрены функции для работы с основными статистическими распределениями, реализованными в языке R. Это распределения Коши, Вейбулла, нормальное, логнормальное, логистическое, экспоненциальное, равномерное, гамма-распределение, центральное и нецентральные распределения Бета, хи-квадрат, F-распределения Фишера, t-распределения Стьюдента, а также дискретные биномиальное и отрицательное биномиальные распределения, геометрическое, гипергеометрическое и распределение Пуассона. Есть функции расчета теоретических моментов распределений, которые позволяют оценить степень соответствия реального распределения модельному.
Arquivos anexados:
Test.mq5  2 kb