MQL5算法交易的神经网络-006感知机模型
输入参数
指定包含训练数据集的文件StudyFileName。
指定用于保存训练误差的文件OutputFileName。
每个样本包含多少根K线BarsToLine。
每根K线对应的神经元/特征数量NeuronsToBar。
是否启用OpenCL加速计算UseOpenCL。
指定每次更新权重矩阵时使用的批量大小BatchSize。
指定学习率LearningRate。
指定隐藏层数量HiddenLayers。
指定每个隐藏层的神经元数量HiddenLayer。
指定权重矩阵更新的迭代次数Epochs。
创建神经网络
创建输入层,先创建CLayerDescription指针,然后初始化参数。由于每根K线有NeuronsToBar个特征,每个样本包含BarsToLine根K线,因此输入层神经元数量是NeuronsToBar * BarsToLine,其他参数为空或0。
创建隐藏层,隐藏层神经元数量HiddenLayer根据经验定义,并定义激活函数和优化器。
创建输出层,输出层神经元数量为2。
加载训练数据
创建CBufferType类型指针pattern保存特征值。
创建CBufferType类型指针target保存目标值。
循环读取训练集文件数据,pattern初始化维度(1,NeuronsToBar * BarsToLine),target初始化维度(1,2)。
每行数据读取完毕后将特征和目标值数据分别保存到传入的data和targets中。
训练模型(SGD)
嵌套遍历Epochs和BatchSize。
在每个BatchSize中随机选择一个样本,然后输入特征值进行前向传播,输入目标值进行反向传播。
每个BatchSize结束后更新权重,并保存误差值。
保存模型
保存训练误差值历史数据到对应文件。
保存模型到“Study.net”文件中。
实际操作结果
使用XAU5分钟数据,时间长度为1年的数据无法收敛,时间长度3年的数据出现梯度爆炸无法训练。
由于原始数据没有对target2进行归一化,导致目标值和特征值差异较大,尝试对target2归一化之后重新训练数据。
使用1年的数据误差逐渐收敛,但是3年的数据仍然存在梯度爆炸问题。