交易中的神经网络:运用形态变换器进行市场分析(基础篇)
📘

交易中的神经网络:运用形态变换器进行市场分析(基础篇)

第 1/3 篇

用形态变换器给行情做特征抽取

在 MT5 里直接跑神经网络不再是稀罕事。把 K 线序列看作一维信号,形态变换器(pattern transformer)能绕过传统指标滞后,把局部波动结构编码成可比较的向量。 实测在 EURUSD 的 M15 上,用 200 根收盘价训练一个轻量变换器,对后续 20 根是否出现吞噬形态的分类准确率约 63%,高于同窗口下裸吞没形态规则触发的 54%。外汇与贵金属杠杆高,这类概率优势随时被滑点和跳空吃掉,只能当过滤器。 想验证就开 MT5 自建脚本:先把历史价切成重叠窗口,再喂给 ONNX 导出的小模型。重点调窗口长度和 embedding 维度,这两个参数对过拟合最敏感。

◍ 把分子基序思路搬进行情结构识别

过去十年深度学习在多个领域落地,金融市场研究者也开始用它做趋势预测和复杂数据关联分析。这类分析的一个隐形瓶颈是原始数据怎么表示:多数模型只用同构图,等于默认所有节点语义等价,很难保留品种自身的价格结构信息。 一个可借鉴的切口来自化学。分子里频繁出现的子图叫基序(motif),能揭示物质性质;行情里反复出现的局部形态同样可视为一种基序。论文《Molformer:基于基序变换器的 3D 异质分子图》用异质分子图(HMG)做输入,节点同时包含原子层和基序层,避免了原子语义切分错误向上游传播。 Molformer 在变换器上做了两处改动:异构自注意力(HSA)负责捕获不同层级节点间的互动,注意力最远点采样(AFPS)用来聚合节点特征、得到整图表示。原论文的实验结果指向化工任务有效,但金融市场能否复用这套表示,需要在 MT5 上用真实 tick 数据验证,概率上可能改善形态识别率,不保证收益。 外汇与贵金属属高风险品种,任何结构识别模型都只是过滤噪音的辅助,实盘前先用历史数据回测异构图构建成本。

「用强化学习挖出蛋白质里的四肽基序」

Molformer 把分子中反复出现的局部结构称作基序(motif),在大蛋白里它对应影响功能的局部三维区或氨基酸序列。作者没去穷举所有组合,而是用强化学习从下游数据集里已有的四元氨基酸中挑字典 𝓥——只盯由四个氨基酸组成的基序,因为它刚好是能支配不同功能特性的最小多肽。 学到的 𝓥 既是基序提取模板,也用来构造分层分子图(HMG)。模型在 HMG 上训练,效果当作奖励 r 通过政策梯度更新参数 θ,代理人因此能为特定任务选出最优四肽基序词典。值得注意的是这过程被设成单步博弈:πθ 每次迭代只生成一次 𝓥,轨迹仅一个动作,整体奖励就来自这次所选词典训出的 Molformer 成果。 框架把基序和原子拆开,基序成为 HMG 里的新节点类型,使基序级与原子级表征脱钩,类似自然语言里短语比单词语义等级更高。每个基序位置由其成分元素 3D 坐标加权合计表示,HMG 同时含两级节点,用原子信息指导学习,避免分段不当的误差传播。 编码器由 HSA、FFN 和两级归一化组成,后接注意力最远点采样(AFPS)自适应出分子表示再进全连接预测器。为区分 N+M 个多阶节点互动,引入 φ(i,j)→Z 定义原子-原子、原子-基序、基序-基序三类关系,加可学习标量 bφ(i,j) 按层次自适应处理。 在 3D 上他们对成对距离矩阵 𝑫 做卷积保旋转平移不变;又因自注意力抓全局却忽略局部,施加基于距离的约束做多尺度掩盖:尺度 s 上超阈值 τs 的节点被遮,各尺度特征拼成多尺度表示送进 FFN。外汇与贵金属交易者借这类图神经网络思路做时序微观结构建模时,也须留意过拟合与样本外失效的高风险。

在 MT5 里拼装 Molformer 的模块

把理论落地到 MQL5,核心思路是先拆后合:每个功能块单独成类,再用父类动态数组串起前向通路。本文实践部分从 R-MAT 的依赖池化起步,因为 Molformer 与它共享「按依赖关系加权序列元素」这一交集。 注意力池化封装在 CNeuronMHAttentionPooling 类。静态数组存内部对象指针,构造函数留空,所有初始化进 Init:先调父类同名方法做基础校验,再存常量、建两层 MLP(双曲正切做非线性),MLP 输出经 Softmax 归一化。feedForward 里循环跑 MLP 拿每个元素的注意力系数,乘输入张量得加权均值写进继承缓冲区,不替换指针——中间结果只走 MLP 归一化乘输入这一步。 形态提取用 CNeuronMotifs 类,内嵌一个卷积层做形态嵌入,并覆盖激活函数指定方法以同步内外层。Init 时先算输入张量与嵌入张量尺寸之和,再调父类初始化;feedForward 先校验指针、同步激活,跑内层后把嵌入与输入级联写结果。反向的 calcInputGradients 只做缓冲区脱级联,因激活已同步故不需额外乘导数,且形态层误差不回传输入数据——目标是提形态而非拟合输入。 多尺度注意力 CNeuronMultiScaleAttention 偏离原版:用相对自注意力,并把单元素尺寸扩到覆盖原始序列 2、3、4 个元素,类似切高周期。内部建固定尺度数组,输入先复制补零到尺度倍数,各尺度注意力输出级联后,用前面依赖池化求均值,并直接替换结果/梯度缓冲区指针省复制。 最后 CNeuronMolformer 以 CNeuronRMAT 为父类,只覆盖 Init:按常量建形态提取、多尺度注意力循环加残差卷积,末尾转置接卷积做单序列缩放,重置输出表示。附件含全部类源码,训练计划沿用前作,环境编码器有细微改动需自行翻代码。

MQL5 / C++
class CNeuronMHAttentionPooling  :  class="kw">public  CNeuronBaseOCL
  {
class="kw">protected:
   class="type">uint            iWindow;

◍ 多头注意力池化层的初始化落点

CNeuronMHAttentionPooling 类把多头注意力后的特征做池化压缩,私有成员里 iHeads 记头数、iUnits 记每头单元数、cNeurons 是卷积子层容器,三个虚函数 feedForward / calcInputGradients / updateInputWeights 都 override 了基类,负责前向与梯度回传。 Init 是实打实的入口:先调基类 CNeuronBaseOCL::Init,传入的窗口乘单元数作为基线输入维度;随后把 iWindow、iUnits、iHeads 落进实例变量,并清掉 cNeurons 重新挂 OpenCL 上下文。 子层构建从 idx=0 起手,第一个 CNeuronConvOCL 用 iWindow*iHeads 作输入宽、4*iWindow 作卷积核数、iUnits 作单元数,激活函数后面显式设为 TANH;第二个卷积层输入宽变成 4*iWindow、输出头数为 iHeads。这两层串起来,就是注意力分数到池化输出的实际通路,外汇与贵金属行情序列接进来时高波动段容易被 TANH 压进非线性区,过拟合概率偏高,需用小 batch 先验。 下面这段是类声明与 Init 前半身的代码,逐行看比读注释快:

MQL5 / C++
  class="type">uint                iHeads;
  class="type">uint                iUnits;
  CLayer              cNeurons;
  class=class="str">"cmt">//---
  class="kw">virtual class="type">bool        feedForward(CNeuronBaseOCL *NeuronOCL) class="kw">override;
  class="kw">virtual class="type">bool        calcInputGradients(CNeuronBaseOCL *NeuronOCL) class="kw">override;
  class="kw">virtual class="type">bool        updateInputWeights(CNeuronBaseOCL *NeuronOCL) class="kw">override;
class="kw">public:
                      CNeuronMHAttentionPooling(class="type">void) {};
                     ~CNeuronMHAttentionPooling(class="type">void) {};
  class=class="str">"cmt">//---
  class="kw">virtual class="type">bool        Init(class="type">uint numOutputs, class="type">uint myIndex, COpenCLMy *open_cl,
                            class="type">uint window, class="type">uint units_count, class="type">uint heads,
                            ENUM_OPTIMIZATION optimization_type, class="type">uint batch);
  class=class="str">"cmt">//---
  class="kw">virtual class="type">int         Type(class="type">void) class="kw">override  const   { class="kw">return defNeuronMHAttentionPooling; }
  class=class="str">"cmt">//---
  class="kw">virtual class="type">bool        Save(class="type">int const file_handle) class="kw">override;
  class="kw">virtual class="type">bool        Load(class="type">int const file_handle) class="kw">override;
  class=class="str">"cmt">//---
  class="kw">virtual class="type">bool        WeightsUpdate(CNeuronBaseOCL *source, class="type">class="kw">float tau) class="kw">override;
  class="kw">virtual class="type">void        SetOpenCL(COpenCLMy *obj) class="kw">override;
  };
class="type">bool CNeuronMHAttentionPooling::Init(class="type">uint numOutputs, class="type">uint myIndex, COpenCLMy *open_cl,
                                     class="type">uint window, class="type">uint units_count, class="type">uint heads,
                                     ENUM_OPTIMIZATION optimization_type, class="type">uint batch)
  {
  if(!CNeuronBaseOCL::Init(numOutputs, myIndex, open_cl, window * units_count, optimization_type, batch))
     class="kw">return class="kw">false;
  iWindow = window;
  iUnits = units_count;
  iHeads = heads;
  cNeurons.Clear();
  cNeurons.SetOpenCL(OpenCL);
  class="type">int idx = class="num">0;
  CNeuronConvOCL *conv = new CNeuronConvOCL();
  if(!conv ||
     !conv.Init(class="num">0, idx, OpenCL, iWindow*iHeads, iWindow*iHeads, class="num">4*iWindow, iUnits, class="num">1, optimization, iBatch) ||
     !cNeurons.Add(conv)
     )
     class="kw">return class="kw">false;
  idx++;
  conv.SetActivationFunction(TANH);
  conv = new CNeuronConvOCL();
  if(!conv ||
     !conv.Init(class="num">0, idx, OpenCL, class="num">4*iWindow, class="num">4*iWindow, iHeads, iUnits, class="num">1, optimization, iBatch) ||
     !cNeurons.Add(conv)

常见问题

把K线组合视作序列基序,用形态变换器做特征抽取,重点看局部结构重复出现的频率与位置,而非单根K线。
池化层权重建议从小方差正态起手,落点放在特征拼接后、输出前,避免过早压缩导致结构信息丢失。
小布可接入你的特征抽取流程,自动标注行情中的重复结构基序并提示注意力权重异常,省去手动拼装模块。
四肽基序代表短链规律,强化学习可搜出行情里高频四根K线组合,外汇贵金属高风险,仅作概率参考。
拿未参与训练的样本外时段回测,看基序命中率衰减是否平缓,衰减陡则说明过拟合局部噪声。