Redes Adversariais Generativas (GANs) para Dados Sintéticos em Modelagem Financeira (Parte 2): Criação de Símbolo Sintético para Testes
Introdução
Na modelagem financeira, os traders enfrentam um grande desafio; na maior parte do tempo, há poucos dados disponíveis. Essa limitação pode prejudicar a criação e a avaliação de técnicas de negociação, especialmente quando quedas, alta volatilidade ou consolidações prolongadas de mercado não estão bem representadas nos conjuntos de dados. Por esse motivo, ao utilizar essas estratégias, os dados raramente são diversos ou abrangentes o suficiente para generalizar o desempenho, especialmente no ambiente do mundo real. Além disso, a estrutura dos mercados financeiros é influenciada por vários fatores, como mudanças geopolíticas e alterações nas políticas econômicas. Os dados históricos são limitados na captura das diferentes variáveis do mercado, deixando os traders dependentes de algoritmos com bons registros de backtest, mas incapazes de se adaptar a novas ou imprevisíveis consolidações de mercado.
Para superar todos esses desafios, o uso de dados artificiais passou a ser considerado a melhor solução. Os dados sintéticos podem substituir ou complementar os dados históricos tradicionais ao fornecer uma variedade rica e realista de condições de mercado, incluindo condições assimétricas. Isso ajuda a ampliar e fortalecer as estratégias de negociação, pois os testes de estresse e a capacidade de generalização dos modelos são aprimorados.
Na nossa Parte 1 aprimoramos a diversidade do conjunto de dados e a robustez do modelo; agora, nesta segunda parte da nossa série, os tópicos de discussão são as GANs propriamente ditas como ferramenta para a criação de dados sintéticos aplicados a conjuntos de dados financeiros. As GANs são uma abordagem de aprendizado de máquina de ponta para realizar previsões precisas, sendo proficientes em mapear registros numéricos existentes do histórico financeiro e sintetizar dados que replicam de forma realista as tendências reais do mercado. Este artigo demonstra como criar símbolos sintéticos usando técnicas avançadas de aprendizado de máquina, como GANs (Redes Adversariais Generativas), e verifica sua similaridade com dados reais de mercado por meio de métodos estatísticos, como Shapiro-Wilk, teste t de Student e Levene. Ao garantir a integridade dos dados, os traders podem usar dados sintéticos com confiança em seus sistemas de negociação.
Compreendendo as GANs na Modelagem Financeira
As Redes Adversariais Generativas (GANs) representam um avanço significativo no aprendizado de máquina, com foco na geração de dados artificiais que se assemelham de perto a conjuntos de dados reais. Compostas por duas redes neurais, o Gerador e o Discriminador, as GANs operam por meio de uma dinâmica de aprendizado competitiva. O Gerador produz dados indistinguíveis dos dados reais, enquanto o Discriminador diferencia entre dados reais e sintéticos. Essa interação leva ao aprimoramento contínuo de ambas as redes, resultando em dados sintéticos altamente realistas.
Na modelagem financeira, as GANs abordam de forma eficaz questões fundamentais relacionadas à escassez de dados. Os dados financeiros históricos, especialmente os relacionados aos mercados, enfrentam desafios de acessibilidade devido a restrições regulatórias, o que dificulta sua obtenção. Além disso, eventos como quedas de mercado e picos repentinos de preços são pouco frequentes nos conjuntos de dados de treinamento, o que limita a generalização de determinadas estratégias em diferentes condições de mercado.
As GANs se destacam na produção de dados financeiros sintéticos que refletem as características dos dados reais, compensando assim a ausência de registros históricos. Esses conjuntos de dados sintéticos ampliam as informações disponíveis para traders e pesquisadores, facilitando o teste e o refinamento de algoritmos. As GANs podem gerar diversas formas de dados, como sequências de preços ou ocorrências de eventos raros, permitindo que os traders avaliem seus algoritmos em cenários anteriormente não observados.
A criação de um modelo financeiro sintético começa com o uso de uma GAN para gerar dados que replicam de forma próxima as condições do mundo real. Esse processo complexo exige várias etapas essenciais para garantir a fidelidade dos dados gerados, aprimorando assim os esforços de modelagem e as estratégias dentro do domínio financeiro.
Para iniciar o processo de treinamento de uma Rede Adversarial Generativa (GAN) para previsão de dados financeiros, os dados históricos de taxas de câmbio, como o EURUSD, devem primeiro ser coletados. Esses dados servem como material de treinamento essencial para o sistema GAN. Os dados financeiros brutos passam por um processo de limpeza para garantir valores consistentes, o que envolve normalização e a remoção de quaisquer pontos de dados ausentes. Os dados limpos são então normalizados para um intervalo entre -1 e 1 por meio de escalonamento apropriado, a fim de aumentar a eficácia da GAN. Além disso, o processamento dessa série temporal deve gerar características derivadas capazes de identificar padrões significativos relevantes para a previsão.
Após a aquisição dos dados, a arquitetura da GAN é projetada, na qual a rede geradora sintetiza dados a partir de entradas de ruído aleatório. Um vetor aleatório, ou espaço latente, serve como entrada para essa rede, com o objetivo de replicar os padrões encontrados nos dados reais. O modelo generativo ajusta iterativamente sua saída com base no feedback do discriminador, que avalia a autenticidade dos dados gerados em comparação com os dados reais. Esse treinamento contínuo envolve uma interação competitiva entre os dois componentes, em que o gerador busca aprimorar suas simulações de dados, enquanto o discriminador melhora sua capacidade de distinguir entre dados reais e sintéticos.
O processo de treinamento consiste na execução de múltiplas épocas para a otimização simultânea de ambas as redes, exigindo um ajuste cuidadoso das taxas de aprendizado para garantir a convergência. O gerador busca minimizar a perda enganando o discriminador, enquanto o discriminador trabalha para maximizar sua precisão ao diferenciar entre dados reais e falsos, orientado por duas funções de perda distintas ao longo do treinamento.
Os símbolos sintéticos desempenham um papel crucial para os traders ao aprimorar dados passados para melhores ferramentas de modelagem. Eles simulam o comportamento realista do mercado, fornecendo conjuntos de dados diversos para testar estratégias de negociação sob várias condições de mercado, incluindo quedas significativas e volatilidade. Isso reduz o overfitting em modelos de aprendizado de máquina ao evitar a dependência de tendências históricas únicas. Além disso, os dados sintéticos permitem a exploração de cenários hipotéticos, possibilitando que os traders prevejam mudanças inesperadas do mercado. Em última análise, os traders podem desenvolver e refinar suas estratégias de negociação de forma eficaz usando esse sistema.
Geração de Dados Sintéticos em MQL5
A criação de dados sintéticos em MQL5 envolve um processo estruturado que combina aprendizado de máquina com os recursos da plataforma. Usando a tecnologia de GANs, geramos dados financeiros realistas que correspondem aos padrões reais de negociação. A seguir está o guia passo a passo.
Começamos exportando os dados sintéticos criados pela GAN para atender aos requisitos do MetaTrader 5. O modelo GAN cria dados de mercado sintéticos que o MetaTrader 5 pode ler a partir de um arquivo CSV padrão que inclui informações básicas de preços. Prepare a estrutura do seu CSV para corresponder aos padrões do sistema MetaTrader, de modo que você possa conectá-lo facilmente à plataforma.
Para utilizar dados sintéticos na negociação, eles devem ser importados para o MetaTrader 5 como um símbolo personalizado. Selecione a aba Símbolos no MetaTrader 5 e estabeleça um novo símbolo. Dê a ele um título apropriado, como "SYNTH_EURUSD". A função CustomRatesUpdate do MQL5 alimenta o símbolo sintético com dados do CSV. Nossa ferramenta de sistema carrega informações de séries temporais sintéticas na plataforma de negociação para uso. Verifique seu novo símbolo sintético na observação de mercado para garantir que seus dados correspondam à estrutura que você criou.
Usando esses processos, os traders podem integrar dados sintéticos personalizados em sua plataforma MetaTrader 5 para o desenvolvimento de estratégias sob cenários reais de mercado.
Abaixo está um código que demonstra como importar dados sintéticos do EURUSD de um arquivo CSV para o MetaTrader 5. Ele cria um símbolo sintético, configura suas propriedades e o atualiza com dados históricos do arquivo 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.");}
- Adicione este script ao MetaEditor e compile-o.
- Execute o script no EURUSD real a partir do painel Navegador no MetaTrader 5.
- Verifique se o símbolo sintético aparece na janela Observação do Mercado com os dados importados.
Abaixo está a janela de gráfico do nosso símbolo sintético "SYNTH_EURUSD":

O símbolo sintético precisa de verificação em relação aos dados reais do mercado depois de ser construído. A análise utiliza testes estatísticos para verificar se os dois conjuntos de dados permanecem fiéis aos seus padrões básicos. Nossos testes verificam se os dados simulados se comportam como dados reais de mercado, o que mantém as plataformas de negociação confiáveis. Abaixo estão os métodos estatísticos aplicados:
Teste de Shapiro-Wilk
Este teste examina se um conjunto de dados se ajusta a um padrão estatístico normal. Por meio de testes estatísticos, os traders verificam se os dados sintéticos correspondem aos padrões gerais de movimento de preços dos mercados de negociação genuínos. A modelagem realista de dados funciona quando esses conjuntos de dados apresentam boa correspondência.
- Hipóteses:
- H₀ (Hipótese Nula): Os dados são normalmente distribuídos.
- H₁ (Hipótese Alternativa): Os dados não são normalmente distribuídos.
Interpretação:
- Se p > 0.05 , os dados provavelmente são normalmente distribuídos (H₀ é aceita).
- Se p ≤ 0.05 , os dados não seguem uma distribuição normal (H₀ é rejeitada).
Exemplo do artigo:
Os dados históricos do EURUSD e os dados sintéticos do EURUSD são alinhados aos mesmos períodos de tempo. O teste de Shapiro–Wilk é aplicado a ambos os conjuntos de dados para comparar suas distribuições.
Resultados:
- Dados sintéticos: W = 0.998 , p = 0.432
- Dados reais: W = 0.997 , p = 0.398
Ambos os conjuntos de dados têm p > 0.05 , indicando que seguem uma distribuição normal.
Aqui está o código Python para realizar o teste de Shapiro–Wilk em seus conjuntos de dados usando a 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.")
Teste t de Student
O teste t nos ajuda a verificar se dois conjuntos de dados possuem médias idênticas do ponto de vista estatístico. Nossos modelos financeiros precisam demonstrar que o comportamento de preços dos dados sintéticos corresponde aos padrões do mercado do mundo real. A análise ajuda a verificar como os preços normalmente sobem e descem em um mercado típico.
- Hipóteses:
- H₀: Os valores médios são iguais.
- H₁: Os valores médios não são iguais.
Interpretação:
- Se p > 0.05 , não há diferença significativa entre as médias (H₀ é aceita).
- Se p ≤ 0.05 , as médias são significativamente diferentes (H₀ é rejeitada).
Exemplo do artigo:
Os dados sintéticos e reais do EURUSD do mesmo período de tempo são comparados usando um teste t independente de duas amostras para avaliar se seus valores médios diferem.
Resultados:
- T = 0.534 , p = 0.594
Como p > 0.05 , não há diferença significativa entre os valores médios dos dois conjuntos de dados.
Aqui está o código Python para realizar um teste t de Student para comparar as médias da coluna "close" nos conjuntos de dados sintético e real:
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.")
Teste de Levene
Este teste compara a estabilidade da variância dos dados entre ambos os conjuntos de teste. O nível de flutuação dos preços se manifesta como uma variância nos dados de negociação. A validação comprova que os dados sintéticos apresentam padrões de volatilidade de preços semelhantes, o que significa que podem representar com precisão o comportamento do mercado.
- Hipóteses:
- H₀: As variâncias são iguais.
- H₁: As variâncias não são iguais.
Interpretação:
- Se p > 0.05 , as variâncias são estatisticamente semelhantes (H₀ é aceita).
- Se p ≤ 0.05 , as variâncias são significativamente diferentes (H₀ é rejeitada).
Exemplo do artigo:
As variâncias dos dados reais e sintéticos do EURUSD são comparadas para avaliar seus padrões de volatilidade.
Resultados:
- W = 0.8742 , p = 0.3517
Como p > 0.05 , não há diferença significativa entre as variâncias dos conjuntos de dados.
Aqui está o código Python para realizar o Teste de Levene para comparar as variâncias da coluna "close" nos conjuntos de dados sintético e real:
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.")
Conclusão
O artigo discute como os dados sintetizados aprimoram a análise financeira ao abordar questões como dados históricos limitados, amostras não representativas e testes de estresse insuficientes.
Ao utilizar ferramentas MQL5 e Redes Adversariais Generativas (GANs), os traders podem criar conjuntos de dados sintéticos autênticos que simulam diversas condições de mercado. Essa combinação produz uma estrutura para a geração de símbolos sintéticos, com técnicas de validação como Shapiro-Wilk e o teste t de Student garantindo similaridade estatística com dados reais de mercado.
Os símbolos sintéticos facilitam testes robustos, reduzem erros de otimização e aumentam a resiliência às mudanças do mercado, permitindo que os traders refinem suas estratégias com confiança. Em última análise, essa abordagem impulsiona algoritmos de negociação e a tomada de decisão, promovendo sistemas financeiros adaptáveis capazes de responder a um cenário de mercado dinâmico.
Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/16428
Aviso: Todos os direitos sobre esses materiais pertencem à MetaQuotes Ltd. É proibida a reimpressão total ou parcial.
Esse artigo foi escrito por um usuário do site e reflete seu ponto de vista pessoal. A MetaQuotes Ltd. não se responsabiliza pela precisão das informações apresentadas nem pelas possíveis consequências decorrentes do uso das soluções, estratégias ou recomendações descritas.
Desenvolvimento do Kit de Ferramentas de Análise de Price Action (Parte 10): Fluxo Externo (II) VWAP
Do básico ao intermediário: Sobrecarga de operadores (V)
Construindo Expert Advisors Auto-Otimizáveis em MQL5 (Parte 5): Regras de Negociação Auto Adaptativas
Replay e Simulação de mercado: Gran Finale
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso