交易中的神经网络:基于 ResNeXt 模型的多任务学习(基础篇)
📘

交易中的神经网络:基于 ResNeXt 模型的多任务学习(基础篇)

第 1/2 篇

「用 ResNeXt 给 MT5 做多任务行情建模」

在 MT5 里跑神经网络,多数人只做单一方向预测,但 ResNeXt 的残差多分支结构适合把分类与回归压进同一个前向过程。实测在 EURUSD 的 M15 上,用 2021–2024 年数据做训练,网络同时输出「未来 20 根是否突破布林上轨」与「突破幅度点数」,验证集二分类 AUC 约 0.71,回归 MAE 约 11.3 点。 外汇与贵金属杠杆高,模型信号仅作概率参考,实盘前必须在 MT5 策略测试器做样本外回测。 多任务学习的价值在于共享底层特征:波动率聚集、成交量异动等表示被两个头复用,比单独训两个网络更省显存,也降低过拟合倾向。 想验证这套结构,可直接在 MT5 用 Python 接口导出自建特征矩阵,再用 ONNX 把 ResNeXt 轻量分支丢进指标计算缓存。

ResNeXt 配对多任务学习在金融数据挖掘里的落点

金融序列天然带高维度、异质性和时态结构,传统统计或单一模型处理起来容易丢信息。ResNeXt 出自《深度神经网络的聚合残差变换》,靠分组卷积把计算量压下来,同时用残差模块保住梯度通路,能一并抓局部价差结构和跨品种全局依赖。 多任务学习(MTL)和它有互补性:不再给趋势预测、风险评估、估值各训一个网络,而是共享底层表示。市场受多源因素驱动且动态切换,共享表示让模型对波动的韧性更强,训练样本利用率也更高。 有研究把 ResNeXt 嵌进 MTL 框架做金融数据挖掘,分组卷积加残差块直接加速收敛,关键特征在深层丢失的概率下降。相比手工特征工程,这类网络能从原始行情、宏观文本、新闻流里自主抽形态,MTL 还能动态调任务权重和损失函数,跟紧风格切换。外汇与贵金属杠杆高、跳空频繁,此类模型只降低误判概率,不消除爆仓风险,上 MT5 前先用历史 tick 做 walk-forward 验证。

◍ ResNeXt 的分组卷积与多任务落地

ResNeXt 把标准卷积拆成「拆分—变换—聚合」三段,变换阶段不再只跑单一卷积,而是用多个并行支路做复杂微变换,这个并行支路数叫基数性(cardinality)。实验里增加基数性比单纯加深度或加宽度更划算,能在相近算力下拿到更好的拟合。 模块统一走瓶颈结构:1×1 降维 → 3×3 主卷积 → 1×1 升维,残差直连保梯度。分组卷积再把输入通道切片,各组独立卷完再拼回,参数量掉一截但吞吐更高。换组数时靠调瓶颈宽度稳住总计算量,伸缩不爆显存。 接金融时序时,特征提取层靠分组数权衡「看得细不细」和「算得动不动」。每组卷自己通道里的局部形态,再聚成统一表示。共享学习模块用权重共享把共同特征投到各任务空间,按相关性聚类减干扰;输出层分类走交叉熵、回归走 MSE,多任务总损失是各任务损失的加权和。 训练分两步:先单任务预训练让各自 MLP 收敛,再进多任务框架用带动态学习率的 Adam 优调。外汇与贵金属波动大、杠杆高风险极高,这套架构只提高建模效率,不预示收益。

「用 MQL5 把 ResNeXt 瓶颈块拼出来」

ResNeXt 在 MT5 里的落地,核心是先把瓶颈模块写成一个可复用的类。它内部由投影、分组特征提取、回投影三条卷积子链路组成,每层后接批量归一化与 LReLU 激活,靠静态对象声明把构造/析构留空,所有初始化压进 Init 方法。 Init 里先算模块输出的序列长度,再调父类卷积层做最终投影;第一层卷积按分组数准备数据投影,输出是 [时间, 分组, 维度] 的三维张量,随后用置换对象把分组维移到首位,确保后续分组卷积互不串扰。卷积窗口与步长在传入内部层时会乘上分组大小,这是维度对齐的关键一处。 前馈 feedForward 是线性流转:原始数据指针直送投影层,归一转置后进分组卷积,再逆置换回单一序列交父类投影。误差梯度反向传播同为线性,故文中未展开,留作自行验证。 残差连接另建 CNeuronResNeXtResidual 对象,输入先转置为单序列再卷积投影,归一后不激活以无损传信息;ResNeXt 主块 CNeuronResNeXtBlock 把两条流求和并归一,calcInputGradients 里用指针交换避免复制,分别向后传梯度再相加。外汇与贵金属行情非线性强、杠杆高风险大,这类结构仅提供建模思路,实盘表现需你在 MT5 用自有数据回测确认。 下面这段是瓶颈块的类骨架,开 MT5 新建 include 文件即可照此补全方法体跑通。

MQL5 / C++
class CNeuronResNeXtBottleneck :  class="kw">public CNeuronConvOCL
  {
class="kw">protected:
   CNeuronConvOCL        cProjectionIn;
   CNeuronBatchNormOCL   cNormalizeIn;
   CNeuronTransposeRCDOCL cTransposeIn;
   CNeuronConvOCL        cFeatureExtraction;
   CNeuronBatchNormOCL   cNormalizeFeature;
   CNeuronTransposeRCDOCL cTransposeOut;
   class=class="str">"cmt">//---
   class="kw">virtual class="type">bool      feedForward(CNeuronBaseOCL *NeuronOCL) class="kw">override;
   class="kw">virtual class="type">bool      updateInputWeights(CNeuronBaseOCL *NeuronOCL) class="kw">override;
   class="kw">virtual class="type">bool      calcInputGradients(CNeuronBaseOCL *NeuronOCL) class="kw">override;
class="kw">public:
                      CNeuronResNeXtBottleneck(class="type">void){};
                     ~CNeuronResNeXtBottleneck(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 chanels_in, class="type">uint chanels_out, class="type">uint window,

常见问题

分组卷积把通道拆分并行处理,参数量约为同等普通卷积的 1/组数,实盘建模时可先设 32 组试跑,再按显存占用下调。
共享底层特征能减少过拟合,两个任务的梯度互相正则,回测中双任务模型的样本外误差通常低 10%~20%。
可以,小布能读取品种页上的模型输出,标注信号冲突与置信度偏低时段,你只需打开对应页面核对即可。
瓶颈块先用 1x1 卷积降维、再分组卷积提特征、最后 1x1 升维;拼装时务必保证三组卷积通道数整除分组数,否则会报维度错。
贵金属波动大属高风险,建议信号置信度高于阈值才半仓,低于则观望,别照单全收模型输出。