Quantencomputing und Handel: Ein neuer Ansatz für Preisprognosen
Einführung in das Quantencomputing für den Handel: Wichtige Konzepte und Vorteile
Stellen Sie sich eine Welt vor, in der jede Markttransaktion durch die Linse von Möglichkeiten analysiert wird, die gleichzeitig existieren – wie die berühmte Schrödingers Katze, die sowohl lebendig als auch tot ist, bis wir die Box öffnen. So funktioniert der Quantenhandel: Er betrachtet alle möglichen Marktzustände auf einmal und eröffnet damit neue Horizonte für die Finanzanalyse.
Während herkömmliche Computer Informationen sequentiell, Bit für Bit, verarbeiten, nutzen Quantensysteme die erstaunlichen Eigenschaften der Mikrowelt – Überlagerung und Verschränkung – um mehrere Szenarien parallel zu analysieren. Es ist wie bei einem erfahrenen Händler, der Dutzende von Charts, Nachrichten und Indikatoren gleichzeitig im Kopf hat, aber in unvorstellbarem Ausmaß.
Wir leben in einer Zeit, in der der algorithmische Handel bereits zur Norm geworden ist, aber nun stehen wir an der Schwelle zur nächsten Revolution. Quantencomputing verspricht mehr als nur eine schnellere Datenanalyse – es bietet einen grundlegend neuen Ansatz zum Verständnis von Marktprozessen. Stellen Sie sich vor, wir könnten statt einer linearen Vorhersage des Preises eines Vermögenswerts einen ganzen Baum von Wahrscheinlichkeitsszenarien erkunden, wobei jeder Zweig die subtilsten Marktkorrelationen berücksichtigt.
In diesem Artikel tauchen wir in die Welt des Quantenhandels ein – von den Grundprinzipien des Quantencomputings bis hin zur praktischen Umsetzung von Handelssystemen. Wir werden uns ansehen, wie Quantenalgorithmen Muster finden können, bei denen herkömmliche Methoden versagen, und wie dieser Vorteil für Handelsentscheidungen in Echtzeit genutzt werden kann.
Unsere Reise beginnt mit den Grundlagen des Quantencomputings und führt uns allmählich zum Aufbau eines funktionierenden Marktvorhersagesystems. Dabei werden wir komplexe Konzepte auf einfache Beispiele herunterbrechen und sehen, wie sich die theoretischen Vorteile des Quantencomputings in praktische Handelsinstrumente umsetzen lassen.
Quantensuperposition und Verschränkung im Zusammenhang mit der Analyse von Finanzzeitreihen
Bei der Analyse der Finanzmärkte stehen wir vor einem grundlegenden Problem: einer unendlichen Anzahl von Faktoren, die sich gegenseitig beeinflussen. Jede Kursbewegung ist das Ergebnis eines komplexen Zusammenspiels von Tausenden von Variablen, von makroökonomischen Indikatoren bis hin zur Stimmung der einzelnen Händler. Hier bietet das Quantencomputing aufgrund seiner grundlegenden Eigenschaften – Überlagerung und Verschränkung – eine einzigartige Lösung.
Betrachten wir die Überlagerung. In einem herkömmlichen Computer kann ein Bit entweder 0 oder 1 sein. Ein Qubit existiert in allen möglichen Zuständen gleichzeitig, bis wir eine Messung durchführen. Mathematisch wird dies beschrieben als |ψ⟩ = α|0⟩ + β|1⟩, wobei α und β komplexe Wahrscheinlichkeitsamplituden sind. Bei der Anwendung auf die Zeitreihenanalyse ermöglicht diese Eigenschaft den Quantenalgorithmen, den Lösungsraum bei Portfolio- und Risikomanagementproblemen effektiv zu erforschen, indem viele potenzielle Szenarien parallel analysiert werden.
Die Quantenverschränkung bietet eine weitere Möglichkeit. Wenn Qubits verschränkt sind, sind ihre Zustände untrennbar miteinander verbunden, wie zum Beispiel durch |ψ⟩ = (|00⟩ + |11⟩)/√2 beschrieben. Im Rahmen der Finanzanalyse wird diese Eigenschaft in Quantenalgorithmen genutzt, um komplexe Korrelationen zwischen verschiedenen Marktindikatoren zu modellieren. So können wir beispielsweise Systeme entwickeln, die die Beziehungen zwischen den Preisen von Vermögenswerten, dem Handelsvolumen und der Marktvolatilität berücksichtigen.
Diese Quanteneigenschaften sind besonders beim Hochfrequenzhandel nützlich, wo die Geschwindigkeit der Verarbeitung multidimensionaler Daten entscheidend ist. Durch Überlagerung können mehrere Handelsszenarien parallel analysiert werden, während die Verschränkung hilft, komplexe Korrelationen zwischen den Märkten in Echtzeit zu berücksichtigen. Die Vorteile der Quantenphysik kommen vor allem bei bestimmten Optimierungs- und Suchproblemen zum Tragen, bei denen die Komplexität der klassischen Algorithmen exponentiell zunimmt.
Entwicklung eines Quantenvorhersagealgorithmus unter Verwendung von QPE (Quantum Phase Estimation)
Das Herzstück unseres Systems ist eine elegante Kombination aus Quantencomputing und klassischer technischer Analyse. Stellen Sie sich ein Quantenorchester aus acht Qubits vor, in dem jedes Qubit ein Musiker ist, der seinen Part in einer komplexen Symphonie von Marktbewegungen spielt.
Alles beginnt mit der Datenaufbereitung. Unsere Quantenprognose empfängt Marktdaten durch die Integration mit MetaTrader 5, wie Neuronen, die Informationen von den Sinnen aufnehmen. Diese Daten durchlaufen einen Normalisierungsprozess – stellen Sie sich vor, wir würden alle Instrumente eines Orchesters auf dieselbe Tonart stimmen.
Der interessanteste Teil beginnt mit der Erstellung eines Quantenschaltkreises. Zunächst versetzen wir jedes Qubit mithilfe von Hadamard-Gattern (H-Gattern) in einen Superpositionszustand. An diesem Punkt existiert jedes Qubit gleichzeitig in allen möglichen Zuständen, so als ob jeder Musiker gleichzeitig alle möglichen Noten seines Parts spielen würde.
Anschließend kodieren wir die Marktdaten mit Hilfe von ry-Gattern in Quantenzustände, wobei der Drehwinkel durch den Wert der Marktparameter bestimmt wird. Er ist wie ein Dirigent, der das Tempo und den Charakter der Darbietung für jeden Musiker vorgibt. Besondere Aufmerksamkeit wird dem aktuellen Preis gewidmet – er erhält eine eigene Quantendrehung und beeinflusst das gesamte System wie ein Solist in einem Orchester.
Die eigentliche Magie entsteht, wenn Quantenverschränkung erzeugt wird. Mit Hilfe von cx-Gattern (CNOT) koppeln wir benachbarte Qubits und schaffen so unbrechbare Quantenkorrelationen. Es ist wie der Moment, in dem die einzelnen Stimmen der Musiker zu einem einzigen harmonischen Klang verschmelzen.
Nach Quantenumwandlungen führen wir Messungen durch, als ob wir ein Konzert aufzeichnen würden. Aber jetzt kommt der Clou: Wir wiederholen diesen Vorgang 2000 Mal (Versuche) und erhalten eine statistische Verteilung der Ergebnisse. Jede Dimension ergibt eine Bitfolge, wobei die Anzahl der Einsen die Richtung der Vorhersage bestimmt.
Der Schlussakkord ist die Interpretation der Ergebnisse. Das System ist sehr konservativ in seinen Prognosen und begrenzt die maximale Preisänderung auf 0,1 %. Es ist wie bei einem erfahrenen Dirigenten, der nicht zulässt, dass das Orchester zu laut oder zu leise spielt, sondern das Gleichgewicht des Klangs aufrechterhält.
Die Testergebnisse sprechen für sich. Die Genauigkeit der Vorhersagen übertrifft das zufällige Raten und erreicht 54 % für den EURUSD H1. Gleichzeitig weist das System ein hohes Maß an Vertrauen in seine Prognosen auf, was sich in der Kennzahl „Vertrauen“ widerspiegelt.
Bei dieser Implementierung ergänzt das Quantencomputing nicht nur die klassische technische Analyse, sondern schafft eine neue Dimension der Marktanalyse, bei der mehrere mögliche Szenarien gleichzeitig in Quantenüberlagerung untersucht werden. Wie Richard Feynman sagte: „Die Natur verhält sich auf der Quantenebene ganz anders, als wir normalerweise denken“. Und es scheint, dass die Finanzmärkte auch eine Quantennatur verbergen, die wir gerade erst zu verstehen beginnen.
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): # Reduce the number of qubits for stability self.num_qubits = num_qubits self.simulator = AerSimulator() self.scaler = MinMaxScaler() def create_qpe_circuit(self, market_data, current_price): """Create a simplified quantum circuit""" qr = QuantumRegister(self.num_qubits, 'qr') cr = ClassicalRegister(self.num_qubits, 'cr') qc = QuantumCircuit(qr, cr) # Normalize data scaled_data = self.scaler.fit_transform(market_data.reshape(-1, 1)).flatten() # Create superposition for i in range(self.num_qubits): qc.h(qr[i]) # Apply market data as phases for i in range(min(len(scaled_data), self.num_qubits)): angle = float(scaled_data[i] * np.pi) # Convert to float qc.ry(angle, qr[i]) # Create entanglement for i in range(self.num_qubits - 1): qc.cx(qr[i], qr[i + 1]) # Apply the current price price_angle = float((current_price % 0.01) * 100 * np.pi) # Use only the last 2 characters qc.ry(price_angle, qr[0]) # Measure all qubits qc.measure(qr, cr) return qc def predict(self, market_data, current_price, features=None, shots=2000): """Simplified prediction""" # Trim the input data if market_data.shape[0] > self.num_qubits: market_data = market_data[-self.num_qubits:] # Create and execute the circuit 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() # Analyze the results predictions = [] total_shots = sum(counts.values()) for bitstring, count in counts.items(): # Use the number of ones in the bitstring to determine the direction ones = bitstring.count('1') direction = ones / self.num_qubits # Normalized direction # Predict the change of no more than 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): """Prepare technical indicators""" 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): # Get data df = self.data_loader.get_historical_data(self.window_size + 50) features = self.prepare_features(df) if len(features) < self.window_size: raise ValueError("Insufficient data") # Get the latest data for the forecast latest_features = features.iloc[-self.window_size:].values current_price = df['close'].iloc[-1] # Make a prediction, now pass features as DataFrame prediction = self.quantum_predictor.predict( market_data=latest_features, current_price=current_price, features=features.iloc[-self.window_size:] # Pass the last entries ) 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): """Evaluation of model accuracy""" predictor = MarketPredictor(symbol, timeframe) predictions = [] actual_movements = [] # Get historical data 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) # Get data for forecasting latest_features = features_temp.iloc[-predictor_temp.window_size:].values current_price = temp_df['close'].iloc[-1] # Make a forecast with the transfer of all necessary parameters 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("\nTest the model...") metrics = evaluate_model(symbol, timeframe, test_periods=100) print("\nModel quality 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("\nCurrent forecast:") 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() # Now this method passes all parameters correctly print(f"Predicted price: {prediction['predicted_price']:.5f}") print(f"Growth probability: {prediction['up_probability']:.2%}") print(f"Fall probability: {prediction['down_probability']:.2%}") print(f"Forecast confidence: {prediction['confidence']:.2%}") print(f"Current price: {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()
Prüfung und Validierung eines Quantenhandelssystems: Methodik und Ergebnisse

