English Русский 中文 Deutsch 日本語 Português
preview
Redes neuronales: así de sencillo (Parte 14): Clusterización de datos

Redes neuronales: así de sencillo (Parte 14): Clusterización de datos

MetaTrader 5Ejemplos | 14 julio 2022, 11:05
586 0
Dmitriy Gizlyk
Dmitriy Gizlyk

Contenido

Introducción

En la presente serie de artículos ya hemos avanzado bastante en el estudio de varios algoritmos de redes neuronales. Sin embargo, todos los algoritmos analizados se basaban en los principios del aprendizaje de un modelo supervisado. Es decir, introducíamos algunos datos históricos en la entrada del modelo y optimizábamos los coeficientes de los pesos para que el modelo retornara valores lo más parecidos a los resultados de referencia. Hay que decir que, en la práctica, este enfoque suele ofrecer los mejores resultados. Pero para organizar ese proceso, además de los datos históricos de la muestra de entrenamiento, también necesitamos los resultados de referencia para cada estado del sistema estudiado. Como puede ver, la preparación de los valores de referencia supone un esfuerzo adicional a la hora de preparar la muestra de entrenamiento. No siempre es posible ofrecer un resultado de referencia inequívoco para cada estado del sistema. En consecuencia, esto impone restricciones respecto al tamaño posible de la muestra de entrenamiento.

Sin embargo, existe otro enfoque en los métodos de aprendizaje de la inteligencia artificial: el aprendizaje no supervisado. Este método permite entrenar los modelos usando como base únicamente los datos originales, sin disponer de valores de referencia. Esto reduce la carga de trabajo en la fase de preparación de la muestra de entrenamiento. Esto nos da la oportunidad de usar más datos de entrada para entrenar el modelo. No obstante, también limita la gama de tareas que se pueden realizar.

Permítanme decir de entrada que en este artículo no verán la conocida estructura vertical de una red neuronal de varias capas. Bien, vayamos por orden. Vamos a ver los posibles algoritmos y cómo podemos utilizarlos en nuestro comercio.

1. Aprendizaje no supervisado

En el campo del desarrollo de algoritmos de inteligencia artificial, es habitual distinguir 3 áreas distintas:

  • aprendizaje supervisado,
  • aprendizaje no supervisado,
  • entrenamiento por refuerzo.

Como se desprende de los títulos anteriores, la principal diferencia entre las dos áreas es su enfoque del aprendizaje de modelos. El primer método, "aprendizaje supervisado", ya se ha tratado con cierto detalle en artículos anteriores de esta serie. Como ya sabrá, para implementar este método necesitamos una muestra de entrenamiento con parejas de valores de «estado del sistema - valor de referencia». En la práctica, este enfoque permite maximizar los resultados. Eso sí, también requiere recursos adicionales (incluidos los recursos humanos) y tiempo para preparar una muestra de entrenamiento. Al fin y al cabo, no resulta sencillo ofrecer un punto de referencia inequívoco para cada estado del sistema. Al mismo tiempo, con cierto grado de probabilidad, deberemos considerar también el factor humano. A veces, estas razones se convierten en limitaciones importantes en el diseño de una muestra de entrenamiento.

Pero, ¿qué podemos hacer cuando hay muchos datos originales y poco conocimiento sobre ellos? ¿O cuando no podemos emparejar cada estado del proceso analizado con algún valor de referencia inequívoco? ¿O incluso no sabemos cuál debe ser ese valor de referencia? Esta situación suele producirse durante la introducción inicial de una gran cantidad de datos. Y en lugar de gastar recursos buscando valores de referencia para cada estado del sistema, dirigiremos nuestra atención hacia el aprendizaje no supervisado. Aquí hay que decir que, dependiendo de la tarea en cuestión, como resultado del aprendizaje del modelo no supervisado, podremos obtener tanto una solución al problema como el preprocesamiento de los datos originales.

Hay que decir de entrada que los retos que plantean los métodos de aprendizaje supervisado y no supervisado son muy diferentes. Por ejemplo, en el caso del aprendizaje no supervisado, no se pueden resolver los problemas de regresión. Hasta cierto punto, resulta posible comparar los problemas de clasificación resueltos por el aprendizaje supervisado y los problemas de clusterización resueltos por los algoritmos de aprendizaje no supervisado. Pero detrás del significado similar de palabras casi sinónimas, se oculta una lógica completamente distinta. Y, con frecuencia, los dos métodos pueden producir resultados completamente diferentes. En el caso de la clasificación supervisada, pedimos al modelo que aprenda qué estado del sistema corresponde a qué clase. En el caso de la clusterización no supervisada, proponemos que el modelo determine a qué clúster pertenece el estado del sistema, basándose en el conjunto de atributos que describen el estado en cuestión. En este caso, puede ser que ni siquiera conozcamos el número de estos grupos al principio. Su número constituye un hiperparámetro del sistema y puede seleccionarse durante el entrenamiento del modelo.

El segundo problema que resuelven los algoritmos de aprendizaje no supervisado es la búsqueda de anomalías. Es decir, la búsqueda de estados que no son propios del sistema en cuestión pero que, debido a diversos factores externos, pueden manifestarse ocasionalmente, con un pequeño grado de probabilidad.

Otro problema que resuelven los algoritmos de aprendizaje no supervisado son los problemas de reducción de la dimensionalidad de los datos. Si lo recuerda, resolvimos un problema similar usando redes convolucionales. Pero, mientras que en el aprendizaje supervisado buscamos características específicas para una tarea concreta, en las tareas de aprendizaje no supervisado tenemos que comprimir los datos con la menor pérdida de información posible.

En general, para resumir todas las tareas que resuelven los algoritmos de aprendizaje no supervisado, puede decirse que la tarea principal de dicho enfoque consiste en el aprendizaje y el resumen de las características incluidas en los datos originales. Este enfoque permite al modelo explorar por sí mismo las características de la descripción del estado del sistema. También se suele usar en las tareas de aprendizaje supervisado. Por primera vez, se entrena un modelo no supervisado con una gran cantidad de datos, para que el modelo aprenda lo máximo posible sobre las características del sistema. A continuación, usando una pequeña cantidad de datos marcados, el modelo se entrena para resolver un problema específico.

Como podemos ver, los algoritmos de aprendizaje no supervisado permiten resolver diferentes problemas. Sin embargo, ¿cómo podemos utilizarlos en nuestro comercio? Vamos a pensar en ello. Al usar técnicas de análisis gráfico, casi siempre se habla de uno u otro patrón gráfico: pico doble/valle doble, cabeza y hombros, bandera, diversos patrones armónicos, etc. También hay patrones de velas más pequeños que contienen de 1 a 3 velas. Y, casi siempre, a la hora de intentar describir un patrón en términos matemáticos, nos enfrentamos a un gran número de convenciones y suposiciones. Esto complica su uso en el trading algorítmico. Hay que decir que también existe mucha subjetividad en la determinación de los patrones por parte del tráder humano. Por eso, al analizar el mismo gráfico, diferentes tráders encuentran en él patrones distintos, a menudo con la dirección opuesta del movimiento previsto. Sí, estoy de acuerdo, en eso se basa todo el sistema comercial. Algunos logran beneficios, y otros, pérdidas. Durante el comercio, no se crean nuevos valores, y la oferta monetaria se mantiene sin cambios. Solo ha pasado de un bolsillo a otro. Pero, ¿cómo no quedarnos con la boca abierta?

Patrón cabeza-hombros

Volvamos a ver los patrones gráficos que hemos mencionados anteriormente. Sí, todos tienen su nivel de tolerancia. Pero al mismo tiempo, cada patrón posee su propia estructura específica que lo distingue del gráfico general de movimiento de precios. ¿Qué pasaría si usáramos algoritmos de clusterización de datos no supervisados y ordenáramos al modelo que identificara todas las posibles variaciones de los datos durante un cierto periodo de tiempo? Como utilizamos el aprendizaje no supervisado, no necesitamos marcar los datos y el periodo de tiempo puede ser bastante largo. Obviamente, deberemos recordar que, a medida que aumenta el horizonte temporal de la historia, también lo hacen los costes de entrenamiento del modelo.

