数据科学和机器学习(第 12 部分):自训练神经网络能否帮助您跑赢股市?(基础篇)
📘

数据科学和机器学习(第 12 部分):自训练神经网络能否帮助您跑赢股市?(基础篇)

第 1/3 篇

手工劳动正迁移到更高抽象层

在 MT5 上折腾自训练神经网络的人,迟早会撞上同一堵墙:特征工程那套手工活并没有消失,只是被推到了更上层。原 MQL5 社区 2023-08-07 发布的系列文提到,专家级投入从「设计特征」转为「设计架构、损失函数、优化方案」,这是实打实的劳动迁移,不是省力。 索托(Stefano Soatto)那句被原文引的话说得很直白——你仍得是专家才能让神经网络跑通,只是原先抠指标特征的精力,现在花在网路结构与训练逻辑上。对外汇/贵金属这类高杠杆、高波动品种,这种抽象层抬升意味着调参容错更低,一个损失函数设计偏差,回测好看实盘可能直接崩。 对读者来说,可验证的动作很具体:开 MT5 新建一个 EA,把原先写死的 RSI 阈值特征删掉,改用简单全连接层让网络自提取,对比两者在 XAUUSD 的 M15 上 3 个月回测曲线。差别大概率不在「谁更赚钱」,而在「谁的过拟合更隐蔽」。

◍ 神经网络不是塞进EA就灵

做过一阵子算法交易的人,多半都听过神经网络。它常被宣传成圣杯机器人的必经之路,但真相是:把网络模块硬塞进交易机器人,离稳定盈利还差得远。外汇和贵金属市场高杠杆、高波动,任何模型失效都可能放大亏损。 我个人的看法很直接——神经网络对怕麻烦的人基本没用。你至少得愿意亲手分析模型结构、检查输入预处理和缩放里的偏差,这些琐碎活儿决定你是盈利还是爆仓。本文先从这个工具到底是什么讲起。

「单层感知器为何够用」

人工神经网络本质上是对生物神经结构的计算模拟,靠层间全连接来抓取数据里的非线性关系。层数堆得越多,模型理论上越能拟合复杂模式,但计算开销陡增,且对简单问题容易过配,准确率反而可能下降。 在多层感知器里,前层每个节点都连到下一层全部节点,信号从输入一路传至输出。这种稠密连接是它找复杂规律的基础,却也意味着参数量随层数指数级膨胀。 实际回测与工程经验显示,大多数交易类问题单隐藏层就能覆盖。我们后续机器人就采用单层结构,在 MT5 里用最轻量网络验证价格行为特征,避免无谓的算力浪费。

前向验算里的矩阵维度是命门

做神经网络前向验算,代码本身没几行,真正卡人的是矩阵维度。输入向量先转成矩阵,再和权重矩阵相乘、加偏置、过激活函数,任何一步维度对不上,MT5 里直接报错或者输出全乱。 回归和分类是两类根本问题:回归预测连续量,比如下一根 K 线的价格点位;分类预测离散标签,比如给 0 表示偏空、1 表示偏多。本文先用回归思路去推价格走向,单层结构就够了,所以前向函数里看不到循环。 记住三个硬尺寸:输入矩阵是 n×1;权重矩阵是 HN×n(HN 是隐藏节点数,n 是上层输入行数);偏置矩阵和该层输出同形。搞清这个,你自己改隐藏层数量时不会淹死在维度猜测里。 下面这段代码就是单层前向验算的核心。VectorToMatrix 把行情特征向量转成矩阵,W.MatMul 做权重点乘,加 B 后过激活函数 A_FX 出结果。复制进 MT5 的 CRegNeuralNets 类,改 A_FX 就能换激活逻辑。外汇和贵金属波动剧烈,这类单网络预测仅作概率参考,实盘高风险。

MQL5 / C++
matrix CRegNeuralNets::ForwardPass(vector &input_v)
 {
   matrix INPUT = this.matrix_utils.VectorToMatrix(input_v);
   matrix OUTPUT;
  
   OUTPUT = W.MatMul(INPUT); class=class="str">"cmt">//Weight X Inputs
  
   OUTPUT = OUTPUT + B;   class=class="str">"cmt">//Outputs + Bias
  
   OUTPUT.Activation(OUTPUT, ENUM_ACTIVATION_FUNCTION(A_FX)); class=class="str">"cmt">//Activation Function
  
   class="kw">return (OUTPUT);
 }
matrix INPUT = this.matrix_utils.VectorToMatrix(input_v);

◍ 权重初始化别只丢随机数

神经网络权重若只填随机值就丢给训练,后面反向传播会制造大量幽灵 bug,逼你怀疑硬编码逻辑而非初始化本身。错误初始化最直观的代价是网络卡在局部极小值,收敛慢到肉眼可见,外汇与贵金属模型在这种耗时过程里还会叠加滑点漂移的高风险。 多数人停在「选个随机状态生成矩阵」这一步,实际上随机之后必须用 Glorot 或 He 做尺度归一。Xavier/Glorot 适配 sigmoid、tanh,He 适配 RELU 系;单隐藏层网络只有一个权重矩阵,初始化后紧跟归一化即可。下面这段代码用固定随机态 42 生成 1×m_inputs 的均匀矩阵,再乘 1/√输入数完成 He 缩放: [CODE] this.W = matrix_utils.Random(0.0, 1.0,1,m_inputs, RANDOM_STATE); this.W = matrix_utils.Random(0.0, 1.0,1,m_inputs, RANDOM_STATE); this.W = this.W * 1/sqrt(m_inputs); //He initialization [/CODE] 逐行看:前两行用 0~1 均匀分布在指定随机态下造出权重矩阵(重复两遍属原文写法,实跑可留一行);末行把矩阵整体除以输入维度平方根,使 RELU 前端方差稳定,训练倾向更快脱离平坦区。开 MT5 把 RANDOM_STATE 设 42、m_inputs 换成你的特征数,能直接复现该缩放效果。

MQL5 / C++
  this.W = matrix_utils.Random(class="num">0.0, class="num">1.0,class="num">1,m_inputs, RANDOM_STATE);
  this.W = matrix_utils.Random(class="num">0.0, class="num">1.0,class="num">1,m_inputs, RANDOM_STATE);
  this.W = this.W * class="num">1/sqrt(m_inputs); class=class="str">"cmt">//He initialization

「回归网络的激活函数选型」

做价格回归的神经网络和分类网络不同,输出层不需要把结果压成概率,所以激活函数基本是回归类变体,RELU 及其衍生型最常用。 MT5 标准库的矩阵模块已经内置了一组激活枚举,不用自己写前向传播。下面这段枚举直接来自标准库源码,覆盖从 ELU 到 SOFTPLUS 共 9 种,实盘里换激活类型只改一个枚举值即可。 [CODE] enum activation { AF_ELU_ = AF_ELU, AF_EXP_ = AF_EXP, AF_GELU_ = AF_GELU, AF_LINEAR_ = AF_LINEAR, AF_LRELU_ = AF_LRELU, AF_RELU_ = AF_RELU, AF_SELU_ = AF_SELU, AF_TRELU_ = AF_TRELU, AF_SOFTPLUS_ = AF_SOFTPLUS }; [/CODE] 逐行看:enum activation 定义激活函数类型集合;AF_ELU_ 到 AF_SOFTPLUS_ 是带下划线别名,等号右侧是库内原生常量;AF_LINEAR_ 对应纯线性,适合最后一层直接吐价格差值;AF_RELU_ 和 AF_LRELU_ 在隐藏层用得最多,后者带泄露系数,缓解死神经元。 外汇与贵金属波动有跳空和流动性断裂,用 ReLU 系虽快但可能对极端样本不敏感,切换 GELU 或 SELU 在回测中常能看到尾部分布更平滑,但推理耗时会升 10%~20%,开 MT5 把同一段历史用两种枚举各跑一遍就能比出来。

MQL5 / C++
enum activation
  {
   AF_ELU_ = AF_ELU,
   AF_EXP_ = AF_EXP,
   AF_GELU_ = AF_GELU,
   AF_LINEAR_ = AF_LINEAR,
   AF_LRELU_ = AF_LRELU,
   AF_RELU_ = AF_RELU,
   AF_SELU_ = AF_SELU,
   AF_TRELU_ = AF_TRELU,
   AF_SOFTPLUS_ = AF_SOFTPLUS
  };

常见问题

有必要。手工劳动正迁移到更高抽象层:你定义特征和验收标准,模型负责拟合,别把问题定义也外包出去。
神经网络不是塞进去就灵。先确认数据是否平稳、特征是否含未来函数,单层感知器在多数回归场景已够用,堆层数反而过拟合。
可以。小布能基于你贴的特征描述和样本区间,提示可能的未来函数、非平稳与维度错配风险,省去你逐行核对。
权重矩阵列数必须等于输入特征数,偏置维度和输出节点数一致。拿单层感知器手推一遍 [n_samples, n_features] × [n_features, n_out] 最稳。
价格回归倾向用 linear(无激活)或 tanh 后反归一化;sigmoid 会把输出压到 0~1,需额外映射且易饱和,新手慎选。