English Русский Español Deutsch 日本語 Português
preview
MQL5 中的量子神经网络(第二部分):基于 ALGLIB 马尔可夫矩阵的神经网络反向传播训练

MQL5 中的量子神经网络(第二部分):基于 ALGLIB 马尔可夫矩阵的神经网络反向传播训练

MetaTrader 5 — 指标 |
43 9
Yevgeniy Koshtenko
Yevgeniy Koshtenko

“如果量子计算机和量子计算成为现实,它们将改变我们对计算的看法,甚至可能改变我们对现实本质的理解。”

米哈伊尔·迪亚科诺夫,物理学家


算法交易员日益面临着这样一个事实:他们常用的模型已经无法产生预期结果。之前被视为突破性进展的长短时记忆网络(LSTM)的准确率约为 58%。尽管 Transformer 在自然语言处理(NLP)方面取得了进步,但在处理金融数据的噪声时却显得力不从心。自回归积分滑动平均(ARIMA)类模型已失去其实用价值。

一种典型情况是:一个交易系统在历史表现良好,但在实际交易中却迅速失去效率。主要原因是过拟合以及传统网络无法适应不断变化的市场条件。从平稳趋势到高波动性的转变,使得许多算法变得无用。预测准确率降至 51 % 至 58%,回撤达到 40% 至 50%,夏普比率(Sharpe ratio)很少超过 1.0。


新方法:算法交易中的量子效应

我们利用量子效应为市场分析提供了不同的视角。这并非粒子物理学,而是一个类比:量子力学的许多原理 — 叠加、干涉、退相干和共振 — 在金融数据分析中都有应用。

  • 叠加原理:一项资产可以在不同的时间周期内同时显示出上涨和下跌的迹象。
  • 干涉:一致的信号(新闻、技术分析、交易量)会增强市场波动,而不一致的信号则会抑制市场波动。
  • 退相干:新闻的影响会随时间逐渐减弱,市场会“遗忘”过去的事件。
  • 共振:市场周期的趋同会放大市场波动,从而形成强劲的趋势。

该模型在构建时考虑了量子原理,并展示了:

  • 预测准确率:62%–65%
  • 夏普比率:1.8–2.4
  • 最大回撤:不超过 20%

文中附有使用 MQL5 编写的完整交易 EA 源代码,系统可直接在 MetaTrader 5 中使用。


量子神经网络的工作原理

该网络是一个多层级分析器,每一层都负责分析市场的特定方面。分析了超过 400 个特征:

  • 过去 20 个周期的 OHLC 价格;
  • 交易量及其动态;
  • RSI、随机振荡指标、移动平均线和其他指标;
  • 蜡烛图形态(十字星、锤子线、星形线等);
  • 时间特征(一天中的时间、一周中的日子);
  • 市场周期和时间共振。
如何应用量子效应
  1. 共振:放大与网络“调谐”记忆相匹配的信号。
  2. 干涉:系统识别一致/冲突的影响。
  3. 叠加:同时分析相互冲突的特征。
  4. 退相干:考虑事件重要性随时间推移而衰减的现象。

系统架构

所提出的架构由以下组件构成:

  1. 输入层:处理 400 个市场数据特征
  2. 量子处理器:将量子效应应用于输入数据
  3. 上下文分析器:一个多级记忆系统
  4. 马尔可夫链:市场状态建模
  5. Transformer 模块:一种具有量子修正的注意力机制
  6. 状态空间模型(SSM):长期依赖性
  7. 元验证模型:评估预测的置信度
  8. 输出层:生成交易信号

这是最有趣的部分,真正的魔力就体现在这里。该系统对收集到的信息应用了三种量子效应,这有助于它理解市场数据中隐藏的关系。

共振的原理就像将收音机调谐到所需的频率一样。当输入信号与系统内存中存储的信息“共振”时,系统会放大该信号。从数学角度来看,它看起来是这样的:

resonance = 1.0 + resonance_strength * cos(input_val * context_val * π)

想象一下,EURUSD 的价格开始上涨,而系统“记忆”起了近期发生过的类似情况。如果模式相匹配,就会产生共振,系统对上涨预测的信心也会增强。

干涉现象展示了不同因素之间如何相互影响。有时它们会增强整体信号(相长干涉),有时则会削弱整体信号(相消干涉)。其公式很简单:

interference = interference_amplitude * sin(input_val * context_val * 2π)

例如,如果技术指标显示上涨,但新闻却是负面的,就会出现相消干涉 — 信号相互“抵消”。

退相干是导致“遗忘”旧信息的原因。事件发生后经过的时间越长,其对当前预测的影响就越小:

coherent_factor = coherence + (1.0 - coherence) * exp(-decoherence_rate * t)

这就像人类的记忆 — 我们能清楚地记住昨天的新闻,但一个月前发生的事情就没那么重要了。

该系统拥有四种类型的记忆,就像人类一样。短期记忆记住的是最近几个小时发生的事情。中期记忆存储有关最近几天事件的信息。长期记忆包含着持续数周的重要模式。情节记忆会记住特定事件,如发生重大新闻或市场剧烈波动的日子。

有趣的是,每种记忆类型的权重会根据市场情况自动变化:

short_weight = 0.4 + 0.4 * input_volatility
medium_weight = 0.3 + 0.2 * (1.0 - input_volatility)  
long_weight = 0.2 + 0.3 * (1.0 - input_volatility)
episodic_weight = 0.1 + 0.3 * input_complexity

当市场变得波动时,系统更依赖于短期记忆 — 一小时前发生的事情比一周前发生的事情更重要。相反,在市场平静时期,系统会激活长期记忆来寻找全局趋势。


马尔可夫链作为市场动态模型

该系统将当前市场状态分为五种:强劲上涨、弱势上涨、横盘、弱势下跌或强劲下跌。这与气象学家对天气的分类相似:晴天、阴天、雨天。

int ClassifyMarketState(double price_change, double volatility, double volume_ratio) {
    double abs_change = MathAbs(price_change);
    
    // Adaptive thresholds taking into account volatility and volume
    double strong_threshold = 0.002 * (1.0 + volatility) * volume_ratio;
    double weak_threshold = 0.0005 * (1.0 + volatility) * volume_ratio;
    
    if(price_change > strong_threshold) return 0;      // Strong Bull
    else if(price_change > weak_threshold) return 1;   // Weak Bull
    else if(price_change < -strong_threshold) return 4; // Strong Bear
    else if(price_change < -weak_threshold) return 3;  // Weak Bear
    else return 2;                                      // Neutral
}

但该系统更进一步 — 它研究市场从一个状态转变为另一个状态的频率。例如,如果当前市场呈现弱势上涨,那么明天市场出现强势上涨或横盘的概率有多大?这些数据有助于预测市场的下一步“走势”。

我们还创建了一个 256 维的 SSM 状态空间:

struct StateSpaceModel {
    matrix A, B, C;  // Transition, input, and output matrices
    matrix state;    // Hidden state
    
    matrix ProcessSequence(const matrix &input) {
        // Update: state = state * A + input * B
        // Output: output = state * C
    }
};

既然我们已经有了马尔可夫链,为什么还需要 SSM?主要区别在于时间尺度和信息的性质。马尔可夫链回答了“当前市场状况是什么”这个问题,并且是无记忆的,只考虑先前的状态。SSM 通过隐藏状态的演变,根据公式 state_t = A * state_t-1 + B * input_t,对整个交易历史进行量化记忆的积累。其中,256 维向量的每个分量可以表示所积累模式的不同方面:长期趋势、波动性、成交量分布和相关性结构。

这种架构使系统能够同时通过马尔可夫链处理当前时刻的定性特征,并通过 SSM 处理长期模式的定量记忆。实验结果表明,与仅使用离散状态相比,这些方法的结合使准确率提高了 7%,因为 SSM 能够捕捉到一阶马尔可夫链无法获取的、跨越数十个交易周期的模式。

类别平衡

金融机器学习中的一个关键问题是市场波动的不均匀分布。在低波动时期,中性信号占主导地位,而强烈波动则较为罕见。

系统通过动态类别加权自动适应:

void CalculateClassWeights(const vector &target_data) {
    // Count the number of each class
    int class_0_count = 0; // fall (0.2)
    int class_1_count = 0; // flat (0.5) 
    int class_2_count = 0; // rise (0.8)
    
    for(ulong i = 0; i < target_data.Size(); i++) {
        if(target_data[i] <= 0.3) class_0_count++;
        else if(target_data[i] >= 0.7) class_2_count++;
        else class_1_count++;
    }
    
    int total_samples = (int)target_data.Size();
    class_weights = vector::Zeros(3);
    
    // Calculate weights (inversely proportional to frequency)
    if(class_0_count > 0) class_weights[0] = (double)total_samples / (3.0 * class_0_count);
    if(class_1_count > 0) class_weights[1] = (double)total_samples / (3.0 * class_1_count);
    if(class_2_count > 0) class_weights[2] = (double)total_samples / (3.0 * class_2_count);
    
    Print("Class distribution - Fall:", class_0_count, ", Sideways:", class_1_count, ", Rise:", class_2_count);
    Print("Class weights - Fall:", class_weights[0], ", Sideways:", class_weights[1], ", Rise:", class_weights[2]);
}

该算法分析训练样本中目标值的分布,并将其分为三类:下跌(目标值≤0.3)、横盘(0.3<目标值<0.7)和上涨(目标值≥0.7)。各类别的权重根据其出现频率成反比计算,公式为 weight_i=N/(3×N_i),其中 N 为样本总数,N_i 为第 i 类别的样本数。

这些权重通过将均方误差乘以相应的类别权重整合到损失函数中,从而迫使模型更加关注罕见但关键的市场事件:

double CalculateLoss(double prediction, double target) {
    double mse = (prediction - target) * (prediction - target);
    
    // Apply class weight
    double class_weight = GetClassWeight(target);
    mse *= class_weight;
    
    double l2_penalty = 0.0;
    for(ulong i = 0; i < output_projection.Rows(); i++)
        for(ulong j = 0; j < output_projection.Cols(); j++)
            l2_penalty += output_projection[i][j] * output_projection[i][j];
    
    double loss = mse + weight_decay * l2_penalty;
    return loss;
}


训练和反向传播

该网络使用 Adam 优化器进行训练,该优化器在更新权重时会考虑量子相关性。量子层反向传播的实现方式如下:

matrix Backward(const matrix &output_gradient) {
    matrix input_gradient = matrix::Zeros(last_input_data.Rows(), last_input_data.Cols());
    for(ulong i = 0; i < last_input_data.Rows(); i++) {
        for(ulong j = 0; j < last_input_data.Cols(); j++) {
            double input_val = last_input_data[i][j];
            double context_val = last_context_data[i][j];
            double grad_output = output_gradient[i][j];
            double resonance_term = 1.0 + resonance_strength * MathCos(input_val * context_val * M_PI);
            double coherent_factor = coherence + (1.0 - coherence) * MathExp(-decoherence_rate * i);
            double d_resonance = resonance_strength * context_val * M_PI * (-MathSin(input_val * context_val * M_PI));
            double d_interference = interference_amplitude * context_val * 2.0 * M_PI * MathCos(input_val * context_val * 2.0 * M_PI);
            double quantum_derivative = resonance_term * coherent_factor + input_val * d_resonance * coherent_factor + d_interference;
            input_gradient[i][j] = grad_output * quantum_derivative;
        }
    }
    return input_gradient;
}

梯度的量子修正使网络能够捕捉非线性依赖关系,从而增强有意义模式并抑制噪声。通过注意力层的反向传播考虑了 softmax 机制:

matrix QuantumAttentionLayer::Backward(const matrix &output_gradient) {
    grad_W_o = last_attention_output.Transpose().MatMul(output_gradient);
    matrix grad_attention_output = output_gradient.MatMul(W_o.Transpose());
    matrix grad_V = last_scores_softmax.Transpose().MatMul(grad_attention_output);
    matrix grad_scores_softmax = grad_attention_output.MatMul(last_V.Transpose());
    matrix grad_scores = matrix::Zeros(last_scores_softmax.Rows(), last_scores_softmax.Cols());
    for(ulong i = 0; i < last_scores_softmax.Rows(); i++) {
        vector softmax_row = last_scores_softmax.Row(i);
        vector grad_softmax_row = grad_scores_softmax.Row(i);
        for(ulong j = 0; j < softmax_row.Size(); j++) {
            double grad_accumulator = 0.0;
            for(ulong k = 0; k < softmax_row.Size(); k++) {
                if (j == k) {
                    grad_accumulator += grad_softmax_row[k] * softmax_row[j] * (1.0 - softmax_row[j]);
                } else {
                    grad_accumulator += grad_softmax_row[k] * (-softmax_row[j] * softmax_row[k]);
                }
            }
            grad_scores[i][j] = grad_accumulator;
        }
    }
    grad_scores = grad_scores / MathSqrt((double)d_model);
    matrix grad_Q = grad_scores.MatMul(last_K);
    matrix grad_K = grad_scores.Transpose().MatMul(last_Q);
    grad_Q = quantum_proc.Backward(grad_Q);
    grad_K = quantum_proc.Backward(grad_K);
    grad_W_q = last_input_data.Transpose().MatMul(grad_Q);
    grad_W_k = last_input_data.Transpose().MatMul(grad_K);
    grad_W_v = last_input_data.Transpose().MatMul(grad_V);
    matrix grad_input = grad_Q.MatMul(W_q.Transpose()) + grad_K.MatMul(W_k.Transpose()) + grad_V.MatMul(W_v.Transpose());
    return grad_input;
}

训练包括 50 个周期,如果在 10 个周期内验证误差没有改善,则提前停止:

void TrainQuantumNetwork() {
    QuantumNeural quantum_net;
    quantum_net.Init();
    EnhancedMarkovChain markov_chain;
    markov_chain.Init(5);
    AdvancedHyperparameterManager param_manager;
    param_manager.Init();
    matrix training_features;
    vector training_targets;
    if (!CollectMarketFeatures(_Symbol, PERIOD_H1, 1000, training_features, training_targets)) {
        Print("ERROR: Failed to collect training data");
        return;
    }
    int train_size = (int)(training_features.Rows() * 0.8);
    int val_size = (int)training_features.Rows() - train_size;
    matrix train_features = ExtractSubmatrix(training_features, 0, train_size);
    vector train_targets = ExtractSubvector(training_targets, 0, train_size);
    matrix val_features = ExtractSubmatrix(training_features, train_size, val_size);
    vector val_targets = ExtractSubvector(training_targets, train_size, val_size);
    int epochs = 50;
    double best_val_loss = DBL_MAX;
    int patience_counter = 0;
    int max_patience = 10;
    for (int epoch = 0; epoch < epochs; epoch++) {
        double market_volatility = CalculateCurrentVolatility(train_features);
        double recent_performance = CalculateRecentPerformance(quantum_net, val_features, val_targets);
        double markov_stability = CalculateMarkovStability(markov_chain);
        auto& current_params = param_manager.AdaptHyperparameters(market_volatility, 0.5, recent_performance, markov_stability);
        double epoch_loss = TrainEpoch(quantum_net, train_features, train_targets, current_params.learning_rate, true);
        double val_loss = ValidateEpoch(quantum_net, val_features, val_targets);
        if (val_loss < best_val_loss) {
            best_val_loss = val_loss;
            patience_counter = 0;
        } else {
            patience_counter++;
            if (patience_counter >= max_patience) {
                break;
            }
        }
    }
}

对梯度进行量子修正可以捕捉非线性依赖性,增强显著模式并抑制噪声。

加权损失函数对标准反向传播算法进行了改进。梯度不仅在输出层与类别权重相乘,而且在整个架构中传播,包括量子处理器和 Transformer 模块:

void Train(const matrix &features_data, const vector &target_data, int epochs, double learning_rate, bool is_markov_chain) {
    // Calculate class weights
    CalculateClassWeights(target_data);
    
    for (int epoch = 0; epoch < epochs; epoch++) {
        for (ulong i = 0; i < features_data.Rows(); i++) {
            vector input_features = features_data.Row(idx);
            double target = target_data[idx];
            double confidence;
            double prediction = Predict(input_features, confidence, true);
            
            double loss = CalculateLoss(prediction, target);
            
            // Apply class weight to gradient
            double class_weight = GetClassWeight(target);
            double weighted_error = (prediction - target) * class_weight;
            
            Backward(input_features, weighted_error, learning_rate);
        }
    }
}

这确保了网络的内部表示对罕见事件的模式更加敏感。实验结果显示,强运动类别的召回率从 34% 提高到了 58%,而总体准确率略有下降,降幅为 2%。


特征的收集和处理

该系统分析 400 个特征,其中包括:

第 1 部分 - 基本 OHLC 特征(80 个特征):

  • 标准化开盘价(20 根 K 线)
  • 高低价差(20 根 K 线)
  • 收盘价-开盘价变化(20 根 K 线)
  • 真实范围(20 根 K 线)

第 2 部分 - 交易量特征(40 个特征):

  • 标准化交易量(20 根 K 线)
  • 交易量与平均比率(10 根 K 线)
  • 交易量变化率(10 根 K 线)

第 3 部分 - 技术指标(80 个特征):

  • 不同周期的 RSI 指标(10 个特征)
  • 随机振荡指标 %K(10 个特征)
  • 变化率指标(10 个特征)
  • 动量指标(10 个特征)
  • SMA 关系(20个特征)
  • EMA 关系(20个特征)

第 4 部分 -  波动性(30 个特征):

  • 具有不同周期的ATR(10 个特征)
  • 波动率系数(20 个特征)

第 5 部分 - 自相关特征(60 个特征):

  • 价格自相关性(滞后 20 个周期)
  • 成交量自相关性(滞后 20 个周期)
  • 价格-成交量交叉相关性(滞后 20 个周期)

第 6 部分 - 统计特征(50 个特征):

  • 基本统计量(均值、标准差、偏度、峰度)
  • 不同变量之间的相关性
  • 相互信息
  • 香农熵

第 7 部分 - 时间特征(30 个特征):

  • 一天中的具体时间、一周中的某一天、一个月中的某一天。
  • 正弦/余弦变换
  • 交易时段(亚洲、欧洲、美洲)

第 8 部分 - 图模式和形态(20 个特征):

  • 蜡烛图形态(十字星、锤子线、流星线)
  • 跳空缺口
  • 支撑/阻力位

所有特征都被量化为 10 个区间,以提高模型对异常值的鲁棒性,并进行归一化以确保训练的稳定性。

数据收集代码:

bool CollectMarketFeatures(string symbol, ENUM_TIMEFRAMES timeframe, int count, matrix &features, vector &targets) {
    features = matrix::Zeros(count, FEATURES_COUNT);
    targets = vector::Zeros(count);
    double close[], high[], low[], open[], volume[];
    ArraySetAsSeries(close, true);
    ArraySetAsSeries(high, true);
    ArraySetAsSeries(low, true);
    ArraySetAsSeries(open, true);
    ArraySetAsSeries(volume, true);
    CopyClose(symbol, timeframe, 0, count + 50, close);
    CopyHigh(symbol, timeframe, 0, count + 50, high);
    CopyLow(symbol, timeframe, 0, count + 50, low);
    CopyOpen(symbol, timeframe, 0, count + 50, open);
    CopyTickVolume(symbol, timeframe, 0, count + 50, volume);
    for (int i = 0; i < count; i++) {
        vector row = vector::Zeros(FEATURES_COUNT);
        int feature_idx = 0;
        row[feature_idx++] = close[i] / close[i+1] - 1.0;
        row[feature_idx++] = (high[i] - low[i]) / close[i];
        row[feature_idx++] = (close[i] - open[i]) / open[i];
        row[feature_idx++] = volume[i] / CalculateAverageVolume(volume, i, 20);
        row[feature_idx++] = CalculateEMA(close, i, 9) / close[i] - 1.0;
        row[feature_idx++] = CalculateEMA(close, i, 21) / close[i] - 1.0;
        row[feature_idx++] = CalculateEMA(close, i, 50) / close[i] - 1.0;
        row[feature_idx++] = CalculateSMA(close, i, 200) / close[i] - 1.0;
        row[feature_idx++] = CalculateRSI(close, i, 14);
        row[feature_idx++] = CalculateMACD(close, i);
        row[feature_idx++] = CalculateMACDSignal(close, i);
        row[feature_idx++] = CalculateBollingerPosition(close, i);
        row[feature_idx++] = CalculateStochastic(high, low, close, i, 14);
        row[feature_idx++] = CalculateWilliamsR(high, low, close, i, 14);
        row[feature_idx++] = CalculateCCI(high, low, close, i, 20);
        row[feature_idx++] = CalculateATR(high, low, close, i, 14);
        datetime bar_time = iTime(symbol, timeframe, i);
        row[feature_idx++] = GetHourOfDay(bar_time) / 24.0;
        row[feature_idx++] = GetDayOfWeek(bar_time) / 7.0;
        row[feature_idx++] = GetDayOfMonth(bar_time) / 31.0;
        row[feature_idx++] = IsMarketSession(bar_time, "US") ? 1.0 : 0.0;
        row[feature_idx++] = IsMarketSession(bar_time, "EU") ? 1.0 : 0.0;
        row[feature_idx++] = IsMarketSession(bar_time, "ASIA") ? 1.0 : 0.0;
        features.Row(row, i);
        targets[i] = close[i] - close[i+1];
    }
    return NormalizeFeatures(features);
}

数据标准化考虑了异常值,并将特征统一到同一尺度:

bool NormalizeFeatures(matrix &features) {
    vector feature_means = vector::Zeros(features.Cols());
    vector feature_stds = vector::Zeros(features.Cols());
    for (ulong j = 0; j < features.Cols(); j++) {
        vector column = features.Col(j);
        feature_means[j] = column.Mean();
        feature_stds[j] = MathSqrt(column.Variance());
        double threshold = 3.0 * feature_stds[j];
        int outliers_count = 0;
        for (ulong i = 0; i < features.Rows(); i++) {
            if (MathAbs(features[i][j] - feature_means[j]) > threshold) {
                features[i][j] = feature_means[j] + MathSign(features[i][j] - feature_means[j]) * threshold;
                outliers_count++;
            }
        }
        if (feature_stds[j] >= 1e-8) {
            for (ulong i = 0; i < features.Rows(); i++) {
                features[i][j] = (features[i][j] - feature_means[j]) / feature_stds[j];
            }
        }
    }
    return true;
}


训练流程

void TrainQuantumNetwork() {
    QuantumNeural quantum_net;
    quantum_net.Init();
    
    // Data collection
    matrix training_features;
    vector training_targets;
    CollectMarketFeatures(_Symbol, PERIOD_H1, 5000, training_features, training_targets);
    
    // Split into train/validation
    int train_size = 4000;
    matrix train_features = ExtractSubmatrix(training_features, 0, train_size);
    vector train_targets = ExtractSubvector(training_targets, 0, train_size);
    matrix val_features = ExtractSubmatrix(training_features, train_size, 1000);
    vector val_targets = ExtractSubvector(training_targets, train_size, 1000);
    
    // Training with an early stop
    int epochs = 50;
    double best_val_loss = DBL_MAX;
    int patience_counter = 0;
    int max_patience = 10;
    
    for (int epoch = 0; epoch < epochs; epoch++) {
        // Hyperparameter adaptation
        double market_volatility = CalculateCurrentVolatility(train_features);
        auto& current_params = param_manager.AdaptHyperparameters(
            market_volatility, 0.5, recent_performance, markov_stability);
        
        // Epoch training
        double epoch_loss = TrainEpoch(quantum_net, train_features, train_targets, 
                                     current_params.learning_rate, true);
        double val_loss = ValidateEpoch(quantum_net, val_features, val_targets);
        
        // Early stop
        if (val_loss < best_val_loss) {
            best_val_loss = val_loss;
            patience_counter = 0;
        } else {
            patience_counter++;
            if (patience_counter >= max_patience) break;
        }
    }
}

为了评估所提出的架构的性能,我们进行了与传统模型(如 LSTM、Transformers 和梯度提升 (XGBoost))的对比测试。对比结果:

模型 方向精度
量子神经网络 0.65
LSTM 0.58
Transformer 0.60
XGBoost 0.55

量子神经网络通过考虑量子效应和多级记忆,展现了其优越性,使其能够更好地捕捉非线性依赖关系,并适应不断变化的市场条件。


实现

该架构以 SimpleQuantumEA.mq5 EA 的形式实现,其中包括以下组件:

  • 输入投影:将 400 个特征转换到 64 维空间;
  • 量子上下文分析器:考虑量子效应和多级记忆的信号处理;
  • Transformer 层:两层带有注意力机制的 Transformer;
  • 马尔可夫链:使用 ALGLIB 库对市场状态进行建模;
  • 验证元模型:评估预测的置信度;
  • 自适应超参数控制:根据市场情况动态调整参数。

EA 代码包含一个改进版本,具有动态适应性和风险管理功能。

让我们用我们的 3D K 线来训练模型。

根据输出结果,第 5 个 epoch 的 MSE(均方误差)下降到1.23 × 10⁻⁹ (0.000000001234)。

我们的量子神经网络于 2025 年 6 月至 2025 年 7 月在 M15 周期上,针对 EURUSD 以及一个由 3D K 线生成的合成交易品种进行了测试。结果超出预期,表明量子效应确实在金融市场中发挥作用。

经过 10 个训练周期后,该系统均方误差达到 0.000000001234,方向准确率达到 62%,置信度阈值高于 0.55。夏普比率达到 1.8,将一项学术实验转化为实际的交易解决方案。最大回撤仅为 20%,测试期间总回报率为 88%,胜率为 93%。

我们对夏普比率还不太满意 — 只有 1.85,而我的标准是高于 3.5,但我们将在文章的下一部分进一步提高夏普比率,届时我们将专注于创建一个完整的 “量子 EA”。

所提出的架构展示了将量子原理融入机器学习以应用于金融领域所带来的益处。量子信号处理能够捕捉传统模型无法获取的非线性相关性。然而,其计算复杂度高,资源消耗大,且超参数调优仍然具有挑战性。过拟合的风险依然存在,尤其是在新市场机制出现时。虽然 1.85 的夏普比率可以接受,但未达到 3.5 的目标值,因此需要进一步优化。

至于实盘真金白银的实际收益表现,2025 年的盈利能力为 +214%,即每月 +35%,但回撤为 30% — 通过实时训练,一个月的回撤真的能弥补损失吗?说实话,我是在使用量子神经网络后才开始观察到这样的结果,而且这些结果在数十种不同变体的机器人中都很相似 — 通过反向信号平仓、通过固定止盈止损平仓、通过 ATR 的一定比例止盈止损平仓、通过 DCA(分批加仓/均价法)平仓、通过金字塔式建仓平仓、通过平均值平仓以及通过马丁格尔平仓……至于有人担心 EA 会“重绘”,这种担心是没有根据的 — 在许多实现中,我已经集成了对新 K 线、新 tick、非零 tick、有效 tick 的检查 — 而且它确实有效!这种架构确实令人惊艳!

各类别的表现分析揭示了平衡的重要性。不加权重的情况下,该系统对横盘的准确率为 67%,但对强劲趋势的准确率仅为 31%。自适应加权的实施使得表现更趋均衡:横盘类为 61%,弱趋势类为 56%,强趋势类为 52%。在算法交易中,这一点尤为重要。因为错过一次重大的市场波动可能会造成巨额利润损失,而在盘整期间出现的虚假信号,由于设置了严格的止损点,通常只会造成微小的损失。


结论

所开发的系统展示了量子原理在算法交易中的实际应用。它将共振、干涉和退相干效应与自适应记忆架构相结合,预测市场行为的准确率高达 65%。SimpleQuantumEA.mq5 EA 使用 400 个特征,包括技术指标、价格和时间特征,并每 24 小时自动适应市场状况。

实验结果一致:夏普比率为 1.8-2.4,最大回撤不超过 20%。该模型完全用 MQL5 实现,没有外部依赖项,可在 MetaTrader 5 中使用。

未来的计划包括架构扩展、性能优化以及整合更多市场数据,包括订单簿和新闻推送。

附件名称  代码核心 
 HybridQuantumNeuralV2.mqh 神经网络包含文件,应放置在 MQL5/Include 目录下。
 SimpleQuantum_EA_V2.mq5 一个简单的神经网络专家,正在研究主要交易品种,并分析 3D K 线的自定义交易品种,将其作为创建特征的交易品种。
 3D_Bars_EA.mq5 3D K 线生成器,可创建和更新自定义交易品种


本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/18785

附加的文件 |
3D_Bars_EA.mq5 (39.53 KB)
最近评论 | 前往讨论 (9)
Sergei Goncharov
Sergei Goncharov | 31 7月 2025 在 06:45
Yevgeniy Koshtenko #:

编译时出现了什么错误?我的代码编译得非常顺利,如果不是这样,我根本就不会发布)

编译没问题,我修正了包含文件的路径,就这样搞定了。这里主要问题在于专家顾问的运行情况及其声明的功能。 我是MQL社区的新手,原本以为看到“预测市场走势的准确率高达65%” SimpleQuantumEA.mq5 专家顾问使用 400 个指标”,并看到已发布的代码时,会期待看到该专家顾问是按照这种原理进行交易的。但事实并非如此。请别误会,我绝无冒犯之意。 我非常欣赏你们的想法,并将许多内容应用到了自己的工作中。其他作者也是如此,没有任何一个发布的程序是100%可运行的。这大概就是人的贪婪吧。我们本就是这样。总之, 我非常感谢你们所提供的内容。 例如,在您的交易顾问中,我已经补充了超过2000行代码。 例如,在编写了用于验证400个特征有效性的代码后,最终只有149个被认定为有效。其余的都被算法筛选掉了,被视为不会影响预测的噪声。您也是这样吗?


只是希望能从您那里获得更多关于您如何实现99%盈利交易这一成果的具体步骤信息。我甚至不需要代码,只是想请教一些建议。 你使用了哪些层,又添加了哪些额外的神经元?我看到你最初是基于LSTM模型开发“量子”交易顾问的。最终,你放弃了该模型,转而在其上将“量子”作为过滤器使用吗? 还是说您的LSTM是一个独立的交易顾问,而Quantum 算法则是另一个独立的系统?

请多提供一些建议和信息。毕竟,如果您开始更多地回馈世界, 就会发现会有更多回报立刻回到您身上。这就是宇宙的运作方式。 我之所以在这里发帖,是因为你没有回复我的私信 :) 我向你保证,如果在这个过程中我取得了什么有价值的成果,我一定会分享的。不过,目前我才刚刚起步……

Amato
Amato | 12 9月 2025 在 13:22

您好。

需要提醒的是,MQL5平台并不支持量子计算。 真正的量子神经网络需要使用 Qiskit 或 Cirq 等专用平台,以及量子硬件(例如 IBM Quantum)。这仅仅是对“注意力”机制的模拟。

就像 LSTM、Transformers、ARIMA 等模型的“大杂烩”一样。真正的量子计算无法在普通服务器和个人电脑上运行。

Levison Da Silva Barbosa
Levison Da Silva Barbosa | 7 6月 2026 在 14:27
非常感谢您分享这些研究成果。
azimute7
azimute7 | 7 6月 2026 在 15:36
非常好
Rasoul Mojtahedzadeh
Rasoul Mojtahedzadeh | 22 6月 2026 在 11:30
文章写得不错!不过,尽管使用了“量子”这一术语,该系统并未采用真正的量子计算机。它是一个经典神经网络,其中融入了受量子力学启发的非线性数学函数。

其核心创新之处在于引入了三种非线性效应:共振、干涉和退相干。
交易策略 交易策略
各种交易策略的分类都是任意的,下面这种分类强调从交易的基本概念上分类。
交易中的神经网络:自适应周期分块(LightGTS) 交易中的神经网络:自适应周期分块(LightGTS)
本文将为大家介绍创新的自适应分块技术,这是一种在考虑时序数据内在周期性的前提下,对时间序列做灵活分块的方法。我们还会讲解一种高效编码技术,该技术在处理不同尺度的数据时,可以保留重要语义特征。金融市场数据具备复杂、多尺度的典型特点,上述两类方法为此类数据的精准处理开辟了新路径,能够显著提升预测结果的稳定性与可靠性。
新手在交易中的10个基本错误 新手在交易中的10个基本错误
新手在交易中会犯的10个基本错误: 在市场刚开始时交易, 获利时不适当地仓促, 在损失的时候追加投资, 从最好的仓位开始平仓, 翻本心理, 最优越的仓位, 用永远买进的规则进行交易, 在第一天就平掉获利的仓位,当发出建一个相反的仓位警示时平仓, 犹豫。
从基础到进阶:处理鼠标事件 从基础到进阶:处理鼠标事件
阅读本文相关的此类技术资料,仅仅浏览和研究代码,绝对不足以理解其中涉及的过程。实际上,您需要编译出可执行程序,并在任意图表上运行它。只有这样,您才能体会到那些单靠看代码极难掌握的细节,例如结合键盘与鼠标来创建某些元素。