2. Algoritmo de k-medias (k-means)

Para resolver el problema de clusterización propuesto anteriormente, usaremos uno de los métodos más simples y sencillos de k-medias. A pesar de su simplicidad, el método resulta bastante eficaz a la hora de resolver problemas de clusterización de datos y puede utilizarse por sí solo o para el preprocesamiento de datos.

Para utilizar el método, cada estado del sistema analizado se describe usando un conjunto de datos reunidos en un único vector. Cada uno de estos vectores representa las coordenadas de algún punto en un espacio de N dimensiones, donde la dimensionalidad del espacio es igual a la dimensionalidad del vector que describe el estado del sistema.

Datos originales en un plano

La esencia del método consiste en encontrar los centros (vectores) alrededor de los cuales todos los estados conocidos del sistema pueden combinarse en clústeres. La distancia media de todos los estados del sistema respecto al centro del clúster correspondiente deberá ser mínima. Como puede ver, de ahí proviene el nombre del método k-medias. El número de estos clústeres es el hiperparámetro del modelo y se determina en la fase de diseño o validación del mismo.

Puede sonar un poco extraño decir "...se determina en la fase de diseño o validación". A primera vista, estos conceptos están separados tanto en el tiempo como en las etapas de creación y entrenamiento de modelos, pero hay casos muy diferentes. A veces, el número de estos grupos viene determinado por el planteamiento de la tarea. Esto es posible cuando el cliente entiende claramente el número de estos clústeres partiendo de su experiencia o del uso previsto de los resultados esperados. Por otra parte, al visualizar los datos, podemos ver el número de clústeres expresados explícitamente. En estos casos, podemos especificar directamente el número de clústeres que buscamos en el modelo.

Sin embargo, en otros casos en los que no tenemos conocimientos suficientes para determinar el número de clústeres de forma inequívoca, debemos realizar una serie de entrenamiento del modelo para determinar el número óptimo de clústeres. Pero ya hablaremos de eso después. Ahora vamos a explicar el algoritmo del método.

En la figura anterior, mostramos la visualización de 100 puntos aleatorios en un plano. La visualización de datos resulta útil para entender la estructura de los datos, pero no es necesaria para el método en cuestión. Como puede ver, los puntos se han espaciado de forma bastante uniforme en el plano y no podemos distinguir visualmente ningún clúster, y menos aún su número. Para el primer experimento, tomaremos 5 clústeres, por ejemplo.

Bien, ya hemos decidido la cantidad. ¿Dónde debemos colocar ahora sus centros? Recuerde que cuando inicializamos los pesos, debemos rellenar las matrices con valores aleatorios. Aquí vamos a hacer más o menos lo mismo. Lo único es que no generaremos vectores aleatorios, ya que pueden alejarse respecto a nuestros datos iniciales. Simplemente tomaremos 5 puntos al azar de nuestra muestra de entrenamiento. En la siguiente ilustración se han marcado como X.

Añadiendo los centros de los clústeres

A continuación, deberemos calcular la distancia de cada punto a cada centro. No creo que nadie tenga dificultades para determinar la distancia entre dos puntos de una línea (espacio unidimensional). Para determinar la distancia entre dos puntos en el plano, utilizaremos el teorema de Pitágoras, conocido por todos de las matemáticas escolares. Este establece que la suma de los cuadrados de los catetos es igual al cuadrado de la hipotenusa. Por lo tanto, la distancia entre dos puntos en el plano es igual a la raíz cuadrada de la suma de las distancias al cuadrado entre las proyecciones de los puntos en los ejes de coordenadas. En pocas palabras, es la suma de los cuadrados de la diferencia de las coordenadas correspondientes Créanme, si aplicamos un enfoque similar a la proyección de un punto sobre un plano N-1, obtendremos una igualdad similar para un espacio de N dimensiones.

Fórmula para determinar la distancia entre puntos

Una vez determinada la distancia a cada uno de los centros de clúster, el centro de clúster más próximo determinará si el punto pertenece a dicho clúster. Después, repetimos las iteraciones de distancia y pertenencia al clúster para todos los puntos de nuestra muestra de entrenamiento. A continuación, una simple media aritmética determinará el nuevo centro de cada clúster. La siguiente figura muestra los resultados de la primera iteración, en la que los puntos de cada clúster están coloreados de forma distinta.

Primera iteración 

Como puede ver, después de la primera iteración, la distribución de los puntos en los clústeres no resulta uniforme. Pero en comparación con el gráfico anterior, los centros de los clústeres se han desplazado. Y, en consecuencia, la distribución entre clústeres cambiará cuando se repitan las iteraciones para recalcular las distancias a los centros de los clústeres y determinar si un punto pertenece a un clúster concreto.

Repetimos las iteraciones en ciclos hasta que los centros de los clústeres ya no se muevan. Como consecuencia, los puntos no cambiarán su pertenencia a un clúster de una iteración a otra.

Tras varias iteraciones con los datos de nuestro ejemplo, obtenemos la siguiente imagen. Como puede ver, hemos obtenido una distribución bastante uniforme de los puntos de la secuencia de entrenamiento en los clústeres.

Distribución final  

Vamos a resumir el algoritmo del que hemos hablado:

  1. Identificamos k puntos aleatorios de la muestra de entrenamiento como centros de clúster.
  2. Organizamos el ciclo de operaciones:
    • Determinamos la distancia de cada punto a cada centro;
    • Según el centro más próximo, determinamos si el punto pertenece a un clúster;
    • Usando la media aritmética, determinamos un nuevo centro para cada clúster.
  3. Repetimos el ciclo hasta que los centros de clúster se "detengan".

Hay que decir que, como no nos interesa la distancia concreta del punto al centro, sino la menor de las dos, para ahorrar recursos, no extraeremos la raíz cuadrada de la suma resultante al calcular la distancia, lo cual no tendrá ningún efecto en el resultado del clúster.

En esta fase, hemos dividido los datos de la muestra de entrenamiento en clústeres. Pero, ¿cómo determinaremos que el número de clústeres que hemos tomado es el óptimo? Al igual que sucede con el aprendizaje supervisado, vamos a introducir una función de pérdida para ayudarnos a evaluar la calidad del modelo entrenado y también para comparar el rendimiento del modelo con diferentes hiperparámetros. Para los problemas de clusterización, esta función de pérdida supone la desviación media de los puntos respecto al centro del clúster correspondiente y se calcula usando la fórmula:

Función de pérdida

donde:

  • m es el número de elementos de la muestra de entrenamiento,
  • N es la dimensionalidad del vector de descripción de un elemento de la muestra de entrenamiento,
  • Xi j- es el i-ésimo valor del vector de descripción del j-ésimo elemento de la muestra de entrenamiento,
  • Ci x j- es el i-ésimo valor del vector central del clúster al que pertenece el j-ésimo elemento de la muestra de entrenamiento.

Como puede ver fácilmente en la fórmula anterior, el valor de la función de pérdida será "0" cuando el número de clústeres sea igual al número de elementos de la muestra de entrenamiento. Pero no queremos copiar la muestra de entrenamiento completa en nuestra matriz de centros de clúster. Al contrario, queremos encontrar una forma de generalizar los datos para poder buscar luego posibles patrones para cada grupo de valores.

He repetido la clusterización de la misma muestra de entrenamiento con diferentes números de clústeres. La dependencia de la función de pérdida respecto al número de clústeres se muestra en la siguiente figura. He evitado deliberadamente mostrar el valor de la función de pérdida, ya que puede resultar muy diferente para distintos datos originales y depende de su naturaleza. Al mismo tiempo, el número de clústeres también dependerá en gran medida de la muestra de entrenamiento, por lo que no debemos guiarnos por los valores indicados. Aquí se ofrecen solo como guía para explicar el gráfico. Es importante que entienda los principios de interpretación del gráfico.

