神经网络在交易中的实际应用

2 十月 2020, 10:12
Andrey Dibrov
0
1 868

概述

本文研究创建交易机器人时应用神经网络。 这是该命题的狭义含义。 更宽泛地说,我们将尝试回答一些问题,并定位若干问题:

  1. 机器学习能够用来创建可盈利系统吗?
  2. 神经网络能给我们带来什么?
  3. 训练神经网络制定决策的基本原理。
  4. 神经网络:困难还是简单?
  5. 如何在交易终端里集成神经网络?
  6. 如何测试神经网络? 测试阶段。
  7. 关于训练样本。


1. 机器学习能够用来创建可盈利系统吗?

大概,很多初学者刚开始在外汇市场上进行真实交易时并没有任何特定系统,取一张纸,写满可能合适的指标清单,然后基于终端中的指标图表,在它们旁边标上正号或负号、或箭头、或价格走势概率。 然后,用户汇总观察结果,并作出某种决策,按某个方向入场(或决定是否为入场的好时机,还是等待下一次机会)。

那么,在最先进的神经网络里(即我们的大脑)会发生什么? 在观察指标之后,我们会依据一些合成指标的图像生成最终信号,并据此做出决策。 或将信号链汇编入指标。 请思考以下情况:如果我们在某个时间点研究指标,并最多回顾过去的若干个周期,那么我们如何才能同时研究这些指标在前几年的表现,然后把信号汇编入一个合成指标,从而可以进一步优化。

这是我们第二个问题的答案:神经网络能给我们带来什么? 我们重新表述一下这个问题:经过训练后,您想从神经网络中获得什么结果? 从逻辑上讲,第一个问题也可以有一个肯定的答案。 这可以通过编程来完成。 您可以观看我的视频,了解如何在实践中实现此目标: https://youtu.be/5GwhRnSqT78. 您也可以在以下网址观看视频播放列表,该列表包括神经网络模块在线测试 https://youtu.be/3wEMQOXJJNk


2. 训练神经网络制定决策的基本原理。

在开始任何交易系统的开发之前,请回答以下问题:该系统功能依据什么原则运行? 我们有两个基本面原则:横盘和顺势交易。 我们不考虑这两个系统的衍生产品,例如日内交易、基本面数据和新闻的使用、在市场开盘时间进行交易、等等。 我曾广泛涉猎神经网络产品的描述,其作者们建议用它们来预测价格,例如股票、货币等。

该图表展示经过训练的价格预测神经网络的操作

1. 该图表展示经过训练的价格预测神经网络的操作

我们可看到神经网络值重现价格图表,但滞后了一步。 结果并不取决于我们是否预测价格数据或其衍生品。 我们可由此得出一些结论。 例如:“我们的昨天是神经网络的今天”,它不是很有用,不是吗? 不过,在某些修订后可以使用此变体。

但我们的目标是“NN(神经网络)的今天,是我们的明天”,这就是一类时光机。 当然,我们知道最好的神经网络就是我们的大脑。 它的效率是 50%(如果我们谈论的是/否的概率),甚至更糟。 还有第三个选择– “NN 的昨天是我们的今天”,或者:“我们的今天,就是 NN 的昨天”。 我们研究一下上述情况在交易中的含义:

  • 第一种 — 我们执行交易并从 NN 接收答案,无论方向是否正确。 不过,我们可以不用 NN 就能知道。
  • 第二种 — 我们从 NN 接收信息,执行交易,并看到第二天的建议已调整。
  • 第三种 — 我们从 NN 接收有关何时执行交易的信息,或者我们是否需要立即执行交易 - 如果要执行,则朝哪个方向。

第一个变种根本不适合。 第二和第三种变体十分适合交易。 不过,第二种变体可看作是对未来的一瞥。 粗略地说,在某个特定时刻(例如,在一天收盘时)会收到来自 NN 的信号 - 并预测第二天的收盘价位(且我们现在对交易完成之前的价格走势不感兴趣)。 在此阶段,该想法很难实现纯自动化交易(对于盈利交易)。 第三种变体的思路是,我们跟踪 NN 在交易时段中的反应。 我们解释此响应,然后即可买入、亦或卖出资产。 在此,我们需要了解主要事情。

