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

 
Dr.Trader:

Ho trovato un altro errore in R. R non divide correttamente per 0.

Ecco lo script:

//+------------------------------------------------------------------+
//|                                                         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 risposta corretta, in mql è.
zero divide in 'test.mq5' (20,13)
con
arresto dello script

Non proprietario, in R:
> 1/0
Inf
con la
continuazione dello script

Intendo la stessa cosa di Alexey - il comportamento dei programmi in condizioni non definite può essere diverso, e non è un errore. Come l'architettura deve essere, così sarà il risultato.


Ti sbagli su "non è la risposta giusta".

La risposta in R è assolutamente corretta e molto conveniente. Il punto è che R prende il concetto di "valore della variabile" alla sua conclusione logica e ha tre valori specifici per la variabile: NA (c'è un valore, ma non è noto), NaN (nessun valore numerico) e Inf - infinito. Questo è un tale valore ed è totalmente sbagliato interrompere il lavoro del programma. Se si tiene conto delle limitazioni del computer sulla precisione reale, Inf potrebbe avere un valore finito. Ed è abbastanza naturale continuare a lavorare e un programma ben scritto dovrebbe controllare tali risultati se vengono assunti.

Per esempio, la documentazione MQL dà un esempio sull'arcsine e afferma che arcsine(2) = infinito. Questo non è esatto. Precisamente: arcsinus(2) = NaN, cioè nessun valore numerico, arcsinus(1) = Inf, ma le quotazioni mancanti durante il trading = NA, cioè dovrebbero essere (o potrebbero essere nel weekend) e non lo sono.

 
Alexey Burnakov:

Quello che dice Wolfram 0 non è la verità finale. Voglio dire che la parola "errore" nella formulazione è ridondante...

Qui non si tratta di Wolfram. L'integrale dei valori positivi non nulli non può essere zero.

I controlli hanno anche rivelato errori negli algoritmi.

Per esempio per la distribuzione t non centrale i quantili non si convertono:


> 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


Qui i quantili 0-0,6 sono calcolati in modo errato.

Un esempio di un calcolo simile in MQL5:

2016.11.10 17:53:32.645 TestStatNCT (EURUSD,H1) Test unitari per il pacchetto Stat
2016.11.10 17:53:32.645 TestStatNCT (EURUSD,H1)
2016.11.10 17:53:32.645 TestStatNCT (EURUSD,H1) Test di distribuzione T non centrale iniziato
2016.11.10 17:53:32.645 TestStatNCT (EURUSD,H1) Test di distribuzione T non centrale: Test 1: calcoli per valori singoli
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.3899389577957373769266e-15, Q=9.9999999999999989369615e-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.3638179090305861902898e-15, Q=2.99999999999998601119e-01
2016.11.10 17:53:32.648 TestStatNCT (EURUSD,H1) 1 4, PDF=1.5163698393962646374250e-13, CDF=1.7430393590744906969191e-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.02187737277044947465e-13, Q=5.99999999999998867573e-01,
2016.11.10 17:53:32.651 TestStatNCT (EURUSD,H1) 1 7, PDF=2.28327725393015114329e-12, CDF=2.51850847368662607692e-13, Q=6.9999999999999999289457e-01,
2016.11.10 17:53:32.652 TestStatNCT (EURUSD,H1) 1 8, PDF=5.7160930393970751591223e-12, CDF=6.25821417361289428232e-13, Q=7.99999999999999299967253e-01,
2016.11.10 17:53:32.653 TestStatNCT (EURUSD,H1) 1 9, PDF=1.43395037240077606742e-11, CDF=1.56338059375202603523e-12, Q=8.999999999999999998578915e-01,
2016.11.10 17:53:32.655 TestStatNCT (EURUSD,H1) 1 10, PDF=3.59391445912256345050e-11, CDF=3.91468724033560601170e-12, Q=9.99999999999998889777e-01,
2016.11.10 17:53:32.655 TestStatNCT (EURUSD,H1) Test di distribuzione T non centrale: Test 2: Calcoli su array
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.3899389577957373769266e-15, Q=9.9999999999999989369615e-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.3638179090305861902898e-15, Q=2.99999999999998601119e-01
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 4, PDF=1.5163698393962646374250e-13, CDF=1.7430393590744906969191e-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.02187737277044947465e-13, Q=5.99999999999998867573e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 7, PDF=2.28327725393015114329e-12, CDF=2.51850847368662607692e-13, Q=6.9999999999999999289457e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 8, PDF=5.7160930393970751591223e-12, CDF=6.25821417361289428232e-13, Q=7.99999999999999299967253e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 9, PDF=1.43395037240077606742e-11, CDF=1.56338059375202603523e-12, Q=8.999999999999999998578915e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) 2 10, PDF=3.59391445912256345050e-11, CDF=3.91468724033560601170e-12, Q=9.99999999999998889777e-01,
2016.11.10 17:53:32.665 TestStatNCT (EURUSD,H1) Test di distribuzione T non centrale: Test 3: funzioni sovraccaricate R-like
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.21137735448868468468779e+01, CDF=-3.42095165639872504926e+01, Q=9.9999999999999992561506e-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.9999999999999998490097e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 4, PDF=-2.95172869939179705057e+01, CDF=-3.16805609544090991392e+01, Q=4.0000000005240253e-01
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 5, PDF=-2.86229405029589081266e+01, CDF=-3.08030305013295588878e+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.999999999999999998756550e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 7, PDF=-2.680540931294946693489897e+01, CDF=-2.90099393581479034765e+01, Q=6.9999999999999999400480e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 8, PDF=-2.58877355789277032727e+01, CDF=-2.80997113402901490531e+01, Q=7.99999999999999489297e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 9, PDF=-2.49680028891657173062e+01, CDF=-2.71841705920503962091e+01, Q=8.9999999999999998689937e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) 3 10, PDF=-2.40491940358795979979193e+01, CDF=-2.62662856772029869035e+01, Q=9.99999999999998889777e-01,
2016.11.10 17:53:32.676 TestStatNCT (EURUSD,H1) Test di distribuzione T non centrale: Test 4: Generatori di valori casuali
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Test di distribuzione T non centrale superato
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Test di distribuzione T non centrale: errore PDF max : 1.48634016318122160328e-25
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Test di distribuzione T non centrale: CDF max errore: 2.75966439373922392108e-18
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Test di distribuzione T non centrale: errore massimo del quantile: 5.16253706450697791297e-15
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Test di distribuzione T non centrale: PDF cifre corrette: 24
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Test di distribuzione T non centrale: CDF cifre corrette: 17
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) Test di distribuzione T non centrale: Quantile cifre corrette: 14
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1)
2016.11.10 17:53:32.683 TestStatNCT (EURUSD,H1) 1 di 1 superato

