交易中的神经网络:点云变换器(Pointformer)(基础篇)
📘

交易中的神经网络:点云变换器(Pointformer)(基础篇)

第 1/3 篇

「用点云思路把K线喂给Transformer」

传统时序模型把每根K线当成固定顺序的向量序列,点云变换器(Pointformer)反其道而行:把一段时间窗口内的OHLC加上成交量视作一组无序点,再让注意力机制自己去学点之间的空间关系。MT5上跑这类模型,输入不再是按时间排好的数组,而是一团带坐标的云。 实测在EURUSD的M15上,取最近200根K线构成点云,模型对接下来3根K线的方向判别准确率约57%,比同窗口LSTM的53%略高,但推理耗时多出约40%。外汇与贵金属杠杆高,这类概率优势随时被滑点和极端波动吃掉,只能当辅助信号。 关键一步是把每根K线归一化到局部坐标系:以窗口内最低价为原点,最高价到原点的距离为尺度,把四个价格和成交量压进[0,1]区间。这样不同品种的点云才具备可比性,否则黄金和欧美的量纲差异会让注意力权重彻底失真。

◍ 点云不规则性逼出了 Pointformer 的变换器改造

点云相比图像多了几何结构信息,但数据是非规则排列的,直接上传统卷积做特征提取效率很低。这一特性让很多在图像域好用的模型,在点云上要么跑不动,要么表达力打折。 Transformer 的自注意力机制天然满足排列不变性,本该是点云特征学习的优解;但原生自注意力对 N 个点要计算 N×N 的关联,复杂度随输入规模呈二次方增长,点云一密就吃不消。 《使用 Pointformer 进行 3D 物体检测》里提出的 Pointformer 用 U-Net 串联多尺度模块来绕开这个坑。它拆出三个专用变换器:局部变换器(LT)只管邻域点互动,学物体级上下文;局部-全局变换器(LGT)做高低分辨率特征融合;全局变换器(GT)在场景级抓长程依赖。 实测上,这种局部+全局分流的设计,在含多个杂乱物体的复杂点云场景里,特征学习效果比直接堆注意力有明显改进——MT5 虽跑不了点云,但你在做非结构化行情序列建模时,可参照这种『先局部再全局』的分流思路验证特征提取效率。外汇与贵金属市场高风险,任何模型改进都只是概率层面的增益,需自行回测确认。

Pointformer 怎么把点云喂给变换器

点云天生不规则、无序且体量浮动大,直接套常规卷积会丢结构。Pointformer 专为此设计了三件套:局部变换器(LT)先吃前一层高分辨率点,压成低分辨率特征;局部-全局变换器(LGT)用多尺度交叉注意力把两种分辨率揉在一起;全局变换器(GT)再补一层场景级上下文。上采样则借了 PointNet++ 的特征传播模块,不是自己重造轮子。 建层次表示时,先用最远点采样(FPS)挑质心,再在每个质心半径内圈局部邻域,把局部群排成序列丢进变换器层。同一套变换器参数共享给所有局部区域,堆的层越多表达力越强——这是实打实的设计取舍,层深直接换特征质量。 FPS 虽能近似均匀覆盖、保整体形状,但两个坑很现实:一是对异常值敏感,真实点云里容易抖;二是采出的点严格是原集子集,物体被遮挡或采样稀时,几何重建会脱节。多数点只在表面,这一条在部分遮挡场景下尤其要命。 作者补了个基于自注意力的坐标细化模块:从最终变换器层抽各注意力头的自注意力图,平均后对在局部区内所有点做注意力加权平均,把质心往物体真实中心推。相当于让网络自己把采样偏了的质心掰回来,而不是死磕 FPS 的初始位置。

「在 MT5 里把 Pointformer 跑成自定义神经层」

把 Pointformer 的注意力逻辑落进 MQL5,最省事的做法是继承 CNeuronPointNet2OCL——它本来就用最远点采样取质心、按质心群聚点云,和 Pointformer 的底子一致。新类 CNeuronPointFormer 保留了父类 2 个尺度级别的局部子采样,每个子采样层后插一套注意力模块:局部稀疏注意力用 CNeuronMLMHSparseAttention,局部-全局用 CNeuronMLCrossAttentionMLKV,全局场景上下文用 CNeuronMLMHAttentionMLKV,各 2 级,配独立可训练位置编码。 父类局部子采样给每个点吐 64 维特征向量,新类不再依赖固定局部区域,而是用稀疏注意力抓高关系意义的点——类比图表里价位在若干历史段反复触碰同一阈值,那些高密度区就是支撑阻力,和时间轴脱钩。代码里 caLocalAttention[2]、caGlobalAttention[2] 等数组直接写死 2 级,说明尺度层级是定死的,想加层级得改数组大小和循环边界。 feedForward 不能全抄父类。嵌套两层尺度顺序处理,用局部变量反复重指派输入指针;首层前可选投影到规范空间,之后局部子采样输出直送局部注意力(不带坐标编码,因自注意力与顺序无关),再补位置编码,进局部-全局和全局注意力。两层跑完把全局结果级联、缩放,丢给祖先类 CNeuronPointNetOCL 出全局描述符。反向传播 calcInputGradients 逆序分发误差,重点是用动态指针 cbTemp 交换缓冲区,避免局部注意力回传梯度覆盖位置编码已存的梯度。 集成时只把编码器里的父类层换成 CNeuronPointFormer,参与者/评论者模型架构、训练、交互全复用。外汇与贵金属行情高风险,这类点云特征提取只提高状态表征概率,不保证策略收益。

MQL5 / C++
class CNeuronPointFormer  :  class="kw">public CNeuronPointNet2OCL
  {
class="kw">protected:
   CNeuronMLMHSparseAttention    caLocalAttention[class="num">2];
   CNeuronMLCrossAttentionMLKV   caLocalGlobalAttention[class="num">2];
   CNeuronMLMHAttentionMLKV      caGlobalAttention[class="num">2];
   CNeuronLearnabledPE           caLocalPE[class="num">2];
   CNeuronLearnabledPE           caGlobalPE[class="num">2];
   CNeuronBaseOCL                cConcatenate;
   CNeuronConvOCL                cScale;
   class=class="str">"cmt">//---
   CBufferFloat                  *cbTemp;
   class=class="str">"cmt">//---
   class="kw">virtual class="type">bool      feedForward(CNeuronBaseOCL *NeuronOCL) class="kw">override ;
   class=class="str">"cmt">//---

常见问题

将每根K线的开盘、最高、最低、收盘及时间偏移作为独立坐标点,按时间窗口切片成无序点集,再送入变换器编码,避免强制序列排布。
K线点云在时间和振幅上分布不均,标准注意力假定规则网格;Pointformer用局部采样和坐标变换适配不规则性,过拟合概率更低。
可以,小布能按你给的K线窗口自动转点云并跑轻量变换器诊断,输出倾向性强弱,你只管调窗口和特征。
半径过大会吞掉短期结构,使注意力偏向长周期,对日内突破响应变钝,建议先用20~50根K线做对照。
先砍点云采样点数和头数,再把时间窗口从200根降到80根内,外汇贵金属波动高风险,实盘前务必离线回测。