English Русский Español Deutsch 日本語 Português
preview
神经网络实验(第 6 部分):自给自足的价格预测工具 — 感知器

神经网络实验(第 6 部分):自给自足的价格预测工具 — 感知器

MetaTrader 5交易系统 | 28 九月 2023, 10:21
1 488 0
Roman Poshtar
Roman Poshtar

概述

感知器是一种机器学习技术,可用于预测市场价格。对于那些努力获得价格预测的交易者和投资者来说,这是一个实用的工具。


一般概念

感知器是一个简单的神经网络,由一个或多个神经元组成,这些神经元接受输入数据,进行处理,并提供输出。 它由弗兰克·罗森布拉特(Frank Rosenblatt)于 1957 年开发,此后在各个领域得到了广泛的应用,包括金融分析和股票市场预测。

感知器可解决分类和回归问题,包括价格预测。 在最简单的情况下,感知器由单个神经元组成,该神经元接受多个输入变量,并产生单个输出信号。 例如,为了预测外汇市场的价格,您可以采用以下输入数据:汇率,交易量,消费者价格指数、和其它因素。 数据处理完毕之后,神经元生成一个输出信号,其为货币对的预测。

感知器工作原理

感知器的操作基于监督学习原理。 这意味着感知器依据历史数据进行训练,从而判定各种市场因素和价格之间的关系。 该数据用于调整神经元的权重,从而判定每个输入因子对预测股票价格的重要性。

感知器可以在学习和预测模式下运行。 在训练模式下,感知器将外汇市场中的历史数据和实际价格作为输入,然后以最小化预测误差的方式调整其权重。

运用感知器预测外汇价格的益处

  1. 使用感知器预测外汇价格有若干优点。 首先,感知器能够适应市场的变化,并根据新的数据调整其预测。 这使得它比传统的数据分析方法,如统计分析和时间序列等更有效,后者不能始终适应市场变化。
  2. 其次,感知器可以处理大量输入数据,这令其可参考影响价格的许众不同因素。 由此可导致比传统数据分析方法更准确的价格预测。
  3. 第三,感知器可以依据大量数据进行训练,这允许它基于大量历史数据进行训练和价格预测。

然而,运用感知器来预测价格也有一些缺点。 首先,感知器可能很容易受到数据中的峰值或误差的影响,这可能导致价格预测不准确。 其次,训练感知器需要大量的历史数据。 如果历史数据不能充分代表当前的市场情况,那么感知器预测可能不准确。

此外,当感知器对历史数据过于敏感而无法适应新的市场变化时,可能会出现过度拟合的问题。 为了应对这个问题,可以使用各种监管技术,例如 L1 和 L2 正则化,这有助于控制神经元权重,并防止过度拟合。

感知器可以与其它预测方法,如自回归模型(ARIMA) 或指数平滑结合使用,从而获得更准确、更可靠的预测。 例如,您可以使用感知器来预测长期价格趋势,并使用 ARIMA 或指数平滑来预测短期价格趋势。请记住,用于训练感知器的历史数据可能与当前的市场条件并不匹配。 在这种情况下,预测结果可能并不准确。 因此,应定期更新模型,以便充分反映市场变化。


优化感知器的参数

感知器是最简单的神经网络类型之一,它由输入层、隐藏层和输出层组成。 它可用于各种任务,例如分类、回归或图像处理。 不过,为了令感知器有效工作,必须正确为其选择参数。

感知器参数是定义其结构和行为的数值。 它们包括隐藏层的数量,每层中的神经元数量,激活函数,学习率、等等。 正确调整的参数令感知器获得最佳结果。

此处是一些可以优化的感知器参数:

Number of hidden layers

隐藏层的数量决定了模型的复杂性。 如果模型太简单,那么它可能无法胜任任务;如果它太复杂,则可能发生过度拟合。 因此,应根据要解决的问题以最优方式选择隐藏层的数量。

Number of neurons in each layer

每层中神经元的数量也会影响模型的复杂性。 大量的神经元可以提高预测的准确性,但同时会增加训练时间。 神经元的数量应该针对特定任务进行优化。

以下示例事关 Number of hidden layers,Number of neurons in each layer。 此处用到了 NeuralNets 函数库:

int OnInit()
  {

// set the number of neurons in the input, hidden and output layers
int n_inputs = 2;
int n_hidden = 3;
int n_outputs = 1;

// create a perceptron object
CNeuralNet ann;

// add layers
ann.AddLayer(n_inputs);
ann.AddLayer(n_hidden, CNeuralNet::TANH);
ann.AddLayer(n_outputs, CNeuralNet::TANH);

// set learning parameters
ann.SetLearningRate(0.1);
ann.SetMomentum(0.9);
ann.SetMaxEpochs(1000);
ann.SetDesiredAccuracy(90);

// create arrays to store input and target values
double inputs[][2] = {{0,0}, {0,1}, {1,0}, {1,1}};
double targets[] = {0, 1, 1, 0};

// train the perceptron
ann.Train((double*)inputs, targets, 4);

// test the perceptron
double output;
ann.Compute((double*)inputs[0], output);
Print("0 XOR 0 = ", output);
ann.Compute((double*)inputs[1], output);
Print("0 XOR 1 = ", output);
ann.Compute((double*)inputs[2], output);
Print("1 XOR 0 = ", output);
ann.Compute((double*)inputs[3], output);
Print("1 XOR 1 = ", output);

}

在这个例子中,我们创建了一个含有两个输入神经元、三个隐藏神经元、和一个输出神经元的感知器。 我们还设置训练参数,例如训练速率、矩和最大世代。 接下来,创建存储输入和目标值的数组,并依据该数据训练感知器。 在四个不同的输入上测试感知器后,在屏幕上显示结果。

Activation function

激活函数判定神经元应如何响应输入。 有许多激活函数,例如 sigmoid、ReLU、和双曲正切。 激活函数的选择还应取决于所要解决的问题。

下面是选择不同激活函数的示例:

int OnInit()
  {

// set the number of neurons in the input and output layers
int n_inputs = 2;
int n_outputs = 1;

// create a perceptron object
CNeuralNet ann;

// add layers
ann.AddLayer(n_inputs);
ann.AddLayer(3, CNeuralNet::TANH);
ann.AddLayer(n_outputs, CNeuralNet::SIGMOID);

// set learning parameters
ann.SetLearningRate(0.1);
ann.SetMomentum(0.9);
ann.SetMaxEpochs(1000);
ann.SetDesiredAccuracy(90);

// create arrays to store input and target values
double inputs[][2] = {{0,0}, {0,1}, {1,0}, {1,1}};
double targets[] = {0, 1, 1, 0};

// train the perceptron
ann.Train((double*)inputs, targets, 4);

// test the perceptron
double output;
ann.Compute((double*)inputs[0], output);
Print("0 XOR 0 = ", output);
ann.Compute((double*)inputs[1], output);
Print("0 XOR 1 = ", output);
ann.Compute((double*)inputs[2], output);
Print("1 XOR 0 = ", output);
ann.Compute((double*)inputs[3], output);
Print("1 XOR 1 = ", output);

}

在这个例子中,我们添加一个由三个神经元组成的隐藏层,并为隐藏层选择 “tanh” 激活函数,为输出层选择 “sigmoid”。

Training rate

训练率决定了神经网络改变其权重的速度。 训练率太高会导致溢出,而该数值太低可能会导致训练时间过长。 您需要选择最适合特定任务的训练率。

Regularization

监管是一种用于防止过度拟合的方法。 它包括向误差函数添加附加项,从而惩罚模型的权重过大。 监管减少了预测的盲目扩散,提高了模型的普适能力。

Weight initialization

权重初始化是感知器中每个神经元的权重初始设置。 不正确的初始化权重可能会导致模型收敛到误差函数的局部最小值,而非全局最小值。 因此,有必要选择正确的方法来初始化权重。

Batch size

批量规模决定了在一个训练迭代中将用到多少个数据样本。 批量规模太小可能会减慢学习过程,而批量规模太大会导致内存溢出。 针对特定任务选择最适合的批量规模。

Optimizer

优化器是一种算法,用于在训练期间更新模型的权重。 有许多优化器,例如随机梯度下降,Adam 和 RMSprop。 每个优化器都有其优点和缺点,最佳优化器的选择取决于任务。

通常,感知器的最佳参数取决于所要解决的问题。 有必要尝试不同的参数值,以便找到特定任务的最优集合。 机器学习是迭代改进模型的过程,正确调整的参数是获得更好结果的关键。



将指标和价格传递给感知器进行市场分析

指标是用于分析市场并帮助识别趋势、入场和离场时机、以及支撑位和阻力位的数学方程式。 可以在感知器中用于分析外汇市场的一些最常见指标包括:

  • 移动平均线;
  • 相对强弱指数(RSI);
  • 随机振荡器;
  • MACD(移动平均收敛扩散)。

