Red neuronal cuántica en MQL5 (Parte III): Procesador cuántico virtual con qubits
En la segunda parte del estudio analizamos un sistema que utiliza análogos matemáticos de los efectos cuánticos: resonancia (coseno), interferencia (seno) y decoherencia (exponencial). Sin embargo, no dejaba de ser una imitación: formalmente, resultaba elegante; en esencia, no era cuántico.
Con el tiempo quedó claro que el modelo, aunque elegante, no reflejaba la esencia del procesamiento cuántico: la superposición, el entrelazamiento y la irreversibilidad de las mediciones. Operábamos con funciones, no con principios.
Los enfoques clásicos siguen siendo limitados:
- LSTM ofrece una precisión de hasta el 58 %
- Los modelos Transformer son vulnerables al ruido
- El modelo ARIMA ha perdido vigencia
- Los modelos son inestables debido al sobreajuste
El avance clave es la transición a los qubits virtuales
En la segunda versión, en lugar de análogos, hemos empleado un procesador cuántico completo: 3 qubits, un espacio de estados de 8 dimensiones, puertas cuánticas y mediciones. Asimismo, hemos revisado la arquitectura: ahora cada operación se rige por las leyes de la mecánica cuántica —unitaridad, normalización y comportamiento ante las mediciones—.
Arquitectura del procesador cuántico
Cada qubit se representa como un vector complejo en un espacio 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; // Estado inicial |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 la estructura básica para almacenar un estado cuántico. A diferencia de los bits clásicos, los estados cuánticos tienen amplitudes complejas que pueden interferir entre sí. La función GetProbability calcula la probabilidad de medir el sistema en un estado determinado según la regla de Born.
La particularidad de esta implementación radica en que no trabajamos con qubits individuales, sino con el estado cuántico completo de todo el sistema. Esto es de vital importancia para modelar correctamente el entrelazamiento y las correlaciones cuánticas. Cada estado en nuestro espacio de 8 dimensiones corresponde a una combinación determinada de tres qubits: |000⟩, |001⟩, |010⟩, |011⟩, |100⟩, |101⟩, |110⟩, |111⟩.
Puertas cuánticas: de la teoría a la práctica
Las puertas de rotación implementan transformaciones unitarias, lo que permite rotar suavemente el estado del qubit en la 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 construye la matriz de una puerta de rotación que actúa sobre un qubit concreto. El ángulo de rotación está directamente relacionado con los datos de mercado: cuanto más fuerte es el movimiento del precio, mayor es el ángulo de rotación. Esto establece una relación directa entre la dinámica del mercado y el estado cuántico del sistema.
El algoritmo utiliza operaciones bit a bit para determinar qué elementos de la matriz hay que rellenar. Para cada par de estados |i⟩ y |j⟩, comprobamos si la rotación de un qubit concreto influye en la transición entre ambos. Si todos los demás qubits se encuentran en el mismo estado, la rotación actúa solo sobre el qubit objetivo.
Las puertas de fase controlada crean entrelazamiento cuántico entre los 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); } } }
La fase φ depende de las correlaciones entre las características de mercado. Cuando dos factores del mercado presentan una fuerte correlación (por ejemplo, el precio y el volumen), los qubits correspondientes pasan a un estado entrelazado. Esto permite que el sistema tenga en cuenta las complejas interrelaciones presentes en los datos.
La puerta de fase controlada solo actúa cuando ambos qubits se encuentran en el estado |1⟩. En este caso, añade el factor de fase e^(iφ) a la amplitud del estado correspondiente. Esto no altera la probabilidad de medición de cada qubit, pero crea correlaciones cuánticas entre ellos.
Las puertas de Hadamard llevan los qubits a estados de superposición:
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++) { // ... código para construir la matriz de Hadamard 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; } } }
La puerta de Hadamard crea una superposición uniforme de los estados |0⟩ y |1⟩. En el contexto del trading, esto significa que el sistema puede analizar simultáneamente escenarios de subida y bajada del mercado hasta el momento de la «medición» definitiva: la toma de una decisión de trading.
Construcción dinámica de circuitos cuánticos
La innovación clave consiste en la construcción dinámica de un circuito cuántico a partir de los datos de mercado entrantes. Cada característica de mercado influye en los parámetros de las puertas cuánticas, creando un procesamiento cuántico único para cada situación de mercado.
void BuildQuantumCircuit(const vector &features) { num_gates = 0; quantum_state.Initialize(STATE_DIM); // Puertas de rotación basadas en características de mercado 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++; } } // Puertas de entrelazamiento entre pares de qubits 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++; } } } // Puertas de superposición adaptativas 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 muestra cómo los datos del mercado determinan directamente la arquitectura de un circuito cuántico. A diferencia de las redes neuronales estáticas, nuestro sistema adapta su estructura interna a cada situación del mercado. La alta correlación entre las características genera más estados entrelazados, mientras que la incertidumbre del mercado aumenta la probabilidad de aplicar puertas que generan superposición.
La particularidad de nuestro enfoque es que no nos limitamos a aplicar una secuencia fija de puertas cuánticas. En cambio, el circuito se construye de forma adaptativa: si la correlación entre las características es débil, no se crean las puertas de entrelazamiento correspondientes. Si la incertidumbre del mercado es baja, las puertas de superposición se utilizan en contadas ocasiones. Esto permite al sistema ahorrar recursos computacionales y centrarse en los efectos cuánticos más relevantes.
Evolución cuántica y decoherencia
Una vez construido el circuito, el sistema pasa a la evolución cuántica, es decir, a la aplicación sucesiva de operadores unitarios al estado inicial |000⟩:
void ExecuteQuantumCircuit() { // Inicializamos el estado double state[STATE_DIM]; ArrayInitialize(state, 0.0); state[0] = 1.0; // Estado inicial |000⟩ // Aplicamos cada puerta del circuito for(int gate_idx = 0; gate_idx < num_gates; gate_idx++) { ApplyGateToState(state, gate_idx); } // Normalizamos el estado 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; } } }
Es crucial destacar que el orden de aplicación de los operadores importa: las puertas cuánticas no conmutan. Esto significa que la secuencia de acontecimientos del mercado influye en el estado final del sistema, del mismo modo que, en los mercados reales, el orden en que se recibe la información influye en los precios.
Modelado de la decoherencia del mercado
En los sistemas financieros reales, los efectos cuánticos se dan en un entorno «ruidoso». El flujo constante de noticias, las reacciones emocionales de los participantes y los acontecimientos macroeconómicos generan decoherencia:
void ApplyEnvironmentalDecoherence(ComplexVector &state, int evolution_step) { // Evaluación adaptativa del ruido de mercado double market_volatility = CalculateRecentVolatility(); double information_flow = CalculateInformationIntensity(); double decoherence_strength = base_decoherence_rate * (1.0 + 0.5 * market_volatility + 0.3 * information_flow); // Decoherencia de fase (pérdida de interferencias cuánticas) for(int i = 0; i < STATE_DIM; i++) { if(state.GetProbability(i) > DECOHERENCE_THRESHOLD) { double phase_noise = GenerateGaussianNoise(0.0, decoherence_strength); // Rotación en el plano complejo 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 simula una decoherencia realista, en la que la intensidad depende de las condiciones del mercado. En periodos de calma, los efectos cuánticos se mantienen durante más tiempo, mientras que, durante las turbulencias del mercado, el sistema adopta rápidamente un comportamiento clásico.
La decoherencia no es solo un artefacto técnico, sino un componente importante del modelo. Esta refleja el hecho de que los mercados financieros no pueden mantener la coherencia cuántica indefinidamente. La nueva información, las decisiones de los traders y los cambios en el sentimiento actúan como «mediciones» que destruyen las superposiciones cuánticas.
Mediciones cuánticas y extracción de información
La obtención de información a partir de un estado cuántico requiere protocolos de medición especializados:
vector MeasureQuantumState() { vector measurements = vector::Zeros(NUM_QUBITS); // Calculamos las probabilidades de medición de cada qubit 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) { // Si el qubit está en el estado |1⟩ prob_1 += quantum_state.GetProbability(i); } } measurements[qubit] = prob_1; // Probabilidad de medir |1⟩ } return measurements; }
Las mediciones Z representan señales de trading clásicas: la probabilidad de que el precio suba o baje. Las mediciones X revelan efectos de superposición, mostrando los momentos de máxima incertidumbre del mercado. Las correlaciones de dos qubits revelan las relaciones ocultas entre los distintos factores del mercado.
Una característica importante de nuestra implementación es que realizamos mediciones no invasivas. A diferencia de los sistemas cuánticos reales, en los que la medición provoca el colapso de la función de onda, nosotros obtenemos información estadística sin alterar el estado cuántico. Esto permite realizar múltiples mediciones y obtener una gran cantidad de información sobre el sistema.
Arquitectura híbrida: lo mejor de ambos mundos
El logro clave es la elegante integración del procesamiento cuántico con los métodos clásicos. El procesador cuántico complementa y potencia el análisis tradicional:
double Predict(const vector &input_features, double &confidence, bool is_training = false) { // Aplicamos el procesador cuántico a los datos de entrada matrix input_matrix(1, input_features.Size()); input_matrix.Row(input_features, 0); // Creamos el contexto básico para el procesador cuántico 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); } // Aplicamos los efectos cuánticos matrix quantum_enhanced_input = input_quantum_proc.ApplyQuantumEffects(input_matrix, basic_context); vector quantum_features = quantum_enhanced_input.Row(0); // Clasificación del estado del mercado con datos mejorados cuánticamente 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); // Obtención de la incorporación del estado matrix state_embedding = markov_chain.Forward(state); // El procesamiento posterior mediante componentes clásicos... matrix ssm_output = ssm.ProcessSequence(quantum_input_matrix); matrix contextualized = context_analyzer.ProcessWithContext(combined); // Capas Transformer con atención cuántica matrix hidden = contextualized; for(int i = 0; i < TRANSFORMER_LAYERS; i++) { hidden = transformer_layers[i].Forward(hidden, is_training); } // Pronóstico final double prediction = Sigmoid(output_result[0][0] + output_bias[0]); confidence = meta_model.Forward(quantum_features, prediction, error_metrics); return prediction; }
Este código muestra cómo se integra el procesamiento cuántico en el pipeline general. Los datos iniciales pasan primero por un procesador cuántico, que detecta correlaciones ocultas y genera una representación enriquecida. A continuación, los datos mejorados cuánticamente se procesan mediante los componentes clásicos del sistema.
Un detalle importante de la arquitectura: no sustituimos los métodos clásicos por los cuánticos, sino que creamos una simbiosis. El procesador cuántico funciona como un «preprocesador» que enriquece los datos de entrada con información adicional sobre correlaciones ocultas y dependencias no lineales. A continuación, los componentes clásicos utilizan esta información enriquecida para tomar decisiones más precisas.
Merece especial atención la integración de los efectos cuánticos en los mecanismos de atención de los modelos Transformer:
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); // Aplicamos el «dropout» en modo de entrenamiento 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)); } // NOVEDAD CLAVE: procesamiento cuántico de Query y Key Q = quantum_proc.ApplyQuantumEffects(Q, input_data); K = quantum_proc.ApplyQuantumEffects(K, input_data); // Cálculo de las puntuaciones de atención con correlaciones cuánticas matrix scores = Q.MatMul(K.Transpose()) / MathSqrt((double)d_model); // Aplicación de softmax para obtener los pesos de atención 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); }
El procesamiento cuántico de las matrices Query y Key permite que el mecanismo de atención tenga en cuenta no solo las relaciones lineales entre las características, sino también sus correlaciones cuánticas. Esto resulta especialmente eficaz para detectar señales débiles en datos financieros ruidosos.
Todo el sistema se ha implementado en forma de asesor experto para MetaTrader 5, escrito íntegramente en MQL5 sin dependencias externas. La arquitectura incluye los siguientes componentes clave:
struct QuantumContextAnalyzer { matrix short_memory, medium_memory, long_memory, episodic_memory, pattern_memory; matrix ProcessWithContext(const matrix &input_data) { // Ponderación adaptativa de los tipos de memoria 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); // Aplicación de los efectos cuánticos a la información contextual matrix quantum_result = quantum_proc.ApplyQuantumEffects(input_matrix, context_matrix); return quantum_result; } };
El sistema selecciona dinámicamente el tipo de memoria más relevante en función de las condiciones del mercado. En periodos de alta volatilidad, la memoria a corto plazo recibe un peso mayor; en momentos de calma, lo recibe la memoria a largo plazo.
double Forward(const vector &original_features, double prediction, const vector &error_metrics) { vector meta_input = vector::Zeros(original_features.Size() + 1 + error_metrics.Size()); // Combinamos las características iniciales, la previsión y las métricas de error 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]; // Predicción de la confianza mediante una red de dos capas 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]); }
El metamodelo analiza no solo la predicción actual, sino también la historia de errores del sistema, evaluando de forma adaptativa la confianza en cada caso concreto.
Hemos prestado especial atención a la integración con el sistema de gestión de riesgos para trabajar con empresas de prop trading. Las empresas de prop trading modernas imponen requisitos estrictos en cuanto a la reducción máxima, los límites diarios de pérdidas y los objetivos de rentabilidad.
Resultados del trading en vivo: la teoría se encuentra con la realidad
La prueba más importante de cualquier sistema de trading la constituyen los resultados obtenidos en condiciones reales de mercado. Durante el periodo 2024-2025, el sistema cuántico mostró:
Resultados financieros:
- Rentabilidad anual: +13,3 %
- Reducción máxima: 2,39 %
- Tasa de aciertos: 87 %
- Ratio de Sharpe: 2,48
- Tiempo medio de mantenimiento de una posición: 4,2 horas

Adaptabilidad del sistema: algo especialmente importante es que el sistema demostró resultados estables en diversas condiciones de mercado. Durante los periodos de alta volatilidad, reducía automáticamente el tamaño de las posiciones y se volvía más conservador. En los periodos tranquilos, por el contrario, aumentaba la agresividad del trading, aprovechando los efectos cuánticos para detectar señales débiles pero estables.

A pesar de los impresionantes resultados, el sistema aún no ha alcanzado todos los objetivos fijados:
Limitaciones actuales:
- La ratio de Sharpe de 2,48 sigue estando por debajo del valor objetivo de 3,5+
- La complejidad computacional del simulador cuántico requiere recursos considerables
- El ajuste de los hiperparámetros sigue siendo una tarea compleja
- El sistema requiere una calibración minuciosa para cada instrumento de trading
Conclusión
El futuro cuántico abre un nuevo mundo en el trading algorítmico. El paso a los qubits virtuales ha supuesto una ventaja significativa frente a los métodos clásicos, mejorando las predicciones y los resultados. Nuestro sistema, basado en los principios de la mecánica cuántica, afronta con naturalidad la incertidumbre del mercado y las correlaciones complejas, lo que sigue siendo un reto para los modelos clásicos. La creación del primer simulador cuántico completo, la arquitectura adaptativa y la integración de métodos cuánticos y clásicos en un sistema híbrido ponen de relieve nuestros logros.
En el futuro, nos centraremos en optimizar el sistema y alcanzar una ratio de Sharpe superior a 3,5, desarrollando un ecosistema de trading cuántico. La implementación completa está disponible como asesor experto para MetaTrader 5, listo para su uso en tiempo real.
Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/18890
Advertencia: todos los derechos de estos materiales pertenecen a MetaQuotes Ltd. Queda totalmente prohibido el copiado total o parcial.
Este artículo ha sido escrito por un usuario del sitio web y refleja su punto de vista personal. MetaQuotes Ltd. no se responsabiliza de la exactitud de la información ofrecida, ni de las posibles consecuencias del uso de las soluciones, estrategias o recomendaciones descritas.
Utilizando redes neuronales en MetaTrader
Redes neuronales en el trading: Desentrañando las componentes estructuradas (Codificador)
Particularidades del trabajo con números del tipo double en MQL4
Optimización por comunidad de científicos — Community of Scientist Optimization (CoSO): Práctica
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
@Yevgeniy Koshtenko
En el archivo hay un duplicado de PropRiskManagerLoss.mqh:
Parece que falta el archivo HybridQuantumNeuralV3.mqh para que QuantumProp_EA_Lite.mq5 se compile sin errores.
@Yevgeniy Koshtenko
En el archivo hay un duplicado de PropRiskManagerLoss.mqh:
Parece que falta el archivo HybridQuantumNeuralV3.mqh para que QuantumProp_EA_Lite.mq5 se compile sin errores.
¡Muchas gracias! Acabo de darme cuenta; lo he enviado para que lo comprueben con el archivo actualizado)
Se ha publicado el artículo «Red neuronal cuántica en MQL5 (Parte III): Procesador cuántico virtual con qubits»:
Autor: Yevgeniy Koshtenko
Yevgeniy, esto parece un producto realmente bueno y profesional. Lo probaremos y te daremos nuestra opinión. Dime, ¿no hay forma de hacer que este modelo de aprendizaje utilice la GPU para el entrenamiento, como ocurre, por ejemplo, con el modelo LSTM en Python? Por si acaso ya has estudiado esta cuestión, para no perder tiempo. Si no es así, podemos pensarlo juntos, ya que el rendimiento del hardware en este modelo es importante, y con razón. Un modelo de buena calidad con un análisis profundo tiene que ser exigente con el hardware.
Buenos días.
No he conseguido repetir la prueba descrita en el artículo, ni siquiera trazar un gráfico similar.
¿Podría indicarnos los parámetros y el símbolo?
Gracias.