用 ENCOG 机器学习框架做 MQL5 时间序列预测
一、为什么选 ENCOG
ENCOG 是 Heaton Research 开发的高级神经网络/机器学习框架,被选中有几个硬理由:
- 已在两个商业交易软件(C#/Java)中用于金融时间序列预测,经过实战检验。
- 开源免费、文档完善,可通读源码理解网络内部。
- 持续维护(写文时在开发 2.6/3.0),且支持多核、多线程甚至 OpenCL(GPU)。
二、网络结构:RPROP 前馈
弹性传播(RPROP)前馈网络用梯度符号独立调整每层步长,对中小样本金融序列比普通反向传播更稳,不易陷局部极小。
三、输入特征:StochK / WilliamsR
随机振荡指标与威廉指标都是界内振荡量,归一化稳定,且对超买超卖敏感,适合作为方向特征。归一化到 [0,1] 或 [-1,1] 是训练前提。
// 归一化到 [0,1]
double normalize(double x, double min, double max)
{ return (x - min) / (max - min); }
double deNormalize(double x, double min, double max)
{ return min + x * (max - min); }
// 输入: 过去 N 根 StochK, WilliamsR
double input[FEAT];
input[0] = normalize(iStochastic(...), 0, 100);
input[1] = normalize(iWilliamsR(...), -100, 0);
四、导出与训练
MQL5 负责特征工程,把样本导出给 ENCOG(C#/Java 环境)训练;预测时可加载模型或经 DLL 调用。导出格式用 CSV 最简单。
// 把 MQL5 特征导出给 ENCOG 训练
void ExportToEncog(double &inp[], double &out[])
{
int fh = FileOpen("encog_train.csv", FILE_CSV|FILE_WRITE, ',');
for(int i=0;i<ArraySize(inp);i++) FileWrite(fh, inp[i]);
FileClose(fh);
}
五、关键注意
六、ENCOG 能做什么
ENCOG 是 .NET 下的机器学习库,支持神经网络、SVM、线性回归等多种模型。在 MQL5 生态里,它常被用来做「价格模式→未来方向」的建模:把历史特征喂进去训练,得到可预测的模型。
它比手写网络方便:内置多种训练算法与评估指标,你专注特征与数据,不必自己实现反向传播。适合想用 ML 但不想从零造轮子的交易者。
七、训练流程
流程:准备特征与标签(如用未来 N 根收益当标签)→ 划分训练/验证集 → 选模型与超参 → 训练 → 在验证集看误差 → 达标后导出模型供 MQL5 调用(通常经 DLL 或序列化权重)。
// 伪代码:ENCOG 训练 var net = new BasicNetwork(); net.AddLayer(...); net.Randomize(); var train = new ResilientPropagation(net, dataset); while(!train.IsTrained) train.Iteration();
八、在 MQL5 里调用与预警
训练好的模型通过 DLL 或权重文件被 MQL5 调用:每 tick 算特征、送模型得预测、超阈值发信号。但 ML 模型是黑盒,必须配样本外验证与回撤熔断,不能因为它「高级」就放松风控。
务实做法:把 ML 预测当投票中的一个信号,而非唯一决策源,用它的非线性能力补其他信号的不足,同时不被它一家绑架。
九、数据量与时序切分
ML 最忌随机切分时序数据(会把未来泄漏给训练)。必须用「时间顺序切分」:靠前训练、靠后验证,模拟真实「用过去预测未来」。这点错了,验证误差再低也是假象。
数据量上,样本太少模型学不到结构、样本太多训练慢,按特征维度配足够但不浪费的量,并定期用新数据重训练,让模型跟上市场。
十、ML 策略的监控与退化
ML 模型会「退化」:市场 regime 一变,昨天拟合的权重今天就失效。监控指标是「近期预测准确率」和「近期实盘盈亏」,两者同时下滑就触发重训练或暂停。
退化不可怕,可怕的是没发现。给 ML 策略装一个「健康度仪表」,定期自动评估,比等亏大了再查主动得多,也符合「系统长期运行」的工程纪律。
训练时的早停机制是关键:一旦验证集误差开始回升就立刻停,别等训练集误差见底才收手,那时早已过拟合。网络结构从简到繁,先用小网络跑通整条训练—推理—部署流程,再逐步加隐层,避免一上来就掉进调不动的超参黑洞。记录每轮的训练曲线,方便对比哪种结构真正有用。
保存最终网络权重时连同训练配置一起存,下次复现结果才不会因参数丢失而前功尽弃。把训练脚本、数据版本、随机种子都归档,才是可交付的机器学习工程。