Wichtige Leistungskennzahlen
- Gesamtgenauigkeit (Accuracy): 55,00% Übertrifft mäßig das zufällige Raten für den volatilen EURUSD-Markt.
- Prognosegenauigkeit (Precision): 63,64% Zeigt eine gute Zuverlässigkeit der vom System erzeugten Signale – fast zwei Drittel der Prognosen sind korrekt.
- Trefferquote (Recall): 14,58% Eine niedrige Trefferquote deutet darauf hin, dass das System selektiv ist und nur dann Signale erzeugt, wenn ein hohes Vertrauen in die Prognose besteht. Dies hilft, falsche Signale zu vermeiden.
- F1-Score: 23,73 % Der F1-Wert spiegelt das Gleichgewicht zwischen Präzision und Trefferquote wider und bestätigt die konservative Strategie des Systems.
Aktuelle Marktprognose
- Aktueller EURUSD-Kurs: 1.02903
- Voraussichtlicher Preis: 1.02905
- Wahrscheinlichkeitsverteilung:
- Wachstumswahrscheinlichkeit: 38.95%
- Wahrscheinlichkeit eines Rückschlags: 61.05%
- Vertrauen in die Vorhersage: 99.98%
Das System prognostiziert mit hoher Zuversicht eine moderate Aufwärtsbewegung, obwohl die Wahrscheinlichkeit eines Rückgangs überwiegt. Dies könnte auf eine kurzfristige Korrektur im Rahmen des allgemeinen Abwärtstrends hindeuten.
Technische Indikatoren
- RSI: 49,13 (nahe der neutralen Zone, deutet auf keine eindeutig überkauften oder überverkauften Bedingungen hin)
- SMA: 1.02904
- EMA: 1.02909
- Trend: neutral (aktueller Kurs liegt in der Nähe der gleitenden Durchschnittswerte)
Zusammenfassung
Das System weist die folgenden Hauptmerkmale auf:
- Gleichbleibende Genauigkeit gegenüber zufälligem Schätzen
- Hohe Selektivität bei der Signalerzeugung (63,64 % genaue Vorhersagen)
- Fähigkeit, das Vertrauen und die Wahrscheinlichkeiten verschiedener Szenarien zu quantifizieren
- Eine umfassende Analyse der Marktsituation, die sowohl technische Indikatoren als auch komplexere Muster berücksichtigt
Dieser konservative Ansatz, bei dem die Qualität der Signale Vorrang vor ihrer Quantität hat, macht das System zu einem potenziell effektiven Instrument für den realen Handel.
Integration von Metriken des maschinellen Lernens und Quantenalgorithmen: Überlegungen und erste Versuche
Die Kombination von Quantencomputing und maschinellem Lernen eröffnet neue Horizonte. In unserem Experiment wird der MinMaxScaler von sklearn verwendet, um die Daten vor der Quantenkodierung zu normalisieren und die Marktdaten in Quantenwinkel umzuwandeln.
Das System kombiniert Metriken des maschinellen Lernens (Genauigkeit, Präzision, Wiedererkennung, F1-Score) mit Quantenmessungen. Mit einer Genauigkeit von 60 % erfasst es Muster, die für klassische Algorithmen unzugänglich sind, und beweist dabei Vorsicht und Selektivität wie ein erfahrener Händler.
Die Zukunft solcher Systeme liegt in der Integration ausgefeilter Vorverarbeitungsmethoden wie Autoencodern und Transformatoren für eine tiefere Datenanalyse. Quantenalgorithmen können zu einem Filter für klassische Modelle werden oder umgekehrt und sich den Marktbedingungen anpassen.
Unser Experiment beweist, dass die Synergie von Quanten- und klassischen Methoden keine Option, sondern ein Weg zum nächsten Durchbruch im algorithmischen Handel ist.
Wie ich anfing, mein erstes Quantenneuronales Netz zu schreiben – den Klassifikator
Als ich begann, im Handel mit Quantencomputern zu experimentieren, beschloss ich, über einfache Quantenschaltungen hinauszugehen und ein hybrides System zu schaffen, das Quantencomputer mit klassischen maschinellen Lernmethoden kombiniert. Die Idee schien vielversprechend. Ich wollte Quantenzustände verwenden, um Marktinformationen zu kodieren, und dann einen konventionellen Klassifikator auf diese Daten trainieren.
Das System erwies sich als recht komplex. Es basiert auf einem 8-Qubit-Quantenschaltkreis, der Marktdaten durch eine Reihe von Quantengattern in Quantenzustände umwandelt. Jeder Teil der Preisgeschichte wird in Drehwinkeln von ry-Gattern kodiert, und die Verschränkung zwischen Qubits wird mit cx-Gattern erzeugt. Dadurch kann das System komplexe nichtlineare Beziehungen in den Daten erfassen.
Um die Vorhersagefähigkeit zu verbessern, habe ich eine Reihe klassischer binärer Indikatoren hinzugefügt: Kursrichtung, Momentum, Volumen, Konvergenz/Divergenz des gleitenden Durchschnitts, Volatilität, RSI und Bollinger-Bänder. Jeder Indikator erzeugt binäre Signale, die dann mit Quantenmerkmalen kombiniert werden.
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) # Normalize data scaled_data = self.scaler.fit_transform(market_data.reshape(-1, 1)).flatten() # Create superposition for i in range(self.num_qubits): qc.h(qr[i]) # Apply market data as phases for i in range(min(len(scaled_data), self.num_qubits)): angle = float(scaled_data[i] * np.pi) qc.ry(angle, qr[i]) # Create entanglement for i in range(self.num_qubits - 1): qc.cx(qr[i], qr[i + 1]) # Add the current price 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() # Create a vector of quantum features 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): """Prepare hybrid features""" pattern_generator = BinaryPatternGenerator(df, self.lookback) binary_patterns = pattern_generator.get_all_patterns() features = [] labels = [] # Fill NaN in binary patterns 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: # Quantum features 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 features binary_vector = [] for key in binary_patterns: window = binary_patterns[key].iloc[i-self.lookback:i].values binary_vector.extend([ sum(window), # Total number of signals window[-1], # Last signal sum(window[-3:]) # Last 3 signals ]) # Technical indicators rsi = binary_patterns['rsi'].iloc[i] bollinger = binary_patterns['bollinger'].iloc[i] momentum = binary_patterns['momentum'].iloc[i] # Combine all features feature_vector = np.concatenate([ quantum_features, binary_vector, [rsi, bollinger, momentum] ]) # Label: price movement direction 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): """Train hybrid model""" print("Preparing features...") X, y = self.prepare_features(df) # Split into training and test samples 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)) # Model evaluation predictions = self.model.predict(X_test) probas = self.model.predict_proba(X_test) # Calculate metrics 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 analysis 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): """Next movement forecast""" 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): """Full test of the hybrid model""" try: # MT5 initialization if not mt5.initialize(): raise Exception("Failed to initialize MT5") # Download data print(f"Loading {periods} periods of {symbol} {timeframe} data...") loader = MT5DataLoader(symbol, timeframe) df = loader.get_historical_data(periods) # Create and train model print("Creating hybrid model...") model = HybridQuantumBinaryPredictor() # Training and assessment print("Training and evaluating model...") metrics = model.train(df) # Output results 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%}") # Current forecast 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.")
Die ersten Ergebnisse waren ernüchternd. Beim EURUSD H1 lag die Genauigkeit des Systems bei nur 42,13 %, was sogar noch schlechter ist als das zufällige Schätzen. Eine Genauigkeit von 39,71 % und eine Wiederauffindbarkeit von 27 % zeigen, dass das Modell in seinen Vorhersagen deutlich falsch liegt. Der F1-Wert von 32,14 % bestätigt die allgemeine Schwäche der Prognosen.
Als besonders interessant erwies sich die Analyse der Bedeutung der Merkmale. Quantenmerkmale trugen nur zu 27,63 % zur Gesamtvorhersagekraft des Modells bei, während binäre Merkmale eine Signifikanz von 121,95 % aufwiesen. Dies deutet darauf hin, dass entweder der Quantenteil des Systems wichtige Muster in den Daten nicht erkennt oder dass die Quantencodierungsmethode selbst stark verbesserungsbedürftig ist.
Diese Ergebnisse sind jedoch nicht entmutigend – im Gegenteil, sie weisen auf spezifische Bereiche hin, in denen Verbesserungen möglich sind. Vielleicht lohnt es sich, die Quantencodierschaltung zu ändern, die Anzahl der Qubits zu erhöhen oder zu verringern und mit anderen Quantengattern zu experimentieren. Vielleicht liegt das Problem aber auch darin, wie Quanten- und konventionelle Eigenschaften ineinandergreifen.
Das Experiment zeigte, dass die Schaffung eines effizienten quantenklassischen Hybridsystems nicht einfach eine Frage der Kombination der beiden Ansätze ist. Sie erfordert ein tiefes Verständnis sowohl des Quantencomputings als auch der Besonderheiten der Finanzmärkte. Dies ist nur der erste Schritt auf einem langen Weg der Forschung und Optimierung.
In zukünftigen Iterationen plane ich, den Quantenteil des Systems erheblich zu überarbeiten, möglicherweise komplexere Quantentransformationen hinzuzufügen und die Art und Weise zu verbessern, wie Marktinformationen in Quantenzustände kodiert werden. Es lohnt sich auch, mit verschiedenen Möglichkeiten der Kombination von Quanten- und klassischen Merkmalen zu experimentieren, um das optimale Gleichgewicht zwischen ihnen zu finden.

Schlussfolgerung
Ich dachte, es sei eine großartige Idee, Quantencomputing mit technischer Analyse zu kombinieren. Wie im Film: Man nehme eine coole Technologie, füge ein wenig Magie des maschinellen Lernens hinzu, und voilà – fertig ist die Gelddruckmaschine! Die Realität hat mich eines Besseren belehrt.
Mein „brillanter“ Quantenklassifikator erreichte gerade einmal 42 % Genauigkeit. Das ist schlimmer als eine Münze zu werfen! Und wissen Sie, was das Lustigste ist? All diese ausgefallenen Quantenfunktionen, an denen ich wochenlang gearbeitet habe, brachten nur 27 % Nutzen. Und die guten alten technischen Indikatoren, die ich „vorsichtshalber“ hinzugefügt hatte, stiegen um 122 %.
Besonders aufgeregt war ich, als ich begann, die Quantenverschlüsselung von Daten zu begreifen. Stellen Sie sich vor, wir nehmen gewöhnliche Preisbewegungen und verwandeln sie in Quantenzustände! Es klingt wie Science-Fiction, aber es funktioniert wirklich. Allerdings nicht ganz so, wie ich es mir vorstelle.
Mein Quantenklassifikator ist immer noch eher ein kaputter Taschenrechner als ein Handelssystem der Zukunft. Aber ich gebe nicht auf. Denn irgendwo da draußen, in dieser seltsamen Welt der Quantenzustände und Marktmuster, ist etwas wirklich Wertvolles versteckt. Und ich habe vor, sie zu finden, auch wenn ich den gesamten Code von Grund auf neu schreiben muss.
In der Zwischenzeit... kehre ich zu meinen Qubits zurück. Dennoch zeigte das gewöhnliche „Quanten“-Schema einige Ergebnisse. Besser als zu raten... Aber ich habe ein paar Ideen, wie man die Sache zum Laufen bringen kann. Und ich werde Ihnen auf jeden Fall davon erzählen.
Programme, die im diesem Artikel verwendet werden
| Datei | Inhalt der Datei |
|---|---|
| Quant_Predict_p_1.py | Klassische Quantenvorhersage mit einem Versuch, den Prototyp zu entdecken |
| Quant_Neural_Link.py | Entwurf der Version des neuronalen Quantennetzwerks |
| Quant_ML_Model.py | Entwurf des Modells für das maschinelle Lernen mit Quanten |
Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/16879
Warnung: Alle Rechte sind von MetaQuotes Ltd. vorbehalten. Kopieren oder Vervielfältigen untersagt.
Dieser Artikel wurde von einem Nutzer der Website verfasst und gibt dessen persönliche Meinung wieder. MetaQuotes Ltd übernimmt keine Verantwortung für die Richtigkeit der dargestellten Informationen oder für Folgen, die sich aus der Anwendung der beschriebenen Lösungen, Strategien oder Empfehlungen ergeben.
Black Hole Algorithmus (BHA)
Neuronale Netze im Handel: Ein hybrider Handelsrahmen mit prädiktiver Kodierung (letzter Teil)
Neuronale Netze im Handel: Modelle mit Wavelet-Transformation und Multitasking-Aufmerksamkeit
Artificial Tribe Algorithm (ATA)
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.