Grupo de usuarios de MetaTrader 5 Python - cómo utilizar Python en Metatrader - página 83

 

Bien - mal preparado....

¿Dónde puedo leer sobre esto? Preparo los datos para la NS según mi percepción de lo que es importante y lo que no.

Una cosa que me desconcierta es si el mismo tipo de datos debe recogerse "en un montón" o añadirse a medida que van llegando.

¿De qué lado deben recogerse los datos: de los "más viejos" o de los "más nuevos"?

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

Bien - mal preparado....

¿Dónde puedo leer sobre esto? Preparo los datos para la NS según mi percepción de lo que es importante y lo que no.

Una cosa que me desconcierta es si el mismo tipo de datos debe recogerse "en un montón" o añadirse a medida que van llegando.

¿Desde qué lado deben recogerse los datos: desde el "más viejo" o desde el "más nuevo"?

En el hilo de MoD pregunta, alguien te responderá. Este es el tema del conector

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

El problema es que la normalización es una causa perdida.

Déjeme explicarle. Hay algunos datos A, B, C...

Son diferentes en cuanto a su importancia, etc. Todo el mundo (google) dice que la normalización debe hacerse por columnas (A-A-A, B-B-B, C-C-C) y no por filas. Esto es lógicamente comprensible.

Pero cuando aparecen nuevos datos para la "predicción" ¿CÓMO normalizarlos si es sólo una fila? ¿Y cualquier término de esa fila puede superar la normalización en los datos de entrenamiento y de prueba?

¡Y la normalización por cadenas no tiene ningún efecto!

En realidad, después de comprobar estos matices, tuve este "grito del alma" ))))

Durante la normalización se guardan los coeficientes. Para evitar que se salgan del rango, debemos tomar una gran parte de la historia y normalizarla, para luego aplicar estos coeficientes a los nuevos datos

en datos no normalizados, la red no aprenderá, o lo hará de forma deficiente. Esa es su naturaleza.
 
Maxim Dmitrievsky:

los coeficientes se conservan durante la normalización. Para evitar que se salgan del rango, tenemos que tomar una gran parte de la historia y normalizarla, y luego aplicar estos coeficientes a los nuevos datos

No aprenderá de los datos no normalizados, o aprenderá mal. Esa es su peculiaridad.

Todo esto es lógico y comprensible, ¡pero la red se está formando! Además hay información de que usar datos no normalizados es más complicado para el aprendizaje, pero no es crítico.

¿Y cómo no salirse de las gamas? Por ejemplo, hay un precio. Hay un rango de precios en los datos de entrenamiento y de prueba: toma 123-324. Pero el precio sube a 421. ¿Cómo entra en ese mismo rango?

Pero nos estamos alejando del meollo de la cuestión: ¿por qué, con un entrenamiento y unas pruebas normales, la predicción es algo?

 

Queridos amigos, una vez más mis esquís no se mueven... Estoy pidiendo ayuda.

Decidí esbozar un pequeño probador para comprobar la predicción de la red entrenada.

# Загрузка данных
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]))

Todo está bien aquí.

[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

Y lo siguiente que sabes...

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}]')

jura

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,)

¿Qué pasa?

 

Después de haber buscado en la web y haber mirado el artículo, en base al cual escribí mi código, llegué a la decepcionante conclusión de que todo autor de cualquier artículo "para principiantes" está obligado a olvidar mencionar algo importante...

Y aquí resultó queStandardScaler se utiliza en el entrenamiento de la red.Pero el artículo no dice ni una palabra sobre qué es y por qué es necesario.

Además,StandardScaler es estandarización. Además, quiero saber cómo puedo implementar la misma normalización para un solo vector de entrada e incluso menos.

Y lo que es peor, ¡la "normalización" se lleva a cabo por columnas del conjunto de datos! No, bueno, para las estadísticas, está bien. Pero para los pronósticos, es "***hole". Cuando llegan nuevos datos, ¿tengo que volver a entrenar la red sólo para que los nuevos datos estén en el rango de "normalización"?

