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

 
Alexey Burnakov:

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)

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

La nostra opinione rimane - gli errori ci sono e sono causati dalla disattenzione nell'attuazione.

 
Renat Fatkhullin:

Il fatto è che @Quantum è una pura implementazione e un controllo completo dell'analogo della libreria matematica R 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 procede il lavoro con i consigli degli scienziati.

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

Caro Renat!

Ho le seguenti domande sui suoi ultimi post, che sono per me questioni di principio:

1. A giudicare dalla data di pubblicazione del suo articolo è l'anno 2003. Naturalmente, R, come qualsiasi altro sistema software, ha degli errori e una lista di correzioni viene sempre pubblicata al momento del rilascio. Allo stesso tempo, R ha sempre sottolineato che il basso livello di bug dovuto al numero estremamente grande di utenti è una virtù di R. E qui dal 2003 un bug nell'algoritmo è stato identificato a livello di pubblicazione e non è stato risolto. Questo non mi è chiaro.

Avete fatto una richiesta a R su questo argomento?

2. Mi piacerebbe vedere il codice con cui sono state confrontate le prestazioni di R e MQL5.

Lo apprezzo in anticipo.

 
SanSanych Fomenko:

Caro Renat!

Ho le seguenti domande sui tuoi ultimi post, che sono fondamentali per me:

1. A giudicare dalla data di pubblicazione dell'articolo, è il 2003. Naturalmente, R, come qualsiasi altro sistema software, ha degli errori e una lista di correzioni viene sempre pubblicata al momento del rilascio. Allo stesso tempo, R ha sempre sottolineato il basso livello di bug dovuto al numero estremamente grande di utenti come un vantaggio di R. E qui dal 2003 un bug nell'algoritmo è stato rilevato a livello di pubblicazione e non è stato corretto. Questo non mi è chiaro.

È elementare e assolutamente chiaro.

Tutti commettono errori - è quello che fanno gli sviluppatori. Facciamo un sacco di errori e non ci scoraggiamo.

Questo errore in R è solo dovuto alla disattenzione e alla dipendenza da una funzione di base che ha incasinato le altre. Correggetelo.

Avete fatto una richiesta a R su questo argomento?

Abbiamo condotto test, esaminato tutto nei dettagli mentre scrivevamo la libreria, confrontato costantemente MQL5 - Wolfram Alpha - R, mostrato i nostri risultati e siamo pronti a rispondere pubblicamente. Naturalmente, abbiamo allegato tre grandi script con test unitari e un benchmark al nostro pacchetto matematico (che è nel codice sorgente).

Sono sicuro che @Quantum scriverà un rapporto di bug in R. L'articolo aggiornato è stato rilasciato solo un paio d'ore fa.


Mi piacerebbe vedere il codice che confronta le prestazioni di R e MQL5.

Il codice del benchmark per MQL5 si trova in \Scripts\UnitTests\Stat\TestStatBenchmark.mq5 e il codice R può essere trovato alla fine dell'articolo Distribuzioni statistiche in MQL5 - prendere il meglio da R e renderlo più veloce, vedi "Appendice. Risultati del calcolo della linea temporale delle funzioni statistiche".

Si assicuri di aggiornare a MetaTrader 5 build 1467 collegandosi al server MetaQuotes-Demo, per favore. È in questa versione beta che abbiamo incluso la nuova libreria e tutti gli script di test.

 
Renat Fatkhullin:

Questo è elementare e completamente comprensibile.

Tutti commettono errori - è la natura degli sviluppatori. Facciamo un sacco di errori e non ci scoraggiamo.

Questo errore in R è solo dovuto alla disattenzione e alla fiducia in una funzione di base che ha incasinato le altre. Sarà corretto.

Abbiamo condotto test, esaminato tutto nei dettagli mentre scrivevamo la libreria, confrontato costantemente i risultati tra MQL5 - Wolfram Alpha - R, mostrato i nostri risultati e siamo pronti a rispondere pubblicamente. Naturalmente, abbiamo allegato tre grandi script con test unitari e un benchmark al nostro pacchetto matematico (che è nel codice sorgente).

