文章 "交易中的神经网络:状态空间模型"

 

新文章 交易中的神经网络:状态空间模型已发布:

到目前为止,我们审阅的大量模型都是基于变换器架构。不过,在处理长序列时,它们或许效率低下。在本文中,我们将领略一种替代方向,即基于状态空间模型的时间序列预测。

最段时间,大型模型适配新任务的范式变得越来越普遍。这些模型依据广泛的数据集进行预训练,其中包含来自各种领域的任意原生数据,包括文本、图像、音频、时间序列、以及更多。

尽管这个概念与任何特定的架构选择无关,但大多数模型都基于单一架构 — 变换器及其核心层自注意力自注意力的效率归因于它能够在情境窗口中密集地引导信息,从而能够为复杂数据建模。然而,该属性有本质上的局限性:无法针对超出有限窗口的任何东西建模,以及相对于窗口长度的二次缩放。

对于序列建模任务,另一种替代方案涉及在状态空间中使用结构化序列模型(空间序列建模,SSM)。这些模型可解释为递归神经网络(RNN)与卷积神经网络(CNN)的组合。这类模型可以遵照序列长度的线性或近线性缩放极其有效地计算。甚至,它还具有固有机制,即针对特定数据模态中的长期依赖关系进行建模。

论文《曼巴(Mamba):配以可选性状态空间进行线性-时间序列建模》中介绍了一种启用状态空间模型进行时间序列预测的算法。该论文提出了一类新的选择性状态空间模型。

 


作者:Dmitriy Gizlyk

 
据我所知,在您的管道步骤 1 中,我们需要运行 Research.mq5 或 ResearchRealORL.mq5,详情如下:

如果运行 Research.mq5
目的
使用 Encoder (Enc.nnw) 和 Actor (Act.nnw) 预测交易行为(买入/卖出、成交量、TP、SL)。
收集这些行动的轨迹并保存到 TotalBase.dat。
要求
需要先前训练过的编码器 (Enc.nnw) 和执行器 (Act.nnw)。
如果没有这两个文件,EA 将无法运行,因为它需要依靠这两个文件来编码市场状态和预测行动。

输出:TotalBase.dat(二进制轨迹数据)。


如果运行 ResearchRealORL.mq5
目的
根据 Signals\Signal1.csv 中的实际历史记录(而非 Actors 中的预测)模拟交易。
收集这些交易的轨迹并保存到 TotalBase.dat。
要求
需要 Signals\Signal1.csv 文件,其中包含交易历史(打开/关闭时间、类型、交易量、价格等)。
不需要编码器或代理,因为它使用的是 Signal1.csv 中的数据而不是预测。

输出:TotalBase.dat(二进制轨迹数据)。


由于我们没有先前训练好的编码器(Enc.nnw)和行为器(Act.nnw),因此无法 运行 Research.mq5,而且我们 没有Signals\Signal1.csv 文件,因此也无法运行ResearchRealORL.mq5 那么我们如何运行步骤 1 呢?

MetaQuotes:

请查看新文章:交易中的神经网络:状态空间模型

作者:Dmitriy Gizlyk德米特里-吉兹里克

 
trungns #:
据我所知,在您的管道步骤 1 中,我们需要运行 Research.mq5 或 ResearchRealORL.mq5,详情如下:

如果运行 Research.mq5
目的
使用 Encoder (Enc.nnw) 和 Actor (Act.nnw) 预测交易行为(买入/卖出、成交量、TP、SL)。
收集这些行动的轨迹并保存到 TotalBase.dat。
要求
需要先前训练过的编码器 (Enc.nnw) 和执行器 (Act.nnw)。
如果没有这两个文件,EA 将无法运行,因为它需要依靠这两个文件来编码市场状态和预测行动。

输出:TotalBase.dat(二进制轨迹数据)。


如果运行 ResearchRealORL.mq5
目的
根据 Signals\Signal1.csv 中的实际历史记录(而非 Actors 中的预测)模拟交易。
收集这些交易的轨迹并保存到 TotalBase.dat。
要求
需要 Signals\Signal1.csv 文件,其中包含交易历史(打开/关闭时间、类型、交易量、价格等)。
不需要编码器或代理,因为它使用的是 Signal1.csv 中的数据而不是预测。

输出:TotalBase.dat(二进制轨迹数据)。


由于我们没有先前训练好的编码器(Enc.nnw)和行为器(Act.nnw),因此无法 运行 Research.mq5,而且我们 没有Signals\Signal1.csv 文件,因此也无法运行ResearchRealORL.mq5 那么我们如何运行步骤 1 呢?

您好、

在 Research.mq5 中,您可以找到

//--- 加载模型
   float temp;
//---
   if(!Encoder.Load(FileName + "Enc.nnw", temp, temp, temp, dtStudied, true))
     {
      CArrayObj *encoder = new CArrayObj();
      if(!CreateEncoderDescriptions(encoder))
        {
         delete encoder;
         return INIT_FAILED;
        }
      if(!Encoder.Create(encoder))
        {
         delete encoder;
         return INIT_FAILED;
        }
         delete encoder;
     }
   if(!Actor.Load(FileName + "Act.nnw", temp, temp, temp, dtStudied, true))
     {
      CArrayObj *actor = new CArrayObj();
      CArrayObj *critic = new CArrayObj();
      if(!CreateDescriptions(actor, critic))
        {
         delete actor;
         delete critic;
         return INIT_FAILED;
        }
      if(!Actor.Create(actor))
        {
         delete actor;
         delete critic;
         return INIT_FAILED;
        }
      delete actor;
      delete critic;
     }
//---

因此,如果您没有预训练模型,EA 将以随机参数生成模型。您可以从随机轨迹中收集数据。

关于 ResearchRealORL.mq5 的更多信息,请参阅文章

Neural networks made easy (Part 67): Using past experience to solve new tasks
Neural networks made easy (Part 67): Using past experience to solve new tasks
  • www.mql5.com
In this article, we continue discussing methods for collecting data into a training set. Obviously, the learning process requires constant interaction with the environment. However, situations can be different.
 
插入代码 时请 使用代码 按钮 (Alt-S)

版主纠正了这次的格式问题。今后请正确使用代码格式,格式不正确的帖子可能会被删除。

在 trajectory.mqh,mamba 文件夹

中的第 2-4 层(第 604 行左右),我认为有一个问题:
,将 new CLayerDescription() 移到 Mamba 循环内,这样 3 层中的每一层都有自己的分配
,我是这样写的。

   for(int i = 2; i <= 4; i++)
     {
      if(!(descr = new CLayerDescription()))
         return false;
      descr.type = defNeuronMambaOCL;
      descr.window = BarDescr;                                       //窗口
      descr.window_out = 4 * BarDescr;                               //内部尺寸
      prev_count = (int)(descr.count = HistoryBars);                  //单位
      descr.batch = 1 e4;
      descr.activation = None;
      descr.optimization = ADAM;
      if(!encoder.Add(descr))
        {
         delete descr;
         return false;
        }
     }

谁能告诉我是对还是错?

 
Seyedsoroush Abtahiforooshani #:

在 trajectory.mqh 中,mamba 文件夹中的第 2-4 层(第 604 行左右)

我觉得有一个问题:
在 Mamba 循环内移动了 new CLayerDescription(),因此 3 层中的每一层都有自己的分配
下面是我的写法。

谁能告诉我是对还是错?

下午好,Seyedsoroush Abtahiforooshani。

在这种情况下,我们并不形成一个层,而只是对其结构进行描述。程序会根据描述生成神经元层。在初始变体中,当 descr = new CLayerDescription() 在数组外形成时,我们为单层形成一个 descr 对象,并按要求的次数传递其指针。在形成模型层时,descr 对象不会改变。这就是为什么神经元层的结构完全相同,但每个神经元层都有自己的参数。
当你将对象形成移入一个循环时,正在创建的模型不会有任何变化。我们只是创建了额外的descr 复制,这些 复制将在模型形成后立即删除。这将在形成模型时增加一些额外的操作和内存消耗。这对模型操作没有影响。