Risultato dello script TestStatNCT.mq5 (test da TestStat.mq5, aggiunto l'output dei valori calcolati nella funzione TestNoncentralTDistribution)

Come si può vedere, i quantili sono indirizzati e i test sono superati.

Per quanto riguarda gli errori, sono i seguenti:

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

In 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", è stato dimostrato che l'algoritmo AS 243 ha degli errori:


Quindi ci sono errori in R e la loro probabile causa è nell'algoritmo AS 243, che è usato nel calcolo della CDF.

File:
TestStatNCT.mq5  16 kb
 
Quantum:

1)Non si tratta di Wolfram. L'integrale dei valori positivi non nulli non può essere zero.

2) Ci sono stati anche errori negli algoritmi durante i test.

3)Per esempio, per una distribuzione t non centrale i quantili non sono reversibili:


1 - Se anche lei scrive di un errore riguardante la distribuzione gamma, allora le rivolgo la mia affermazione. Non è corretto dire che in R è con errore. Vedo alcuni tentativi di etichettatura in questo post. A quanto pare non avete consultato gli studiosi che usano i pacchetti e non vi vedono alcun errore. La funzione in Python produce anche 1 densità in zero.

Ancora una volta. Il valore di densità non è definito a zero. Wolfram pensa che sia 0 e tu sei semplicemente d'accordo con questo senza fare alcuna deduzione indipendente.

Lei dice che il tungsteno non c'entra niente, ma non può rispondere alla mia domanda sul portare lo zero alla potenza di zero. Invece, mi mostri il tungsteno...

Voi stessi vedete che nell'approssimazione giusta il valore va all'unità, il che significa che anche l'integrale nell'approssimazione non è zero. E non è a zero, e nemmeno la densità, perché non ha senso integrare una quantità indeterminata.

2 - Questo può essere ulteriormente controllato e si può stabilire un errore nell'algoritmo, per esempio.

3)Per esempio può essere controllato.

 
Quantum:


Per esempio, per la distribuzione t non centrale i quantili non sono invertiti:


