Квантовая нейросеть на MQL5 (Часть III): Виртуальный квантовый процессор с кубитами
Во второй части исследования была разработана система, использующая математические аналоги квантовых эффектов — резонанс (косинус), интерференцию (синус), декогеренцию (экспонента). Однако это оставалось лишь имитацией: формально — красиво, по сути — не квантово.
Со временем стало ясно: модель элегантна, но не отражает суть квантовой обработки — суперпозицию, запутанность, необратимость измерений. Мы оперировали функциями, а не принципами.
Классические подходы по-прежнему ограничены:
- LSTM даёт до 58% точности
- Трансформеры уязвимы к шуму
- ARIMA потеряла актуальность
- Модели нестабильны из-за переобучения
Ключевой прорыв — переход к виртуальным кубитам
Во второй версии вместо аналогов применён полноценный квантовый процессор: 3 кубита, 8-мерное пространство состояний, гейты и измерения. Архитектура пересмотрена: теперь каждая операция подчиняется законам квантовой механики — унитарность, нормировка, поведение при измерениях.
Архитектура квантового процессора
Каждый кубит представляется в виде комплексного вектора в двумерном гильбертовом пространстве.
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; } } } };
Этот код реализует базовую структуру для хранения квантового состояния. В отличие от классических битов, квантовые состояния имеют комплексные амплитуды, которые могут интерферировать друг с другом. Функция GetProbability вычисляет вероятность измерить систему в определенном состоянии согласно правилу Борна.
Особенность реализации заключается в том, что мы работаем не с отдельными кубитами, а с полным квантовым состоянием всей системы. Это критически важно для правильного моделирования запутанности и квантовых корреляций. Каждое состояние в нашем 8-мерном пространстве соответствует определенной комбинации трех кубитов: |000⟩, |001⟩, |010⟩, |011⟩, |100⟩, |101⟩, |110⟩, |111⟩.
Квантовые гейты: от теории к практике
Ротационные гейты реализуют унитарные преобразования, позволяя плавно вращать состояние кубита в блоховой сфере:
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; } } } }
Этот код строит матрицу ротационного гейта, действующего на конкретный кубит. Угол поворота напрямую связан с рыночными данными — чем сильнее ценовое движение, тем больше угол ротации. Это создает прямую связь между рыночной динамикой и квантовым состоянием системы.
Алгоритм использует битовые операции для определения, какие элементы матрицы нужно заполнить. Для каждой пары состояний |i⟩ и |j⟩ мы проверяем, влияет ли ротация конкретного кубита на переход между ними. Если все остальные кубиты находятся в одинаковом состоянии, то ротация действует только на целевой кубит.
Гейты контролируемой фазы создают квантовую запутанность между кубитами:
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); } } }
Фаза φ зависит от корреляций между рыночными признаками. Когда два рыночных фактора сильно коррелируют (например, цена и объем), соответствующие кубиты становятся запутанными. Это позволяет системе учитывать сложные взаимосвязи в данных.
Гейт контролируемой фазы работает только тогда, когда оба кубита находятся в состоянии |1⟩. В этом случае он добавляет фазовый множитель e^(iφ) к амплитуде соответствующего состояния. Это не меняет вероятности измерения отдельных кубитов, но создает квантовые корреляции между ними.
Гейты Адамара переводят кубиты в суперпозиционные состояния:
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; } } }
Гейт Адамара создает равномерную суперпозицию состояний |0⟩ и |1⟩. В торговом контексте это означает, что система может одновременно рассматривать сценарии роста и падения рынка до момента окончательного "измерения" — принятия торгового решения.
Динамическое построение квантовых схем
Ключевая инновация — построение квантовой схемы динамически на основе входящих рыночных данных. Каждый рыночный признак влияет на параметры квантовых гейтов, создавая уникальную квантовую обработку для каждой рыночной ситуации.
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++; } } }
Этот алгоритм показывает, как рыночные данные напрямую определяют архитектуру квантовой схемы. В отличие от статических нейронных сетей, наша система адаптирует свою внутреннюю структуру к каждой рыночной ситуации. Высокая корреляция между признаками создает больше запутанных состояний, а рыночная неопределенность увеличивает вероятность суперпозиционных операций.
Особенность нашего подхода в том, что мы не просто применяем фиксированную последовательность гейтов. Вместо этого схема строится адаптивно: если корреляция между признаками слабая, соответствующие гейты запутанности не создаются. Если рыночная неопределенность низкая, суперпозиционные гейты применяются редко. Это позволяет системе экономить вычислительные ресурсы и фокусироваться на наиболее релевантных квантовых эффектах.
Квантовая эволюция и декогеренция
После построения схемы система переходит к квантовой эволюции — последовательному применению унитарных операторов к начальному состоянию |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; } } }
Критически важно, что порядок применения операторов имеет значение — квантовые гейты не коммутируют. Это означает, что последовательность рыночных событий влияет на финальное состояние системы, точно так же, как в реальных рынках порядок поступления информации влияет на цены.
Моделирование рыночной декогеренции
В реальных финансовых системах квантовые эффекты существуют в "шумном" окружении. Постоянный поток новостей, эмоциональные реакции участников, макроэкономические события создают декогеренцию:
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(); }
Этот код моделирует реалистичную декогеренцию, где интенсивность зависит от рыночных условий. В спокойные периоды квантовые эффекты сохраняются дольше, а во время рыночных потрясений система быстро переходит к классическому поведению.
Декогеренция — не просто технический артефакт, а важная составляющая модели. Она отражает тот факт, что финансовые рынки не могут поддерживать квантовую когерентность бесконечно долго. Новая информация, решения трейдеров, изменения настроений — все это играет роль "измерений", которые разрушают квантовые суперпозиции.
Квантовые измерения и извлечение информации
Извлечение информации из квантового состояния требует специализированных протоколов измерений:
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; }
Z-измерения представляют классические торговые сигналы — вероятность роста или падения цены. X-измерения выявляют суперпозиционные эффекты, показывая моменты максимальной рыночной неопределенности. Двухкубитные корреляции раскрывают скрытые взаимосвязи между различными рыночными факторами.
Важная особенность нашей реализации — мы проводим не разрушающие измерения. В отличие от реальных квантовых систем, где измерение коллапсирует волновую функцию, мы извлекаем статистическую информацию, не нарушая квантовое состояние. Это позволяет проводить множественные измерения и получать богатую информацию о системе.
Гибридная архитектура: лучшее из двух миров
Ключевое достижение — элегантная интеграция квантовой обработки с классическими методами. Квантовый процессор дополняет и усиливает традиционный анализ:
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; }
Этот код показывает, как квантовая обработка интегрируется в общий пайплайн. Исходные данные сначала проходят через квантовый процессор, который выявляет скрытые корреляции и создает обогащенное представление. Затем квантово-улучшенные данные обрабатываются классическими компонентами системы.
Важная деталь архитектуры — мы не заменяем классические методы квантовыми, а создаем симбиоз. Квантовый процессор работает как "предпроцессор", который обогащает входные данные дополнительной информацией о скрытых корреляциях и нелинейных зависимостях. Классические компоненты затем используют эту обогащенную информацию для принятия более точных решений.
Особого внимания заслуживает интеграция квантовых эффектов в механизмы внимания трансформеров:
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); }
Квантовая обработка Query и Key матриц позволяет механизму внимания учитывать не только линейные связи между признаками, но и их квантовые корреляции. Это особенно эффективно для выявления слабых сигналов в зашумленных финансовых данных.
Вся система была реализована в виде торгового советника для MetaTrader 5, полностью написанного на MQL5 без внешних зависимостей. Архитектура включает следующие ключевые компоненты:
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; } };
Система динамически выбирает наиболее релевантный тип памяти в зависимости от рыночных условий. В периоды высокой волатильности больший вес получает краткосрочная память, в спокойные времена — долгосрочная.
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]); }
Мета-модель анализирует не только текущий прогноз, но и историю ошибок системы, адаптивно оценивая уверенность в каждом конкретном случае.
Особое внимание было уделено интеграции с системой управления рисками для работы с проп-компаниями. Современные пропфирмы предъявляют жесткие требования к максимальным просадкам, дневным лимитам убытков и целевым показателям прибыли.
Результаты живой торговли: теория встречает реальность
Самым важным тестом любой торговой системы являются результаты в реальных рыночных условиях. За 2024-2025 год квантовая система показала:
Финансовые результаты:
- Годовая доходность: +13.3%
- Максимальная просадка: 2.39%
- Винрейт: 87%
- Коэффициент Шарпа: 2.48
- Среднее время удержания позиции: 4.2 часа

Адаптивность системы: Что особенно важно — система продемонстрировала стабильные результаты в различных рыночных условиях. Во время периодов высокой волатильности она автоматически снижала размер позиций и становилась более консервативной. В спокойные периоды, наоборот, увеличивала агрессивность торговли, используя квантовые эффекты для поиска слабых, но стабильных сигналов.

Несмотря на впечатляющие результаты, система пока не достигла всех поставленных целей:
Текущие ограничения:
- Коэффициент Шарпа 2.48 все еще ниже целевого значения 3.5+
- Вычислительная сложность квантового симулятора требует значительных ресурсов
- Настройка гиперпараметров остается сложной задачей
- Система требует тщательной калибровки для каждого торгового инструмента
Заключение
Квантовое будущее открывает новый мир в алгоритмической торговле. Переход к виртуальным кубитам обеспечил значительное превосходство над классическими методами, улучшая прогнозы и результаты. Наша система, основанная на принципах квантовой механики, естественно справляется с рыночной неопределенностью и сложными корреляциями, что остается сложной задачей для классических моделей. Создание первого полноценного квантового симулятора, адаптивная архитектура и интеграция квантовых и классических методов в гибридной системе подчеркивают наши достижения.
В будущем мы сконцентрируемся на оптимизации системы и достижении целевого коэффициента Шарпа выше 3.5, развивая квантовую торговую экосистему. Полная реализация доступна в виде торгового советника для MetaTrader 5, готового к применению в реальном времени.
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Нейросети в трейдинге: Распутывание структурных компонентов (Окончание)
Разработка советника для мониторинга точек входа в свинг-сделки
Разработка системы репликации (Часть 78): Новый Chart Trade (V)
Оптимизация сообществом ученых — Community of Scientist Optimization (CoSO): Практика
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
@Yevgeniy Koshtenko
В архиве дубликат PropRiskManagerLoss.mqh:
Похоже не хватает файла HybridQuantumNeuralV3.mqh, чтобы QuantumProp_EA_Lite.mq5 скомпилировалось без ошибок.
@Yevgeniy Koshtenko
В архиве дубликат PropRiskManagerLoss.mqh:
Похоже не хватает файла HybridQuantumNeuralV3.mqh, чтобы QuantumProp_EA_Lite.mq5 скомпилировалось без ошибок.
Спасибо большое! Сам только увидел, отправил на проверку с актуальным файлом)
Опубликована статья Квантовая нейросеть на MQL5 (Часть III): Виртуальный квантовый процессор с кубитами:
Автор: Yevgeniy Koshtenko
Евгений, вот это кажется прям хороший профессиональный продукт. Будем тестировать и давать обратную связь. Подскажи, а эту модель обучения никак нельзя заставить использовать GPU для обучения, как например в случае с LSTM моделью на Python? Вдруг ты уже этот вопрос изучил, что бы не тратить время. Если нет, то вместе можем подумать, так как производительность железа в этой модели важна, да это и правильно. Хорошая качественная модель с глубоким анализом просто обязана быть требовательной к железу
Доброе утро.
Мне не удалось повторить тест, описанный в статье, и даже построить похожий график.
Можете ли вы сообщить нам параметры и символ?
Спасибо.