将收盘价和指标传递给感知器,可令模型参考市场分析的各个方面,并创建更准确的价格预测。 例如,模型可利用移动平均线来判定整体市场趋势,然后利用随机振荡器来判定入场切入点。

不过,将大量指标传递给感知器可能会导致数据冗余问题。 数据冗余会导致模型过度拟合,以及普适能力低下。 因此,有必要针对特定的市场分析任务选择最明显的指标。

此外,数据传输到感知器需要相应的数据预处理。 例如,如果数据包含缺失值,则需要解决此问题,例如,用平均值填充缺失值、或删除含有缺失值的行。

有必要为感知器选择最优参数,如此模型就能够最好地训练和预测价格。 需要优化的一些主要参数包括:

  1. The number of neurons in the hidden layer;
  2. Neuron activation function;
  3. Number of learning epochs;
  4. The size of data mini batches for training.

最佳参数的选择可以通过反复试验,或使用优化算法(如遗传算法,或基于梯度的优化方法)来完成。


示例和实际应用

在此,我们将研究一个基于简单感知器的 EA 示例,该感知器将两条移动平均线指标之间的距离作为输入传递。 传递周期为 1 和 24 的两条移动平均线指标之间的距离。 类型为指数移动平均线,应用收盘价,但首先把这些数值转换为点数的常规化数值。 

在输入里取蜡烛序号 1、4、7、10(4 个参数)上的距离。 在感知器输出中,我们得到两个值 — 开仓买入,和开仓卖出。 这些条件不是标准条件。 它们只是作为感知器的一个例子给出。 我们当前的示例将尽可能简单。  

在此,我将提供优化和前向验证测试的所有参数,以免在文本中重复:
  • 外汇市场;
  • 货币对 EURUSD;
  • 时间帧 H1;
  • 止损 300,止盈 600; 在 EA 里止盈设为 止损的两倍;
  • "仅开盘价","快速(基于遗传算法)",以及 "最大复杂准则" 优化和测试模式; 常重要的是使用“最大复杂准则”模式,与“最大盈利能力”相比,它展示出更稳定和有利可图的结果;
  • 优化范围 3 年。 从 2019.04.19 至 2022.04.19。 3 年并非是一个可靠的准则。 您可以自行试验此参数;
  • 前向验证测试范围为 1 年。 从 2022.04.19 至 2023.04.19。
  • 初始本金 10000 单位;
  • 杠杆 1:500。

优化:

EA 优化参数:

优化

EA 优化结果:

优化


优化

以下是前向验证测试结果前 5 名:

测试 1


测试 2


测试 3:


测试 4


测试 5


结束语

总之,感知器是外汇市场价格预测的强大工具。 它可以单独使用,也可与其它数据分析方法结合使用。 然而,为了在运用感知器预测外汇价格时获得最佳结果,必须意识到其局限性,并考虑历史数据的关联场景。 还必须在外汇交易方面具有一定的知识和经验,并了解与外汇交易相关的高风险。

感谢您的关注!


本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/12515

附加的文件 |
Perceptron_MA_4.mq5 (39.78 KB)
NeuralNets.mqh (7.83 KB)
交易中的资金管理 交易中的资金管理
我们将研究构建资金管理系统的几种新方法,并定义其主要功能。 今天,有相当多的资金管理策略可以满足各种口味。 我们将尝试根据不同的数学增长模型考察几种管理资金的方法。
从自营公司那里吸取一些教训(第 1 部分)— 简介 从自营公司那里吸取一些教训(第 1 部分)— 简介
在这篇介绍性文章中,我将讨论从自营交易公司实施的挑战规则中吸取的一些教训。 这对于初学者和那些努力在这个交易世界中站稳脚跟的人来说尤其重要。 后续文章会介绍代码实现。
MQL5 中的范畴论 (第 7 部分):多域、相对域和索引域 MQL5 中的范畴论 (第 7 部分):多域、相对域和索引域
范畴论是数学的一个多样化和不断扩展的分支,直到最近才在 MQL5 社区中得到一些报道。 这些系列文章旨在探索和验证一些概念和公理,其总体目标是建立一个开放的函数库,提供洞察力,同时也希望进一步在交易者的策略开发中运用这个非凡的领域。
神经网络实验(第 5 部分):常规化传输到神经网络的输入参数 神经网络实验(第 5 部分):常规化传输到神经网络的输入参数
神经网络是交易者工具包中的终极工具。 我们来检查一下这个假设是否成立。 在交易中运用神经网络,MetaTrader 5 是最接近自给自足的媒介。 为此提供了一个简单的解释。