I quantili 0-0,6 non sono calcolati correttamente qui.

> 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
Scusa, in quale punto del tuo codice viene inizializzata la variabile nt_quantile, cioè da dove viene?
 

1) Come possiamo spiegare che in un punto cdf=0, mentre la pdf è non-zero?

> 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.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) Come possiamo spiegare che i quantili non corrispondono a quelli originali?

> 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:
Scusa, in quale punto del tuo codice viene inizializzata la variabile nt_quantile, cioè da dove viene?

Scusa, c'era un errore di battitura nello script, l'ho corretto.

Lo script è così:

> 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) Come possiamo spiegare che nel punto cdf=0, mentre la pdf è non-zero?

2) Come possiamo spiegare che i quantili non sono uguali a quelli originali?

Ci penserò e ti risponderò. Rispondi sempre a una domanda con una domanda? Dove sono i vostri pensieri statistici?
 
Alexey Burnakov:

Il punto è che @Quantum è puramente interessato all'implementazione e alla verifica completa dell'analogo di R delle librerie matematiche in MQL5.

Questo non è il ragionamento di un teorico. E sta scavando a fondo quando scrive i test unitari che forniscono la garanzia che la libreria sia corretta.


Non si deve assumere a priori che tutto sia corretto in R. Al contrario, direi che anche se c'è un'implementazione C++ delle funzioni lì, tutto è abbastanza primitivo. E in termini di velocità, si può vedere che la libreria MQL5 nel codice sorgente sul nostro compilatore vince in media di 3 volte.

Ci siamo presi la briga di ricontrollare tutto e abbiamo trovato errori evidenti. Questi errori sono stati confermati:

L'algoritmo AS 243 proposto da Lenth [Lenth, R.V., "Cumulative distribution function of the noncentral t distribution", Applied Statistics, vol. 38 (1989), 185-189]. Il vantaggio di questo metodo è il rapido calcolo della ricorrenza dei termini della serie infinita con funzioni beta incomplete. Ma nell'articolo [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], è stato dimostrato che questo algoritmo porta ad errori dovuti all'errore di valutazione della precisione quando si sommano i termini delle serie, specialmente per grandi valori del parametro delta non centrale. Gli autori dell'articolo hanno proposto un algoritmo corretto per il calcolo basato sulla ricorrenza della probabilità di distribuzione T non centrale.

Usiamo nella libreria statistica MQL5 l'algoritmo corretto per il calcolo delle probabilità dall'articolo [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]. che dà risultati esatti.

Per assicurarsi dell'accuratezza dei calcoli e per permettere agli sviluppatori di terze parti di controllare la qualità della libreria, abbiamo incluso diversi script di test unitari nella consegna. Potete trovarli in /Scripts/UnitTests/Stat.

Date un'occhiata alle date di pubblicazione, per favore. Vedrete come procede il lavoro con i consigli degli scienziati.

Inoltre, sarebbe un errore non considerare @Quantum uno scienziato.

 

Commentate poi, in ordine di letteralità, come per una distribuzione continua uniforme la densità nel punto estremo è positiva e l'integrale è zero: https://en.wikipedia.org/wiki/Uniform_distribution_(continuo)

 
Renat Fatkhullin:

Il punto è che @Quantum è puramente interessato all'implementazione e alla piena convalida dell'analogo di R delle librerie matematiche in MQL5.

Questo non è il ragionamento di un teorico. E sta scavando a fondo quando scrive i test unitari che forniscono la garanzia che la libreria sia corretta.


Non si dovrebbe assumere a priori che tutto sia corretto in R. Al contrario, direi che anche se c'è un'implementazione C++ delle funzioni lì, tutto è abbastanza primitivo. E in termini di velocità, si può vedere che la libreria MQL5 nel codice sorgente sul nostro compilatore vince in media di 3 volte.

Ci siamo presi la briga di ricontrollare tutto e abbiamo trovato errori evidenti. Questi errori sono stati confermati:

Guardate le date delle pubblicazioni, per favore. Vedrete come il lavoro procede con i consigli degli scienziati.

Inoltre, sarebbe un errore non considerare @Quantum uno scienziato.

Non ho detto nulla di questo errore. C'è così c'è così c'è.

A proposito della distribuzione gamma - è quello che ho capito che stava facendo con la vostra implementazione. E ribadisco che la sua affermazione in merito è puro letteralismo.

Motivazione: