L'apprendimento automatico nel trading: teoria, modelli, pratica e algo-trading - pagina 200

 
Renat Fatkhullin:

Torniamo all'affermazione originale sugli errori della R nell'articolo.

La nostra opinione è ancora valida: ci sono degli errori presenti, e sono stati causati da una disattenzione nell'implementazione.

Il vostro specialista non vuole rispondermi nel merito. Mi ha solo dato un colpetto al tungsteno e questo è tutto.

Ripeterò il nostro punto. Non c'è nessun errore sulla distribuzione gamma. Questa è una questione di convenzione nella comunità matematica. C'è una frase di errore da parte vostra che non è corretta.

La derivazione dello zero per la densità nella tua versione è, in primo luogo, una delle opzioni possibili (convenzioni). E in secondo luogo, l'essenza dell'analisi applicata dalla scelta di questo valore (nan, 0 o 1) non influenza nulla. Le funzioni di distribuzione sono utilizzate per stimare le statistiche. In questo la distribuzione è zero. E questo è sufficiente.

Per quanto riguarda la distribuzione t. Ho riprodotto questo errore sull'ultima versione di R. ma non sono entrato nell'essenza dell'algoritmo. Ammetto che la correzione era davvero necessaria.

Proverò a fare una domanda al team di supporto R.
 

E tu ci entri, ricalcoli tutto, passi qualche settimana a ricontrollare come ha fatto lui. Ma invece non hai nemmeno letto il nostro articolo.

Da parte nostra, abbiamo fatto il lavoro. E abbiamo fatto un buon lavoro. Se neanche Wolfram è un'autorità per voi, allora state perdendo il vostro tempo con questo modo di comunicare.

Non confondete i creatori con gli utenti, per favore.

 
Renat Fatkhullin:

E tu ci entri, ricalcoli tutto, passi qualche settimana a ricontrollare come ha fatto lui. Ma invece non hai nemmeno letto il nostro articolo.

Da parte nostra, abbiamo fatto il lavoro. E abbiamo fatto un buon lavoro. Se neanche Wolfram è un'autorità per voi, allora state perdendo il vostro tempo con questo modo di comunicare.

Non confondete i creatori con gli utenti, per favore.

Rispetto la sua opinione. Ma perché ne risponde?

Lo dirò di nuovo.

La derivazione dello zero per la densità nella tua versione, in primo luogo, è una delle opzioni possibili (convenzioni). E in secondo luogo, l'essenza dell'analisi applicata dalla scelta di questo valore (nan, 0 o 1) non influenza nulla. Le funzioni di distribuzione sono utilizzate per stimare le statistiche. In questo punto, la distribuzione è zero. E questo è sufficiente.

Aggiungerei in generale che velocizzare i calcoli è un vantaggio. Cioè, oggettivamente l'implementazione delle funzioni non è peggiore o addirittura migliore, secondo il vostro articolo.
 
Spero che la parte emotiva sia finita...

Hanno cercato in giro per 0^0. Questo è esattamente il punto del contendere - contenuto nell'equazione della densità di probabilità per la distribuzione gamma quando x = 0.


In questa discussione, questa è la risposta:
0^0 e 0! sono uguali a 1 a causa della regola del prodotto vuoto. Lo standard IEEE dice che 0^0 dovrebbe valutare 1. Quindi la maggior parte dei software lo valuterà in questo modo. Non ci sono situazioni in cui valutare a 0 è utile.

Ci sono molte formule che assumono 0^0=1, per esempio la notazione per i polinomi e le serie di potenze, l'aritmetica dei numeri cardinali, il teorema binomiale, ecc., tutti questi presuppongono 0^0=1. Per esempio, sostituendo x=0 in x^0+x^1+x^2+... = 1/(1-x) mostra 0^0 = 1.

Cioè la norma per convertire questa espressione in 1. E non c'è nessun beneficio o danno nel portare l'espressione a 0.

Penso che in R sia stato codificato 1... e voi avete 0.

Questo è il punto e non ha senso discuterne. Un computer non può calcolare il valore algebricamente.
 
Alexey Burnakov:

La derivazione dello zero per la densità nella tua versione è, in primo luogo, una possibilità (convenzioni).

Si può supporre che definire una funzione significa specificare un modo per calcolarla.

Espressione data
Alexey Burnakov:

Inoltre, secondo:

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

quando x = 0, alfa = 1, beta = 1, si ottiene un valore indefinito nel numeratore, che porta l'intera frazione nell'incertezza.

Diciamo che, a rigore, la densità gamma della distribuzione al punto zero è indefinita. E prendendo il limite a destra, la densità è uguale a uno.

Alla luce di ciò, crediamo che la formulazione dell'affermazione "errori di calcolo in R" non sia corretta. Più precisamente, è una questione di convenzioni: che considerare uguale all'espressione zero in grado zero. Equiparare la densità della distribuzione gamma a zero nel punto zero non sembra essere una pratica valida.

non si adatta alla definizione della funzione perché contiene un'incertezza nel punto x=0, come avete sottolineato.

Se la condizione x>=0 è messa al posto di x>0 allora non c'è incertezza e si possono calcolare i valori usando questa formula.

Per quanto riguarda la pratica - Mathematica e Matlab possono essere considerati come standard industriali per i calcoli ingegneristici, producono 0, cioè quell'espressione è valida solo per x>0.

 
Quantum:

Possiamo assumere che definire una funzione significa specificare un modo per calcolarla.

L'espressione data è.

non è appropriato per definire una funzione perché contiene un'incertezza a x=0, come avete sottolineato.

Se metti la condizione x>=0 invece di x>0, non c'è incertezza e puoi calcolare i valori usando questa formula.

Per quanto riguarda la pratica - Mathematica e Matlab possono essere considerati lo standard industriale per i calcoli ingegneristici, danno 0, cioè quell'espressione è vera solo per x>0.

Corretto. La funzione è definita sull'area positiva (0,inf).

Perché hai ancora 0 al punto 0? e perché l'errore è un 1?


A proposito, interessante. Tungsten definisce una funzione di probabilità di distribuzione gamma sullo spazio [0,inf]. E così danno un certo valore a zero... Il che è strano.


 
Quantum:

Mathematica e Matlab possono essere considerati lo standard industriale per i calcoli di ingegneria

Hai preso una situazione per la quale non c'è soluzione, hai cercato il risultato che Wolfram restituisce, e hai chiamato sbagliati tutti gli altri risultati. Questo non è un calcolo ingegneristico, ma un dogma.

Potrebbero prendere R come riferimento e scrivere su come trovare un errore in Wolfram. Immagino che se si prendono tutti i software di matematica, e li si divide in due gruppi in base a ciò che restituiscono in questa situazione - ci sarà una divisione 50%/50%, si può aggiungere una dozzina di altri software che mql eccelle in un articolo su mql.

Grazie per gli errori menzionati inAS 243. Ma non dovreste dare la colpa al comportamento di altre funzioni con parametri, per le quali non esiste una soluzione chiara.
Quindi si sarebbe dovuto scrivere nell'articolo sui vantaggi di mql - guarda, in R c'è una funzione che ha un errore di 15 cifre decimali. E abbiamo un'altra funzione in mql che è più precisa. Tutto sarebbe colto e scientifico, non dogmatico come adesso.

 
Alexey Burnakov:

Perché hai ancora 0 al punto 0? e perché l'errore è un 1?

Consideriamo un esempio con i parametri a=0,5, b=1 nel punto x=0

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

Se non escludiamo il punto x=0, la densità diverge e la probabilità è OK.

E più avanti non c'è neanche un problema:

> pgamma(0.00001,0.5,1,log=FALSE)[1] 0.003568236

Si scopre che quando il calcolo della CDF R esclude il punto x=0, l'infinito è scomparso da qualche parte.

 
Quantum

Caro collega!

Per diverse pagine c'è una discussione sulle differenze tra i vostri algoritmi e quelli di R sui bordi del dominio della funzione. I punti marginali sono punti marginali e in pratica le differenze possono essere trascurate.

Ma in questo caso ho una domanda molto più sostanziale:

Dov'è la documentazione per tutte le vostre funzioni?

In precedenza, ho pensato che prendiamo la vostra funzione, poi prendiamo la documentazione di R, dato che le vostre funzioni sono analoghe, e approfondiamo quelle parti della documentazione di R che descrivono gli algoritmi, o vanno ai link forniti da R. R ha una documentazione e un apparato di riferimento di altissima qualità.

Nel corso della discussione, ho scoperto che le vostre funzioni sono diverse da R - sono alcune altre funzioni i cui algoritmi si basano su altre fonti. Non c'è niente di questo nell'articolo stesso, nessuna documentazione. E lo apprendiamo da Renat in un contesto completamente diverso.

In pratica, possiamo trarre una conclusione inequivocabile che il codice non può essere portato da R a MQL5.

Ed ecco perché.

Per me è chiaro che se dice "analogo di R" e non c'è documentazione sull'analogo, allora è analogico al 100% e posso facilmente trasferire il codice dall'interprete al compilatore senza preoccuparmene. E se non è così, è abbastanza per mettere fine all'idea di portare il codice da R a MQL5. Nessuno vuole avere un mal di testa completamente bloccato quando trasferendo il codice funzionante in R si ottiene un codice MQL che non funziona a causa di sottigliezze nell'implementazione degli algoritmi.

 
SanSanych Fomenko:

Dov'è la documentazione per tutte le vostre funzioni?