¡Mentira!

Para cuando esta "nueva red" esté formada, la situación puede haber cambiado ya drásticamente. Entonces, ¿cuál es el puto objetivo de esto?

Hasta aquí Python con un montón de bibliotecas "afiladas" ....

Le agradecería mucho que me hiciera cambiar de opinión.


P.D. Sólo quiero creer que no he perdido mi tiempo en Python para nada.
 
Сергей Таболин:

Después de haber buscado en la web y haber mirado el artículo, en base al cual escribí mi código, llegué a la decepcionante conclusión de que todo autor de cualquier artículo "para principiantes" está obligado a olvidar mencionar algo importante...

Y aquí resultó queStandardScaler se utiliza en el entrenamiento de la red.Pero el artículo no dice ni una palabra sobre qué es y por qué es necesario.

Además,StandardScaler es una estandarización. Además, quiero saber cómo puedo implementar la misma normalización para un solo vector de entrada e incluso menos.

Y lo que es peor, ¡la "normalización" se realiza por columnas del conjunto de datos! No, bueno, para las estadísticas, está bien. Pero para los pronósticos, es "***hole". Cuando llegan nuevos datos, ¿tengo que volver a entrenar la red sólo para que los nuevos datos estén en el rango de "normalización"?

¡Mentira!

Para cuando esta "nueva red" esté formada, la situación puede haber cambiado ya drásticamente. Entonces, ¿cuál es el puto objetivo de esto?

Hasta aquí Python con un montón de bibliotecas "afiladas" ....

Le agradecería mucho que me hiciera cambiar de opinión.


P.D. Sólo quiero creer que no he perdido mi tiempo en Python para nada.
Tal vez porque es sólo el comienzo.
Pero recientemente me he interesado por las capacidades de python para mt. Y sobre si es posible hacerlo, nadie ha respondido. Además, no funciona en mql4. Decidí no perder el tiempo (quizá la situación cambie a mejor después de algún tiempo).
 

(Apenas puedo distinguirlo. )))

Pero ahora tengo otra pregunta (por la que empecé todo):

Cuando entrené la red obtuve los siguientes resultados

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

En otras palabras, ¡el resultado es una ganga!

He puesto en marcha mi probador. Tengo estos resultados

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

Bien, dime exactamente dónde puedes ver que la red está entrenada para obtener un 98% de resultados correctos????

 

Hola, leyendo algunas páginas de la discusión no encontré nada concreto sobre la siguiente pregunta :


- ¿Hay algo que funcione actualmente como los paquetes de MetaTraderR o MetaTrader5 para la integración de MT y R?


Saludos

 

Lo siento, continuaré mi epopeya... )))

Después de obtener un poco más de conocimiento del mismo google, llegué a conclusiones:

  1. Los datos deben ser "equilibrados". Por ejemplo, si de 1000 datos de entrada sólo aparecen señales en 100, necesitamos al menos 1000 - ((1000 - 100) /3) = 700 datos "vacíos" (que no forman señales) para eliminarlos.
  2. El resto debe ser preferentemente "normalizado". Llévalo al rango 0-1. Pero aquí hay una dificultad evidente para elegir el "rango" de normalización. ¿Qué considerar como mínimo y qué considerar como máximo? Todavía no lo sé. Normalizo cada matriz de entrada sólo por su rango...

Cumpliendo estas dos condiciones, conseguí una notable reducción de la curva de aprendizaje de la red. Además, descubrí que

  1. Algunas funciones de pérdida descartadas anteriormente tienen un mejor rendimiento.
  2. Los resultados con menos capas ocultas se volvieron dominantes.
  3. Queda por comprobar el número de épocas de entrenamiento.

Además, había otra pregunta: ¿cuál debería ser la respuesta de la red?

  1. Una neurona (0-1-2) (sin señal de compra-venta)
  2. Dos neuronas [0-0], [1-0], [0-1]
  3. Tres neuronas [0-0-1],[1-0-0],[0-1-0]
???