Rede neural quântica em MQL5 (Parte III): Processador quântico virtual com qubits
Na segunda parte do estudo, foi desenvolvido um sistema que usava análogos matemáticos de efeitos quânticos: ressonância (cosseno), interferência (seno) e decoerência (exponencial). No entanto, isso ainda era apenas uma imitação: formalmente elegante, mas essencialmente não quântico
Com o tempo, ficou claro: o modelo era elegante, mas não refletia a essência do processamento quântico, ou seja, superposição, emaranhamento e irreversibilidade das medições. Operávamos com funções, não com princípios.
As abordagens clássicas continuam limitadas:
- LSTM atinge até 58% de precisão
- Transformers são vulneráveis ao ruído
- ARIMA perdeu relevância
- Os modelos são instáveis devido ao sobreajuste
O principal avanço é a transição para qubits virtuais
Nessa segunda versão, em vez de análogos, foi adotado um processador quântico completo: 3 qubits, espaço de estados de 8 dimensões, portas e medições. A arquitetura foi revista: agora cada operação obedece às leis da mecânica quântica, como unitariedade, normalização e comportamento durante as medições.
Arquitetura do processador quântico
Cada qubit é representado como um vetor complexo em um espaço de Hilbert bidimensional.
struct ComplexVector { double real[STATE_DIM]; double imag[STATE_DIM]; int size; void Initialize(int dim) { size = dim; for(int i = 0; i < dim; i++) { real[i] = (i == 0) ? 1.0 : 0.0; // Начальное состояние |000⟩ imag[i] = 0.0; } } double GetProbability(int index) { return real[index] * real[index] + imag[index] * imag[index]; } void Normalize() { double norm = 0.0; for(int i = 0; i < size; i++) { norm += real[i] * real[i] + imag[i] * imag[i]; } norm = MathSqrt(norm); if(norm > MATRIX_EPSILON) { for(int i = 0; i < size; i++) { real[i] /= norm; imag[i] /= norm; } } } };
Este código implementa a estrutura básica para armazenar o estado quântico. Diferentemente dos bits clássicos, os estados quânticos têm amplitudes complexas que podem interferir entre si. A função GetProbability calcula a probabilidade de medir o sistema em um determinado estado de acordo com a regra de Born.
A particularidade da implementação é que trabalhamos não com qubits isolados, mas com o estado quântico completo de todo o sistema. Isso é essencial para modelar corretamente o emaranhamento e as correlações quânticas. Cada estado em nosso espaço de 8 dimensões corresponde a uma determinada combinação dos três qubits: |000⟩, |001⟩, |010⟩, |011⟩, |100⟩, |101⟩, |110⟩, |111⟩.
Portas quânticas: da teoria à prática
As portas de rotação implementam transformações unitárias, permitindo girar suavemente o estado do qubit na esfera de Bloch:
static void CreateRotationGate(int qubit, double angle, ComplexMatrix &gate) { gate.Initialize(STATE_DIM); double cos_half = MathCos(angle / 2.0); double sin_half = MathSin(angle / 2.0); for(int i = 0; i < STATE_DIM; i++) { for(int j = 0; j < STATE_DIM; j++) { gate.real[i][j] = 0.0; gate.imag[i][j] = 0.0; int bit_i = (i >> qubit) & 1; int bit_j = (j >> qubit) & 1; int other_bits_i = i & ~(1 << qubit); int other_bits_j = j & ~(1 << qubit); if(other_bits_i == other_bits_j) { if(bit_i == 0 && bit_j == 0) gate.real[i][j] = cos_half; else if(bit_i == 0 && bit_j == 1) gate.imag[i][j] = -sin_half; else if(bit_i == 1 && bit_j == 0) gate.imag[i][j] = -sin_half; else if(bit_i == 1 && bit_j == 1) gate.real[i][j] = cos_half; } } } }
Este código constrói a matriz da porta de rotação que atua sobre um qubit específico. O ângulo de rotação está diretamente ligado aos dados de mercado: quanto mais forte o movimento do preço, maior o ângulo de rotação. Isso cria uma conexão direta entre a dinâmica de mercado e o estado quântico do sistema.
O algoritmo usa operações bit a bit para determinar quais elementos da matriz devem ser definidos. Para cada par de estados |i⟩ e |j⟩, verificamos se a rotação de um qubit específico afeta a transição entre eles. Se todos os outros qubits estiverem no mesmo estado, a rotação atua apenas sobre o qubit-alvo.
As portas de fase controlada criam emaranhamento quântico entre os qubits:
static void CreateCPhaseGate(int control_qubit, int target_qubit, double phase, ComplexMatrix &gate) { gate.Initialize(STATE_DIM); for(int i = 0; i < STATE_DIM; i++) { int control_bit = (i >> control_qubit) & 1; int target_bit = (i >> target_qubit) & 1; if(control_bit == 1 && target_bit == 1) { gate.real[i][i] = MathCos(phase); gate.imag[i][i] = MathSin(phase); } } }
A fase φ depende das correlações entre os atributos de mercado. Quando dois fatores de mercado estão fortemente correlacionados, por exemplo, preço e volume, os qubits correspondentes ficam emaranhados. Isso permite que o sistema leve em conta relações complexas nos dados.
A porta de fase controlada funciona somente quando ambos os qubits estão no estado |1⟩. Nesse caso, ela adiciona o multiplicador de fase e^(iφ) à amplitude do estado correspondente. Isso não altera as probabilidades de medição dos qubits individuais, mas cria correlações quânticas entre eles.
As portas de Hadamard colocam os qubits em estados de superposição:
static void CreateHadamardGate(int qubit, ComplexMatrix &gate) { gate.Initialize(STATE_DIM); double inv_sqrt2 = 1.0 / MathSqrt(2.0); for(int i = 0; i < STATE_DIM; i++) { for(int j = 0; j < STATE_DIM; j++) { // ... код построения матрицы Адамара if(bit_i == 0 && bit_j == 0) gate.real[i][j] = inv_sqrt2; else if(bit_i == 0 && bit_j == 1) gate.real[i][j] = inv_sqrt2; else if(bit_i == 1 && bit_j == 0) gate.real[i][j] = inv_sqrt2; else if(bit_i == 1 && bit_j == 1) gate.real[i][j] = -inv_sqrt2; } } }
A porta de Hadamard cria uma superposição uniforme dos estados |0⟩ e |1⟩. No contexto de negociação, isso significa que o sistema pode considerar simultaneamente cenários de alta e de queda do mercado até o momento da "medição" final, isto é, a tomada da decisão de negociação.
Construção dinâmica de circuitos quânticos
A principal inovação é a construção dinâmica do circuito quântico com base nos dados de mercado recebidos. Cada atributo de mercado influencia os parâmetros das portas quânticas, definindo um processamento quântico próprio para cada situação de mercado.
void BuildQuantumCircuit(const vector &features) { num_gates = 0; quantum_state.Initialize(STATE_DIM); // Ротационные гейты на основе рыночных признаков for(int qubit = 0; qubit < NUM_QUBITS && num_gates < MAX_GATES; qubit++) { if(qubit < features.Size()) { double angle = features[qubit] * M_PI / 2.0; CMatrixOps::CreateRotationGate(qubit, angle, circuit_gates[num_gates]); num_gates++; } } // Запутывающие гейты между парами кубитов for(int i = 0; i < NUM_QUBITS - 1 && num_gates < MAX_GATES; i++) { for(int j = i + 1; j < NUM_QUBITS && num_gates < MAX_GATES; j++) { double correlation = CalculateFeatureCorrelation(features[i], features[j]); double phase = correlation * features[i] * features[j] * M_PI * entanglement_factor; if(MathAbs(phase) > MIN_PHASE_THRESHOLD) { CMatrixOps::CreateCPhaseGate(i, j, phase, circuit_gates[num_gates]); num_gates++; } } } // Адаптивные суперпозиционные гейты double market_uncertainty = CalculateMarketUncertainty(features); for(int qubit = 0; qubit < NUM_QUBITS && num_gates < MAX_GATES; qubit++) { double superposition_probability = coherence * market_uncertainty; if(GetRandomDouble() < superposition_probability) { CMatrixOps::CreateHadamardGate(qubit, circuit_gates[num_gates]); num_gates++; } } }
Este algoritmo mostra como os dados de mercado determinam diretamente a arquitetura do circuito quântico. Diferentemente das redes neurais estáticas, nosso sistema adapta sua estrutura interna a cada situação de mercado. Uma correlação elevada entre os atributos gera mais estados emaranhados, enquanto a incerteza do mercado aumenta a probabilidade de operações de superposição.
A particularidade da nossa abordagem é que não aplicamos simplesmente uma sequência fixa de portas. Em vez disso, o circuito é construído de modo adaptativo: se a correlação entre os atributos for fraca, as portas de emaranhamento correspondentes não são criadas. Se a incerteza do mercado for baixa, as portas de superposição serão aplicadas raramente. Isso permite ao sistema economizar recursos computacionais e se concentrar nos efeitos quânticos mais relevantes.
Evolução quântica e decoerência
Após a construção do circuito, o sistema passa para a evolução quântica, isto é, a aplicação sequencial de operadores unitários ao estado inicial |000⟩:
void ExecuteQuantumCircuit() { // Инициализируем состояние double state[STATE_DIM]; ArrayInitialize(state, 0.0); state[0] = 1.0; // Начальное состояние |000⟩ // Применяем каждый гейт в схеме for(int gate_idx = 0; gate_idx < num_gates; gate_idx++) { ApplyGateToState(state, gate_idx); } // Нормализуем состояние double norm = 0.0; for(int i = 0; i < STATE_DIM; i++) { norm += state[i] * state[i]; } norm = MathSqrt(norm); if(norm > MATRIX_EPSILON) { for(int i = 0; i < STATE_DIM; i++) { quantum_state.real[i] = state[i] / norm; quantum_state.imag[i] = 0.0; } } }
É fundamental que a ordem de aplicação dos operadores seja relevante, pois as portas quânticas não comutam. Isso significa que a sequência de eventos de mercado influencia o estado final do sistema, assim como acontece nos mercados reais, em que a ordem de chegada das informações influencia os preços.
Modelagem da decoerência de mercado
Em sistemas financeiros reais, os efeitos quânticos existem em um ambiente com ruído. O fluxo constante de notícias, as reações emocionais dos participantes e os eventos macroeconômicos geram decoerência:
void ApplyEnvironmentalDecoherence(ComplexVector &state, int evolution_step) { // Адаптивная оценка рыночного шума double market_volatility = CalculateRecentVolatility(); double information_flow = CalculateInformationIntensity(); double decoherence_strength = base_decoherence_rate * (1.0 + 0.5 * market_volatility + 0.3 * information_flow); // Фазовая декогеренция (потеря квантовых интерференций) for(int i = 0; i < STATE_DIM; i++) { if(state.GetProbability(i) > DECOHERENCE_THRESHOLD) { double phase_noise = GenerateGaussianNoise(0.0, decoherence_strength); // Вращение в комплексной плоскости double cos_phase = MathCos(phase_noise); double sin_phase = MathSin(phase_noise); double new_real = state.real[i] * cos_phase - state.imag[i] * sin_phase; double new_imag = state.real[i] * sin_phase + state.imag[i] * cos_phase; state.real[i] = new_real; state.imag[i] = new_imag; } } state.Normalize(); }
Este código modela uma decoerência realista, cuja intensidade depende das condições de mercado. Em períodos tranquilos, os efeitos quânticos são preservados por mais tempo, enquanto, durante turbulências de mercado, o sistema passa rapidamente para um comportamento clássico.
A decoerência não é apenas um artefato técnico, mas um componente importante do modelo. Ela reflete o fato de que os mercados financeiros não conseguem manter a coerência quântica indefinidamente. Novas informações, decisões dos traders e mudanças de sentimento fazem o papel de "medições" que destroem as superposições quânticas.
Medições quânticas e extração de informações
A extração de informações do estado quântico exige protocolos especializados de medição:
vector MeasureQuantumState() { vector measurements = vector::Zeros(NUM_QUBITS); // Получаем вероятности измерения каждого кубита for(int qubit = 0; qubit < NUM_QUBITS; qubit++) { double prob_1 = 0.0; for(int i = 0; i < STATE_DIM; i++) { if((i >> qubit) & 1) { // Если кубит в состоянии |1⟩ prob_1 += quantum_state.GetProbability(i); } } measurements[qubit] = prob_1; // Вероятность измерить |1⟩ } return measurements; }
As medições Z representam sinais clássicos de negociação, isto é, a probabilidade de alta ou queda do preço. As medições X revelam efeitos de superposição, indicando momentos de máxima incerteza de mercado. As correlações de dois qubits expõem interdependências ocultas entre diferentes fatores de mercado.
Uma característica importante da nossa implementação é que realizamos medições não destrutivas. Diferentemente dos sistemas quânticos reais, nos quais a medição colapsa a função de onda, extraímos informações estatísticas sem perturbar o estado quântico. Isso permite realizar múltiplas medições e obter um conjunto rico de informações sobre o sistema.
Arquitetura híbrida: o melhor dos dois mundos
A principal conquista é a integração elegante do processamento quântico com métodos clássicos. O processador quântico complementa e reforça a análise tradicional:
double Predict(const vector &input_features, double &confidence, bool is_training = false) { // Применяем квантовый процессор к входным данным matrix input_matrix(1, input_features.Size()); input_matrix.Row(input_features, 0); // Создаем базовый контекст для квантового процессора matrix basic_context = matrix::Zeros(1, input_features.Size()); for(ulong i = 0; i < input_features.Size(); i++) { basic_context[0][i] = MathSin(input_features[i] * M_PI / 4.0); } // Применяем квантовые эффекты matrix quantum_enhanced_input = input_quantum_proc.ApplyQuantumEffects(input_matrix, basic_context); vector quantum_features = quantum_enhanced_input.Row(0); // Классификация рыночного состояния с квантово-улучшенными данными double price_change = quantum_features[0]; double volatility = quantum_features[1]; double volume_ratio = quantum_features[2]; int state = markov_chain.ClassifyMarketState(price_change, volatility, volume_ratio); // Получение эмбеддинга состояния matrix state_embedding = markov_chain.Forward(state); // Дальнейшая обработка через классические компоненты... matrix ssm_output = ssm.ProcessSequence(quantum_input_matrix); matrix contextualized = context_analyzer.ProcessWithContext(combined); // Трансформерные слои с квантовым вниманием matrix hidden = contextualized; for(int i = 0; i < TRANSFORMER_LAYERS; i++) { hidden = transformer_layers[i].Forward(hidden, is_training); } // Финальный прогноз double prediction = Sigmoid(output_result[0][0] + output_bias[0]); confidence = meta_model.Forward(quantum_features, prediction, error_metrics); return prediction; }
Este código mostra como o processamento quântico é integrado ao pipeline do sistema. Primeiro, os dados originais passam pelo processador quântico, que identifica correlações ocultas e cria uma representação enriquecida. Em seguida, os dados aprimorados quanticamente são processados pelos componentes clássicos do sistema.
Um detalhe importante da arquitetura é que não substituímos os métodos clássicos por métodos quânticos, mas criamos uma simbiose. O processador quântico funciona como um "pré-processador", enriquecendo os dados de entrada com informações adicionais sobre correlações ocultas e dependências não lineares. Depois, os componentes clássicos usam essas informações enriquecidas para tomar decisões mais precisas.
A integração dos efeitos quânticos aos mecanismos de atenção dos transformers merece atenção especial:
matrix Forward(const matrix &input_data, bool is_training) { last_input_data = input_data; matrix Q = input_data.MatMul(W_q); matrix K = input_data.MatMul(W_k); matrix V = input_data.MatMul(W_v); // Применяем дропаут в режиме обучения if (is_training) { Q = ApplyDropoutMask(Q, dropout_mask_q, 1.0 / (1.0 - DROPOUT_RATE)); K = ApplyDropoutMask(K, dropout_mask_k, 1.0 / (1.0 - DROPOUT_RATE)); V = ApplyDropoutMask(V, dropout_mask_v, 1.0 / (1.0 - DROPOUT_RATE)); } // КЛЮЧЕВОЕ НОВОВВЕДЕНИЕ: квантовая обработка Query и Key Q = quantum_proc.ApplyQuantumEffects(Q, input_data); K = quantum_proc.ApplyQuantumEffects(K, input_data); // Вычисление скоров внимания с квантовыми корреляциями matrix scores = Q.MatMul(K.Transpose()) / MathSqrt((double)d_model); // Применение softmax для получения весов внимания matrix scores_softmax = matrix::Zeros(scores.Rows(), scores.Cols()); for(ulong i = 0; i < scores.Rows(); i++) { vector row = scores.Row(i); double max_val = row.Max(); for(ulong j = 0; j < row.Size(); j++) row[j] = MathExp(row[j] - max_val); double sum = row.Sum(); if (sum == 0.0) sum = 1e-9; row = row / sum; scores_softmax.Row(row, i); } matrix attention_output = scores_softmax.MatMul(V); return attention_output.MatMul(W_o); }
O processamento quântico das matrizes Query e Key permite que o mecanismo de atenção leve em conta não apenas relações lineares entre atributos, mas também suas correlações quânticas. Isso é especialmente eficaz para identificar sinais fracos em dados financeiros com ruído.
Todo o sistema foi implementado como um EA para MetaTrader 5, totalmente escrito em MQL5 e sem dependências externas. A arquitetura inclui os seguintes componentes principais:
struct QuantumContextAnalyzer { matrix short_memory, medium_memory, long_memory, episodic_memory, pattern_memory; matrix ProcessWithContext(const matrix &input_data) { // Адаптивное взвешивание типов памяти double input_volatility = CalculateVolatility(input_data); double short_weight = 0.4 + 0.4 * input_volatility; double medium_weight = 0.3 + 0.2 * (1.0 - input_volatility); double long_weight = 0.2 + 0.3 * (1.0 - input_volatility); // Применение квантовых эффектов к контекстуальной информации matrix quantum_result = quantum_proc.ApplyQuantumEffects(input_matrix, context_matrix); return quantum_result; } };
O sistema seleciona dinamicamente o tipo de memória mais relevante de acordo com as condições de mercado. Em períodos de alta volatilidade, a memória de curto prazo recebe peso maior; em períodos tranquilos, a memória de longo prazo.
double Forward(const vector &original_features, double prediction, const vector &error_metrics) { vector meta_input = vector::Zeros(original_features.Size() + 1 + error_metrics.Size()); // Объединяем исходные признаки, прогноз и метрики ошибок for(ulong i = 0; i < original_features.Size(); i++) meta_input[i] = original_features[i]; meta_input[original_features.Size()] = prediction; for(ulong i = 0; i < error_metrics.Size(); i++) meta_input[original_features.Size() + 1 + i] = error_metrics[i]; // Прогноз уверенности через двухслойную сеть matrix hidden = input_matrix.MatMul(meta_weights); for(ulong i = 0; i < hidden.Cols(); i++) hidden[0][i] = Tanh(hidden[0][i] + meta_bias[i]); matrix output_result = hidden.MatMul(output_weights); return Sigmoid(output_result[0][0] + output_bias_meta[0]); }
O metamodelo analisa não apenas a previsão atual, mas também o histórico de erros do sistema, avaliando de forma adaptativa a confiança em cada caso específico.
Foi dada atenção especial à integração com o sistema de gestão de riscos para atuação em prop firms. As prop firms modernas impõem requisitos rígidos de drawdown máximo, limites diários de perdas e metas de lucro.
Resultados da negociação real: a teoria se confronta com a realidade
O teste mais importante de qualquer sistema de negociação está nos resultados em condições reais de mercado. Ao longo de 2024-2025, o sistema quântico apresentou:
Resultados financeiros:
- Rentabilidade anual: +13,3%
- Drawdown máximo: 2,39%
- Win rate: 87%
- Índice de Sharpe: 2,48
- Tempo médio de permanência na posição: 4,2 horas

Adaptabilidade do sistema: o mais importante é que o sistema demonstrou resultados estáveis em diferentes condições de mercado. Durante períodos de alta volatilidade, ele reduzia automaticamente o tamanho das posições e se tornava mais conservador. Em períodos tranquilos, ao contrário, aumentava a agressividade nas operações, usando efeitos quânticos para buscar sinais fracos, mas estáveis.

Apesar dos resultados impressionantes, o sistema ainda não atingiu todas as metas estabelecidas:
Limitações atuais:
- O índice de Sharpe de 2,48 ainda está abaixo da meta de 3,5+
- A complexidade computacional do simulador quântico exige recursos significativos
- O ajuste dos hiperparâmetros continua sendo uma tarefa complexa
- O sistema exige uma calibração cuidadosa para cada instrumento de negociação
Conclusão
O futuro quântico abre novas possibilidades na negociação algorítmica. A transição para qubits virtuais proporcionou uma vantagem significativa em relação aos métodos clássicos, melhorando as previsões e os resultados. Nosso sistema, baseado nos princípios da mecânica quântica, lida naturalmente com a incerteza do mercado e com correlações complexas, algo que continua sendo uma tarefa difícil para os modelos clássicos. A criação do primeiro simulador quântico completo, a arquitetura adaptativa e a integração de métodos quânticos e clássicos em um sistema híbrido evidenciam nossos avanços.
No futuro, vamos nos concentrar na otimização do sistema e em atingir a meta de um índice de Sharpe acima de 3,5, desenvolvendo o ecossistema de negociação quântica. A implementação completa está disponível como EA para MetaTrader 5, pronta para uso em tempo real.
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/18890
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.
Caminhe em novos trilhos: Personalize indicadores no MQL5
Redes neurais em trading: Desvendando os componentes estruturais (Encoder)
Está chegando o novo MetaTrader 5 e MQL5
Construindo Expert Advisors Autootimizáveis em MQL5 (Parte 6): Regras de Trading Autoajustáveis (II)
- 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
@Yevgeniy Koshtenko
Há uma duplicata do PropRiskManagerLoss.mqh no arquivo:
O arquivo HybridQuantumNeuralV3.mqh parece estar faltando para que o QuantumProp_EA_Lite.mq5 seja compilado sem erros.
@Yevgeniy Koshtenko
Há uma duplicata do PropRiskManagerLoss.mqh no arquivo:
O arquivo HybridQuantumNeuralV3.mqh parece estar faltando para que o QuantumProp_EA_Lite.mq5 seja compilado sem erros.
Muito obrigado! Acabei de ver isso e o enviei para verificação com o arquivo real)
O artigo Rede Neural Quântica em MQL5 (Parte III) foi publicado: Um processador quântico virtual com qubits:
Autor: Yevgeniy Koshtenko
Eugene, esse parece ser um bom produto profissional. Nós o testaremos e daremos feedback. Você pode me dizer se não há como fazer com que esse modelo de treinamento use GPU para treinamento, como, por exemplo, no caso do modelo LSTM em Python? Talvez você já tenha estudado essa questão, portanto, não precisa perder seu tempo. Caso contrário, podemos pensar nisso juntos, pois o desempenho do hardware nesse modelo é importante, e com razão. Um modelo de boa qualidade com análises profundas deve exigir muito do hardware
Bom dia.
Não consegui repetir o teste descrito no artigo, nem mesmo plotar um gráfico semelhante.
Você pode nos informar os parâmetros e o símbolo?
Obrigado.