MetaTrader 5 Python User Group - Come usare Python in Metatrader - pagina 83

 

Giusto - sbagliato preparato....

Dove posso leggere di questo? Preparo i dati per la NS secondo la mia percezione di ciò che è importante e ciò che non lo è.

Una cosa che mi lascia perplesso è se lo stesso tipo di dati deve essere raccolto "in un mucchio" o aggiunto man mano che arriva?

Da quale parte dovrebbero essere raccolti i dati: dai "vecchi" o dai "nuovi"?

 
Сергей Таболин:

Giusto - sbagliato preparato....

Dove posso leggere di questo? Preparo i dati per la NS secondo la mia percezione di ciò che è importante e ciò che non lo è.

Una cosa che mi lascia perplesso è se lo stesso tipo di dati deve essere raccolto "in un mucchio" o aggiunto man mano che arriva?

Da quale parte dovrebbero essere raccolti i dati: dai "vecchi" o dai "nuovi"?

Nel thread MoD chiedete, qualcuno vi risponderà. Questo è l'argomento del connettore

 
Сергей Таболин:

Il problema è che la normalizzazione è una causa persa del tutto!

Lasciatemi spiegare. Ci sono alcuni dati A, B, C...

Sono diversi in termini di significato e così via. Tutti (google) dicono che la normalizzazione dovrebbe essere fatta per colonne (A-A-A, B-B-B, C-C-C) e non per righe. Questo è logicamente comprensibile.

Ma quando appaiono nuovi dati per la "predizione" COME normalizzarli se si tratta di una sola riga? E qualsiasi termine in quella riga può andare oltre la normalizzazione sui dati di allenamento e di test?

E la normalizzazione per stringhe non ha alcun effetto!

In realtà, dopo aver controllato queste sfumature, ho avuto questo "grido dell'anima" ))))

Durante la normalizzazione i coefficienti vengono salvati. Per evitare i fuori campo, dovremmo prendere un grosso pezzo di storia e normalizzarlo, poi applicare questi coefficienti ai nuovi dati

su dati non normalizzati, la griglia non imparerà, o imparerà male. Questa è la loro natura.
 
Maxim Dmitrievsky:

i coefficienti sono mantenuti durante la normalizzazione. Per evitare i fuori range, abbiamo bisogno di prendere un grosso pezzo di storia e normalizzare, poi applicare questi coefficienti ai nuovi dati

Non imparerà da dati non normalizzati, o imparerà male. Questa è la loro peculiarità.

Tutto questo è logico e comprensibile, ma la rete viene addestrata! Inoltre, ci sono informazioni che l'utilizzo di dati non normalizzati è più complicato per l'apprendimento, ma non è fondamentale.

E come non uscire dalle gamme? Per esempio, c'è un prezzo. C'è una gamma di prezzi sui dati di allenamento e di test - prendi 123-324. Ma il prezzo sale a 421. Come rientra in questa stessa gamma?

Ma ci stiamo allontanando dal cuore della questione - perché, con l'allenamento e i test normali, la previsione è qualcosa?

 

Cari amici, ancora una volta i miei sci non si muovono... Sto chiedendo aiuto.

Ho deciso di abbozzare un piccolo tester per testare la predizione della rete addestrata.

# Загрузка данных
df_full = pd.read_csv(flname_csv, header=None)
r, c = df_full.shape
border = c - row_signal
test_data = np.array(df_full.values[:, :border])
test_verification = np.array(df_full.values[:, border:])
print(test_data[2], 'len =', len(test_data[2]))
print(test_verification[2], 'len =', len(test_verification[2]))

Qui va tutto bene.

[3.00000 e+00 7.00000 e+00 1.14656 e+00 1.14758 e+00 1.14656 e+00 1.14758 e+00
 3.00000 e+00 7.00000 e+00 1.27800 e+03 1.27800 e+03 3.00000 e+00 7.00000 e+00
 1.14758 e+00 1.14857 e+00 1.14758 e+00 1.14857 e+00 3.00000 e+00 8.00000 e+00
 2.93000 e+02 6.20000 e+02 3.00000 e+00 8.00000 e+00 1.14857 e+00 1.14960 e+00
 1.14821 e+00 1.14960 e+00 3.00000 e+00 8.00000 e+00 4.78000 e+02 7.23000 e+02
 3.00000 e+00 8.00000 e+00 1.14960 e+00 1.14966 e+00 1.14860 e+00 1.14860 e+00
 3.00000 e+00 8.00000 e+00 2.32100 e+03 2.41100 e+03] len = 40
[1. 0.] len = 2

E la prossima cosa che sai...

if num_check_rows > r or num_check_rows == 0:
    num_check_rows = r

model = tf.keras.models.Sequential()
model = tf.keras.models.load_model(flname)
model.summary()

for i in range(num_check_rows):
    b = model.predict(test_data[i])
    a = b[0]
    x = a[0]
    y = a[1]
    x = format(x, '.5f')
    y = format(y, '.5f')
    print(f'ожидалось {test_verification[i]} >>> получили [{x} {y}]')

giurare

Model: "sequential_16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 20)                820       
_________________________________________________________________
dropout (Dropout)            (None, 20)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 10)                210       
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 22        
=================================================================
Total params: 1,052
Trainable params: 1,052
Non-trainable params: 0
_________________________________________________________________

Traceback (most recent call last):
  File "M:/PythonProgs/PycharmProjects/NNets/ТестерНС.py", line 79, in <module>
    b = model.predict(test_data[i])
.....
ValueError: Error when checking input: expected dense_input to have shape (40,) but got array with shape (1,)

Cosa c'è che non va?

 

Dopo aver cercato sul web e guardato l'articolo, sulla base del quale ho scritto il mio codice, sono giunto alla deludente conclusione che ogni autore di qualsiasi articolo "per principianti" è destinato a dimenticare di menzionare qualcosa di importante...

E qui si è scoperto cheStandardScaler è usato nell'addestramento della rete.Ma l'articolo non dice una parola su cosa sia e perché sia necessario.

Inoltre,StandardScaler è la standardizzazione. Inoltre, voglio sapere come posso implementare la stessa standardizzazione per un solo vettore di input e anche meno.

Ancora peggio, la "standardizzazione" è effettuata dalle colonne del dataset! No, beh, per le sole statistiche va bene. Ma per le previsioni è "***hole"! Quando arrivano nuovi dati, devo riaddestrare la rete solo per avere i nuovi dati nel range di "standardizzazione"?

Stronzate!

Nel momento in cui questa "nuova rete" viene addestrata, la situazione potrebbe essere già cambiata drasticamente. Allora, che cazzo di senso ha?

Alla faccia di Python con un mucchio di librerie "affilate"....

Le sarei molto grato se potesse farmi cambiare idea.


P.S. Voglio solo credere che non ho sprecato il mio tempo su Python per niente.
 
Сергей Таболин:

Dopo aver cercato sul web e guardato l'articolo, sulla base del quale ho scritto il mio codice, sono giunto alla deludente conclusione che ogni autore di qualsiasi articolo "per principianti" è destinato a dimenticare di menzionare qualcosa di importante...

E qui si è scoperto cheStandardScaler è usato nell'addestramento della rete.Ma l'articolo non dice una parola su cosa sia e perché sia necessario.

Inoltre,StandardScaler è una standardizzazione. Inoltre, voglio sapere come posso implementare la stessa standardizzazione per un solo vettore di input e anche meno.

Ancora peggio, la "standardizzazione" è effettuata dalle colonne del dataset! No, beh, per le sole statistiche va bene. Ma per le previsioni è "***hole"! Quando arrivano nuovi dati, devo riaddestrare la rete solo per avere i nuovi dati nel range di "standardizzazione"?

Stronzate!

Nel momento in cui questa "nuova rete" viene addestrata, la situazione potrebbe essere già cambiata drasticamente. Allora, che cazzo di senso ha?

Alla faccia di Python con un mucchio di librerie "affilate"....

Ti sarei molto grato se cambiassi idea.


P.S. Voglio solo credere che non ho sprecato il mio tempo su Python per niente.
Forse perché è solo l'inizio.
Ma recentemente mi sono interessato alle capacità di python per il mt. E sul fatto che sia possibile farlo, nessuno ha risposto. Inoltre, non funziona in mql4. Ho deciso di non perdere tempo (forse la situazione cambierà in meglio dopo qualche tempo).
 

(Riesco a malapena a capire. )))

Ma ora ho un'altra domanda (per la quale ho iniziato tutto):

Quando ho addestrato la rete ho ottenuto i seguenti risultati

Score on train data     Score on test data      Test loss       Test acc
0.970960                0.968266                0.199544        0.981424

In altre parole - il risultato è un affare!

Ho avviato il mio tester. Ho ottenuto questi risultati

Model: "sequential_16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 15)                465       
_________________________________________________________________
dropout (Dropout)            (None, 15)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 7)                 112       
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 16        
=================================================================
Total params: 593
Trainable params: 593
Non-trainable params: 0
_________________________________________________________________
2021-01-18 17:59:04.495645: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_10.dll
ожидалось [0. 1.] >>> получили [0.08348 0.08859]
ожидалось [0. 1.] >>> получили [0.08324 0.08838]
ожидалось [0. 0.] >>> получили [0.08667 0.09141]
ожидалось [0. 0.] >>> получили [0.08263 0.08784]
ожидалось [0. 0.] >>> получили [0.09200 0.09218]
ожидалось [0. 0.] >>> получили [0.08351 0.08861]
ожидалось [0. 0.] >>> получили [0.08944 0.09384]
ожидалось [1. 0.] >>> получили [0.08313 0.08828]
ожидалось [1. 0.] >>> получили [0.08432 0.08933]

Process finished with exit code 0

Bene, dimmi esattamente dove puoi vedere che la rete è addestrata al 98% di risultati corretti????

 

Ciao, leggendo alcune pagine della discussione non ho trovato nulla di concreto sulla seguente domanda:


- C'è qualcosa che funziona attualmente come i pacchetti MetaTraderR o MetaTrader5 per l'integrazione di MT e R?


Salute

 

Scusa, continuerò la mia epopea... )))

Dopo aver acquisito un po' più di conoscenza dallo stesso google, sono arrivato a delle conclusioni:

  1. I dati dovrebbero essere "equilibrati". Per esempio, se su 1000 dati di ingresso i segnali appaiono solo su 100, abbiamo bisogno di almeno 1000 - ((1000 - 100) /3) = 700 dati "vuoti" (che non formano segnali) da rimuovere.
  2. Il resto dovrebbe essere preferibilmente "normalizzato". Portalo nell'intervallo 0-1. Ma qui c'è un'ovvia difficoltà nella scelta della "gamma" di normalizzazione. Cosa considerare come minimo e cosa come massimo? Non lo so ancora. Normalizzo ogni array di input solo per il suo range...

Soddisfacendo queste due condizioni, ho ottenuto una notevole riduzione della curva di apprendimento della rete. Inoltre, ho scoperto che

  1. Alcune funzioni di perdita scartate in precedenza funzionano meglio.
  2. I risultati con meno strati nascosti sono diventati dominanti.
  3. Resta da controllare il numero di epoche di allenamento.

Inoltre c'era un'altra domanda: quale dovrebbe essere la risposta della rete?

  1. Un neurone (0-1-2) (nessun segnale-acquisto-vendita)
  2. Due neuroni [0-0],[1-0],[0-1]
  3. Tre neuroni [0-0-1],[1-0-0],[0-1-0]
???