Sono sicuro che @Quantum scriverà un rapporto di bug in R. L'articolo aggiornato è stato rilasciato solo un paio d'ore fa.


Il codice del benchmark in MQL5 può essere trovato in \Scripts\UnitTests\Stat\TestStatBenchmark.mq5 e il codice in R può essere trovato alla fine dell'articolo Distribuzioni statistiche in MQL5 - prendere il meglio da R e renderlo più veloce in "Appendice. Risultati del calcolo del tempo per le funzioni statistiche".

Si assicuri di aggiornare a MetaTrader 5 build 1467 collegandosi al server MetaQuotes-Demo, per favore. È in questa versione beta che abbiamo incluso la nuova libreria e tutti gli script di test.

Non posso ancora formarmi un'opinione sul confronto delle prestazioni. E questa è una questione di principio.

Il fatto è che R è un ambiente ideale per lo sviluppo - un interprete in una parola. Ma il codice che esiste durante lo sviluppo è molto diverso dal codice funzionante - per il numero di linee molte volte. E il codice di lavoro, d'altra parte, è molto breve e molto capiente. Quindi dovremmo confrontare su qualsiasi funzione di pacchetti, che hanno senso quando si prendono decisioni di trading, per esempio, randomforest, che utilizzano algoritmi computazionalmente capienti, operazioni di matrice, caricamento di tutti i core....

PS.

State usando una versione non aggiornata di R. Dovresti prendere la versione R 3.3.1 (2016-06-21) da MRAN - Microsofn R Open website. È obbligatorio installare MKL quando si fa questo. Microsoft ha affermato nella citata versione di R che è stata in grado di aumentare la velocità di esecuzione di alcuni pacchetti e funzioni fino a 50 (!) volte.

Microsoft R Open: The Enhanced R Distribution · MRAN
  • Microsoft Corporation
  • mran.revolutionanalytics.com
Microsoft R Open, formerly known as Revolution R Open (RRO), is the enhanced distribution of R from Microsoft Corporation. It is a complete open source platform for statistical analysis and data science. The current version, Microsoft R Open 3.3.1, is based on (and 100% compatible with) R-3.3.1, the most widely used statistics software in the...
 
SanSanych Fomenko:

Non posso ancora formarmi un'opinione sul confronto delle prestazioni. E questa è una questione di principio.

Il fatto è che R è un ambiente ideale per lo sviluppo - un interprete in una parola. Ma il codice che esiste durante lo sviluppo è molto diverso dal codice funzionante - per il numero di linee molte volte. E il codice di lavoro, d'altra parte, è molto breve e molto capiente. Ecco perché dovremmo confrontare tutte le funzioni dei pacchetti, che hanno senso mentre si prendono decisioni di trading, per esempio, randomforest, che utilizzano algoritmi computazionalmente capienti, operazioni matriciali, caricamento di tutti i core....

Traduciamo metodicamente le caratteristiche di R in MQL5. E in modo tale che l'essenza delle chiamate di funzione risulta essere molto simile.

Ecco un esempio della corrispondenza dell'articolo:


Distribuzione
Funzioni MQL5
Funzioni R
1Normale
MathProbabilityDensityNormal
MathCumulativeDistributionNormal
MathQuantileNormal
MathRandomNormal
dnorm
pnorm
qnorm
rnorm
2Beta
MathProbabilityDensityBeta
MathCumulativeDistributionBeta
MathQuantileBeta
MathRandomBeta
dbeta
pbeta
qbeta
rbeta
3Binomio
MathProbabilityDensityBinomial
MathCumulativeDistributionBinomial
MathQuantileBinomial
MathRandomBinomial
dbinom
pbinom
qbinom
rbinom
4
Cauchy
MathProbabilityDensityCauchy
MathCumulativeDistributionCauchy
MathQuantileCauchy
MathRandomCauchy
dcauchy
pcauchy
qcauchy
rcauchy
5Chi-quadro
MathProbabilityDensityChiSquare
MathCumulativeDistributionChiSquare
MathQuantileChiSquare
MathRandomChiSquare
dchisq
pchisq
qchisq
rchisq
6Esponenziale
MathProbabilityDensityExponential
MathCumulativeDistributionExponential
MathQuantileExponential
MathRandomExponential
dexp
pexp
qexp
rexp
7F di Fisher
MathProbabilityDensityF
MathCumulativeDistributionF
MathQuantileF
MathRandomF
df
pf
qf
rf
8Gamma
MathProbabilityDensityGamma
MathCumulativeDistributionGamma
MathQuantileGamma
MathRandomGamma
dgamma
pgamma
qgamma
rgamma
9Geometrico
MathProbabilityDensityGeometric
MathCumulativeDistributionGeometric
MathQuantileGeometric
MathRandomGeometric
dgeom
pgeom
qgeom
rgeom
10Ipergeometrico
MathProbabilityDensityHypergeometric
MathCumulativeDistributionHypergeometric
MathQuantileHypergeometric
MathRandomHypergeometric
dhyper
phyper
qhyper
rhyper
11
Logistica
MathProbabilityDensityLogistic
MathCumulativeDistributionLogistic
MathQuantileLogistic
MathRandomLogistic
dlogis
plogis
qlogis
rlogis
12Lognormale
MathProbabilityDensityLognormal
MathCumulativeDistributionLognormal
MathQuantileLognormal
MathRandomLognormal
dlnorm
plnorm
qlnorm
rlnorm
13Binomio negativo
MathProbabilityDensityNegativeBinomial
MathCumulativeDistributionNegativeBinomial
MathQuantileNegativeBinomial
MathRandomNegativeBinomial
dnbinom
pnbinom
qnbinom
rnbinom
14Beta non centrale
MathProbabilityDensityNoncentralBeta
MathCumulativeDistributionNoncentralBeta
MathQuantileNoncentralBeta
MathRandomNoncentralBeta
dbeta
pbeta
qbeta
rbeta
15Chi-quadro non centrale
MathProbabilityDensityNoncentralChiSquare
MathCumulativeDistributionNoncentralChiSquare
MathQuantileNoncentralChiSquare
MathRandomNoncentralChiSquare
dchisq
pchisq
qchisq
rchisq
16
Decentrale F
MathProbabilityDensityNoncentralF()
MathCumulativeDistributionNoncentralF()
MathQuantileNoncentralF()
MathRandomNoncentralF()
df
pf
qf
rf
17Studente Decentrale T
MathProbabilityDensityNoncentralT
MathCumulativeDistributionNoncentralT
MathQuantileNoncentralT
MathRandomNoncentralT
dt
pt
qt
rt
18Poisson's
MathProbabilityDensityPoisson
MathCumulativeDistributionPoisson
MathQuantilePoisson
MathRandomPoisson
dpois
ppois
qpois
rpois
19Studente T
MathProbabilityDensityT
MathCumulativeDistributionT
MathQuantileT
MathRandomT
dt
pt
qt
rt
20
Uniforme
MathProbabilityDensityUniform
MathCumulativeDistributionUniform
MathQuantileUniform
MathRandomUniform
dunif
punif
qunif
runif
21Weibull
MathProbabilityDensityWeibull
MathCumulativeDistributionWeibull
MathQuantileWeibull
MathRandomWeibull
dweibull
pweibull
qweibull
rweibull

Cerchiamo di rendere il codice di R strettamente identico per dimensioni e tempo di scrittura a quello di MQL5.

Domani rilasceremo in beta la libreria grafica e dimostreremo pezzi di codice di uguali dimensioni in R e MQL5 insieme alle immagini.



State usando una versione non aggiornata di R. Dovresti prendere la versione R 3.3.1 (2016-06-21) da MRAN - Microsofn R Open website. È obbligatorio installare MKL quando si fa questo. Microsoft ha affermato nella citata versione di R che è riuscita ad aumentare la velocità di esecuzione di alcuni pacchetti e funzioni fino a 50 (!) volte.

Dubito che la versione stock di R possa improvvisamente accelerare - il codice non cambia molto. È chiaro che alcune funzioni possono essere accelerate, specialmente quelle matriciali. E la tua dichiarazione conferma la mia opinione che il codice in R è scritto in modo piuttosto sciatto in termini di prestazioni.

Se leggete l'articolo, vedrete che abbiamo ottenuto accelerazioni fino a 46x anche su funzioni di base senza alcun multi-threading e MKL:

I calcoli sono stati eseguiti su un Intel Core i7-4790, 3.6 Ghz CPU, 16 GB RAM, Windows 10 x64. Risultati del tempo di calcolo in microsecondi


Distribuzione
Tempo MQL5
Tempo di calcolo PDF (µs)
Tempo di calcolo R
Tempo di calcolo PDF (µs)
PDF
R/MQL5
Tempo di calcolo MQL5
Tempo di calcolo del CDF (µs)
Tempo di calcolo R
Tempo di calcolo del CDF (µs)
CDF
R/MQL5
Tempo di calcolo MQL5
tempo quantile (µs)
Tempo di calcolo R
tempo di calcolo quantile (µs)
Quantile
R/MQL5
Tempo di generazione MQL5
tempo di generazione dei numeri casuali (µs)
Tempo di generazione R
tempo di generazione dei numeri casuali (μs)
casuale
R/MQL5
1
Binomio
4.39
11.663
2.657
13.65
25.316
1.855
50.18
66.845
1.332
318.73
1816.463
5.699
2
Beta
1.74
17.352
9.972
4.76
15.076
3.167
48.72
129.992
2.668
688.81
1723.45
2.502
3
Gamma
1.31
8.251
6.347
8.09
14.792
1.828
50.83
64.286
1.265
142.84
1281.707
8.973
4
Cauchy
0.45
1.423
3.162
1.33
15.078
11.34
1.37
2.845
2.077
224.19
588.517
2.625
5
Esponenziale
0.85
3.13
3.682
0.77
2.845
3.695
0.53
2.276
4.294
143.18
389.406
2.72
6
Uniforme
0.42
2.561
6.098
0.45
1.423
3.162
0.18
2.846
15.81
40.3
247.467
6.141
7
Geometrico
2.3
5.121
2.227
2.12
4.552
2.147
0.81
5.407
6.675
278
1078.045
3.879
8
Ipergeometrico
1.8511.095
5.997
0.9
8.819
9.799
0.75
9.957
13.28
302.55
880.356
2.91
9
Logistica
1.27
4.267
3.36
1.11
4.267
3.844
0.71
3.13
4.408
178.65
626.632
3.508
10
Weibull
2.99
5.69
1.903
2.74
4.268
1.558
2.64
6.828
2.586
536.37
1558.472
2.906
11
Poisson
2.91
5.974
2.053
6.26
8.534
1.363
3.43
13.085
3.815
153.59
303.219
1.974
12
F
3.86
10.241
2.653
9.94
22.472
2.261
65.47
135.396
2.068
1249.22
1801.955
1.442
13
Chi Quadrato
2.47
5.974
2.419
7.71
13.37
1.734
44.11
61.725
1.399
210.24
1235.059
5.875
14
Chi-quadro non centrale
8.05
14.223
1.767
45.61
209.068
4.584
220.66
10342.96
46.873
744.45
1997.653
2.683
15
Non centrale F
19.1
28.446
1.489
14.67
46.935
3.199
212.21
2561.991
12.073
1848.9
2912.141
1.575
16
Beta non centrale
16.3
26.739
1.64
10.48
43.237
4.126
153.66
2290.915
14.909
2686.82
2839.893
1.057
17
Binomio negativo
6.13
11.094
1.81
12.21
19.627
1.607
14.05
60.019
4.272
1130.39
1936.498
1.713
18
Normale
1.15
4.267
3.71
0.81
3.983
4.917
0.7
2.277
3.253
293.7
696.321
2.371
19
Lognormale
1.99
5.406
2.717
3.19
8.819
2.765
3.18
6.259
1.968
479.75
1269.761
2.647
20
T
2.32
11.663
5.027
8.01
19.059
2.379
50.23
58.596
1.167
951.58
1425.92
1.498
21
T non centrale
38.47
86.757
2.255
27.75
39.823
1.435
1339.51
1930.524
1.441
1550.27
1699.84
1.096
<PDF R/MQL5>.
3.474<CDF R/MQL5>.
3.465
<Quantile R/MQL5>.
7.03
<Random R/MQL5>
3.13



