English Русский 中文 Deutsch 日本語
preview
Redes generativas antagónicas (GAN) para datos sintéticos en modelos financieros (Parte 2): Creación de símbolos sintéticos para pruebas

Redes generativas antagónicas (GAN) para datos sintéticos en modelos financieros (Parte 2): Creación de símbolos sintéticos para pruebas

MetaTrader 5Aprendizaje automático |
147 0
LiviaObongo
LiviaObongo

Introducción

En la modelización financiera, los operadores se enfrentan a un gran desafío: la gran mayoría de las veces hay pocos datos disponibles. Esta limitación puede dificultar la creación y evaluación de técnicas de negociación, especialmente cuando las caídas, la alta volatilidad o la consolidación prolongada del mercado no están bien representadas en los conjuntos de datos. Por este motivo, al utilizar estas estrategias, los datos rara vez son lo suficientemente diversos o completos como para generalizar el rendimiento, especialmente en el entorno del mundo real. Además, la estructura de los mercados financieros se ve influenciada por diversos factores como los cambios geopolíticos y las modificaciones de las políticas económicas. Los datos históricos son limitados para captar las diferentes variables del mercado, lo que hace que los operadores dependan de algoritmos con buenos registros de pruebas retrospectivas, pero que sean incapaces de adaptarse a consolidaciones de mercado nuevas o impredecibles. 

Para superar todos estos desafíos, el uso de datos artificiales se ha considerado actualmente la mejor solución. Los datos sintéticos pueden reemplazar o complementar los datos históricos tradicionales al proporcionar una variedad realista y rica de condiciones de mercado, incluidas las asimétricas. Esto ayuda a ampliar y fortalecer las estrategias de negociación, ya que aquí se mejoran las pruebas de estrés y la capacidad de generalizar los modelos. 

En nuestra Parte 1 hemos mejorado la diversidad de los conjuntos de datos y la solidez de los modelos. Ahora, en esta segunda parte de nuestra serie, los temas de debate son las GAN reales como herramienta para crear datos sintéticos aplicados a conjuntos de datos financieros. Las GAN son un enfoque de aprendizaje automático de vanguardia para realizar predicciones precisas, muy eficaz a la hora de trazar registros numéricos existentes del historial financiero y sintetizar datos que reproducen de forma realista las tendencias reales del mercado. Este artículo muestra cómo crear símbolos sintéticos utilizando técnicas avanzadas de aprendizaje automático, como las redes generativas adversarias (GAN), y verifica su similitud con los datos reales del mercado mediante métodos estadísticos como Shapiro-Wilk, la prueba t de Student y Levene. Al garantizar la integridad de los datos, los operadores pueden utilizar con confianza los datos sintéticos en sus sistemas de negociación.


Comprender las GAN en el modelado financiero 

Las redes generativas adversarias (Generative Adversarial Networks, GAN) representan un avance significativo en el aprendizaje automático, centrándose en la generación de datos artificiales que se asemejan mucho a los conjuntos de datos reales. Compuestas por dos redes neuronales, el generador y el discriminador, las GAN funcionan mediante una dinámica de aprendizaje competitiva. El generador produce datos indistinguibles de los datos reales, mientras que el discriminador diferencia entre datos reales y sintéticos. Esta interacción conduce a la mejora continua de ambas redes, lo que da como resultado datos sintéticos muy realistas.

En el modelado financiero, las GAN abordan eficazmente cuestiones fundamentales relacionadas con la escasez de datos. Los datos financieros históricos, en particular los relativos a los mercados, se enfrentan a dificultades de accesibilidad debido a las restricciones normativas, lo que dificulta su obtención. Además, eventos como caídas del mercado y subidas repentinas de precios son poco frecuentes en los conjuntos de datos de entrenamiento, lo que limita la generalización de ciertas estrategias en diversas condiciones de mercado.

Las GAN destacan en la producción de datos financieros sintéticos que reflejan las características de los datos reales, compensando así la falta de registros históricos. Estos conjuntos de datos sintéticos amplían la información disponible para los operadores e investigadores, lo que facilita la prueba y el perfeccionamiento de los algoritmos. Las GAN pueden generar diversos tipos de datos, como secuencias de precios o ocurrencias de eventos poco frecuentes, lo que permite a los operadores evaluar sus algoritmos en escenarios nunca antes vistos.

La creación de un modelo financiero sintético comienza con el empleo de una GAN para generar datos que reproduzcan fielmente las condiciones del mundo real. Este complejo proceso requiere varios pasos esenciales para garantizar la fidelidad de los datos generados, mejorando así los esfuerzos y estrategias de modelización en el ámbito financiero.

Para iniciar el proceso de entrenamiento de una red generativa adversaria (GAN) para la predicción de datos financieros, primero se deben recopilar datos históricos sobre tipos de cambio, como el EURUSD. Estos datos sirven como material de entrenamiento esencial para el sistema GAN. Los datos financieros brutos se someten a un proceso de limpieza para garantizar la coherencia de los valores, lo que implica la normalización y la eliminación de cualquier dato que falte. A continuación, los datos limpios se normalizan a un rango entre -1 y 1 mediante un escalado adecuado para mejorar la eficacia de la GAN. Además, el procesamiento de estos datos de series temporales debería generar características derivadas capaces de identificar patrones significativos relevantes para la predicción.

Tras la adquisición de datos, se diseña la arquitectura GAN, en la que la red generadora sintetiza datos a partir de entradas de ruido aleatorio. Un vector aleatorio, o espacio latente, sirve como entrada a esta red, con el objetivo de replicar los patrones encontrados en los datos reales. El modelo generativo ajusta iterativamente su salida basándose en la retroalimentación del discriminador, que evalúa la autenticidad de los datos generados en comparación con los datos reales. Esta formación continua implica una interacción competitiva entre los dos componentes, en la que el generador busca mejorar sus simulaciones de datos, mientras que el discriminador mejora su capacidad para distinguir entre datos reales y sintéticos.

El proceso de entrenamiento consiste en ejecutar múltiples épocas para la optimización simultánea de ambas redes, lo que requiere un ajuste cuidadoso de las tasas de aprendizaje para garantizar la convergencia. El generador tiene como objetivo minimizar las pérdidas engañando al discriminador, mientras que el discriminador trabaja para maximizar su precisión a la hora de diferenciar entre datos reales y falsos, guiado por dos funciones de pérdida distintas a lo largo del entrenamiento.

Los símbolos sintéticos desempeñan un papel crucial para los operadores, ya que mejoran los datos históricos para obtener mejores herramientas de modelización. Simulan el comportamiento realista del mercado, proporcionando diversos conjuntos de datos para probar estrategias de negociación en diversas condiciones de mercado, incluyendo caídas significativas y volatilidad. Esto reduce el sobreajuste en los modelos de aprendizaje automático al evitar la dependencia de tendencias históricas singulares. Además, los datos sintéticos permiten explorar escenarios hipotéticos, lo que permite a los operadores predecir cambios inesperados en el mercado. En última instancia, los operadores pueden desarrollar y perfeccionar sus estrategias de negociación de manera eficaz utilizando este sistema.


Generación de datos sintéticos en MQL5

La creación de datos sintéticos en MQL5 implica un proceso estructurado que combina el aprendizaje automático con las características de la plataforma. Mediante la tecnología GAN, generamos datos financieros realistas que se ajustan a los patrones comerciales reales. A continuación se muestra la guía paso a paso.

Comenzamos exportando los datos sintéticos creados por la GAN para cumplir los requisitos de MetaTrader 5. El modelo GAN crea datos de mercado sintéticos que MetaTrader 5 puede leer desde un archivo CSV estándar que incluye información básica sobre precios. Prepare la estructura CSV para que coincida con los estándares del sistema MetaTrader, de modo que pueda conectarla fácilmente a la plataforma.

Para utilizar datos sintéticos en el trading, deben importarse a MetaTrader 5 como un símbolo personalizado. Seleccione la pestaña Símbolos en MetaTrader 5 y establezca un nuevo símbolo. Dale un título adecuado, como «SYNTH_EURUSD». La función MQL5 CustomRatesUpdate introduce datos CSV en nuestro símbolo sintético. Nuestra herramienta del sistema carga información de series temporales sintéticas en la plataforma de negociación para su uso. Comprueba tu nuevo símbolo sintético en el observatorio del mercado para asegurarte de que sus datos coinciden con la estructura que has creado.  

Mediante estos procesos, los operadores pueden integrar datos sintéticos personalizados en su plataforma MetaTrader 5 para desarrollar estrategias en escenarios de mercado reales.

A continuación se muestra un código que muestra cómo importar datos sintéticos EURUSD desde un archivo CSV a MetaTrader 5. Crea un símbolo sintético, configura sus propiedades y lo actualiza con datos históricos del archivo CSV.

#define SYNTHETIC_CSV_FILE_NAME "EURUSD_3_years_synthetic.csv"
// Function to read synthetic data from a CSV filebool ReadSyntheticDataFromCSV(const string fileName, MqlRates &rates[])
{    int fileHandle = FileOpen(fileName, FILE_CSV | FILE_READ | FILE_ANSI);
    if (fileHandle == INVALID_HANDLE)    {
        Print("Error opening file: ", GetLastError());        return false;
    }
    ArrayResize(rates, 0);
    while (!FileIsEnding(fileHandle))    {
        string line = FileReadString(fileHandle);        StringReplace(line, ",", ".");
        string fields[];        int fieldCount = StringSplit(line, ';', fields);
        if (fieldCount >= 6)
        {            MqlRates rate;
            rate.time = (datetime)StringToTime(fields[0]);            rate.open = StringToDouble(fields[1]);
            rate.high = StringToDouble(fields[2]);            rate.low = StringToDouble(fields[3]);
            rate.close = StringToDouble(fields[4]);            rate.tick_volume = (long)StringToInteger(fields[5]);
            rate.spread = 0;            rate.real_volume = 0;
            int currentSize = ArraySize(rates);
            ArrayResize(rates, currentSize + 1);            rates[currentSize] = rate;
        }    }
    FileClose(fileHandle);
    Print("Synthetic data successfully read from CSV.");    return true;
}
void OnStart(){
   string syntheticSymbol = "SYNTH_EURUSD";
   // Step 1: Create or Reset the Synthetic Symbol   if (!CustomSymbolCreate(syntheticSymbol))
   {      Print("Error creating synthetic symbol: ", GetLastError());
      return;   }
   // Step 2: Configure the Symbol Properties
   CustomSymbolSetInteger(syntheticSymbol, SYMBOL_DIGITS, 5);   CustomSymbolSetDouble(syntheticSymbol, SYMBOL_POINT, 0.00001);
   CustomSymbolSetDouble(syntheticSymbol, SYMBOL_TRADE_TICK_VALUE, 1);   CustomSymbolSetDouble(syntheticSymbol, SYMBOL_TRADE_TICK_SIZE, 0.00001);
   CustomSymbolSetInteger(syntheticSymbol, SYMBOL_SPREAD_FLOAT, true);
   // Step 3: Load Data from CSV   MqlRates rates[];
   if (!ReadSyntheticDataFromCSV(SYNTHETIC_CSV_FILE_NAME, rates))   {
      Print("Error reading synthetic data from CSV.");      return;
   }
   // Step 4: Update Rates and Add to Market Watch   if (!CustomRatesUpdate(syntheticSymbol, rates))
   {      Print("Error updating synthetic symbol rates: ", GetLastError());
      return;   }
   MarketBookAdd(syntheticSymbol); // Add to Market Watch
   Print("Synthetic symbol successfully created and added to Market Watch.");}

  • Añade este script al MetaEditor y compílalo.
  • Ejecute el script en el EURUSD real desde el panel Navegador en MetaTrader 5.
  • Compruebe que el símbolo sintético aparece en la ventana "Observación del Mercado" con los datos importados.

A continuación se muestra la ventana del gráfico de nuestro símbolo sintético «SYNTH_EURUSD»:

El símbolo sintético debe verificarse con datos reales del mercado una vez que se ha creado. El análisis utiliza pruebas estadísticas para comprobar si los dos conjuntos de datos se ajustan a sus patrones básicos. Nuestras pruebas verifican que los datos simulados se comportan como los datos reales del mercado, lo que garantiza la fiabilidad de las plataformas de negociación. A continuación se detallan los métodos estadísticos aplicados:


Prueba de Shapiro-Wilk

Esta prueba examina si un conjunto de datos se ajusta a un patrón estadístico normal. Mediante pruebas estadísticas, los operadores verifican que los datos sintéticos coincidan con los patrones generales de movimiento de precios de los mercados bursátiles reales. El modelado realista de datos funciona cuando estos conjuntos de datos coinciden bien.

  • Hipótesis:
    • H₀ (hipótesis nula): los datos siguen una distribución normal.
    • H₁ (Hipótesis alternativa): Los datos no siguen una distribución normal.

