交易中的神经网络:点云的层次化特征学习·综合运用
(3/3)· 从局部邻域采样到嵌套抽象,把前兩篇的零散点云拼成可落地的交易特征引擎
◍ 点网双层结构的初始化与前向传播
这段实现把 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 网络请意识到过拟合与滑点风险偏高。
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 中复刻验证。外汇与贵金属市场波动剧烈,此类未闭合逻辑直接上线可能触发异常信号。
class="kw">return class="kw">false; }
EURUSD H1 上两代模型同场验证
我们用 2023 年全年 EURUSD 的 H1 历史数据训练模型,指标全部取默认参数,训练完直接丢进 MT5 策略测试器跑测试。这一代只比前作多改了一层,所以拿同一份旧实验数据集重训两个模型,对比才公平。 新模型在训练集和测试集上都学到了正回报策略,测试期间余额、净值回撤偏差几乎可以忽略。但它下单更少,盈利因子比前作略高一点。 两种模型测试期总盈利几乎一样,不过各自成交笔数都很少,长期表现现在下结论还太早。外汇和贵金属这类品种波动受宏观事件驱动,样本过少时过拟合风险偏高,这套对比结果只适合当作分层结构有效性的初步信号。
◍ 记住这一条就够了
把行情切片成点云再喂给分层网络,本质是用几何视角补上传统时序模型漏掉的局部形态耦合,测试集上跑出正收益只说明管道通了,不代表能直接上实盘。 文中四个 EA 加三个类库构成闭环:Research 系列采样本、Study 训模型、Test 验效果,NeuroNet 与 Trajectory 管底层结构,整套在 MT5 里可复现但仅作方法演示。 外汇与贵金属属高风险品种,任何点云模型都只是概率工具,真要接资金先把 Test.mq5 在自有历史段重跑一遍再看回撤。