English Русский Español Português
preview
神经网络在交易中的应用:概率时间序列预测(K²VAE)

神经网络在交易中的应用:概率时间序列预测(K²VAE)

MetaTrader 5 — 交易系统 |
54 0
Dmitriy Gizlyk
Dmitriy Gizlyk

引言

近年来,时间序列分析取得了真正的突破。异常检测、分类和缺失值填充现在处理得更加准确和迅速。然而,对于金融市场而言,概率预测更为重要:它不仅仅是预测资产价格的问题,而是评估可能情景的范围。此类评估有助于交易员和分析师制定灵活的策略、管理风险并做出明智的决策。

经典模型在短期预测方面表现出色。但若将目光放得更远一些,误差便会开始累积,波动性放大不准确性,计算成本也急剧上升。这在金融市场中尤为明显,因为市场中的每一个事件 — 无论是公司业绩报告还是地缘政治的意外事件 — 都会引入非线性因素,并改变游戏规则。

作为解决这类问题的一种可能方法,论文 “K²VAE:一种用于概率时间序列预测的Koopman-Kalman增强变分自编码器” 提出了一种基于两个基本理念的新框架。首先,Koopman 理论将非线性过程转化为线性形式。想象一下,你通过特殊镜头观察股票价格图表,它变成了一条直线 — 这种方法使得理解动态变化变得更加容易。其次,经典的 Kalman 滤波器会仔细处理新数据,每次有新信息(如收益报告、利率变化或意外事件)出现时,都会调整预测结果。

论文作者将这些想法融入了 K²VAE 框架 — 一个基于变分自编码器的轻量级快速系统。首先,KoopmanNet 对历史价格数据和指标施加线性结构。然后,基于 Kalman 滤波方法的 KalmanNet 逐步细化对可能变动的估计及其不确定性。这种架构能够在保持高精度和稳定性的同时,进行短期和长期预测。

K²VAE 框架的主要优势:

  • 模型透明度。线性组件为交易者提供可解释的信号,而不是一个黑箱;
  • 预测灵活性。您可以快速为各种资产生成场景:货币对、指数和商品;
  • 风险管理。置信区间的自适应调整有助于及时降低巨额亏损的风险。

因此, K²VAE 成为短期和长期预测的多功能解决方案,使用户能够超越单一场景,立即评估所有可能的市场走势。这大大提高了投资组合管理的有效性和自动交易策略的可靠性 — 你看到的不仅仅是点预测,而是潜在风险和机遇的全貌。



K²VAE 算法

在金融市场的动态变化中,我们经常会遇到看似混乱的现象 — 价格波动、波动性突然飙升以及新闻报道的影响。Koopman 理论提供了一种从系统内部理解问题的视角:与其直接尝试驯服非线性,不如将我们的系统转换为一个特殊的可观测空间。在此,每个状态向量 xₖ (例如,一篮子报价或一组经济指标)都通过函数 ψ 转换为某个观测量,其演化由线性算子 𝒦 描述。简而言之,我们将复杂的价格图表线性化,使其位于一条直线上,这使得分析和预测时间序列的潜在动态变得更加容易。这种方法有助于区分长期趋势和短期噪音。

然而,即便采用线性表示,我们仍面临诸多不确定性:价格每时每刻都在变动,新的经济报告不断发布,央行也在不断调整利率。这时 Kalman 滤波器就派上用场了。该算法基于一个简单而强大的预测–校正原理:首先,我们预测系统的当前状态并估计预测的置信度(矩阵 Pₖ),然后,在接收到实际测量值(价格、交易量或宏观经济指标)后,我们计算 Kalman 增益 Kₖ。我们利用它来调整初始预测以反映实际情况,并更新我们对不确定性的估计。对于交易者而言,这相当于使用最新数据在线更新模型状态:公司报告、流动性变化或突发地缘政治事件都会立即纳入预测中,从而最大限度地减少模型与实时市场的滞后。

通过将系统的线性展开与自适应滤波相结合,我们为概率预测奠定了坚实的基础。但为了避免局限于单一场景,我们引入了变分自编码器的强大功能。VAE 将问题转化为条件生成:输入是历史数据 X ( N 个资产的 T 个最新观测值),输出不是未来值的单个向量,而是可能的轨迹 Y 的分布。关键在于潜在变量 Z ,它反映了隐藏的市场因素:相关性、周期和意外冲击。优化是通过对数似然值的下限来实现的。第一个组件对模型生成能力不佳进行惩罚,而第二个组件则对潜在分布漂移到远离我们先验预期的极端区域进行惩罚。

在 K²VAE 框架中,这三个组件(KoopmanNet、KalmanNet 和 VAE)并非简单共存;相反,它们无缝互补。总体而言,K²VAE 架构遵循一个清晰的多阶段流程,其中每个组件负责将分析数据转换为可解释动态模型过程中的相应阶段。

首先,输入标记单元嵌入模块将原始时间序列拆分为标记单元 — 价格历史或流动性指标的小片段。这种技术与分析师将价格图表划分为具有关键支撑位和阻力位的区间的做法类似:它使数据更有意义。

KoopmanNet 随后将这些标记单元映射到所谓的可观测空间。在此,时间序列的复杂非线性行为(资产之间的相关性、短期波动率飙升)被分解为简单的线性分量。通过训练过程,我们识别出一个线性 Koopman 算子,该算子从第一个标记单元开始迭代,构建一个演化模型。当然,不存在一个理想的可观测空间能使系统完全线性化 — 因此预测中存在偏差。

之后,KalmanNet 开始发挥作用。与卡尔曼滤波器类似,它采用线性预测,并利用新的观测数据进行自我更新,从而优化多维状态的协方差,并据此形成一个具有清晰语义的变分后验 Q(Z|X)。这在金融领域至关重要:我们不仅要构建一个基线价格轨迹,还要立即评估其可能的偏差范围 — 从突发缺口到重大新闻事件引发的反转。

最后,解码器执行从可观测空间的逆映射(ψ⁻¹),将潜在空间中的样本结果转换回熟悉的时间序列格式。它还负责在规划期内对最终分布 P(Y|Z,X)进行建模。因此,我们获得了一个即用型的未来价格场景 — 不仅仅是一个场景,而是许多概率轨迹,每条轨迹都有其对应的风险和置信度估计。

最终,K²VAE 将原始金融数据转化为一个连贯的线性动态模型,该模型具备自适应不确定性细化功能,并能生成市场可能走势的完整谱系。它是投资组合规划、风险评估以及创建可靠算法策略的强大工具。

将时间序列划分为片段远不止是一种技术手段。在金融分析中,这类似于从单个报价点转向五分钟或半小时的蜡烛图,后者能立即显示趋势和波动性的关键峰值。在 K²VAE 框架中,数据预处理基于类似的思想,但超越了传统的各通道独立处理的架构,后者对每个通道进行单独处理。相反,该框架的作者将所有变量(不同资产的价格、交易量和技术指标)整合到一个片段中,使模型能够自然地考虑它们之间的交叉影响。

首先,将上下文时间序列 X(一个由 N 个变量在 T 个时间步长上构成的矩阵)划分为若干个长度为 s 的相等且不重叠的片段。每个片段同时包含所有 N 个指标在 s 个时间点上的数据,从而提供该时段市场状况的快照。接下来,我们将每个片段展平为一个维度为 N·s 的向量,并通过线性投影将其处理,将所得信息压缩为一个维度为 d 的紧凑嵌入表示。通过这一操作,模型不仅学会了查看每个片段的内部,还能自动识别出最重要的变量组合:无论是科技股与半导体股之间的相关性,还是不同细分市场交易量的同步飙升。

这种从不同渠道到多维片段的近乎爆炸性转变,同时带来了几个优势。首先,当波动性或价格趋势同时影响多个资产时,该模型能立即检测到聚集性现象。其次,单个区块内的局部噪声和随机抖动被平滑处理,这大大减少了错误信号的数量。第三,由于变量的覆盖范围更广,每个代币内的隐藏周期和长期模式变得更加明显 — 这些模式在传统方法下,在独立处理渠道时可能被忽视或扭曲。

因此, K²VAE 接收的输入不是一组单独的特征,而是每个时间间隔 s 的市场环境的全面、可分析的快照。这将作为后续阶段的起点。

在现实世界的金融时间序列中,我们会同时遇到多种非线性表现形式:价格周期的阶段可能会相互转移,重要报告发布时统计特征会发生变化,突发新闻事件会打乱既定模式。为了驯服这种复杂性,K²VAE 框架的作者们戴上 Koopman 的‘透镜’ — 即他们将混沌振荡领域的标记单元映射到一个空间,使得其演化变得简单且线性。

实际上,情况是这样的。首先,将每个平滑后的嵌入向量 X′ᴾ 通过一个小型但功能强大的 MLP ,该 MLP 充当可观测函数 ψ 。简而言之,我们将价格和指标之间复杂的相互关系提炼成一个新的向量 xᴾᵢ* ,其中潜在的动态变得更加清晰。

通过收集所有这样的向量,我们得到一个矩阵 X*ᴾ ,其中每一行都是单个片段的具有线性可解释性的投影表示。但仅仅看是不够的。为了了解系统如何逐步演化,我们使用 eDMD (扩展动态模式分解)方法,从 X*ᴾ 中提取前一个-下一个对,并计算算子 𝒦 loc ,以最小化它们之间的差异。经过训练, X*ᴾ 的第一列乘以 𝒦 loc后,能够尽可能准确地再现第二列,依此类推,直到时间序列的末尾。这种方法可以逐步推导出局部转换规则。

从局部到全局层面,我们添加了第二个可训练组件 𝒦 glo 。它们共同构成完整的Koopman运算符 𝒦 = 𝒦 loc + 𝒦 glo 。正是这一点,不仅使我们能够重建历史片段,而且还能够通过将第一个投影 x₁ᴾ*乘以 𝒦ⁿ、𝒦ⁿ⁺¹ 等来自信地展望未来。在这种情况下,可观测空间中的 m = L/s 块与原始序列中的 L 步一一对应。

因此,即使是股票价格、交易量和技术指标之间最复杂的相互作用也被线性化了。K²VAE 可以快速准确地生成任何时间段的预测 — 从几分钟到几个月。同时,该模型保持透明:我们既可以看到局部转换规则,也可以看到全局趋势,而线性结构使交易员和风险管理人员能够了解特定场景的形成驱动因素。

KoopmanNet 对主要趋势进行线性化并重建上下文序列后,不可避免地会留下一些残余误差 — 即图像块的真实投影与其线性近似值之间的差异。K²VAE 框架的作者并没有忽略这些残差;相反,他们将这些残差收集到一个统一的残差信息流中,该信息流显示了线性模型在哪些方面以及在多大程度上存在不足。

这个基于矩阵的误差记录表记录了各种意外情况:突然的缺口、交易量激增,或尚未在 Koopman 算子中反映出来的新闻冲击。

接下来,轻量级 Transformer 集成模块扮演着明智的顾问的角色:它分析所有这些累积的非线性,并将其转换为一系列控制输入 U = [ u ₁, …, uₘ ]。每个向量 uₖ 都作为信号,指示在步骤 k 中预测应该朝哪个方向调整。由于 Transformer 可以考虑不同时间点之间的关系,因此该模型能够学习重新分配误差信息,并以最有效的方式纠正这些误差。

获取控制输入后,我们构建经典过程模型。

在这里, A 负责基本的逐步过渡, B 负责控制输入的效果,而 wₖ 则添加了一点随机噪声,反映了不可预测的市场因素。我们从最后一个真实数据片段中取出初始状态 z₀ ,以便模型从尽可能最准确的点开始。

接下来,我们将通过观测模型来检验由此产生的预测结果。

在这里, H 将内部状态映射到预测格式,而 vₖ 添加了测量噪声,反映了模型线性部分固有的不准确性。我们将之前生成的 KoopmanNet 预测作为主要观测值。

传统的预测-修正循环使 KalmanNet 能够动态地平衡线性预测与误差信息。首先,我们得到初步预测 ẑₖ 和协方差矩阵 P̂ₖ ,它量化了模型的置信度。

接下来,通过与观测结果进行比较,我们计算卡尔曼增益 Kₖ 。之后,我们对状态和协方差进行细化。

因此,该模型不仅改进了预测,而且在每一步都清楚地表明了它对市场的理解程度,以及在哪些方面还需要进一步确认。

为了避免丢失累积的错误信息,该框架的作者通过跳跃连接将最终状态与控制输入联系起来。

这样可以确保,在 KoopmanNet 和 KalmanNet 掌握所有细微差别之前,该模型将利用所有可用的信息。随着训练的进行, U 的大小趋近于零 — 这意味着线性动力学变得越来越自给自足。

因此, K²VAE 框架不仅可以生成价格预测,还可以生成两个相关的估计值:价值本身及其置信度。对于交易员和风险管理人员来说,这是一个非常有价值的两部分信号:预测有助于制定交易计划,而协方差则表明哪些方面需要谨慎行事,哪些方面值得冒险。这种方法将算法交易从盲目追求点位预测转变为深思熟虑的风险管理策略。

最后,我们进入生成概率预测的最终阶段。现阶段,我们已经有了两个关键结果:调整后的潜在状态 Z' 和协方差矩阵 P ,它们描述了我们在预测的每个阶段的置信度。它们共同定义了变分分布,我们将从中抽取未来情景的随机样本。

为了使梯度能够通过随机采样传播,该框架的作者使用了常见的重参数化技巧。他们没有直接从 N ( Z',P ) 中抽取 Z ,而是生成标准正态噪声 ϵ∈ N (0,1) 并构造:

其中 L 是分解 P = LLᵀ 得到的下三角矩阵。因此,该过程本身是可微的,梯度可以从损失函数自由地流向 KalmanNet 和 KoopmanNet 的参数。

接下来, K²VAE 的作者使用解码器将得到的潜在向量 Zsample 映射回熟悉的时间序列格式 — 两个对称的 MLP 镜像原始的 Koopman 编码器ψ 。第一个 MLP ,我们将其表示为 ψ⁻¹μ ,预测均值向量 μ ,而第二个 MLP, ψ⁻¹σ ,预测标准差向量 σ 。

因此,每个生成的样本都会产生一个未来值的向量以及一个离散程度的估计值 — 也就是说,我们不仅能立即看到最可能的轨迹,还能看到置信区间的边界。

为了进一步加强逆变换的质量,框架作者还将重构序列 X̂C 传递给 ψ⁻¹μ 。

我们得到 X Rec ,并用它来计算重建误差 L Rec 。这促使可观测函数 ψ 构建一个真正的线性系统,并使解码器能够准确地将数据映射回价格和指标的原始空间。

最后,综合所有因素,我们确定预测分布。

对于每个样本,Decoder 输出向量 μ 和向量 σ ,它们用于构建完整的概率预测:中位数、置信区间和极端情况。

实际上,这意味着交易员或风险经理可以立即全面了解可能的市场走势 — 从狭窄范围内的保守波动到伴随剧烈波动的激进飙升。由于所有组件( KoopmanNet 、 KalmanNet 和 Decoder)的重新参数化和同步训练, K²VAE 提供了一个平滑、可微分的管道,其中每次迭代不仅提高了平均预测的准确性,而且提高了风险估计的可靠性。

K²VAE 训练的核心在于一对互补的损失函数,它们共同构成了一个强大的模型自我改进机制。第一个是经典的 ELBO 目标(证据下界),该模型旨在同时实现两件事:确保生成的轨迹Y遵循预期分布,并防止潜在空间 Z 偏离我们先前的假设太远。

第一项是对未来场景生成不佳的惩罚:解码器从 Z 的样本中重现 Y 的分布越差,对我们的惩罚就越大。第二项是我们的变分后验 Q ( Z|X ) 与简单标准正态先验P(Z|X )= N (0, I ) 之间的 KL 散度。因此,我们可以防止潜在空间超出合理的范围,并使其平滑地收敛到稳定状态,从而使可观测空间中的线性系统变得稳定。

然而,仅凭 ELBO 并不能保证我们的可观测空间实际上会呈线性行为。这就涉及到第二个关键因素 — 重建误差。

该框架的作者将实际的原始序列 X 与其重建序列 XRec 进行比较,后者是通过 Decoder 从重建的 Koopman 输出序列转换而来的。模型将数据映射回原始空间的能力越准确,它在可观测层构建线性动态的能力就越准确且清晰。该损失函数起到支撑模型基础的作用,防止可观测函数 ψ 偏离线性。

归根结底,整体训练目标就是这两部分的总和。

ELBO 负责正确生成和构建结构良好的潜在空间,而重构误差则保证了线性近似的严谨性和逆变换的质量。它们共同迫使 K²VAE 不仅要学会生成合理的市场情景,还要形成易于理解、可解释的线性动态结构,这种结构能够抵御波动性飙升和意外的市场暴涨。这不仅为交易员和风险管理人员提供预测,而且还提供全面、透明和可靠的决策工具。

作者对 K²VAE 框架的可视化结果如下所示。



使用 MQL5 实现

现在我们已经详细研究了 K²VAE 框架的所有关键组成部分 — 从 KoopmanNet 动态的线性化到使用 KalmanNet 进行自适应不确定性细化以及最终的 VAE 解码器 — 是时候将理论付诸实践了。在本工作的实践部分,我们将系统地演示如何在 MQL5 环境中直接实现这些模块:从准备源数据和生成片段到训练模型参数和生成最终结果。本实用指南将帮助您逐步在自己的算法策略中实现 K²VAE ,同时保持所提出架构的所有灵活性和透明性。

您可能已经注意到, K²VAE 的核心是围绕几个关键矩阵构建的 — Koopman 算子、 KalmanNet 中的转移矩阵和控制矩阵,以及编码器和解码器中的权重投影。与标准神经网络中常见的卷积→激活→卷积层次结构不同,这里相同的参数同时参与了管道的几个不同阶段。如果我们直接照搬这个想法,就必须为每个步骤声明单独的 MLP 层,因此,权重也会被复制,这不仅会减慢执行速度,使代码复杂化,还会扭曲单个线性算子的概念。

因此,我们需要找到一种替代方案,既能保留共享参数的概念,又能将其整合到现有的训练机制中。在这里,值得回顾一下我们在其他项目中已经使用过的一种久经考验的方法,当时我们需要在标准神经网络层层次结构之外训练矩阵。

其思路是将可训练矩阵实现为两层 MLP (多层感知器)。第一层输出一个固定值 — 1.0 — 而第二层将其扩展为所需的整个参数矩阵。这种巧妙的设计使得即使对于位于标准结构之外的参数,也可以使用标准的反向传播和权重更新机制。

换句话说,我们本质上是在创建一个伪层,其目的不是处理输入数据,而只是生成一个参数矩阵。乍一看,它在计算上毫无用处,但正是通过它,梯度才会流动,从而训练第二层 — 而这正是我们得到矩阵 A 、 B 、 K 、 H ,或者说 ψ 的原因。

这种方法的优点在于它与训练神经网络的通用框架保持兼容性。我们无需构建单独的优化机制或手动更新权重。一切都按照标准机制运行:前向传递→误差→梯度传播→参数更新。

因此,即使是 Koopman 算子或 KalmanNet 协方差矩阵等特殊元素也可以集成到架构中,并提供完整的训练支持。

当问题只需要一个参数化矩阵时,在单个对象中实现一个小型 MLP 是完全合适的。我们只需在结构中添加几个内部层,将一个常数输入到输入端,即可在输出端获得所需的矩阵,然后将其用于计算。它简单、透明,无需额外的架构。

然而,在KoopmanNet 和 KalmanNet 算法中,情况有所不同:在这里,我们需要一整套这样的矩阵。为每个矩阵使用单独的实现方式意味着可能会使架构变得混乱,并降低代码的可读性。

因此,我们采用了一种更通用、可扩展的解决方案 — 我们将生成可训练矩阵的逻辑移到一个单独的类中,我们称之为 CParams 。该类负责初始化、存储和更新权重的所有工作,并在正确的时间返回所需的矩阵。这使我们能够:

  • 集中管理参数
  • 添加新矩阵时,可以轻松扩展架构;
  • 采用统一的生成接口,
  • 简化调试和可视化。

新对象的结构如下所示,它包含一个最小但功能完整的框架,可集成到任何神经网络架构中。

class CParams  :  public   CNeuronBaseOCL
  {
protected:
   CNeuronBaseOCL    cOne;
   //---
   virtual bool      feedForward(CNeuronBaseOCL *NeuronOCL) override
                        { return FeedForward(); }
   virtual bool      updateInputWeights(CNeuronBaseOCL *NeuronOCL) override
                        { return UpdateInputWeights(); }
   virtual bool      calcInputGradients(CNeuronBaseOCL *NeuronOCL) override  { return true; }
   virtual bool      calcHiddenGradients(CNeuronBaseOCL *NeuronOCL) override { return true; }

public:
                     CParams(void) {};
                    ~CParams(void) {};
   //---
   virtual bool      Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl, uint numNeurons,
                          ENUM_OPTIMIZATION optimization_type, uint batch) override;
   virtual bool      Identity(const int rows, const int cols);
   //---
   virtual bool      FeedForward(void);
   virtual bool      UpdateInputWeights(void);
   //---
   virtual bool      Save(const int file_handle) override;
   virtual bool      Load(const int file_handle) override;
   //---
   virtual int       Type(void) override const  {  return defParams; }
   virtual void      SetOpenCL(COpenCLMy *obj) override;
   //---
   virtual bool      WeightsUpdate(CNeuronBaseOCL *source, float tau) override;
  }; 

该实现的一个关键特点是使用一个虚拟输入 cOne ,其中填充了 1,并将其输入到可训练层。因此,输出端形成的矩阵成为包含所需参数的唯一对象,可直接使用。

从底层来看, CParams 继承自基础神经网络层 CNeuronBaseOCL ,这使得它与框架的其余部分完全兼容。核心操作逻辑位于 FeedForward 和 UpdateInputWeights 方法中,这些方法通过调用同名的继承方法并以 cOne 作为输入来实现。

通过调用 Init 方法来初始化对象,该方法会创建必要的接口并配置组件之间的连接。

bool CParams::Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl, uint numNeurons,
                                      ENUM_OPTIMIZATION optimization_type, uint batch)
  {
   if(!CNeuronBaseOCL::Init(numOutputs, myIndex, open_cl, numNeurons, optimization_type, batch))
      return false;
   if(!cOne.Init(numNeurons, 0, OpenCL, 1, optimization, iBatch))
      return false;
   cOne.SetActivationFunction(None);
   if(!cOne.getOutput().Fill(1))
      return false;
//---
   return true;
  }

精心实现后,我们可以完全隐藏与支持前向和后向传递、参数优化以及 OpenCL 上下文中的缓冲区相关的所有复杂性,使用户只需声明式地指定矩阵形状和用途即可。

最终得到的是一个用途广泛、可扩展且可重用的可训练参数块,适用于复杂的计算图。换句话说,我们得到了 PyTorch 中 nn.Parameter 的灵活等效物,但它是在支持 OpenCL 的 MQL5 环境中实现的。

值得注意的是一个重要的细节: CParams 对象中的前向传递操作( FeedForward )仅在训练期间执行。这是有道理的 — 毕竟,正是在此时此刻,权重矩阵必须根据模型的误差进行调整,并基于反向传播进行调节。

bool CParams::FeedForward(void)
  {
   if(!bTrain)
      return true;
//---
   return CNeuronBaseOCL::feedForward(cOne.AsObject());
  }

然而,在生产环境中 — 即使用训练好的模型进行预测或决策时 — 无需重新计算矩阵。训练生成的矩阵成为一个静态参数 — 它不再发生变化,也不需要任何额外的操作,尤其是对 OpenCL 内核的资源密集型调用。

因此,切换到生产环境时,我们基本上锁定了参数,可以安全地禁用前向传递,从而避免系统进行不必要的计算。这可以减轻计算资源的负担,加快模型运行速度,并提高其稳定性。

这种方法是计算阶段分离的经典示例,其中训练和部署在逻辑和工作负载方面都严格区分开来。这使得架构不仅更易于理解和灵活,而且在运行过程中也更具可预测性,这对于实时系统来说尤其重要。

CParams 对象及其所有方法的完整代码见随文附件。

我们已经完成了大量的工作:我们探索了 K²VAE 框架的理论基础,详细研究了其关键模块,甚至实现了 CParams对象 — 一个参数化矩阵的通用生成器,这在模型架构中是必不可少的。我们现在面临着一个更具挑战性的难题:为整个框架建立清晰一致的逻辑,其中每个细节都是一台运转良好的机器的重要组成部分。

但现在没必要着急。建立这样的系统需要头脑清晰、注意力集中和全新的视角。正因如此,我们将休息一段时间,直到下一篇文章发布,届时我们将以全新的活力和灵感回归。



结论

在本文中,我们探讨了 K²VAE ,这是一个强大而有前途的框架,它结合了线性动力学、变分推断和自适应滤波的优势。它的主要优势在于能够在潜在可观测空间中线性近似复杂的非线性过程,同时保持对噪声和系统偏差的鲁棒性。这不仅提供了一个模型,而且提供了一个具有高度可解释性、灵活性和准确性的工具 — 对于时间序列分析和预测市场动态尤其相关。

我们才刚刚开始理清 K²VAE 框架背后的各种理念。在本文中,我们迈出了第一步 — 从理论基础到关键组件的实现,例如参数矩阵和通用的 CParams 类,该类处理标准神经网络架构之外的所有权重管理。这标志着在构建模型完整逻辑方面迈出了重要一步。

然而,前方还有很多工作要做。我们需要将不同的元素组合成一个单一的、连贯的系统:实现滤波机制,在潜在空间中组织概率动态,并将 Encoder、Integrator、KalmanNet 和 Decoder 架构组装成一个整体。这并非易事,但正是这一点将使该模型成为真正智能的决策系统。

我们并非要结束这件事 — 我们只是勾勒出了发展轨迹。主要的发展还在后头。因此,稍作休息是有意义的,这样我们就能以更充沛的精力继续下一部分的旅程。


参考


本文中使用的程序

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

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

附加的文件 |
MQL5.zip (2886.75 KB)
基于协整股票的统计套利(第三部分):数据库搭建 基于协整股票的统计套利(第三部分):数据库搭建
本文提供一个 MQL5 Service(服务)的实现示例,用于保持新建数据库及时更新;该数据库作为数据分析以及一篮子协整股票交易的数据来源。文中详细阐述数据库的设计思路,并整理数据字典以供查阅。配套提供MQL5与Python脚本,用于数据库创建、表结构初始化以及行情数据写入。
梦境优化算法(DOA) 梦境优化算法(DOA)
这是一种基于种群的优化算法,其灵感源自一种尚存争议、研究较少的现象 —— 人类梦境的机制。该算法拥有一个具备不同“记忆”的智能体种群,用余弦波调制移动步长,并采用独特的99/1时间分配比例。让我们看一下这些特性会如何影响交易策略的优化效率。
新手在交易中的10个基本错误 新手在交易中的10个基本错误
新手在交易中会犯的10个基本错误: 在市场刚开始时交易, 获利时不适当地仓促, 在损失的时候追加投资, 从最好的仓位开始平仓, 翻本心理, 最优越的仓位, 用永远买进的规则进行交易, 在第一天就平掉获利的仓位,当发出建一个相反的仓位警示时平仓, 犹豫。
重构经典策略(第十五部分):日线突破交易策略 重构经典策略(第十五部分):日线突破交易策略
早在计算机出现之前,人工交易者就已投身金融市场,并总结出指导交易决策的经验法则。在本文中,我们重新研究一套知名的突破策略,来检验这种从实战中总结的市场逻辑,能否与系统化交易方法抗衡。研究结果表明:原始策略虽然胜率很高,但存在稳定性差、风险管控不足的问题。通过策略优化,我们展示如何将主观交易经验改造为更加稳健的算法交易策略。