Interpretación:

  • Si p > 0.05, es probable que los datos sigan una distribución normal (se acepta H₀).
  • Si p ≤ 0.05, los datos no siguen una distribución normal (se rechaza H₀).

Ejemplo del artículo:

Los datos históricos del EURUSD y los datos sintéticos del EURUSD están alineados con los mismos marcos temporales. La prueba de Shapiro-Wilk se aplica a ambos conjuntos de datos para comparar sus distribuciones.

Resultados:

  • Datos sintéticos: W = 0.998 , p = 0.432
  • Datos reales: W = 0.997 , p = 0.398

Ambos conjuntos de datos tienen p > 0.05, lo que indica que siguen una distribución normal.

Aquí está el código Python para realizar la prueba de Shapiro-Wilk en tus conjuntos de datos utilizando la biblioteca scipy.stats:

import pandas as pd
from scipy.stats import shapiro

# Load synthetic and real datasets
synthetic_data = pd.read_csv('EURUSD_3_years_synthetic(1).csv')
real_data = pd.read_csv('EURUSD_CSV(1).csv')

# Select the 'close' column for the test
synthetic_close = synthetic_data['close']
real_close = real_data['close']

# Perform Shapiro-Wilk test
synthetic_stat, synthetic_p = shapiro(synthetic_close)
real_stat, real_p = shapiro(real_close)

# Print results
print("Shapiro–Wilk Test Results:")
print(f"Synthetic Data W-statistic: {synthetic_stat:.4f}, P-value: {synthetic_p:.4f}")
print(f"Real Data W-statistic: {real_stat:.4f}, P-value: {real_p:.4f}")

# Interpretation
if synthetic_p > 0.05:
    print("Synthetic data follows a normal distribution.")
else:
    print("Synthetic data does not follow a normal distribution.")

if real_p > 0.05:
    print("Real data follows a normal distribution.")
else:
    print("Real data does not follow a normal distribution.")


Prueba t de Student

La prueba t nos ayuda a ver si dos conjuntos de datos tienen mediciones medias idénticas desde el punto de vista estadístico. Nuestros modelos financieros deben demostrar que el comportamiento de los precios a partir de datos sintéticos coincide con los patrones del mercado real. El análisis ayuda a verificar cómo los precios suelen subir y bajar en un mercado típico.

  • Hipótesis:
    • H₀: Los valores medios son iguales.
    • H₁: Los valores medios no son iguales.

Interpretación:

  • Si p > 0.05, no hay diferencias significativas entre las medias (se acepta H₀).
  • Si p ≤ 0.05, las medias son significativamente diferentes (se rechaza H₀).

Ejemplo del artículo:

Los datos sintéticos y reales del EURUSD del mismo periodo de tiempo se comparan utilizando una prueba t independiente de dos muestras para evaluar si sus valores medios difieren.

Resultados:

  • T = 0.534 , p = 0.594

Dado que p > 0.05, no hay diferencias significativas entre los valores medios de los dos conjuntos de datos.

Este es el código Python para realizar una prueba t de Student con el fin de comparar las medias de la columna «close» en los conjuntos de datos sintéticos y reales:

import pandas as pd
from scipy.stats import ttest_ind

# Load synthetic and real datasets
synthetic_data = pd.read_csv('EURUSD_3_years_synthetic(1).csv')
real_data = pd.read_csv('EURUSD_CSV(1).csv')

# Select the 'close' column for the test
synthetic_close = synthetic_data['close']
real_close = real_data['close']

# Perform Student's t-test
t_stat, p_value = ttest_ind(synthetic_close, real_close, equal_var=False)  # Use equal_var=False if variances are unequal

# Print results
print("Student's T-Test Results:")
print(f"T-statistic: {t_stat:.4f}, P-value: {p_value:.4f}")

# Interpretation
if p_value > 0.05:
    print("The means of the synthetic and real data are not significantly different.")
else:
    print("The means of the synthetic and real data are significantly different.")


Prueba de Levene

Esta prueba compara la estabilidad de la varianza de los datos entre ambos conjuntos de pruebas. El nivel de fluctuación de los precios se refleja en forma de variación en los datos comerciales. La validación demuestra que los datos sintéticos muestran patrones de volatilidad de precios similares, lo que significa que pueden representar con precisión el comportamiento del mercado.

  • Hipótesis:
    • H₀: Las varianzas son iguales.
    • H₁: Las varianzas no son iguales.

Interpretación:

  • Si p > 0.05, las varianzas son estadísticamente similares (se acepta H₀).
  • Si p ≤ 0.05, las varianzas son significativamente diferentes (se rechaza H₀).

Ejemplo del artículo:

Se comparan las variaciones de los datos reales y sintéticos del EURUSD para evaluar sus patrones de volatilidad.

Resultados:

  • W = 0.8742 , p = 0.3517

Dado que p > 0.05, no hay diferencias significativas entre las varianzas de los conjuntos de datos.

Este es el código Python para realizar la prueba de Levene y comparar las varianzas de la columna «close» en los conjuntos de datos sintéticos y reales:

import pandas as pd
from scipy.stats import levene

# Load synthetic and real datasets
synthetic_data = pd.read_csv('EURUSD_3_years_synthetic(1).csv')
real_data = pd.read_csv('EURUSD_CSV(1).csv')

# Select the 'close' column for the test
synthetic_close = synthetic_data['close']
real_close = real_data['close']

# Perform Levene's test
stat, p_value = levene(synthetic_close, real_close)

# Print results
print("Levene's Test Results:")
print(f"Statistic: {stat:.4f}, P-value: {p_value:.4f}")

# Interpretation
if p_value > 0.05:
    print("The variances of the synthetic and real data are not significantly different.")
else:
    print("The variances of the synthetic and real data are significantly different.")


Conclusión

El artículo analiza cómo los datos sintetizados mejoran el análisis financiero al abordar cuestiones como la limitación de los datos archivados, las muestras no representativas y las pruebas de estrés insuficientes.

Mediante el uso de herramientas MQL5 y redes generativas adversarias (Generative Adversarial Networks, GAN), los operadores pueden crear conjuntos de datos sintéticos genuinos que simulan diversas condiciones de mercado. Esta combinación produce un marco para generar símbolos sintéticos, con técnicas de validación como Shapiro-Wilk y la prueba t de Student, que garantizan la similitud estadística con los datos reales del mercado.

Los símbolos sintéticos facilitan la realización de pruebas sólidas, reducen los errores de optimización y mejoran la resiliencia ante los cambios del mercado, lo que permite a los operadores perfeccionar sus estrategias con confianza. En última instancia, este enfoque mejora los algoritmos de negociación y la toma de decisiones, fomentando sistemas financieros adaptables capaces de responder a un panorama de mercado dinámico.

Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/16428

Archivos adjuntos |
Redes neuronales en el trading: Modelos híbridos de secuencias de grafos (Final) Redes neuronales en el trading: Modelos híbridos de secuencias de grafos (Final)
Continuamos nuestro estudio de los modelos híbridos de secuencias de grafos (GSM++) que integran las ventajas de distintas arquitecturas, proporcionando una gran precisión de análisis y una asignación eficiente de los recursos computacionales. Estos modelos revelan eficazmente patrones ocultos, reduciendo el impacto del ruido del mercado y mejorando la calidad de las previsiones.
Indicador de estimación de fuerza y debilidad de pares de divisas en MQL5 puro Indicador de estimación de fuerza y debilidad de pares de divisas en MQL5 puro
Hoy crearemos un indicador profesional para analizar la fuerza de las divisas en MQL5. Esta guía paso a paso le enseñará cómo desarrollar una poderosa herramienta comercial con un tablero visual para MetaTrader 5. Asimismo, aprenderá a calcular la fuerza de los pares de divisas en múltiples marcos temporales (H1, H4, D1), a implementar actualizaciones dinámicas de datos y a crear una interfaz fácil de usar.
Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 10): Flujo externo (II) VWAP Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 10): Flujo externo (II) VWAP
¡Domina el poder del VWAP con nuestra guía completa! Aprenda a integrar el análisis VWAP en su estrategia de trading utilizando MQL5 y Python. Maximice su conocimiento del mercado y mejore sus decisiones comerciales hoy mismo.
Gestión de capital en el trading y programa de contabilidad doméstica del tráder con base de datos Gestión de capital en el trading y programa de contabilidad doméstica del tráder con base de datos
¿Cómo gestiona el capital un tráder? ¿Cómo debe llevar el tráder y el inversor los registros de gastos, ingresos, activos y pasivos? No solo voy a presentarle un programa de contabilidad, sino una herramienta que puede convertirse en su navegante financiero de confianza en el turbulento mar del trading.