
Квантовые вычисления и трейдинг: Новый взгляд на прогнозы цен
Введение в квантовые вычисления для трейдинга: основные концепции и преимущества
Представьте себе мир, где каждая рыночная сделка анализируется через призму возможностей, существующих одновременно — как знаменитый кот Шрёдингера, который и жив, и мертв, пока мы не откроем коробку. Именно так работает квантовый трейдинг: он рассматривает все потенциальные состояния рынка единовременно, открывая новые горизонты для финансового анализа.
В то время как классические компьютеры обрабатывают информацию последовательно, бит за битом, квантовые системы используют удивительные свойства микромира — суперпозицию и запутанность — чтобы анализировать множество сценариев параллельно. Это похоже на опытного трейдера, который одновременно держит в голове десятки графиков, новостей и индикаторов, но масштабированного до немыслимых пределов.
Мы живем в эпоху, когда алгоритмическая торговля уже стала нормой, но теперь мы стоим на пороге следующей революции. Квантовые вычисления обещают не просто ускорить анализ данных — они предлагают принципиально новый подход к пониманию рыночных процессов. Представьте, что вместо линейного прогнозирования цены актива, мы можем исследовать целое дерево вероятностных сценариев, где каждая ветвь учитывает тончайшие рыночные корреляции.
В этой статье мы погрузимся в мир квантового трейдинга — от базовых принципов квантовых вычислений до практической реализации торговых систем. Мы рассмотрим, как квантовые алгоритмы могут находить закономерности там, где классические методы пасуют, и как это преимущество можно применить для принятия торговых решений в реальном времени.
Наше путешествие начнется с основ квантовых вычислений и постепенно приведет нас к созданию работающей системы прогнозирования рынка. По пути мы разберем сложные концепции на простых примерах и увидим, как теоретические преимущества квантовых вычислений превращаются в практические инструменты для трейдинга.
Квантовая суперпозиция и запутанность в контексте анализа финансовых временных рядов
При анализе финансовых рынков мы сталкиваемся с фундаментальной проблемой: бесконечным множеством взаимовлияющих факторов. Каждое движение цены — это результат сложного взаимодействия тысяч переменных, от макроэкономических показателей до настроений отдельных трейдеров. Именно здесь квантовые вычисления предлагают уникальное решение через свои фундаментальные свойства — суперпозицию и запутанность.
Рассмотрим суперпозицию. В классическом компьютере бит может быть либо 0, либо 1. Кубит же существует во всех возможных состояниях одновременно, пока мы не произведем измерение. Математически это описывается как состояние |ψ⟩ = α|0⟩ + β|1⟩, где α и β — комплексные амплитуды вероятности. Применительно к анализу временных рядов, это свойство позволяет квантовым алгоритмам эффективно исследовать пространство решений в задачах портфельного управления и риск-менеджмента, анализируя множество потенциальных сценариев параллельно.
Квантовая запутанность добавляет еще один уровень возможностей. Когда кубиты запутаны, их состояния становятся неразрывно связанными, что описывается, например, состоянием |ψ⟩ = (|00⟩ + |11⟩)/√2. В контексте финансового анализа это свойство используется в квантовых алгоритмах для моделирования сложных корреляций между различными рыночными показателями. Например, мы можем создавать системы, где учитываются взаимосвязи между ценой актива, объемом торгов и рыночной волатильностью.
Эти квантовые свойства особенно полезны при работе с высокочастотным трейдингом, где критически важна скорость обработки многомерных данных. Суперпозиция позволяет параллельно анализировать множество торговых сценариев, а запутанность помогает учитывать сложные межрыночные корреляции в режиме реального времени. Квантовые преимущества наиболее ярко проявляются в специфических задачах оптимизации и поиска, где классические алгоритмы сталкиваются с экспоненциальным ростом вычислительной сложности.
Разработка квантового алгоритма прогнозирования с использованием QPE (Quantum Phase Estimation)
В сердце нашей системы лежит изящная комбинация квантовых вычислений и классического технического анализа. Представьте себе квантовый оркестр из восьми кубитов, где каждый кубит — это музыкант, играющий свою партию в сложной симфонии рыночных движений.
Начинается всё с подготовки данных. Наш квантовый предиктор получает рыночные данные через интеграцию с MetaTrader 5, словно нейроны, собирающие информацию от органов чувств. Эти данные проходят через процесс нормализации, — представьте, как если бы мы настраивали все инструменты оркестра на одну тональность.
Самое интересное начинается при создании квантовой схемы. Сначала мы погружаем каждый кубит в состояние суперпозиции с помощью адамаровых вентилей (H-gates). В этот момент каждый кубит существует одновременно во всех возможных состояниях — так, как если бы каждый музыкант одновременно играл все возможные ноты своей партии.
Затем мы кодируем рыночные данные в квантовые состояния через ry-вентили, где угол поворота определяется значением рыночных параметров. Это похоже на то, как дирижер задает темп и характер исполнения каждому музыканту. Особое внимание уделяется текущей цене — она получает собственный квантовый поворот, влияя на всю систему, как солист в оркестре.
Настоящая магия происходит при создании квантовой запутанности. Используя cx-вентили (CNOT), мы связываем соседние кубиты, создавая неразрывные квантовые корреляции. Это похоже на момент, когда отдельные партии музыкантов сливаются в единое гармоничное звучание.
После квантовых преобразований, мы проводим измерения — словно делаем запись концерта. Но здесь есть особенность: мы повторяем этот процесс 2000 раз (shots), получая статистическое распределение результатов. Каждое измерение дает нам битовую строку, где количество единиц определяет направление прогноза.
Финальный аккорд — это интерпретация результатов. Система очень консервативна в своих прогнозах, ограничивая максимальное изменение цены до 0.1%. Это похоже на опытного дирижера, который не позволяет оркестру играть слишком громко или слишком тихо, сохраняя баланс звучания.
Результаты тестирования говорят сами за себя. Точность прогнозов превышает случайное угадывание, достигая 54% на часовом таймфрейме EUR/USD. При этом система демонстрирует высокий уровень уверенности в своих прогнозах, что отражается в метрике confidence.
В этой реализации квантовые вычисления не просто дополняют классический технический анализ — они создают новое измерение в анализе рынка, где множество возможных сценариев исследуются одновременно в квантовой суперпозиции. Как говорил Ричард Фейнман: "Природа на квантовом уровне ведет себя совсем не так, как мы привыкли думать". И похоже, что финансовые рынки тоже скрывают в себе квантовую природу, которую мы только начинаем познавать.
import numpy as np import MetaTrader5 as mt5 import pandas as pd from datetime import datetime, timedelta from qiskit import QuantumCircuit, transpile, QuantumRegister, ClassicalRegister from qiskit_aer import AerSimulator from sklearn.preprocessing import MinMaxScaler from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score import warnings warnings.filterwarnings('ignore') class MT5DataLoader: def __init__(self, symbol="EURUSD", timeframe=mt5.TIMEFRAME_H1): if not mt5.initialize(): raise Exception("MetaTrader5 initialization failed") self.symbol = symbol self.timeframe = timeframe def get_historical_data(self, lookback_bars=1000): current_time = datetime.now() rates = mt5.copy_rates_from(self.symbol, self.timeframe, current_time, lookback_bars) if rates is None: raise Exception(f"Failed to get data for {self.symbol}") df = pd.DataFrame(rates) df['time'] = pd.to_datetime(df['time'], unit='s') return df class EnhancedQuantumPredictor: def __init__(self, num_qubits=8): # Уменьшаем число кубитов для стабильности self.num_qubits = num_qubits self.simulator = AerSimulator() self.scaler = MinMaxScaler() def create_qpe_circuit(self, market_data, current_price): """Создание упрощенной квантовой схемы""" qr = QuantumRegister(self.num_qubits, 'qr') cr = ClassicalRegister(self.num_qubits, 'cr') qc = QuantumCircuit(qr, cr) # Нормализуем данные scaled_data = self.scaler.fit_transform(market_data.reshape(-1, 1)).flatten() # Создаем суперпозицию for i in range(self.num_qubits): qc.h(qr[i]) # Применяем рыночные данные как фазы for i in range(min(len(scaled_data), self.num_qubits)): angle = float(scaled_data[i] * np.pi) # Преобразуем в float qc.ry(angle, qr[i]) # Создаем запутанность for i in range(self.num_qubits - 1): qc.cx(qr[i], qr[i + 1]) # Применяем текущую цену price_angle = float((current_price % 0.01) * 100 * np.pi) # Используем только последние 2 знака qc.ry(price_angle, qr[0]) # Измеряем все кубиты qc.measure(qr, cr) return qc def predict(self, market_data, current_price, features=None, shots=2000): """Упрощенное предсказание""" # Обрезаем входные данные if market_data.shape[0] > self.num_qubits: market_data = market_data[-self.num_qubits:] # Создаем и выполняем схему qc = self.create_qpe_circuit(market_data, current_price) compiled_circuit = transpile(qc, self.simulator, optimization_level=3) job = self.simulator.run(compiled_circuit, shots=shots) result = job.result() counts = result.get_counts() # Анализируем результаты predictions = [] total_shots = sum(counts.values()) for bitstring, count in counts.items(): # Используем количество единиц в битстроке для определения направления ones = bitstring.count('1') direction = ones / self.num_qubits # Нормализованное направление # Предсказываем изменение не более чем на 0.1% price_change = (direction - 0.5) * 0.001 predicted_price = current_price * (1 + price_change) predictions.extend([predicted_price] * count) predicted_price = np.mean(predictions) up_probability = sum(1 for p in predictions if p > current_price) / len(predictions) confidence = 1 - np.std(predictions) / current_price return { 'predicted_price': predicted_price, 'up_probability': up_probability, 'down_probability': 1 - up_probability, 'confidence': confidence } class MarketPredictor: def __init__(self, symbol="EURUSD", timeframe=mt5.TIMEFRAME_H1, window_size=14): self.symbol = symbol self.timeframe = timeframe self.window_size = window_size self.quantum_predictor = EnhancedQuantumPredictor() self.data_loader = MT5DataLoader(symbol, timeframe) def prepare_features(self, df): """Подготовка технических индикаторов""" df['sma'] = df['close'].rolling(window=self.window_size).mean() df['ema'] = df['close'].ewm(span=self.window_size).mean() df['std'] = df['close'].rolling(window=self.window_size).std() df['upper_band'] = df['sma'] + (df['std'] * 2) df['lower_band'] = df['sma'] - (df['std'] * 2) df['rsi'] = self.calculate_rsi(df['close']) df['momentum'] = df['close'] - df['close'].shift(self.window_size) df['rate_of_change'] = (df['close'] / df['close'].shift(1) - 1) * 100 features = df[['sma', 'ema', 'std', 'upper_band', 'lower_band', 'rsi', 'momentum', 'rate_of_change']].dropna() return features def calculate_rsi(self, prices, period=14): delta = prices.diff() gain = (delta.where(delta > 0, 0)).ewm(alpha=1/period).mean() loss = (-delta.where(delta < 0, 0)).ewm(alpha=1/period).mean() rs = gain / loss return 100 - (100 / (1 + rs)) def predict(self): # Получаем данные df = self.data_loader.get_historical_data(self.window_size + 50) features = self.prepare_features(df) if len(features) < self.window_size: raise ValueError("Недостаточно данных") # Получаем последние данные для прогноза latest_features = features.iloc[-self.window_size:].values current_price = df['close'].iloc[-1] # Делаем прогноз, теперь передаем features как DataFrame prediction = self.quantum_predictor.predict( market_data=latest_features, current_price=current_price, features=features.iloc[-self.window_size:] # Передаем последние записи ) prediction.update({ 'timestamp': datetime.now(), 'current_price': current_price, 'rsi': features['rsi'].iloc[-1], 'sma': features['sma'].iloc[-1], 'ema': features['ema'].iloc[-1] }) return prediction def evaluate_model(symbol="EURUSD", timeframe=mt5.TIMEFRAME_H1, test_periods=100): """Оценка точности модели""" predictor = MarketPredictor(symbol, timeframe) predictions = [] actual_movements = [] # Получаем исторические данные df = predictor.data_loader.get_historical_data(test_periods + 50) for i in range(test_periods): try: temp_df = df.iloc[:-(test_periods-i)] predictor_temp = MarketPredictor(symbol, timeframe) features_temp = predictor_temp.prepare_features(temp_df) # Получаем данные для прогноза latest_features = features_temp.iloc[-predictor_temp.window_size:].values current_price = temp_df['close'].iloc[-1] # Делаем прогноз с передачей всех необходимых параметров prediction = predictor_temp.quantum_predictor.predict( market_data=latest_features, current_price=current_price, features=features_temp.iloc[-predictor_temp.window_size:] ) predicted_movement = 1 if prediction['up_probability'] > 0.5 else 0 predictions.append(predicted_movement) actual_price_next = df['close'].iloc[-(test_periods-i)] actual_price_current = df['close'].iloc[-(test_periods-i)-1] actual_movement = 1 if actual_price_next > actual_price_current else 0 actual_movements.append(actual_movement) except Exception as e: print(f"Error in evaluation: {e}") continue if len(predictions) > 0: metrics = { 'accuracy': accuracy_score(actual_movements, predictions), 'precision': precision_score(actual_movements, predictions), 'recall': recall_score(actual_movements, predictions), 'f1': f1_score(actual_movements, predictions) } else: metrics = { 'accuracy': 0, 'precision': 0, 'recall': 0, 'f1': 0 } return metrics if __name__ == "__main__": if not mt5.initialize(): print("MetaTrader5 initialization failed") mt5.shutdown() else: try: symbol = "EURUSD" timeframe = mt5.TIMEFRAME_H1 print("\nТестирование модели...") metrics = evaluate_model(symbol, timeframe, test_periods=100) print("\nМетрики качества модели:") print(f"Точность (Accuracy): {metrics['accuracy']:.2%}") print(f"Точность прогнозов (Precision): {metrics['precision']:.2%}") print(f"Полнота (Recall): {metrics['recall']:.2%}") print(f"F1-мера: {metrics['f1']:.2%}") print("\nТекущий прогноз:") predictor = MarketPredictor(symbol, timeframe) df = predictor.data_loader.get_historical_data(predictor.window_size + 50) features = predictor.prepare_features(df) latest_features = features.iloc[-predictor.window_size:].values current_price = df['close'].iloc[-1] prediction = predictor.predict() # Теперь этот метод правильно передает все параметры print(f"Предсказанная цена: {prediction['predicted_price']:.5f}") print(f"Вероятность роста: {prediction['up_probability']:.2%}") print(f"Вероятность падения: {prediction['down_probability']:.2%}") print(f"Уверенность в прогнозе: {prediction['confidence']:.2%}") print(f"Текущая цена: {prediction['current_price']:.5f}") print(f"RSI: {prediction['rsi']:.2f}") print(f"SMA: {prediction['sma']:.5f}") print(f"EMA: {prediction['ema']:.5f}") finally: mt5.shutdown()
Тестирование и валидация квантовой торговой системы: методология и результаты