Ma la versione specificata sarà testata, naturalmente. Sia per la velocità che per le prestazioni.

 
SanSanych Fomenko:

Ti sbagli sulla "risposta sbagliata"

...

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

L'ho scritto con un po' di ironia sulle risposte sbagliate. Avrei dovuto aggiungere una faccina sorridente... In realtà ho aggiunto alla fine che non è un bug in entrambi i casi, poiché il comportamento del compilatore e dell'interprete in aree di funzioni non difese dipende interamente dall'architettura del sistema e dagli sviluppatori. È meglio restituire nan in questo caso, ovviamente.
Voglio dire, non chiamare una funzione con parametri per i quali non è definita e poi confrontare i risultati con un'altra libreria, altrimenti si possono trovare centinaia di "bug".

A proposito, è interessante l'esempio con arcsinus.
mql -
MathArcsin(1) = MathArcsin(2) = -nan(ind)

Wolfram -
Arcsin(1) = Pi/2
Arcsin(2) = qualcosa di complesso. Non esiste una soluzione con un risultato valido.

R -
asin(1) = Pi/2
asin(2) = nan (la risposta è per i numeri reali)
asin(2+0i) = qualcosa di complesso, come in wolframio

wiki dice che asin(1) è ancora definito(https://en.wikipedia.org/wiki/Inverse_trigonometric_functions), puoi scrivere una segnalazione di bug a servicedesk.
Ma asin(2) è una regione indefinibile, va bene e corrisponde ovunque.

E di nuovo riguardo all'ultimo post - la divisione per 0 in matematica semplice è impossibile, quindi è logico che lo script mql si blocchi con un errore, nessun bug qui. Ma è molto strano vedere una tale meticolosità nel precisare i risultati fino a 16 cifre decimali, e restituire nan o Inf quando dividere per zero è impossibile per qualche motivo. Imho bisogno di tornare Inf e non tormentare gli sviluppatori con crash improvvisi dei loro script.

 
Renat, questa traduzione di diverse funzioni da R a mql era davvero la sorpresa di cui parlavi?
 

Per disabilitare il controllo della divisione dei valori reali, usate il parametro FpNoZeroCheckOnDivision=1 nella sezione [Experts] del file metaeditor.ini

Se questo parametro è presente, il seguente codice produrrà inf

void OnStart()
  {
   double x=0;  
   Print(1/x);
  }

Naturalmente, la presenza di questo parametro non vi salverà da un errore di compilazione quando si divide per una costante 0,0
Print(1/0.0);

'0.0' - division by zero in the constant expression    s1.mq5    8    12
 
mytarmailS:
Renat, questo trasferimento di alcune funzioni da R a mql era davvero la sorpresa di cui parlavi?

No.

La sorpresa non ha senso, faremo tutto all'interno di MQL5 e MetaTrader 5.

 
Renat Fatkhullin:

Se questo parametro è presente, il seguente codice darà inf

Grazie, impostazione molto corretta. E se si divide zero per zero si ottiene nan invece di inf, ed è ancora più corretto, non mi aspettavo nemmeno una tale precisione!
Motivazione: