交易中的神经网络:点云的层次化特征学习·综合运用
🌐

交易中的神经网络:点云的层次化特征学习·综合运用

(3/3)· 从局部邻域采样到嵌套抽象,把前兩篇的零散点云拼成可落地的交易特征引擎

新手友好 第 3/3 篇
不少人在用 PointNet 做行情点云编码时,直接拿全局 MaxPooling 当终局,忽略了局部密度异质带来的结构丢失。把不同区域的稀疏和稠密点混成一团签名,模型对突变行情的响应会钝化。这一篇收尾,先把分区和层次抽象补上。

◍ 点网双层结构的初始化与前向传播

这段实现把 PointNet 的思路搬到了 OpenCL 加速的二层网络上:第一层 caLocalPointNet[0] 用窗口长度 window 映射到 units_count,再经 64 个神经元、丢弃率 0.2 做局部特征提取;caLocalPointNet[1] 则接收前层输出,用 64→units_count、丢弃率 0.4 做二次抽象。 若启用 cTNetG 分支,会先算 window = sqrt(cTNetG.Neurons()),再用 MatMul 把 NeuronOCL 输出与 cTNetG 输出乘到 cTurnedG,维度拆成 (NeuronOCL.Neurons()/window) × window × window,这一步把时序特征做了转置卷积式的重排。 layer 2 的描述符里,descr.batch 设成了 1e4,optimization 用 ADAM,activation 为 None,window_out 指向 LatentCount 作为潜变量维度;HistoryBars 直接当作 Units 数,意味着回看 K 线根数会线性撑大显存占用。 在 MT5 里跑前先确认 OpenCL 设备可用,否则 cTNetG.Init(0,1,...) 会直接返回 false 导致整个网络构建失败;外汇与贵金属品种下用这类 GPU 网络请意识到过拟合与滑点风险偏高。

MQL5 / C++
      class="kw">return class="kw">false;
      }
      if(!cTurnedG.Init(class="num">0, class="num">1, OpenCL, window * units_count, optimization, iBatch))
         class="kw">return class="kw">false;
   }
   else
   {
      if(!!cTNetG)
         class="kw">delete cTNetG;
      if(!!cTurnedG)
         class="kw">delete cTurnedG;
   }
   if(!caLocalPointNet[class="num">0].Init(class="num">0, class="num">0, OpenCL, window, units_count, class="num">64, class="num">0.2f, optimization, iBatch))
      class="kw">return class="kw">false;
   if(!caLocalPointNet[class="num">1].Init(class="num">0, class="num">0, OpenCL, class="num">64, units_count, class="num">64, class="num">0.4f, optimization, iBatch))
      class="kw">return class="kw">false;
class=class="str">"cmt">//---
   class="kw">return true;
   }
class="type">bool CNeuronPointNet2OCL::feedForward(CNeuronBaseOCL *NeuronOCL)
   {
class=class="str">"cmt">//--- LocalNet
   if(!cTNetG)
      {
      if(!caLocalPointNet[class="num">0].FeedForward(NeuronOCL))
         class="kw">return class="kw">false;
      }
   else
      {
      if(!cTurnedG)
         class="kw">return class="kw">false;
      if(!cTNetG.FeedForward(NeuronOCL))
         class="kw">return class="kw">false;
      class="type">int window = (class="type">int)MathSqrt(cTNetG.Neurons());
      if(IsStopped() ||
         !MatMul(NeuronOCL.getOutput(), cTNetG.getOutput(), cTurnedG.getOutput(),
NeuronOCL.Neurons() / window, window, window))
         class="kw">return class="kw">false;
      if(!caLocalPointNet[class="num">0].FeedForward(cTurnedG.AsObject()))
         class="kw">return class="kw">false;
      }
   if(!caLocalPointNet[class="num">1].FeedForward(caLocalPointNet[class="num">0].AsObject()))
      class="kw">return class="kw">false;
   if(!CNeuronPointNetOCL::feedForward(caLocalPointNet[class="num">1].AsObject()))
      class="kw">return class="kw">false;
class=class="str">"cmt">//---
   class="kw">return true;
   }
class=class="str">"cmt">//--- layer class="num">2
   if(!(descr = new CLayerDescription()))
      class="kw">return class="kw">false;
   descr.type = defNeuronPointNet2OCL;
   descr.window = BarDescr;                                        class=class="str">"cmt">// Variables
   descr.count = HistoryBars;                                      class=class="str">"cmt">// Units
   descr.window_out = LatentCount;                                 class=class="str">"cmt">// Output Dimension
   descr.step = class="type">int(true);                                         class=class="str">"cmt">// Use class="kw">input and feature transformation
   descr.batch = class="num">1e4;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!encoder.Add(descr))
      {
      class="kw">delete descr;

「未命名小节的技术断点」

这一节原文只留下了一段不完整的代码片段,没有任何配套说明文字。从残存结构看,它处在某个条件判断的收尾位置,当逻辑不满足时直接返回 false。 代码片段显示:缩进层级为两层,说明位于某个函数或控制块内部;末尾的 return false 表示当前分支未通过校验,调用方应据此跳过后续处理。 由于本小节缺乏可验证的数据点、参数说明或回测现象,无法支撑任何交易动作。建议回到前节确认该函数的完整上下文,再决定是否在 MT5 中复刻验证。外汇与贵金属市场波动剧烈,此类未闭合逻辑直接上线可能触发异常信号。

MQL5 / C++
      class="kw">return class="kw">false;
    }

EURUSD H1 上两代模型同场验证

我们用 2023 年全年 EURUSD 的 H1 历史数据训练模型,指标全部取默认参数,训练完直接丢进 MT5 策略测试器跑测试。这一代只比前作多改了一层,所以拿同一份旧实验数据集重训两个模型,对比才公平。 新模型在训练集和测试集上都学到了正回报策略,测试期间余额、净值回撤偏差几乎可以忽略。但它下单更少,盈利因子比前作略高一点。 两种模型测试期总盈利几乎一样,不过各自成交笔数都很少,长期表现现在下结论还太早。外汇和贵金属这类品种波动受宏观事件驱动,样本过少时过拟合风险偏高,这套对比结果只适合当作分层结构有效性的初步信号。

◍ 记住这一条就够了

把行情切片成点云再喂给分层网络,本质是用几何视角补上传统时序模型漏掉的局部形态耦合,测试集上跑出正收益只说明管道通了,不代表能直接上实盘。 文中四个 EA 加三个类库构成闭环:Research 系列采样本、Study 训模型、Test 验效果,NeuroNet 与 Trajectory 管底层结构,整套在 MT5 里可复现但仅作方法演示。 外汇与贵金属属高风险品种,任何点云模型都只是概率工具,真要接资金先把 Test.mq5 在自有历史段重跑一遍再看回撤。

把采样和分层交给小布盯盘
这些最远点采样与多层级抽象的诊断,小布盯盘的 AIGC 已内置,打开对应品种页即可看到邻域覆盖是否均匀,你专注决策就行。

常见问题

最远点采样按输入数据本身的距离量值选质心,能适应点云密度不均,避免规则网格在稀疏区浪费算力、在稠密区漏覆盖,整体效率更高。
可以,小布盯盘的品种页内置了邻域球体覆盖与质心分布的诊断视图,能直观看出采样是否遗漏了关键局部结构,省去手写可视化脚本。
它对无序点集和噪声健壮,能把局部点集抽象成高级别表示,且权重在分区间共享,类似卷积的局部感知却不受网格束缚。
有可能,级别过深会把微小波动当成结构学出来,回测中表现脆,实盘外汇贵金属高风险下更易失效,需按样本量节制层数。