In precedenza, ho pensato che prendiamo la vostra funzione, poi prendiamo la documentazione di R, dato che le vostre funzioni sono analoghe, e andiamo in quelle parti della documentazione di R che o descrivono gli algoritmi, o vanno ai link forniti da R. R ha una documentazione e un apparato di riferimento di altissima qualità.

Nel corso della discussione, ho scoperto che le vostre funzioni sono diverse da R - sono alcune altre funzioni i cui algoritmi si basano su altre fonti. Non c'è niente di questo nell'articolo stesso, nessuna documentazione. E lo apprendiamo da Renat in un contesto completamente diverso.

In pratica, possiamo trarre una conclusione inequivocabile che il codice non può essere portato da R a MQL5.

Ed ecco perché.

Per me è chiaro che se dice "analogo di R" e non c'è documentazione sull'analogo, allora è analogico al 100% e posso facilmente trasferire il codice dall'interprete al compilatore senza preoccuparmene. E se non è così, è abbastanza per mettere fine all'idea di portare il codice da R a MQL5. Nessuno vuole ottenere un blocco completo, quando dopo la migrazione del codice di lavoro in R si ottiene il codice MQL, che non funziona a causa delle sottigliezze nell'implementazione degli algoritmi.

Per il momento le funzioni sono descritte nell'articolo https://www.mql5.com/ru/articles/2742

Consideriamo come esempio il calcolo di una distribuzione normale con parametri mu=2, sigma=1:

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) L'analogo della funzione R dnorm() è una funzione:

La funzione calcola i valori della funzione di densità di probabilità della distribuzione normale con i parametri mu e sigma per l'array di variabili casuali x[]. In caso di errore restituisce false. Un analogo di dnorm() in 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) pnorm analogico:

La funzione calcola il valore della funzione di distribuzione normale con i parametri mu e sigma per l'array di variabili casuali x[]. In caso di errore, restituisce false. Analogo di pnorm() in 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) Analogo di qnorm:

Questa funzione calcola i valori della funzione inversa della distribuzione normale con i parametri mu e sigma per l'array di valori probability[]. In caso di errore, restituisce false. L'analogo di qnorm() in 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] Массив со значениями квантилей
);

Questo è un esempio di come usarlo:

#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]);
  }

Risultato:

2016.11.11:56:46.413 Test (EURUSD,H1) 1 0, x=0.0000000000000000e+00 PDF=5.39909665131880628364e-02, CDF=2.27501319481792120547e-02, Q=0.0000000000000000e+00,
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 1, x=1.00000000000000005551e-01 PDF=6.56158147746765951780e-02, CDF=2.87165598160018034624e-02, Q=1.0000000000088818e-01
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 2, x=2.00000000000000011102e-01 PDF=7.89501583008941493214e-02, CDF=3.593031911292598098213e-02, Q=2.0000000000177636e-01
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 3, x=2.99999999999999988898e-01 PDF=9.40490773768869470217e-02, CDF=4.456546247585430410108e-02, Q=3.0000000000266454e-01
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 4, x=4.000000000000022204e-01 PDF=1.1092083434679455543315e-01, CDF=5.47992916995579740225e-02, Q=3.99999999999999911182e-01
2016.11.11:56:46.413 Test (EURUSD,H1) 1 5, x=5.0000000000000000e-01 PDF=1.29517595665891743772e-01, CDF=6.68072012688580713080e-02, Q=5.0000000000222045e-01,
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 6, x=5.9999999999999999977796e-01 PDF=1.49727465635744877437e-01, CDF=8.07566592337710387195e-02, Q=6.0000000000310862e-01
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 7, x=6.99999999999999955591e-01 PDF=1.71368592047807355438e-01, CDF=9.6800484585610344040793e-02, Q=7.0000000000177636e-01
2016.11.11:56:46.413 Test (EURUSD,H1) 1 8, x=8.000000000000044409e-01 PDF=1.94186054983212952330e-01, CDF=1.15069670221708289515e-01, Q=8.000000000000044409e-01,
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 9, x=9.000000000000022204e-01 PDF=2.1785217177032550525793e-01, CDF=1.35666060946382671659e-01, Q=9.0000000000133227e-01
2016.11.11:56:46.413 Test (EURUSD,H1) 1 10, x=1.00000000000000000000e+00 PDF=2.41970724519143365328e-01, CDF=1.58655253931457046468e-01, Q=1.0000000000000000e+00,

Risultato del calcolo in R:

> 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.coda=TRUE,log.p = FALSE)> normal_quantile <- qnorm(normal_cdf, mu,sigma, lower.tail=TRUE,log.p = FALSE)> 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-распределения Стьюдента, а также дискретные биномиальное и отрицательное биномиальные распределения, геометрическое, гипергеометрическое и распределение Пуассона. Есть функции расчета теоретических моментов распределений, которые позволяют оценить степень соответствия реального распределения модельному.
File:
Test.mq5  2 kb