要实现的变体取决于我们如何训练神经网络。 在这种情况下,第三种变体更易于实现。 在第二个变体中,我们抱着接收第二天结果的目标使用任何信息 — 即收盘(该日期仅用作示例,因此可以是任何周期)。 在第三种变体里,我们在制定决定之前利用早一步收到的信息,以便示意价格将向何方移动。 我在系统中使用第三种变体。


3. 神经网络:挑战亦或轻松? 

我们正在尝试创建一个交易系统。 那么,我们在何处使用神经网络,应该如何训练它,以及我们如何将其集成到交易终端之中? 对于我来说,我正在使用现成的神经网络:NeuroSolutions 和 Matlab。 这些平台允许选择合适的网络,对其进行训练,并创建具有所需界面的可执行文件。 生成的神经网络程序如下所示:

基于 Matlab 环境创建的神经网络模块

2. 基于 Matlab 环境创建的神经网络模块

或像这样:

基于 Neuro Solutions 环境创建的神经网络模块

3. 基于 Neuro Solutions 创建的神经网络模块

当研究神经网络在金融市场中应用的可能性时,我得出的结论是,神经网络不仅可用作主要的信号生成器,还可作为智能交易系统软件的部分选择。 想象一下,您决定编写一款用到十几个指标的智能交易系统。 这些指标拥有不同的参数;需要在一些周期内分析和比较它们。 更甚,您用到了若干个时间窗口。 因此,您在实盘交易时会导致智能交易系统过载,而这难以测试。

我们能做的就是在经过相应训练后将指标计算任务委托给神经网络。 此外,将用这些指标来训练神经网络。 这意味着只需从智能交易系统把将指标公式中的相对价格数据输入到神经网络模块即可。 神经网络将输出 “1” 和 “0”,我们可以对其进行比较并做出决策。

我们以随机振荡器为例来查看结果。 我们将使用以下价格数据作为输入。 该指标本身将用作训练示例。

价格数据

4. 价格数据

FileWrite(handle,
                   
                   iClose(NULL,0,i+4)-iLow(NULL,0,i+4),
                   iHigh(NULL,0,i+4)-iClose(NULL,0,i+4),
                   iHigh(NULL,0,i+4)-iLow(NULL,0,i+4),
                   iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,5,i+4))-iLow(NULL,0,iLowest(NULL,0,MODE_LOW,5,i+4)),
                   
                   iClose(NULL,0,i+3)-iLow(NULL,0,i+3),
                   iHigh(NULL,0,i+3)-iClose(NULL,0,i+3),
                   iHigh(NULL,0,i+3)-iLow(NULL,0,i+3),
                   iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,5,i+3))-iLow(NULL,0,iLowest(NULL,0,MODE_LOW,5,i+3)),
                   
                   iClose(NULL,0,i+2)-iLow(NULL,0,i+2),
                   iHigh(NULL,0,i+2)-iClose(NULL,0,i+2),
                   iHigh(NULL,0,i+2)-iLow(NULL,0,i+2),
                   iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,5,i+2))-iLow(NULL,0,iLowest(NULL,0,MODE_LOW,5,i+2)),
                   
                   iClose(NULL,0,i+1)-iLow(NULL,0,i+1),
                   iHigh(NULL,0,i+1)-iClose(NULL,0,i+1),
                   iHigh(NULL,0,i+1)-iLow(NULL,0,i+1),
                   iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,5,i+1))-iLow(NULL,0,iLowest(NULL,0,MODE_LOW,5,i+1)),
       
                   iClose(NULL,0,i)-iLow(NULL,0,i),
                   iHigh(NULL,0,i)-iClose(NULL,0,i),
                   iHigh(NULL,0,i)-iLow(NULL,0,i),
                   iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,5,i))-iLow(NULL,0,iLowest(NULL,0,MODE_LOW,5,i)),
 
                   iStochastic(NULL,0,5,3,3,MODE_SMA,1,MODE_MAIN,i),
                   TimeToStr(iTime(NULL,60,i)));

训练之后,神经网络将输出以下结果。

神经网络响应

5. 神经网络响应

为了更好地进行直观研究,我们将这些数据转移到交易终端作为指标。

随机振荡器指标和神经网络

6. 随机振荡器指标和神经网络

上方的窗口显示终端里可用的标准指标。 下方窗口显示由神经网络创建的指标。 我们可以直观看出神经网络创建的指标具有标准指标的所有特征,包括级别、交叉、反转、偏差、等等。 记住,我们没有用到任何复杂的公式来训练网络。

因此,我们可以绘制以下交易系统示意图。

交易系统模块示意图

7. 交易系统模块示意图

MT4 模块代表我们的智能交易系统。 "Input_mat" 是价格文件。 "Open1,2,3" 是信号文件。 这些文件的示例将在下一章节里提供。

主要工作会涉及模块 “Net1” 和 “Net2”。 对于这些模块,我们需要用到多个脚本和 EA 来准备历史数据,并测试来自这些模块的信号。 实际上,当复杂系统准备就绪后,对其进行修改、开发和试验不会花费太多时间。 以下视频展示一个示例: https://youtu.be/k_OLEKJCxPE。 通常,准备文件,训练 Net1 和 Net2,我们优化系统的第一个测试阶段需花费 10 分钟。


4. 将神经网络集成到交易终端

神经网络与交易终端的集成并不困难。 我已解决了这个问题,方法是通过终端和神经网络程序创建的文件来传递数据。 也许有人会说这可能会减慢系统的决策速度。 然而,这种方法也有其优点。 首先,终端传递最少的数据,只有几十个字节。 请参阅下面终端写出的文件行。

常规化价格文件

8. 常规化价格文件

尽管这种数据传输方法仅在下一个即时报价之后,随着来自神经网络的信号到达才允许开立交易。 然而,如果系统不采用超短时刻进行交易,则这并非至关重要。 在本文中,系统使用开盘价格操作。 还有,使用这种数据传输方法的系统需要按照检查点,或在每次即时报价模式进行测试。 基于神经网络的系统在这两种模式下测试几乎相同。 在开发传统的交易机器人时,我遇到过这样的情况,即在每次即时报价模式下的测试结果都很糟糕。 

这种数据传输模式的主要优点是我们可以控制每个阶段接收和发送的数据。 我考虑这是利用神经网络迈进成功交易的基础之一。 因此,在实际操作中,我们将庞大的神经网络系统准备工作转化为了优势。 这种方式,我们可在系统逻辑结构中将程序产生错误的可能性降至最低。 这是因为系统需要在使用前逐步进行三重测试。 稍后我们将回到这一部分。

下图展示文件 “Input_mat” 和 “Bar”。 这些文件由交易终端生成。 文件 Open1,2,3 由 NN 程序生成。 唯一的不便之处在于,在 NN 程序里,我们需要根据所用 EA 的方式(用于测试或交易)明确设置这些文件的路径。

神经网络模块和智能交易系统生成的文件

9. 神经网络模块和智能交易系统生成的文件

“Bar” 是一个辅助文件,用作计数器。

Bar 文件

接收到的 NN 响应被写到文件 Open1,2,3 当中。 第一行显示之前的响应。 第二行显示实时响应。 这种格式是一种特殊情况。 格式可能因交易条件而异。 响应文件的数量也可能不同。 我们有三个,因为 NN 模块用到的三个网络,会以不同时间间隔进行训练。

神经网络模块的响应位于文件 Open1,2,3 当中

10. 文件 Open1,2,3 中的神经网络模块响应


5. 如何测试神经网络? 测试阶段

在准备基于神经网络的交易系统时,我用了三个测试阶段。 第一阶段是快速测试。 就其总体性能而言,这是主要系统的准备阶段。 在这一阶段,我们可以优化系统,而优化不会太花时间。 在此,我们用脚本或 EA 来准备含有历史数据的文件,而该文件里的数据时间段应是训练 NN 之后的历史周期直到当前时间。 然后,我们利用 Matlab 脚本接收此间隔的 NN 响应,并根据响应创建指标。 之后,我们利用该指标来优化 NN 响应,我们据其入场和离场。 下图展示了此指标的示例。 该指标针对来自 12 种自定义指标的 52 种衍生品进行诠释。 这些可能包括终端内的标准指标。

一款基于神经网络响应的指标

11. 一款基于神经网络响应的指标

接着,我们可以优化我们的交易策略。

基于神经网络响应的指标测试结果

12. 测试神经网络响应的结果

在第二个测试阶段,我们利用神经网络工具箱在 Matlab 环境里训练和编写神经网络。

神经拟合

13. 神经拟合


结果神经网络

14. 结果神经网络


通过命令窗口从这些神经网络获得响应。

从神经网络接收响应