Основные метрики эффективности
- Общая точность (Accuracy): 55.00% Умеренно превышает случайное угадывание для волатильного рынка EURUSD.
- Точность прогнозов (Precision): 63.64% Показывает хорошую надежность генерируемых системой сигналов - почти две трети прогнозов оказываются верными.
- Полнота (Recall): 14.58% Низкий показатель полноты указывает, что система избирательна и генерирует сигналы только при высокой уверенности в прогнозе. Это позволяет избегать ложных сигналов.
- F1-мера: 23.73% Значение F1-меры отражает баланс между точностью и полнотой, подтверждая консервативную стратегию системы.
Текущий прогноз рынка
- Текущая цена евро-доллара EURUSD: 1.02903
- Прогнозируемая цена: 1.02905
- Вероятностное распределение:
- Вероятность роста: 38.95%
- Вероятность падения: 61.05%
- Уверенность в прогнозе: 99.98%
Система предсказывает умеренное движение вверх с высокой уверенностью, несмотря на преобладающую вероятность падения. Это может указывать на период кратковременной коррекции в рамках общего нисходящего тренда.
Технические индикаторы
- RSI: 49.13 (близко к нейтральной зоне, указывает на отсутствие явной перекупленности или перепроданности)
- SMA: 1.02904
- EMA: 1.02909
- Тренд: нейтральный (текущая цена находится около уровней скользящих средних)
Выводы
Система демонстрирует следующие ключевые характеристики:
- Стабильную точность выше случайного угадывания
- Высокую избирательность при генерации сигналов (63.64% точных прогнозов)
- Способность количественно оценивать уверенность и вероятности различных сценариев
- Комплексный анализ рыночной ситуации, учитывающий как технические индикаторы, так и более сложные паттерны
Такой консервативный подход, отдающий приоритет качеству сигналов над их количеством, делает систему потенциально эффективным инструментом для реального трейдинга.
Интеграция метрик машинного обучения и квантовых алгоритмов: размышления и первые попытки
Соединение квантовых вычислений и машинного обучения открывает новые горизонты. В нашем эксперименте MinMaxScaler из sklearn используется для нормализации данных перед их квантовым кодированием, переводя рыночные данные в квантовые углы.
Система объединяет метрики машинного обучения (accuracy, precision, recall, F1-score) с квантовыми измерениями. При точности 60% она улавливает паттерны, недоступные классическим алгоритмам, демонстрируя осторожность и избирательность, словно опытный трейдер.
Будущее таких систем — это интеграция сложных методов предобработки, таких как автоэнкодеры и трансформеры, для более глубокого анализа данных. Квантовые алгоритмы могут стать фильтром для классических моделей или наоборот, адаптируясь под рыночные условия.
Наш эксперимент доказывает, что синергия квантовых и классических методов — это не выбор, а путь к следующему прорыву в алгоритмической торговле.
Как я начал писать свою первую квантовую нейросеть - классификатор
Когда я начал эксперименты с квантовыми вычислениями в трейдинге, я решил пойти дальше простых квантовых схем и создать гибридную систему, объединяющую квантовые вычисления с классическими методами машинного обучения. Идея казалась многообещающей: использовать квантовые состояния для кодирования рыночной информации, а затем обучать на этих данных классический классификатор.
Система получилась довольно сложной. В её основе лежит квантовая схема с 8 кубитами, которая преобразует рыночные данные в квантовые состояния через серию квантовых вентилей. Каждый фрагмент ценовой истории кодируется в углы поворота ry-вентилей, а запутанность между кубитами создается с помощью cx-вентилей. Это позволяет системе улавливать сложные нелинейные взаимосвязи в данных.
Для усиления прогностической способности я добавил набор классических бинарных индикаторов: направление движения цены, моментум, объемы, схождение/расхождение скользящих средних, волатильность, RSI и линии Боллинджера. Каждый индикатор генерирует бинарные сигналы, которые затем комбинируются с квантовыми признаками.
import numpy as np import MetaTrader5 as mt5 import pandas as pd from datetime import datetime, timedelta from qiskit import QuantumCircuit, transpile, QuantumRegister, ClassicalRegister from qiskit_aer import AerSimulator from sklearn.preprocessing import MinMaxScaler, StandardScaler from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score from sklearn.model_selection import train_test_split from catboost import CatBoostClassifier import warnings warnings.filterwarnings('ignore') class MT5DataLoader: def __init__(self, symbol="EURUSD", timeframe=mt5.TIMEFRAME_H1): if not mt5.initialize(): raise Exception("MetaTrader5 initialization failed") self.symbol = symbol self.timeframe = timeframe def get_historical_data(self, lookback_bars=1000): current_time = datetime.now() rates = mt5.copy_rates_from(self.symbol, self.timeframe, current_time, lookback_bars) if rates is None: raise Exception(f"Failed to get data for {self.symbol}") df = pd.DataFrame(rates) df['time'] = pd.to_datetime(df['time'], unit='s') return df class BinaryPatternGenerator: def __init__(self, df, lookback=10): self.df = df self.lookback = lookback def direction_encoding(self): return (self.df['close'] > self.df['close'].shift(1)).astype(int) def momentum_encoding(self, threshold=0.0001): returns = self.df['close'].pct_change() return (returns.abs() > threshold).astype(int) def volume_encoding(self): return (self.df['tick_volume'] > self.df['tick_volume'].rolling(self.lookback).mean()).astype(int) def convergence_encoding(self): ma_fast = self.df['close'].rolling(5).mean() ma_slow = self.df['close'].rolling(20).mean() return (ma_fast > ma_slow).astype(int) def volatility_encoding(self): volatility = self.df['high'] - self.df['low'] avg_volatility = volatility.rolling(20).mean() return (volatility > avg_volatility).astype(int) def rsi_encoding(self, period=14, threshold=50): delta = self.df['close'].diff() gain = (delta.where(delta > 0, 0)).ewm(alpha=1/period).mean() loss = (-delta.where(delta < 0, 0)).ewm(alpha=1/period).mean() rs = gain / loss rsi = 100 - (100 / (1 + rs)) return (rsi > threshold).astype(int) def bollinger_encoding(self, window=20): ma = self.df['close'].rolling(window=window).mean() std = self.df['close'].rolling(window=window).std() upper = ma + (std * 2) lower = ma - (std * 2) return ((self.df['close'] - lower)/(upper - lower) > 0.5).astype(int) def get_all_patterns(self): patterns = { 'direction': self.direction_encoding(), 'momentum': self.momentum_encoding(), 'volume': self.volume_encoding(), 'convergence': self.convergence_encoding(), 'volatility': self.volatility_encoding(), 'rsi': self.rsi_encoding(), 'bollinger': self.bollinger_encoding() } return patterns class QuantumFeatureGenerator: def __init__(self, num_qubits=8): self.num_qubits = num_qubits self.simulator = AerSimulator() self.scaler = MinMaxScaler() def create_quantum_circuit(self, market_data, current_price): qr = QuantumRegister(self.num_qubits, 'qr') cr = ClassicalRegister(self.num_qubits, 'cr') qc = QuantumCircuit(qr, cr) # Нормализуем данные scaled_data = self.scaler.fit_transform(market_data.reshape(-1, 1)).flatten() # Создаем суперпозицию for i in range(self.num_qubits): qc.h(qr[i]) # Применяем рыночные данные как фазы for i in range(min(len(scaled_data), self.num_qubits)): angle = float(scaled_data[i] * np.pi) qc.ry(angle, qr[i]) # Создаем запутанность for i in range(self.num_qubits - 1): qc.cx(qr[i], qr[i + 1]) # Добавляем текущую цену price_angle = float((current_price % 0.01) * 100 * np.pi) qc.ry(price_angle, qr[0]) qc.measure(qr, cr) return qc def get_quantum_features(self, market_data, current_price): qc = self.create_quantum_circuit(market_data, current_price) compiled_circuit = transpile(qc, self.simulator, optimization_level=3) job = self.simulator.run(compiled_circuit, shots=2000) result = job.result() counts = result.get_counts() # Создаем вектор квантовых признаков feature_vector = np.zeros(2**self.num_qubits) total_shots = sum(counts.values()) for bitstring, count in counts.items(): index = int(bitstring, 2) feature_vector[index] = count / total_shots return feature_vector class HybridQuantumBinaryPredictor: def __init__(self, num_qubits=8, lookback=10, forecast_window=5): self.num_qubits = num_qubits self.lookback = lookback self.forecast_window = forecast_window self.quantum_generator = QuantumFeatureGenerator(num_qubits) self.model = CatBoostClassifier( iterations=500, learning_rate=0.03, depth=6, loss_function='Logloss', verbose=False ) def prepare_features(self, df): """Подготовка гибридных признаков""" pattern_generator = BinaryPatternGenerator(df, self.lookback) binary_patterns = pattern_generator.get_all_patterns() features = [] labels = [] # Заполняем NaN в бинарных паттернах for key in binary_patterns: binary_patterns[key] = binary_patterns[key].fillna(0) for i in range(self.lookback, len(df) - self.forecast_window): try: # Квантовые признаки market_data = df['close'].iloc[i-self.lookback:i].values current_price = df['close'].iloc[i] quantum_features = self.quantum_generator.get_quantum_features(market_data, current_price) # Бинарные признаки binary_vector = [] for key in binary_patterns: window = binary_patterns[key].iloc[i-self.lookback:i].values binary_vector.extend([ sum(window), # Общее количество сигналов window[-1], # Последний сигнал sum(window[-3:]) # Последние 3 сигнала ]) # Технические индикаторы rsi = binary_patterns['rsi'].iloc[i] bollinger = binary_patterns['bollinger'].iloc[i] momentum = binary_patterns['momentum'].iloc[i] # Объединяем все признаки feature_vector = np.concatenate([ quantum_features, binary_vector, [rsi, bollinger, momentum] ]) # Метка: направление движения цены future_price = df['close'].iloc[i + self.forecast_window] current_price = df['close'].iloc[i] label = 1 if future_price > current_price else 0 features.append(feature_vector) labels.append(label) except Exception as e: print(f"Error at index {i}: {str(e)}") continue return np.array(features), np.array(labels) def train(self, df): """Обучение гибридной модели""" print("Preparing features...") X, y = self.prepare_features(df) # Разделение на обучающую и тестовую выборки split_point = int(len(X) * 0.8) X_train, X_test = X[:split_point], X[split_point:] y_train, y_test = y[:split_point], y[split_point:] print("Training model...") self.model.fit(X_train, y_train, eval_set=(X_test, y_test)) # Оценка модели predictions = self.model.predict(X_test) probas = self.model.predict_proba(X_test) # Расчет метрик metrics = { 'accuracy': accuracy_score(y_test, predictions), 'precision': precision_score(y_test, predictions), 'recall': recall_score(y_test, predictions), 'f1': f1_score(y_test, predictions) } # Анализ важности признаков feature_importance = self.model.feature_importances_ quantum_importance = np.mean(feature_importance[:2**self.num_qubits]) binary_importance = np.mean(feature_importance[2**self.num_qubits:]) metrics.update({ 'quantum_importance': quantum_importance, 'binary_importance': binary_importance, 'test_predictions': predictions, 'test_probas': probas, 'test_actual': y_test }) return metrics def predict_next(self, df): """Прогноз следующего движения""" X, _ = self.prepare_features(df) if len(X) > 0: last_features = X[-1].reshape(1, -1) prediction_proba = self.model.predict_proba(last_features)[0] prediction = self.model.predict(last_features)[0] return { 'direction': 'UP' if prediction == 1 else 'DOWN', 'probability_up': prediction_proba[1], 'probability_down': prediction_proba[0], 'confidence': max(prediction_proba) } return None def test_hybrid_model(symbol="EURUSD", timeframe=mt5.TIMEFRAME_H1, periods=1000): """Полное тестирование гибридной модели""" try: # Инициализация MT5 if not mt5.initialize(): raise Exception("Failed to initialize MT5") # Загрузка данных print(f"Loading {periods} periods of {symbol} {timeframe} data...") loader = MT5DataLoader(symbol, timeframe) df = loader.get_historical_data(periods) # Создание и обучение модели print("Creating hybrid model...") model = HybridQuantumBinaryPredictor() # Обучение и оценка print("Training and evaluating model...") metrics = model.train(df) # Вывод результатов print("\nModel Performance Metrics:") print(f"Accuracy: {metrics['accuracy']:.2%}") print(f"Precision: {metrics['precision']:.2%}") print(f"Recall: {metrics['recall']:.2%}") print(f"F1 Score: {metrics['f1']:.2%}") print("\nFeature Importance Analysis:") print(f"Quantum Features: {metrics['quantum_importance']:.2%}") print(f"Binary Features: {metrics['binary_importance']:.2%}") # Текущий прогноз print("\nCurrent Market Prediction:") prediction = model.predict_next(df) if prediction: print(f"Predicted Direction: {prediction['direction']}") print(f"Up Probability: {prediction['probability_up']:.2%}") print(f"Down Probability: {prediction['probability_down']:.2%}") print(f"Confidence: {prediction['confidence']:.2%}") return model, metrics finally: mt5.shutdown() if __name__ == "__main__": print("Starting Quantum-Binary Hybrid Trading System...") model, metrics = test_hybrid_model() print("\nSystem test completed.")
Первые результаты оказались отрезвляющими. На часовом таймфрейме EURUSD точность системы составила всего 42.13%, что даже хуже случайного угадывания. Precision в 39.71% и recall в 27% говорят о том, что модель сильно ошибается в своих прогнозах. F1-мера в 32.14% подтверждает общую слабость предсказаний.
Особенно интересным оказался анализ важности признаков. Квантовые признаки внесли всего 27.63% в общую предсказательную силу модели, в то время как бинарные признаки показали значимость в 121.95%. Это наводит на мысль, что либо квантовая часть системы не улавливает важные паттерны в данных, либо сам способ квантового кодирования требует серьезной доработки.
Но эти результаты не обескураживают — наоборот, они указывают на конкретные направления для улучшений. Возможно, стоит изменить схему квантового кодирования, увеличить или уменьшить число кубитов, поэкспериментировать с другими квантовыми вентилями. Или, может быть, проблема в том, как квантовые и классические признаки интегрируются друг с другом.
Эксперимент показал, что создание эффективной квантово-классической гибридной системы — это не просто вопрос объединения двух подходов. Требуется глубокое понимание как квантовых вычислений, так и специфики финансовых рынков. Это только первый шаг в долгом пути исследований и оптимизаций.
В следующих итерациях я планирую значительно переработать квантовую часть системы, возможно, добавив более сложные квантовые преобразования и улучшив способ кодирования рыночной информации в квантовые состояния. Также стоит поэкспериментировать с различными способами объединения квантовых и классических признаков, чтобы найти оптимальный баланс между ними.