Dependencia del error respecto al número de clústeres

El gráfico anterior muestra claramente que a medida que el número de clústeres cambia de 2 a 4, el valor de la función de error disminuye bruscamente. Cuando el número de clústeres aumenta a 6, el ritmo de disminución de la función de error disminuye gradualmente. Y cuando el número de clústeres cambia de 6 a 7, el valor de la función de error no cambia mucho. Aquí vemos el cambio suavizado en la función de pérdida. Pero a veces puede haber un cambio discontinuo de gráfico en un punto específico. Este fenómeno es más común cuando los datos de la muestra de entrenamiento son claramente separables.

La regla general de interpretación del gráfico es la siguiente:

  • Si hay una línea discontinua en el gráfico, el número óptimo de clústeres se tomará en el punto de ruptura;
  • Si se da un gráfico suavizado, elegiremos entre un equilibrio de calidad y rendimiento en la zona de curvas.  

Para el ejemplo anterior, dado el pequeño tamaño de la muestra y el número de clústeres, recomendaría utilizar 5 o 6 clústeres.

3. Implementación con Python

Ya nos hemos familiarizado con los aspectos teóricos del método de k-medias usando los datos abstractos como ejemplo. Esto nos hace preguntarnos cómo funcionará el método con datos reales. Para responder a esta pregunta, aprovecharemos la integración entre MetaTrader 5 y Python. Python es conocido por poseer un gran número de bibliotecas que pueden satisfacer casi cualquier necesidad.

Las herramientas de integración han sido analizadas muchas veces en este sitio web, incluyendo el procedimiento necesario para instalar las bibliotecas descritas en la documentación.

3.1. Bibliotecas de inclusión

Usaremos varias bibliotecas para realizar la tarea que nos ocupa. Y sobre todo la biblioteca de MetaTrader5. Esta biblioteca organiza todos los puntos de integración entre MetaTrader 5 y Python.

La segunda biblioteca que necesitaremos será Scikit-Learn. Es una biblioteca que ofrece herramientas sencillas y eficaces para el análisis de datos. Entre otras cosas, implementa varios algoritmos de clusterización de datos. Esto incluye el método de k-medias que estamos analizando.

Implementaremos la visualización de datos con la biblioteca Matplolib.

Las herramientas de integración de MetaTrader 5 y Python permiten trasladar a scripts diversa información sobre el estado de la cuenta, las operaciones comerciales y la situación del mercado. Sin embargo, no permiten el uso de datos de programas internos, como los indicadores. Por consiguiente, deberemos repetir toda la implementación de los indicadores en el lado de Python. Y aquí, para facilitarnos las cosas, usaremos la biblioteca TA-Lib, que ofrece varias herramientas de análisis técnico.

Obviamente, todas las bibliotecas y el intérprete de Python utilizados deberán estar instalados en su ordenador antes de crear el script. Este proceso no entra en el tema del presente artículo. Pero si alguien tiene dificultades, le responderé en los comentarios al artículo, si tengo tal posibilidad. 

3.2. Creando el script

Ahora que hemos decidido la lista de bibliotecas que usaremos, podemos empezar a escribir el script. Primero, guardaremos el código del script en el archivo "clustering.py".

Al principio del script, introduciremos las bibliotecas necesarias.

# Импорт библиотек
import numpy as np
import matplotlib.pyplot as plt
import MetaTrader5 as mt5
from talib import abstract as tl
import sklearn.cluster as cluster
from datetime import datetime as dt

A continuación, organizaremos la conexión con el terminal. Al hacerlo, comprobaremos que la operación se haya realizado correctamente. Y si se produce un error, mostraremos un mensaje y saldremos del programa.

# Подключаемся к терминалу MetaTrader 5
if not mt5.initialize():
    print("initialize() failed, error code =",mt5.last_error())
    quit()

Una vez conectado con éxito al terminal, descargaremos los datos históricos del periodo analizado y nos desconectaremos del terminal.

# Загрузка котировок
rates=mt5.copy_rates_range('EURUSD',mt5.TIMEFRAME_H1,dt(2006,1,1),dt(2022,1,1))
mt5.shutdown()

Ahora que tenemos los datos históricos, procederemos a definir los valores de los indicadores. En este bloque, calcularemos los valores de los mismos indicadores que utilizamos al probar diferentes modelos usando el aprendizaje supervisado. Hablamos de los osciladores clásicos RSI, CCI y MACD.

# Рассчитаем значение индикаторов
rsi=tl.RSI(rates['close'])
cci=tl.CCI(rates['high'],rates['low'],rates['close'])
macd,macdsignal,macdhist=tl.MACD(rates['close'])

Así, tendremos los datos originales, pero divididos en 6 tensores. Para nuestro análisis, necesitaremos combinarlos en un único tensor. Hay otro punto aquí que debemos señalar. La función de clusterización se construye de forma que reciba en la entrada un array bidimensional cuyas filas se tratan como patrones individuales. Al combinar todos los tensores en uno solo, obtendremos también un array bidimensional; cada fila de este, contendrá información sobre una vela individual. Sin duda, podemos usarlo así. Pero luego realizaremos una clusterización de velas individuales. No obstante, ¿qué utilidad tendría esta información para nosotros? Si queremos buscar patrones de varias velas, tendremos que cambiar la dimensionalidad del tensor. Al mismo tiempo, el simple hecho de cambiar la dimensionalidad no cumple del todo con nuestros requisitos. Esto es comparable a usar una ventana móvil con pasos de desplazamiento iguales a su tamaño. Sin embargo, nos gustaría entender el patrón de cada vela. Por lo tanto, tendremos que reformatear el tensor copiando los datos. A continuación, mostramos un ejemplo de código de combinación de tensor seguido del copiado de datos para hacer un patrón de 20 velas. Fíjese en el recorte de los datos históricos cuando los valores de los indicadores no están definidos.

# Сгруппируем обучающую выборку
data=np.array([rates['close']-rates['open'],rates['high']-rates['close'],rates['close']-rates['low'],
                                                                   rsi,cci,macd,macdsignal,macdhist]).T
s=data.shape[0]
data=np.hstack([data[40+k:s-20+k] for k in range(0,20)])

Esto completa el proceso de preparación de los datos, por lo que podemos llevar a cabo la clusterización de los mismos. Sin embargo, para estimar el número de clústeres necesarios necesitamos realizar varias pruebas con diferentes números de clústeres. En este ejemplo, he realizado la clusterización para un rango de 50 a 1000 clústeres en incrementos de 50 clústeres.

# Проведем кластеризацию с различным количеством кластеров
R=range(50,1000,50)
KM = (cluster.KMeans(n_clusters=k).fit(data) for k in R)

Por último, determinamos el error para cada caso y visualizamos los resultados.

distance=(k.transform(data) for k in KM)                      
dist = (np.min(D, axis=1) for D in distance)
avgWithinSS = [sum(d) / data.shape[0] for d in dist]
# Отрисовка результатов обучения модели
plt.plot(R, avgWithinSS)
plt.xlabel('$Clasters$')
plt.title('Loss dynamic')
# Вывод созданных графиков
plt.show()

Con esto, hemos completado el código del script. Vamos a pasar a la simulación. Podrá encontrar el código completo del script en el archivo adjunto.

4 Simulación

Ya hemos creado el script en Python, ahora podemos ponerlo a prueba. Todos los parámetros de prueba se indican en el código del script:

  • Instrumento EURUSD;
  • Marco temporal - H1.
  • Intervalo histórico de 16 años desde el 01.01.2006 hasta el 01.01.2022
  • Número de clústeres de 50 a 1000 en incrementos de 50

Como resultado del entrenamiento, se ha trazado un gráfico con las dependencias de la función de pérdida respecto al número de clústeres. 

Influencia del número de clústeres en el error del modelo