15. 接收来自神经网络的响应


因此,我们会得到另一个指标,该指标应与前一个指标相同。 相应地,测试基于该指标的策略也应该相同。

如果一切良好,我们可以就继续前进。

利用系统神经网络模块的脚本,我们能够测试这些神经网络。 信号在任何时间间隔,于控制点进行测试。 如果此次测试与前一次相同测试时间间隔的结果重合,那么我们正在朝着正确的方向前进。 在 Matlab 环境中启动此脚本。 与此同时,在交易终端中启动智能交易系统。

在 Matlab 环境中启动脚本

16. 在 Matlab 环境中启动脚本

在终端中启动智能交易系统

17. 在终端中启动智能交易系统

此为结果:

测试 Matlab 脚本和 MT4 智能交易系统的结果

18. 测试 Matlab 脚本和 MT4 智能交易系统的结果

接下来,如上所述,我们需要创建用户界面,编译神经网络模块,并进行测试。


测试已编译的神经网络模块

19. 测试已编译的神经网络模块

如果结果与前一个相似,则我们可以依据神经网络系统进行实际交易。



5. 关于训练样本


取决于使用哪些训练样本来准备神经网络,我们将基于 NN 的响应得到不同的指标。 因此,可以创建不同的交易策略。 甚或,不同策略的组合能为我们提供更稳定的最终结果。 在前面章节里已展示了一种变体。 在该示例中,我们根据交易周期的极端点进行选择。 我再举一个例子。

基于不同样本训练神经网络的响应指标

20. 基于不同样本训练神经网络的响应指标

鉴于这种情况下,我训练了两个神经网络。 其一 - 用于买入,另一个 - 用于卖出。 当触及最低价格而尚未触及最高价格时,基于样本进行训练。 反之亦然。 图中示意的这两个指标反映的是针对十二个自定义指标的诠释。 当触及最低价格,用红线的高点示意。 灰色高点是最高价格。 现在,这些指标即可一起、亦可分别优化。 例如,我们可以测试它们的相交,或它们的差值,以及级别相交,等等。

若是优化十二个指标则会更加困难。


结束语

关于在交易中运用神经网络的文章很多。 然而,关于如何在实践中应用基于神经网络的系统的材料很少。 甚至,出版物均旨在面向具有特定编程知识的用户。 很难在一篇文章中提供完整的讲述。 我尝试在不增加过多理论材料的情况下解释用例的细节,请参阅我的著作“神经网络交易系统, MetaTrader 4 + MATLAB。 逐步开发。 第二版" (俄语)。


本文译自 MetaQuotes Software Corp. 撰写的俄文原文
原文地址: https://www.mql5.com/ru/articles/7031

手工图表和交易工具包(第一部分)。 准备:结构描述和助手类 手工图表和交易工具包(第一部分)。 准备:结构描述和助手类

这是该系列的第一篇文章,我将在其中讲述一个工具箱,该工具箱可通过键盘快捷键来手工图表图形应用。 这非常方便:按一个键,然后出现趋势线,再按另一个键 — 将创建具有必要参数的斐波那契扇形。 也可以切换时间帧,重新排列图层或从图表中删除所有对象。

DoEasy 函数库中的时间序列(第四十四部分):指标缓冲区对象类集合 DoEasy 函数库中的时间序列(第四十四部分):指标缓冲区对象类集合

本文介绍如何创建指标缓冲区对象类的集合。 我计划测试为指标创建和操控任意数量缓冲区的能力(在 MQL 指标中可以创建的最大缓冲区数量为 512)。

神经网络在交易中的实际应用。 是时候进行实践了 神经网络在交易中的实际应用。 是时候进行实践了

本文提供了在 Matlab 平台上实际运用神经网络模块的讲述和指南。 它还涵盖了运用神经网络模块创建交易系统的主要方面。 为了能够在一篇文章中厘清复杂内容,我必须对其进行修改,从而在一个程序中组合若干个神经网络模块函数。

快捷手动交易工具箱:基本功能 快捷手动交易工具箱:基本功能

如今,众多交易者切换至自动交易系统,这类系统可能需要附加设置,或是能够完全自动化并准备就绪。 然而,有相当一部分交易者更喜欢以旧有方式进行手动交易。 在本文中,我们将创建快速手动交易工具箱,用热键来一键执行典型交易操作。