English Русский 中文 Español 日本語 Português
preview
Quantencomputing und Handel: Ein neuer Ansatz für Preisprognosen

Quantencomputing und Handel: Ein neuer Ansatz für Preisprognosen

MetaTrader 5Handelssysteme |
144 0
Yevgeniy Koshtenko
Yevgeniy Koshtenko

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:

  1. Gleichbleibende Genauigkeit gegenüber zufälligem Schätzen
  2. Hohe Selektivität bei der Signalerzeugung (63,64 % genaue Vorhersagen)
  3. Fähigkeit, das Vertrauen und die Wahrscheinlichkeiten verschiedener Szenarien zu quantifizieren
  4. 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

Beigefügte Dateien |
Quant_ML_Model.py (11.58 KB)
Black Hole Algorithmus (BHA) Black Hole Algorithmus (BHA)
Der Black Hole Algorithm (BHA) nutzt die Prinzipien der Schwerkraft von Schwarzen Löchern, um Lösungen zu optimieren. In diesem Artikel werden wir uns ansehen, wie BHA die besten Lösungen findet und dabei lokale Extreme vermeidet, und warum dieser Algorithmus zu einem leistungsstarken Werkzeug für die Lösung komplexer Probleme geworden ist. Erfahren Sie, wie einfache Ideen zu beeindruckenden Ergebnissen in der Welt der Optimierung führen können.
Neuronale Netze im Handel: Ein hybrider Handelsrahmen mit prädiktiver Kodierung (letzter Teil) Neuronale Netze im Handel: Ein hybrider Handelsrahmen mit prädiktiver Kodierung (letzter Teil)
Wir setzen unsere Untersuchung des hybriden Handelssystems StockFormer fort, das prädiktive Kodierungs- und Verstärkungslernalgorithmen für die Analyse von Finanzzeitreihen kombiniert. Das System basiert auf drei Transformer-Zweigen mit einem diversifizierten Mehrkopf-Aufmerksamkeitsmechanismus (DMH-Attn), der die Erfassung komplexer Muster und Abhängigkeiten zwischen Assets ermöglicht. Zuvor haben wir uns mit den theoretischen Aspekten des Frameworks vertraut gemacht und die DMH-Attn-Mechanismus implementiert. Heute werden wir über die Modellarchitektur und das Training sprechen.
Neuronale Netze im Handel: Modelle mit Wavelet-Transformation und Multitasking-Aufmerksamkeit Neuronale Netze im Handel: Modelle mit Wavelet-Transformation und Multitasking-Aufmerksamkeit
Wir laden Sie ein, einen Rahmen zu erkunden, der Wavelet-Transformationen und ein Multitasking-Selbstaufmerksamkeitsmodell kombiniert, um die Reaktionsfähigkeit und Genauigkeit von Prognosen unter volatilen Marktbedingungen zu verbessern. Die Wavelet-Transformation ermöglicht die Zerlegung der Renditen von Vermögenswerten in hohe und niedrige Frequenzen, wodurch langfristige Markttrends und kurzfristige Schwankungen sorgfältig erfasst werden.
Artificial Tribe Algorithm (ATA) Artificial Tribe Algorithm (ATA)
In diesem Artikel werden die wichtigsten Komponenten und Innovationen des ATA-Optimierungsalgorithmus ausführlich besprochen. Dabei handelt es sich um eine evolutionäre Methode mit einem einzigartigen dualen Verhaltenssystem, das sich je nach Situation anpasst. ATA kombiniert individuelles und soziales Lernen und nutzt Crossover für Erkundungen und Migration, um Lösungen zu finden, wenn sie in lokalen Optima stecken.