Como podemos ver en el gráfico, la ruptura se ha extendido bastante. El uso óptimo parece ser de 400 a 500 clústeres. Además, debemos añadir que hemos analizado 98641 estados del sistema.

Conclusión

En este trabajo, hemos presentado el método de clusterización de datos de k-medias, uno de los algoritmos de aprendizaje no supervisado. Asimismo, hemos creado un script usando las bibliotecas de Python y hemos entrenado un modelo con diferentes números de clústeres. A partir de los resultados de la prueba, podemos concluir que el modelo ha sido capaz de distinguir alrededor de 500 patrones. Por supuesto, somos conscientes de que no todos ellos darán señales comerciales claras, pero en los siguientes artículos hablaremos de cómo se pueden utilizar los resultados en la práctica.


Enlaces

  1. Redes neuronales: así de sencillo
  2. Redes neuronales: así de sencillo (Parte 2): Entrenamiento y prueba de la red
  3. Redes neuronales: así de sencillo (Parte 3): Redes convolucionales
  4. Redes neuronales: así de sencillo (Parte 4): Redes recurrentes
  5. Redes neuronales: así de sencillo (Parte 5): Cálculos multihilo en OpenCL
  6. Redes neuronales: así de sencillo (Parte 6): Experimentos con la tasa de aprendizaje de la red neuronal
  7. Redes neuronales: así de sencillo (Parte 7): Métodos de optimización adaptativos
  8. Redes neuronales: así de sencillo (Parte 8): Mecanismos de atención
  9. Redes neuronales: así de sencillo (Parte 9): Documentamos el trabajo realizado
  10. Redes neuronales: así de sencillo (Parte 10): Multi-Head Attention (atención multi-cabeza)
  11. Redes neuronales: así de sencillo (Parte 11): Variaciones de GTP
  12. Redes neuronales: así de sencillo (Parte 12): Dropout
  13. Redes neuronales: así de sencillo (Parte 13): Normalización por lotes (Batch Normalization)

Programas utilizados en el artículo:

# Nombre Tipo Descripción
1 clustering.py Script Script de clusterización de datos en Python



Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/10785

Archivos adjuntos |
clustering.py (2.97 KB)
Vídeo: Comercio automatizado simple: cómo crear un asesor comercial sencillo usando MQL5 Vídeo: Comercio automatizado simple: cómo crear un asesor comercial sencillo usando MQL5
La mayoría de los estudiantes de mis cursos consideraban que el lenguaje MQL5 era difícil de entender. Asimismo, buscaban formas sencillas de automatizar algunos procesos. En este artículo, el lector aprenderá cómo comenzar a trabajar directamente en MQL5 incluso sin conocimientos de programación y habiendo tenido incluso intentos fallidos de dominar este tema en el pasado.
Desarrollando un EA comercial desde cero (Parte 19): Un nuevo sistema de órdenes (II) Desarrollando un EA comercial desde cero (Parte 19): Un nuevo sistema de órdenes (II)
Aquí vamos a desarrollar un sistema gráfico de órdenes, del tipo «vea lo que está pasando». Cabe decir que no partiremos de cero, sino que modificaremos el sistema existente añadiendo aún más objetos y eventos al gráfico del activo que estamos negociando.
Desarrollando un EA comercial desde cero (Parte 20): Un nuevo sistema de órdenes (III) Desarrollando un EA comercial desde cero (Parte 20): Un nuevo sistema de órdenes (III)
Continuemos con la implantación del nuevo sistema de órdenes. La creación de este sistema es algo que exige un buen dominio de MQL5, así como entender cómo funciona en realidad la plataforma MetaTrader 5 y qué recursos nos proporciona.
Desarrollando un EA comercial desde cero (Parte 18): Un nuevo sistema de órdenes (I) Desarrollando un EA comercial desde cero (Parte 18): Un nuevo sistema de órdenes (I)
Esta es la primera parte del nuevo sistema de ordenes. Desde que este EA comenzó a tener su desarrollo documentado en artículos, ha sufrido varios cambios y mejoras, si bien ha mantenido el mismo modelo de sistema de órdenes en el gráfico.