English Русский Español 日本語 Português
preview
神经网络在交易中的应用:不依赖特定数据的时间序列泛化(Mamba4Cast)

神经网络在交易中的应用:不依赖特定数据的时间序列泛化(Mamba4Cast)

MetaTrader 5交易系统 |
26 0
Dmitriy Gizlyk
Dmitriy Gizlyk

概述

市场既残酷无情又变幻莫测。对于那些误读其信号的人,它不会给予第二次机会。如今尤其如此,新闻传播速度之快,远超一分钟图表上 K 线的形成速度。现代交易者不再依赖过去的数据 — 他们依靠的是刚刚从数据流中浮现出来的信息。在其他人之前发现新出现的模式意味着获得竞争优势。因此,当今算法的要求是在事件变得明显之前进行预测,同时理想情况下要避免大量模型调优和维护的技术负担。

在这场竞赛中,传统模型,尤其是循环架构,开始显现出其局限性。它们擅长识别重复模式和记忆序列信息,但在应对真实市场的混乱行为时却往往力不从心。它们难以捕捉突发冲击,对间隙和异常值处理不当,并且需要针对每个新环境进行适应。当今的市场需要更加灵活且具有预测性的解决方案。

基于 Transformer 的架构显著提高了预测精度,特别是对于长周期时间序列而言。然而,这些改进是以计算复杂度和架构开销的增加为代价的。随着数据集越来越大,预测范围越来越长,这些模型逐渐变得不再适合实时应用。在实践中,这意味着需要更多的资源、更长的时间以及更高的操作复杂性。

在此背景下,论文 “Mamba4Cast:基于状态空间模型的零样本时间序列高效预测” 中介绍了 Mamba4Cast 框架。其设计基于两大核心思想:轻量级且表现力强的 Mamba 架构,以及先验数据拟合网络PFN)的革命性概念。它们共同为时间序列预测的新方法奠定了基础,尤其是在交易等高度动态的领域。

PFN 概念代表了思维方式的根本性转变。与传统方法(先在一个数据集上预训练模型,然后再在另一个数据集上进行广泛的微调)不同, PFN 提出在大量合成生成的任务上预训练模型。该模型不是从一个现实世界的问题中学习,而是从数百万个不同的(尽管不完美)场景中学习。这使模型真正具备通用性,并能稳健地适应新数据。在交易中,这意味着该模型不局限于特定的金融工具或时间周期;相反,它能够即时适应。

Mamba4Cast 框架完全秉承了 PFN 理念。它利用涵盖各种市场场景的合成数据,构建了广泛的行为范围。因此,该模型获得了类似于直觉的能力 — 即使在高波动性和不稳定动态的条件下,也能概括出模式。

第二个决定性特征是 Mamba 架构,其计算复杂度与序列长度呈线性关系。与 Transformer 不同, Mamba 不需要使用注意力矩阵进行二次运算,因此可以高效且经济地处理长输入序列。对交易者而言,最重要的是, Mamba4Cast 一次就能预测整个预测窗口。这显著减少了自回归预测过程中出现的错误,同时能够更快地应对不断变化的市场状况。

此外,由于该模型能够生成多步预测,因此非常适合构建端到端的交易系统 — 从信号分析到直接交易决策。Mamba4Cast 不仅可以成为指导方针,还可以成为自动化交易系统中预测模型的核心组件。


Mamba4Cast 框架算法

Mamba4Cast 框架是时间序列预测系统发展进程中迈出的大胆且充满希望的一步。其核心在于,将严谨的数学基础与灵活的深度学习算法相结合,能够将市场视为一个复杂的生态系统,其中过去、现在和未来是相互关联的。

传统模型通常基于单一资产的历史数据进行训练,然后再现其学到的模式与依赖关系。这种方法在过去取得了优异的成果,但如今却面临诸多局限:市场变得愈发动荡且动态复杂,事件也愈发难以预测。Mamba4Cast 采用了不同的方法:它不记忆特定的历史时间序列,而是使用先验数据拟合网络( PFN ) 方法。想象一下,训练分析师时,不是基于单一股票的真实报价,而是基于无数合成场景:趋势、横盘市场、重大波动前夕的平静期,以及突发新闻驱动的冲击。这构建了一种通用的市场智能,能够开箱即用地应用于任何工具。

该系统的核心是基于状态空间建模Mamba 架构。与 Transformer 中密集的自注意力层不同, Mamba 沿着序列长度线性工作,使其能够处理数百甚至数千个时间步,而不会导致计算成本呈指数级增长。这种效率不仅加快了计算速度,还实现了实时市场分析,在实时市场分析中,每一毫秒都至关重要。由此产生的架构在计算上经济高效,非常适合在市场波动的情况下处理高频流数据。

第一阶段使用标准最小-最大归一化对输入时间序列进行缩放,其中每个值 xt 根据以下公式进行变换:

其中 xminxmax 是在训练数据集的范围内计算的。这消除了特征之间的规模差异,并为高效学习做好了数据准备。

接下来是预处理的关键部分:位置编码。时间戳,包括分钟、小时、星期几、月份中的第几天、月份和年份,会被分别提取并转换为向量表示。该算法采用类似于 Transformer 架构中使用的正弦编码方案,但针对时间序列的周期性成分进行了调整。对于每个时间分量,使用相应的周期和2的幂次来计算多个正弦和余弦谐波:

其中 T 表示相应分量的周期, i 表示时间点, j 是频谱中的频率索引。

这些向量能够编码跨多个尺度的时间依赖关系,从而使模型能够捕捉到日常周期、季节性效应以及宏观经济阶段。

在此之后,它们会与时间序列的归一化值进行拼接。得到的向量表示该时间点的嵌入向量。

然后,使用一组因果卷积层对该序列进行处理。具有独特窗口的多个并行卷积能够捕捉不同的时间尺度。每次卷积都会捕捉到特定层次的信息:从局部波动到长期趋势。它们的输出在每个时间步长上被合并成一个增强的表示。这对于金融数据尤其有价值,因为一根K线可能同时代表短期的市场波动,同时也是更广泛市场趋势的一部分。

接下来,将表示投影到更高维度的空间中,以便为数据进入主模型块做好准备。在此阶段,连接了一个经过修改的 inception 层,该层结合了不同大小的卷积核,同时整合了局部和全局特征。每个时间步长产生的激活包含来自不同泛化层次的信息,同时保持输出维度,并对缺失值和噪声具有鲁棒性。

该架构的核心由基于 Mamba 的模块组成, Mamba 是状态空间模型( SSM ) 的一种创新实现,其复杂度与序列长度呈线性关系。每个模块都实现了一个通用的 SSM 结构,其中隐藏状态使用矩阵 A、B、C、D 进行更新,这些矩阵与其他模型参数一起训练:

因此,每个时刻都既取决于前一状态,也取决于当前输入。这提供了稳定的长期记忆能力,并能灵活适应当前的市场环境。每个这样的块之后都会进行层归一化,以消除分布偏差并归一化激活分布,从而使训练更加稳定。紧接着是一个额外的因果卷积层,它支持信息沿时间轴流动。

堆栈中此类块的数量可以根据所需的泛化深度而变化。较低层级专门捕捉短期市场行为,如快速回调、动量和新闻驱动的波动。更高层逐渐学习更广泛的市场周期、季节性动态和重复出现的形态。这一堆叠结构好比一个神经频谱分析器,每一层负责一个不同的时间频率范围。

最后阶段是解码器。所有激活值都通过一个线性层被投影到一个或多个输出通道中。当需要进行不确定性估计时,会使用一个专门的预测头来输出预测方差的对数:

对于分类任务, Softmax 预测头会生成所分析类别的概率。

Mamba4Cast 的 一个显著特点是能够进行零样本泛化。为了实现这一目标,作者们引入了一个基于广泛合成数据集的独特预训练阶段。该数据集包括由随机微分方程 ( SDE ) 生成的时间序列、手动设计的模式(反转、盘整和动量冲击)以及随机生成的规则。

该模型同时使用多个损失函数进行训练:均方误差(MSE)、负对数似然(NLL)和交叉熵损失用于市场状态切换预测。这使得该模型能够形成一种稳健且通用的市场模式视角,能够适应新的资产和时间尺度。

综上所述,这些特性使得 Mamba4Cast 不仅是一个实验模型,而且为构建预测交易系统、市场状态检测算法和波动性预测解决方案提供了实际的基础。

下面展示了作者提供的 Mamba4Cast 框架的示意图。


MQL5 中的实现

在探索了 Mamba4Cast 架构的理论基础之后,我们现在转向实践方面 — 在 MQL5 中实现其核心组件。我们的首要任务是构建时间位置编码模块,没有这个模块,任何现代预测模型都无法将分析的序列正确解读为真正的时间线。

我们的库中已经包含了多种传统的位置嵌入实现,从简单的正弦编码到可学习的表。然而,它们都将时间序列仅仅视为元素的有序序列,而没有考虑到记录观测值的实际时间戳。Mamba4Cast 的作者坚持认为,每个时间步都应该使用其真实的时间上下文进行编码:分钟、小时、星期几、月份中的日期、月份,甚至年份 — 所有这些都会影响市场动态。根据他们的方法,为每个时间分量构建独立的正弦分解。因此,我们的第一个实践环节将专门探讨这种深度时间表示法。

这一阶段从根本上决定了模型如何感知时间:不是简单地将时间视为一系列 K 线,而是在精确定义的时刻将时间视为一系列事件。如果没有准确的时间戳表示,即使是最复杂的算法也会变得毫无意义,因为市场会根据分钟、小时或日期做出不同的反应。

OpenCL 端的时序编码

我们的实现方式并非采用功能强大但繁琐的预计算调和查找表方法,而是使用 OpenCL 内核直接从实时时间戳计算位置编码。这样就无需在内存中存储大型正弦和余弦表,避免了相邻点之间的阶跃效应,并大大简化了 EA 的逻辑。

在这种方法中,每个时间步都带着两组信息进入 OpenCL 内核:其数值特征(价格、成交量、指标)及其事件时间戳。时间戳被转换为向量,以精确告知模型事件发生的时间:是在交易时段的高峰期,还是周末的淡静时段,是在月初,还是新年除夕。

这种方法的优势显而易见。首先,它生成完美平滑的位置编码,确保相邻嵌入保持连续,而不会出现人为的跳跃。其次,消除查找表可以减少代码量、降低同步问题,并减少平台中的内存消耗。第三,即时计算使嵌入更加相关:更改设置或周期时无需重建表格 — 只需更改周期值,模型即可立即适应新的要求。

OpenCL 端,将时间编码添加到分析数据中的算法意味着为每根 K 线附加一个描述其在周期中位置的谐波向量。TSPositionEncoder 内核接收指向三个数组的指针:

  • 包含输入的 data
  • 带有时间戳的 time
  • 定义每个日历周期持续时间的 period 数组。

__kernel void TSPositonEncoder(__global const float2* __attribute__((aligned(8))) data,
                               __global const float* time,
                               __global float2* __attribute__((aligned(8))) output,
                               __global const float* period
                              )
  {
   const int id = get_global_id(0);
   const int freq = get_global_id(1);
   const int p = get_global_id(2);
   const int total = get_global_size(0);
   const int freqs = get_global_size(1);
   const int periods = get_global_size(2);

内核将在三维空间中执行:

  • 分析序列的长度(时间步数),
  • 每个周期内的谐波数量,
  • 周期数。

在内核体中,每个执行线程会立即确定其在所有三个维度上的坐标。

首先,对于每个时间步长(索引 id )和周期( p )中的每个谐波( freq ),内核计算周期内的坐标:将实际时间除以周期长度,将绝对值 time[id] 转换为完整周期数。小数部分乘以 π 和 2 的幂 2^(freq+1) 。所得值 val 成为正弦函数和余弦函数的参数,其中第一个谐波跨越整个周期,第二个谐波将其分成两半,第三个谐波将其分成四份,依此类推。

   const int shift = id * freqs + freq;
   const float2 d = data[shift * periods + p];
   const float t = time[id] / period[p];
   float val = M_PI_F * t * pow(2.0f, freq + 1);

然后将此值添加到源嵌入中。每个 OpenCL 线程从与当前时间步、谐波和时间周期对应的数据中加载一对值,将sin(val)加到第一个元素,将cos(val)加到第二个元素。将生成的向量保存到 output 缓冲区。此操作通过添加额外特征来丰富时间序列中的每个点,从而精确地编码其在日历模式中的位置。

   output[shift * periods + p] = (float2)(d.s0 + sin(val), d.s1 + cos(val));
  }

这种方法的优点是所有计算都在 GPU 内核中即时执行,无需大型查找表或额外的 CPU 端处理。任何修改(例如,添加新的时间周期或增加谐波数量)只需要调整三维网格的尺寸并更新 period 数组。同时,由于正弦和余弦函数的平滑特性,表示仍然完全连续,而 GPU 并行处理能够同时处理大量观测值而不会出现延迟。

因此,每个市场事件都有其独特的嵌入,不仅反映了其数值特征(如价格或成交量),还反映了其发生的确切时刻。这为 Mamba4Cast 提供了更丰富的时间上下文,使其预测过程真正具有时间感知能力。

由于我们实现中的事件时间戳不是可训练参数,因此只需要前馈传递。具体来说,我们只需要在 OpenCL 内核中计算嵌入向量。无需通过时间戳传播梯度或更新时间戳本身。这使我们能够完全消除反向传播过程,简化架构,并将位置编码简化为时间的纯确定性函数。

时间编码对象

在主程序方面,时间编码算法在 CNeuronTSPositionEncoder 类中实现,其结构如下所示。

class CNeuronTSPositionEncoder   :  public CNeuronBaseOCL
  {
protected:
   CNeuronConvOCL             cProjection;
   CNeuronBatchNormOCL        cNorm;
   CBufferFloat               cPeriods;
   //---
   virtual bool               AddPE(CBufferFloat *time);
   //---
   virtual bool               feedForward(CNeuronBaseOCL *NeuronOCL) override { return false; }
   virtual bool               feedForward(CNeuronBaseOCL *NeuronOCL,
                                          CBufferFloat *SecondInput) override;
   virtual bool               updateInputWeights(CNeuronBaseOCL *NeuronOCL) override;
   virtual bool               calcInputGradients(CNeuronBaseOCL *NeuronOCL) override;

public:
                     CNeuronTSPositionEncoder(void) {};
                    ~CNeuronTSPositionEncoder(void) {};
   //---
   virtual bool               Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl,
                                   uint window, uint units_count, uint &periods[], uint freqs,
                                   ENUM_OPTIMIZATION optimization_type, uint batch);
   //---
   virtual int                Type(void) override  const   {  return defNeuronTSPositionEncoder;   }
   //---
   virtual bool               Save(int const file_handle) override;
   virtual bool               Load(int const file_handle) override;
   //---
   virtual bool               WeightsUpdate(CNeuronBaseOCL *source, float tau) override;
   virtual void               SetOpenCL(COpenCLMy *obj) override;
   //---
   virtual uint               GetWindow(void) const { return cProjection.GetWindow(); }
   virtual uint               GetWindowOut(void) const { return cProjection.GetFilters(); }
   virtual uint               GetUnits(void) const { return cProjection.GetUnits(); }
  };

在所呈现的结构中,有三个内部对象格外引人注目。乍一看,它们似乎是多余的,因为时间编码是在 OpenCL 端执行的。然而,正是这些组件负责确保在添加时间上下文之前,每个分析过的数据序列都得到适当的打包和缩放。

首先, cProjection 接收来自神经网络前一层的任意特征数组,并将它们转换为固定维度的均匀向量。因此,代码的其余部分不必关心输入特征的数量及其内部组织 — cProjection 的输出始终具有可预测的结构,可以进行批量归一化和位置编码。

其次, cNorm 起到稳定性机制的作用。在实际操作中,价格、交易量和任何随机信号都可能在不同的价值范围内跳跃。如果在投影后立即添加 [-1,1] 范围内的正弦和余弦值,则可能会丢失一些信息。为了防止这种情况发生, cProjection 的输出会经过批量归一化,使均值为零,方差为一。只有在此之后才会引入时间谐波。这种排序确保了时间特征成为处理后数据的有机延伸,而非不受控制的额外噪声来源。

最后, cPeriods 存储固定的时间周期集合。

这种职责分离使得该类同时具有灵活性(可接受任意输入数据)、鲁棒性(始终将表示转化为稳定形式)和精确性(同时保持时间编码的绝对连续性)。

要将 CNeuronTSPositionEncoder 类从声明式结构转换为完全功能的神经网络组件,所有内部模块都必须正确初始化。这项任务由 Init 方法处理。

bool CNeuronTSPositionEncoder::Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl,
                                    uint window, uint units_count, uint &periods[], uint freqs,
                                    ENUM_OPTIMIZATION optimization_type, uint batch)
  {
   if(!CNeuronBaseOCL::Init(numOutputs, myIndex, open_cl, 2 * units_count * freqs * periods.Size(),
                                                                         optimization_type, batch))
      return false;

该方法严格遵循上述架构逻辑:投影→归一化→时间特征添加。

第一步,我们调用父类的相应方法。它定义了对象的通用参数。请注意,指定输出张量大小时,接收到的参数的乘积要乘以 2。原因在于每个时间谐波由两个分量表示:正弦和余弦。

接下来,初始化时间周期缓冲区。周期以秒为单位。

   cPeriods.BufferFree();
   if(!cPeriods.AssignArray(periods) ||
      !cPeriods.BufferCreate(OpenCL))
      return false;

接下来,我们将输入数据投影层初始化为一个固定维度的空间:2 × 频率数 × 周期数。该大小对应于将接收时间信息的通道数量。本质上,我们配置了过滤器,用于在添加时间相位之前,对时间序列的每个片段进行预处理。

   int index = 0;
   if(!cProjection.Init(0, index, OpenCL, window, window, 2 * freqs * cPeriods.Total(), units_count,
                                                                           1, optimization, iBatch))
      return false;
   cProjection.SetActivationFunction(TANH);

在投影阶段使用 TANH 激活函数不仅仅是一种风格选择,它还具有将输出幅度限制在 [-1,1] 范围内的实际目的。这带来了几个重要的优势。

如果原始数据包含噪声、跳跃或极值,TANH 会起到软限制器的作用,平滑较大的偏差,使模型的行为更加稳定。这对于金融时间序列尤为重要,因为异常 K 线或成交量激增可能会扰乱整个神经网络的行为。

此外,TANH 在整个输入范围内提供了平滑的导数,这在后续的梯度传播过程中非常重要。这降低了神经元饱和的风险,有助于实现更快、更稳定的收敛。

投影操作完成后,其输出将传递给 cNorm ,在那里调整平均值和尺度。这可以防止时间正弦-余弦信号被过大的振幅所淹没,从而确保可靠的时间编码。

   index++;
   if(!cNorm.Init(0, index, OpenCL, cProjection.Neurons(), iBatch, optimization))
      return false;
   cNorm.SetActivationFunction(None);

最后的改进是,由于时间编码并非传统意义上的可训练组件,因此禁用了通用激活函数,梯度仅从外部接口传播到 cNorm

   SetActivationFunction(None);
   if(!SetGradient(cNorm.getGradient(), true))
      return false;
//---
   return true;
  } 

接下来讨论 CNeuronTSPositionEncoder 类中前馈传递的实现,需要强调的是,这一阶段标志着整个时间编码过程的逻辑完成。在此,原始序列中的投影和归一化信息与由传入数据的实际时间戳计算出的谐波所表示的详细时间结构相结合。

feedForward 方法将过程仔细地分为三个连续的阶段。需要注意的是,该方法接收指向两个独立数据源的指针。主要信息流包含待分析的序列,而次要信息流则包含对应的时间戳。

bool CNeuronTSPositionEncoder::feedForward(CNeuronBaseOCL *NeuronOCL, CBufferFloat *SecondInput)
  {
   if(!cProjection.FeedForward(NeuronOCL))
      return false;

首先,执行输入投影层的前馈传递。在此阶段,任何维度的输入数据都会被转换为预定义数量的特征,以确保在添加所需数量的时间谐波时具有维度兼容性。

然后将得到的投影通过归一化层。

   if(!cNorm.FeedForward(cProjection.AsObject()))
      return false;

归一化的目的是消除分析数据特征之间的统计差异,并为它们与时间谐波的结合做好准备。

最后,在最后一个阶段,调用之前描述的时间编码核的封装方法。该内核会根据当前时间戳值和周期集,实时为每个时间步长和每个指定频率计算正弦-余弦谐波。

   return AddPE(SecondInput);
  }

此操作不依赖于可训练参数,也不需要梯度传播,因为时间是一个外部确定性因素。

因此,输出结果是一个丰富的表示,既包含了输入数据的有意义特征,又包含了这些观测值发生的精确时间背景 — 不是根据它们的顺序索引,而是根据事件的实际节奏。

CNeuronTSPositionEncoder 类中的反向传播过程在结构上刻意保持简洁,同时保留了核心内容。所有计算都遵循将误差梯度反向传播回原始输入数据的标准方法。主要计算流程通过两个关键组件:投影层( cProjection )和归一化层( cNorm )。这些中的每一个都包含可训练的参数,因此需要进行优化。

实际上,这意味着当调用 updateInputWeightscalcInputGradients 方法时,我们的对象只是按顺序将执行委托给其内部组件的相应方法。

这种方法确保了逻辑的模块化和可重复性:单个层优化机制的变化会自动在整个系统中传播,而无需修改更高级别的代码。这对于可扩展的神经网络架构尤为重要。

然而,有一点需要强调。虽然feedForward方法接收两个信息流 — 主要输入序列和时间戳数组 — 但只有主要信息流参与反向传播。这完全合情合理。

原因是 CNeuronTSPositionEncoder 中的时间编码不包含可训练的参数。它表示对时间戳进行的一种固定的、确定性的转换。此外,我们有意不将误差梯度反向传播到时间戳级别。这些值是模型外部的,在优化过程中不应修改。

这种设计理念使得架构不仅简洁稳定,而且在逻辑上保持一致:时间信息用于情境化,而非用于训练。

附件中提供了该类及其所有方法的完整源代码。

我们现在已经达到了这种文章格式的合理篇幅限制。我们分析了时间编码的基本组成部分,实现了关键概念,并以清晰且结构化的形式用代码展示了层架构。然而,俗话说,并非所有事情都能一蹴而就。

我们的实现工作尚未完成。前方仍有大量工作待完成,需要采取谨慎且深思熟虑的方法。我们将稍作休息,并在下一篇文章中继续。


结论

在本文中,我们探讨了 Mamba4Cast 框架,该框架旨在解决时间序列分析中的一个基本挑战:构建一个灵活且可扩展的模型,能够捕捉动态时间数据的复杂结构。我们研究了作者如何通过融合现代架构方法,包括融入因果卷积机制的状态空间模型SSM),并辅以基于真实时间戳的精确位置编码,从而克服了经典模型的传统局限性。

在逐步探索框架结构的过程中,我们详细分析了构建时序特征的过程。我们展示了简单而强大的谐波函数如何将原始时间戳转换为有意义的嵌入,这些嵌入反映了市场动态的周期性特征。以 OpenCL 实现为例,我们研究了如何在计算内核中直接高效地生成此类嵌入,而无需额外的查找表或处理延迟。

然而,我们的工作尚未完成。在下一篇文章中,我们将继续这项研究,并展示时间嵌入如何与模型的架构块相互作用,从而保持分析的完整性并提高预测准确性。


参考


本文中用到的程序

# 名称 类型 描述
1 Research.mq5 EA 样本采集 EA
2 ResearchRealORL.mq5
EA
使用 Real-ORL 方法采集样本的 EA
3 Study.mq5 EA 离线模型训练的 EA
4 StudyOnline.mq5
EA
在线模型训练的 EA
4 Test.mq5 EA 模型测试 EA
5 Trajectory.mqh 类库 系统状态和模型架构描述结构
6 NeuroNet.mqh 类库 用于创建神经网络的类库
7 NeuroNet.cl 代码库 OpenCL 程序代码

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

附加的文件 |
MQL5.zip (2754.59 KB)
MQL5 向导技巧(第七十七部分):使用 Gator 振荡器与积累/派发振荡器(AD Oscillator) MQL5 向导技巧(第七十七部分):使用 Gator 振荡器与积累/派发振荡器(AD Oscillator)
Gator 振荡器(Gator Oscillator)由比尔·威廉姆斯(Bill Williams)开发,与累积/派发振荡器(Accumulation/Distribution Oscillator)是另一对可在 MQL5 EA 中协同使用的指标组合。我们使用 Gator 振荡器来确认趋势,同时使用 AD 振荡器通过检查成交量来确认趋势。在探索这种指标组合时,我们一如既往地使用 MQL5 向导来构建和测试它们的潜力。
神经网络在交易中的应用:基于自适应模态分解的时间序列预测(终篇) 神经网络在交易中的应用:基于自适应模态分解的时间序列预测(终篇)
本文讨论了在算法交易背景下,使用 MQL5 对 ACEFormer 框架的调整及其实践应用。它展示了关键的架构决策、训练特性以及在真实数据上的模型测试结果。
MQL5中的量子神经网络(第三部分):基于量子比特的虚拟量子处理器 MQL5中的量子神经网络(第三部分):基于量子比特的虚拟量子处理器
本文聚焦于构建一套搭载真正的量子模拟器的交易系统,而非仅使用数学类比。该系统通过3个虚拟量子比特、量子门以及量子叠加原理对市场进行分析,并以MQL5编写为MetaTrader 5平台的交易EA实现。其核心突破在于从简单模拟转向真正遵循量子原理处理金融信息。
灰色模型在金融时间序列技术分析中的应用研究 灰色模型在金融时间序列技术分析中的应用研究
本文研究灰色模型,这是一种具有潜力的工具,能够提升交易者在分析与策略构建方面的能力。我们探讨了将该模型应用于技术分析并构建交易策略的若干实现方案。