Заключение
Я думал, что объединить квантовые вычисления с техническим анализом — это отличная идея. Ну знаете, как в фильмах: берём крутую технологию, добавляем немного магии машинного обучения, и вуаля — печатный станок для денег готов! А на деле — нет.
Мой "гениальный" квантовый классификатор с трудом наскрёб 42% точности. Это хуже, чем подбрасывать монетку! И знаете, что самое смешное? Все эти навороченные квантовые примочки, над которыми я корпел неделями, принесли всего 27% пользы. А старые добрые технические индикаторы, которые я добавил "для подстраховки", выстрелили на все 122%.
Особенно я загорелся, когда начал разбираться с квантовым кодированием данных. Представляете, мы берём обычные ценовые движения и превращаем их в квантовые состояния! Звучит как научная фантастика, но это реально работает. Правда, пока не совсем так, как хотелось бы.
Мой квантовый классификатор пока больше похож на сломанный калькулятор, чем на торговую систему будущего. Но я не сдаюсь. Потому что где-то здесь, в этом странном мире квантовых состояний и рыночных паттернов, скрывается нечто действительно стоящее. И я намерен это найти, даже если мне придётся переписать весь код с нуля.
А пока... Пока я возвращаюсь к своим кубитам. Все же, обычная "квантовая" схема показала кое-какие результаты. Лучше угадывания - и ладно? Но у меня есть пара идей, как заставить эту штуку работать. И я о них обязательно расскажу.
Программы, используемые в статье
Файл | Содержание файла |
---|---|
Quant_Predict_p_1.py | Классическое квантовое прогнозирование с попыткой открыть продобраз |
Quant_Neural_Link.py | Черновая версия квантово-нейронной сети |
Quant_ML_Model.py | Черновая версия квантовой модели машинного обучения |





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования