目录
- 第二代神经网络
- 1.1。链接体系结构
- 1.2。神经网络的主要类型是
1.2.1。MLP(多层感知器)1.2.2.约旦网络
1.2.3。Elman网络
1.2.4。径向基函数网络(RBF)
1.2.5。动态学习矢量量化,DLVQ 1.2.6。Hopfield网络
。 - 1.3。培训方法
1.3.1。主要规则
1.3.1.1。误差修正1.3.1.2.玻尔兹曼规则1.3.1.3。HEBB规则1.3.1.4.竞争性学习 - 1.4。缺点
- 深度学习
- 2.1。背景
- 2.2。自动编码器、自动编码器、限幅玻尔兹曼机。差异和特征
2.2.1。自动编码器2.2.2.受限玻尔兹曼机器,RBM - 2.3。堆栈式自动连接网络。堆栈自动编码器SAE,堆栈自动编码器(堆栈RBM)
- 2.4。深度网络训练(DN)。阶段。特性
- 实践实验
- 3.1。R语言
- 3.2。实施方案和问题
- 3.3.3.3.3.3.3.3.1.准备数据
3.3.3.3.2.2.1。威尔斯·威尔德定向运动指数ADX(HLC,N)3.3.3.2.2。Aroon(HL,N)3.3.2.3.3.2.3.3.3.2.3.3商品渠道指数CCI(HLC,N)3.3.3.2.4。柴金波动指数(HLC,N)3.3.3.3.3.2.2.2.4。柴金波动指数(HLC,N)3.3.3.3.3.2.2.5。钱德动量振荡器(med)cmo(med)3.3 macd振荡器3.3.2.7.OSMA(医学,NFAST,3.3.nslow,NSIG)3.3.3.2.8.相对强度指数rsi(med,n)3.3.3.2.9。随机振荡器stoch(hlc,n fastk=14,nfastd=14,nfastd=3,nslowd=3)3.3.2.10.随机动量指数-smi(hlc,n=13,nfast=13,nfast=2,nslow=2,nslow=25,nsig=9)3.3.3.3.3.3.3.2.11.波动性(和zhang volatibility(oyang,oon fastk=“yang yang”calculating“oyang”“”ozhang“calccumating”n=96)3.3.3.3.输出数据(目标)3.3.4.间隙数据3.3.5.培训和测试样本的形成3.3.6.分类余额3.3.7.预处理 - 3.4。建造、培训和测试模型
3.4.1。并行计算 - 成就(指标和EA)
- 4.1。培训与保存模式
- 4.2。安装和加载命令
- 4.3。提高质量特性的途径和手段
简介
本文将讨论这个主题的主要概念,如深度学习和没有复杂外行正式操作的深度网络。
对真实数据的实验通过定量和比较分析(不可能量化和比较)证实了深层神经网络(或证伪)的理论优势。目前的任务是分类。我们需要建立一个基于深度神经网络模型的索引和EA,根据客户机/服务器模式进行操作,并对它们进行测试。
本文的读者应该对神经网络的基本概念有一定的了解。
1。第二代神经网络
神经网络设计用于解决图像处理领域的一系列问题。
以下是典型神经网络可以解决的问题列表:
- 由函数逼近的一组点(回归)。
- 根据指定的类集对数据进行分类。
- 用于识别未知原型类的数据聚类;
- 信息压缩;
- 恢复丢失的数据;
- 联想记忆;
- 优化、最优控制等。
本文没有列出上述内容,只讨论“分类”。
1.1。链接体系结构
网络中反馈回路的误差对信息处理方式有很大影响。如果神经元之间没有反馈链接(例如,网络有一个连续的层次结构,每个神经元只接收上一层的信息),那么网络中的信息处理是单向的。输入信号由一系列神经网络层处理,并由相同级别的相同数量的触点接收。
反馈回路的存在使得神经网络(以下简称回路)的动力学不可预测。事实上,网络可能是“死循环”,永远不会响应。同时,根据图灵的结论,任何循环网络都没有算法来确定其元素是否会进入平衡状态(停机问题)。
一般来说,基于循环网络中的神经元多次参与信息处理的事实,这种网络可以以不同的方式对信息进行更深层次的处理。在这种情况下,需要采取特殊措施来防止网络进入死循环。例如,使用对称节点(如Hopfield网络)或强制限制迭代次数。
培训类型
节点类型 |
“监督” | 无监督的 |
---|---|---|
无反馈回路 | 多层传感器(功能近似,分类) | 竞争网络、自组织地图(数据压缩、特征分离) |
反馈回路 | 循环传感器(时间序列预测,在线培训) | Hopfield网络(相关内存、数据聚类、优化) |
表1。按连接和训练类型分类的神经网络
1.2。神经网络的主要类型
神经网络从神经元开始经历了漫长的发展历程。目前,大量的神经网络采用了不同的结构和训练方式。
最著名的是:
1.2.1多层全连接前馈网络MLP(多层感知器)
图1。多层神经网络结构
1.2.2.约旦网络是典型的环形网络,与埃尔曼网络相似。
它可以被看作是一个反馈网络,在输入层有额外的神经元。
这些感受神经元是来自输入神经元的自我反馈(直接反馈)。接受层中的神经元保持网络的当前状态。在约旦网络中,接收层的神经元数目必须与输入层的数目相同。
图2。约旦网络体系结构
1.2.3.Elman网络是一种典型的环形网络,与约旦网络相似。Elman网络和约旦网络的区别在于,在Elman网络中,接收层的神经元输入由输出神经元决定,而不是由隐藏的神经元决定。另外,感受层的神经元没有直接反馈。
在一个Elman网络中,接受神经元和内隐神经元的数量必须相同。Elman网络的主要优点是接收层中的神经元数量不是由输出层(如约旦网络)决定的,而是由隐藏层中的神经元数量决定的,这使得网络更加灵活。与输出神经元不同,隐藏的神经元可以很容易地添加或移除。
图3。Elman网络架构
1.2.4径向基函数网络(RBF)-一种前馈神经网络,包含一个径向对称神经元的中间(隐藏)层。这种神经元通过一些非线性高斯算法将它与特定输入向量之间的距离转换为中心距离。
与多层前馈网络相比,RBF网络具有许多优点。首先,它们只使用一个中间层来模拟任何非线性函数,这样就避免了开发人员决定层的数量。然后,可以使用许多著名的线性优化算法来优化输出级的线性组合参数。后者运行非常快,并且没有会严重干扰反向传播的局部极小值。这也是RBF网络在使用反向传播时具有很大学习速度的原因。
RBF的缺点是:当输入向量很大时,这些网络的外推特性很弱,效率很低。
图4。RBF结构
1.2.5动态学习矢量量化(DLVQ)网络与自组织映射(SOM)网络非常相似。与SOM不同,DLVO可以进行有监督的学习,并且不依赖于原型。矢量量化比聚类更为广泛。
1.2.6在Hopfield网络的执行过程中,网络会动态地收敛到其中一个平衡状态。这些平衡态是称为网络能量的最小局部函数。这种网络可以作为一个内容寻址的联想存储系统、一个过滤器,并解决一些优化问题。
与许多神经网络不同的是,Hopfield网络在收到一定的反馈之前一直运行,直到达到平衡,也就是说,网络的下一个状态与前一个状态完全相同。在这种情况下,初始状态是输入模式,输出图像以平衡状态接收。训练Hopfield网络需要输入和输出层来提供训练模式。
图5。三个神经元的Hopfield网络结构
尽管它有着吸引人的特性,但经典的Hopfield网络还远远不够完美。它的内存有限,仅占网络n中神经元的15%左右,但是内存直接寻址系统可以使用n位存储多达2n个不同的图像。
此外,如果图像相对于其初始存储位置移动或旋转,Hopfield网络无法识别图像。这个或那个缺点使得Hopfield网络在理论模型研究中比在日常实用工具中更常用。
许多其他网络(Hemming Cycle Network、Grossberg Network、自适应共振理论网络(Art-1、Art-2))在本文中没有提及,因为它们超出了我们的兴趣范围。
1.3。培训方法
学习新事物是人脑的主要功能。对于人工神经网络,学习就是构造网络结构(神经元之间的连接结构)和接触过程的权重(信号的影响系数),从而获得解决实际问题的有效方法。神经网络通常是在数据样本上训练的。训练是特定算法的执行过程。随着训练的进行,网络对输入信号的响应逐渐提高。
主要有三种学习模式:有监督、无监督和混合。在第一种情况下,每个输入的正确结果是已知的,并且使用网络权重来最小化错误。无监督学习用于对样本进行分类,并解释数据的内在结构和特征。上述两种模式用于混合模式。
1.3.1神经网络学习的主要规律
网络构造算法有四种:纠错算法、玻尔兹曼规则、赫布规则和竞争算法。
1.3.1.1误差修正
每个输入样本都有一个特定的预期输出值(目标值),这可能与实际(预测)值不一致。纠错学习算法利用目标与预测值之间的误差作为权重调整的直接依据,以减小误差。只有在出现错误时才进行培训。这种学习方法有许多优化版本。
1.3.1.2玻耳兹曼规则
玻尔兹曼定律是一种混沌学习算法,类似于热力学原理。它根据预期的概率分布调整神经元的权重。玻尔兹曼学习算法可以看作是一种特殊的纠错算法。其误差是指两个模型中状态之间的相关性差异。
1.3.1.3.赫伯规则
HEBB算法是最著名的神经网络学习算法。这种算法的思想是,如果突触两侧的神经元同时有规律地被激活,那么接触过程的强度就会增加。这里的一个重要特征是,只有当连接的神经元被激活时,天线的重量才会改变。该算法有许多变体,但不同之处在于修改接触重量的方法。
1.3.1.4。竞争性学习
与Hebb学习算法不同,许多输出神经元可以同时被激活,并且它们之间存在竞争关系。最大的输出神经元,具有累积权重“赢”和“赢家吃光”。其他输出神经元的输出失活。学习时,只有“赢家”权重值得修改,使其逐渐接近当前的输入实例。
为了解决不同的问题,有许多学习算法。反向传播算法是现代最有效的算法之一。其基本原理是接触重量的变化发生在误差函数的局部梯度附近。
网络输出层的实际值和正确响应值之间的差异沿信号流的方向向后传播(图5)。这样,每个神经元都可以定义属于它的累积网络错误的权重分布。最简单的学习规则是最陡下降法,即凸点的权重根据其累积误差分布成比例变化。
图6。反向传播学习时的数据和误差扩散模式
当然,这种类型的神经网络学习不能保证最佳的学习效果,因为总是有一定的概率算法陷入局部极小。有一些特殊的技术可以识别发现的结果是否是局部极点。如果多次使用该技术后,神经网络的决策是一致的,就有可能得出结论,结果是最好的。
1.4。缺点
- 使用神经网络的主要困难是所谓的“维度灾难”。随着输入维数和层次的增加,网络的复杂度和学习时间呈指数增长,收到的结果并不总是最优的。
- 使用神经网络的另一个困难是传统的神经网络无法解释它们如何解决问题。在一些医学应用中,解释比结果本身更重要。除了我们不感兴趣的最简单的情况外,内部结果表示是机器复杂的,几乎不可能进行分析。
2。深度学习
由于深入学习算法的成功实施,以第三代神经网络为代表的机器学习理论和实践正在经历一场“深刻的革命”。与80年代和90年代的经典第二代神经网络不同,新的学习模型解决了许多问题,突破了局限性,成功地应用于传统的神经网络。
用深度学习算法训练的神经网络不仅比其它方法更精确,而且在某些情况下可以揭示理解输入信息的基础。图像识别和文本信息分析是最好的例子。
目前,最先进的工业计算机视觉和语音识别方法都是基于深度神经网络的。IT巨头ru aple、google和facebook正在聘请研究人员开发深度神经网络。
2.1。背景
一群多伦多大学的研究生,由杰弗里·E·辛顿教授带领,在默克赞助的比赛中获得了第一名。利用有限的数据集来描述15个分子的化学结构,G.Hinton的团队创建并应用了一个特殊的程序系统来确定哪种分子最有可能是最有效的药物。
本工作的特点是开发人员采用基于深度学习的人工神经网络来完成。由于该系统是基于非常有限的源数据来计算和获取结果的,因此通常需要输入大量的信息来训练神经网络。
辛顿的球队成绩令人印象深刻,因为他们只参加了比赛的最后一分钟。此外,深入学习系统的发展不需要了解与之相关的特定分子域。深入学习的成功应用是2012年人工智能领域的又一重大成就。
因此,2012年,来自谷歌的Jeff Dean和Andrew Y.Ng提出了一种新的图像识别系统,准确率为15.8%。他们使用ImageNet网络中20000个不同对象的140万张图像来训练具有16000个节点的集群系统。去年,在瑞士科学家为识别交通信号图片而创建的一个项目中,神经网络系统超越了人脑。获奖项目准确识别了50000张图像中99.46%的图像,32名参与者的最佳得分为99.22%,人脑平均得分为98.84%。2012年10月,微软科学项目的成员理查德拉希德(Richard F.Rashid)在中国天津参加了一个会议,他展示了一种模拟英语同时翻译为中文的技术。
这些技术在人工智能领域都有一定的突破。深入学习理论的主要贡献来自英国科学家乔治·布尔的曾孙辛顿教授。
深度学习理论将常用的机器学习方法与特殊的算法结合起来,用于分析多层表示的输入信号。这种新方法的特点是,深度学习算法在找到足够的信息表示层影响问题所涉及对象的参数后,才开始学习。
这样,基于该方法的神经网络比传统的神经网络需要更少的输入数据来学习,而经过训练的神经网络能够更准确地分析信息。辛顿教授和他的团队声称他们的技术表现更好,尤其是在处理多维、结构良好的信息数组时。
人工智能技术(ai),尤其是深度学习技术,广泛应用于不同的系统,包括基于Nuance通信技术的苹果Siri智能个人助理和谷歌街景地址识别系统。然而,科学家在评估这一领域的成功时非常小心,因为人工智能系统的历史充满了希望和失望。
在20世纪60年代,科学家们相信一个完美的人工智能系统可以在10年内创造出来。然后,在20世纪80年代,在这个领域的“冰河时代”之后,出现了一批提供“现代人工智能系统”的年轻公司,并一直持续到今天。如今,由于云服务提供强大的计算能力,利用新的理论和算法实现神经网络成为可能。
值得注意的是,即使是第三代神经网络,如卷积神经网络和玻尔兹曼机器,除了它们的名字外,也与生物神经没有相似之处。
新的学习算法分两步实现:第一步是通过无监督训练分层从无格式大数组中提取输入数据的内部结构信息。然后,将信息应用于多层神经网络中,利用现有的算法对格式化后的数据进行监控。同时,未格式化的数据必须尽可能大。格式化数据可以相对较小。在我们的场景中,这不是最重要的事情。
2.2。自动编码器、自动编码器、限幅玻尔兹曼机。差异和特点
2.2.1自动编码器
第一个自动传感器是福岛神经认知机器。
其结构如图7所示。
图7。福岛神经认知机
自动传感器(AA)的目的是在输出端尽可能精确地接收输入数据的镜像。
有两种类型的AA-生产和合成。受限玻尔兹曼机属于第一类,自动编码器代表第二类。
自动编码器是一个只有一个开放层的神经网络。使用无监督学习算法和反向传播算法,将目标值设置为与输入向量相同的值,如y=x.
。
图8是一个自动编码器的例子。
图8。自动编码器结构
自动编码器试图构造函数h(x)=x,换句话说,它试图找到一个近似函数,以确保神经网络的反馈与输入参数近似相等。为了推广问题的解决方案,开放层中的神经元数量必须小于输入数据的维数(如图所示)。
当输入信号传输到网络的输出层时,数据将被压缩。例如,如果输入向量是一个10 x 10像素(100个特征值)的图像灰度值,并且隐藏层中的神经元数为50,那么网络就必须学会压缩图像。h(x)=x是指根据隐藏层中的50个激活神经元,输出层将原始图像恢复到100像素。如果存在隐藏节点、特征相关或任何关联结构,则这种压缩是可行的。从这个意义上说,这种自动编码器可以提醒主成分分析(PCA)输入数据被压缩。
令人惊讶的是,Bengio等人进行了这项实验(2007年)。实验表明,随机梯度下降训练时,隐藏神经元的数目大于输入数据的数目(也称为“过量”),非线性自动编码网络有利于表达网络的输入一致性误差。
然后,当稀疏思想出现时,稀疏模式自动编码器得到了广泛的应用。
稀疏自动编码器是一种具有大量隐藏神经元和冗余输入数据维的自动编码器,但具有稀疏激活模式。所谓的稀疏激活模式,意味着隐藏层中激活神经元的数量要比不激活神经元的数量小得多。一般来说,当一个神经元被激活时,它的功能值接近1。如果使用乙状结肠功能,非活动神经元的值必须大约等于0(对于双曲正切函数,该值必须接近-1)。
这是自动编码器的一种变体,称为降噪自动编码器(Vincent等人,2008年)。它和自动编码器一样,但是训练方法有点特殊。培训网络时,输入“损坏”数据(替换为0)。同时,与输出数据相比,有“正确”的数据。这样,自动编码器可以恢复损坏的数据。
2.2.2.限制玻尔兹曼机器,RBM。
我们不会关注受限玻尔兹曼机器(RBM)的历史。我们知道,有反馈的循环网络很难训练。由于学习困难,出现了有限循环模型,使得学习算法简单,可以在实际中应用。霍普菲尔德神经网络就是其中的一种。约翰霍普菲尔德介绍了网络能量的概念,并将神经网络的动力学与热力学中的概念进行了比较。
去RBM的下一站是普通的Boltzmann机器。它们与Hopfield网络的不同之处在于它们具有随机性,它们的神经元分为可见和隐藏组(类似于隐藏的马尔可夫模型)。限制玻尔兹曼机器和常规玻尔兹曼机器的区别在于同一层神经元之间没有相关性。
图9显示了RBM结构。
图9。RBM结构
该模型的特点是,在一组神经元的当前状态下,其他组神经元的状态相互独立。现在让我们来看看其他理论,在这些理论中,这个特性起着重要的作用。
解释和观点
RBM可以理解为类似于隐马尔可夫模型。我们可以观察到一些(可见神经元)的状态,一些我们不能直接看到的隐藏状态(隐藏神经元)。根据可观测状态,我们可以得到隐藏状态的概率统计。一旦对模型进行了训练,我们就有机会得出这样的结论:隐藏状态从可见状态开始遵循贝叶斯准则。这允许通过训练模型的概率分布生成数据。
这样,我们就可以设定训练模型的目标:调整模型参数,使初始状态的重构向量最接近原始值。重构向量是隐式状态概率演绎的产物,隐式状态是可见状态概率演绎的产物,如原向量。
训练算法为对比差分法CD-K。
这个算法由辛顿教授于2002年发明,非常简单。主要思想是用自定义值替换数学期望。介绍了吉布斯采样的思想。
CD-K如下:
- 神经元的状态设置为与输入模式一致。
- 绘制了隐层状态的概率分布图。
- 隐藏层中的每个神经元都被分配一个状态“1”,这意味着分布与当前状态一致。
- 可见层状态的概率分布是基于隐藏层的绘制。
- 如果当前迭代次数小于k,则返回第二步。
- 绘制了隐层状态的概率分布图。
在辛顿的报告中:
0
图表。10。CD-K学习算法
换句话说,样本越长,梯度越精确。Hinton教授声称CD-1算法的结果是好的,它只进行一次采样迭代。
2.3。堆栈式自动连接网络。堆栈自动编码器SAE,堆栈自动编码器(堆栈RBM)
为了解析输入数据集的高层抽象信息,在网络中加入了自动相关器。
图11显示了堆栈自动编码器和神经网络的结构。它们共同构成一个深度神经网络,其权重由堆栈自动编码器初始化。
1
图11。DN-SAE结构
图12是一个堆RBM(SRBM)模型和一个神经网络,它们共同构成一个由SRBM初始化的深层神经网络。
这些深层神经网络结构的例子强调了一个事实,即信息是由下而上进行解析的。
2
图12。DN SRBM结构
2.4。深度网络训练(DN)。阶段。特性
深部神经网络的训练分为两个步骤。首先,自动关联网络(SAE或SRBM,取决于DN类型)在未格式化数据数组的监督下进行培训。然后根据训练后得到的隐层权重对普通MLP的隐层神经元进行初始化。图11和图12显示了训练模式和传输过程。在第一次AE/RBM训练后,隐藏层中神经元的重量成为第二个输入,依此类推。这样,就可以从数据中解析结构的一般信息(线条、周长、模式等)。
第二步是使用众所周知的方法对格式化数据集上的MLP(监督培训)进行微调。实验表明,该初始化方法可以将MLP隐层神经元的权值设置为全局最小,且后续的微调时间很短。
此外,Hinton教授建议,对于三层以上的深层神经网络,微调应该分两步进行。首先,只对前两层进行培训,然后对网络的其余部分进行培训。
值得注意的是,就无人监督的培训结果而言,SRBM的稳定性低于SAE。
请注意,这些概念经常被混淆。SRBM由深度信任网络DBN确定。虽然RBM是由DBN衍生而来,但其结构却完全不同。DBN是一种多层神经网络,其隐层神经元由二进制模式随机初始化。
三。实践实验
一种用R语言实现的深度神经网络。
3.1。R语言
历史。R语言是一种编程语言,是统计计算和映射的环境。它是1996年由新西兰科学家罗斯·伊哈卡和罗伯特·绅士在奥克兰大学发明的。
R是一个GNU开源软件项目。其基本原则如下:
- 执行任何目的程序的自由(自由0);
- 有自由学习如何运行内存和修改内存以供自己使用(自由1);
- 帮助他人复制分发过程的自由(自由2);
- 有改进程序的自由,使社会能从改进中受益。
历史上,R是1976年约翰·钱伯斯和他的同事在贝尔实验室发明的S的替代品。如今,核心开发团队(包括JohnChambers)仍在优化R。
为了重新试验,必须安装R和RSTUDIO。您可以在Internet上找到有关下载位置和下载方式的信息。如果有任何问题,我们可以在本文的评论部分讨论它们。
R的优点:
- 今天,R是统计计算领域的标准。
- 它正由世界各地大学的研究团队开发和支持。
- 在所有高级领域都有大量的数据挖掘开发工具包。思想的发布和R开发工具包的实现之间的时间间隔通常不超过两周。
- 最重要的是,它是完全免费的。一位著名的开源操作系统开发人员曾经说过:“程序就像性——最好是免费的。”
3.2。实施方案和问题
有两种实现。
第一个是使用约翰辛顿的独特的matlab程序。这需要“r.matlab”。此包包含用于读取和写入mat文件的writemat()和readmat()方法。它可以与本地加载或运行Matlab V6及更高版本(编码、发送和接收对象等)的远程服务器通信。开发工具包中描述了详细信息。这是习惯使用matlab的人的方法。我还没有尝试过这个方法,但是可以在matlab和mql之间建立连接。
第二种方法是使用R开发工具包。我们将深入研究这种方法。
据我所知,有三个与本文主题相关的开发包。
- “DEPNET”是一个简单的开发工具包,用于实现dn-sae和dn-srbm模型。用于有监督和无监督学习的输入数据集的长度相同。这使得无法通过两个步骤对系统进行微调。从构建和测试模型开始。
- “darh”是一款先进、广泛的dnsrbm模型开发工具包。有一个dn-sae模型,但我没有成功加载它。此软件包适用于有经验的用户,他们可以创建和调整任意复杂性的模型。它是基于辛顿独特的matlab语言程序。
- “h2o”是一个广泛开发的软件包,用于在大型数据集(csv文件格式)上对深度网络(不仅如此)进行培训。
在下面的实验中,我们将使用“深网”包。
3.3。为测试准备输入和目标数据
今天的数据挖掘有一个特定的执行序列:
- 选择输入数据(研究、分析、预处理、评价);将数据集划分为培训集、验证集和测试集(抽样);
- 模型在训练集上得到,在验证集上进行验证。
- 测试样本用于评估模型的质量,确定最佳模型参数,或通过特定的方法获得与测试集匹配的最佳模型。
- 模型开始工作了。
第一步是最耗时的,也是产生最终结果最重要的步骤。老实说,这一步没有规则可循,几乎是一门艺术。在大多数情况下,这取决于研究人员的经验。然而!为了选择最重要的输入数据集,对其进行定量评价是非常重要的。在这种情况下,为特定模型自动选择最佳参数甚至更好。R语言提供了广泛的功能来解决所有的实现挑战。
源数据不仅是重要的,而且还有很多方面要考虑。它可以在单独的文章中讨论。由于本文的目标是用简单的语言表达复杂的事物,因此我们将重点放在关键点上,而不必过多地关注细节。
3.3.1源数据
为了分类,我们需要一组独立(输入)变量和一个目标变量。因为深度学习网络的优点是它可以在大量输入样本上快速学习,所以让我们创建一个包含17个预测因子(11个指标)的输入数据集。之字形用作目标变量。在R中下载4000列开盘价、最大值、最小值和收盘价向量。下载方法在下面的索引编译中讨论。这一步不重要。所有进一步的计算将在R中实施。
四个向量用于构造一个具有平均价格和列大小的矩阵。将其转换为函数:
pr.OHLC <- function (o, h, l, c) { #Unite quote vectors into a matrix having previously expanded them #Indexing of time series of vectors in R starts with 1. #Direction of indexing is from old to new ones. price <- cbind(Open = rev(o), High = rev(h), Low = rev(l), Close = rev(c)) Med <- (price[, 2] + price[, 3])/2 CO <- price[, 4] - price[, 1] #add Med and CO to the matrix price <- cbind(price, Med, CO) }
查看结果(08.10.14:12:00)
> head(price) Open High Low Close Med CO [1,] 1.33848 1.33851 1.33824 1.33844 1.338375 -4e-05 [2,] 1.33843 1.33868 1.33842 1.33851 1.338550 8e-05 [3,] 1.33849 1.33862 1.33846 1.33859 1.338540 1e-04 [4,] 1.33858 1.33861 1.33856 1.33859 1.338585 1e-05 [5,] 1.33862 1.33868 1.33855 1.33855 1.338615 -7e-05 [6,] 1.33853 1.33856 1.33846 1.33855 1.338510 2e-05
3.3.2输入数据(预测器)
指标列表。指标是随机选择的,并不是有意获得输入的最大差异。
所有指标都是使用包含许多指标的TTR包计算的。
威尔斯·威尔德的运动方向指数-ADX(HLC,N)-4输出(DIP,DIN,DX,ADX)
观察前200个气缸的计算结果:
> library(TTR)
> adx<-ADX(price, n = 16)
> plot.ts(head(adx, 200))
3
图13。威尔斯·威尔德定向运动指数-ADX(HLC,N)
> summary(adx) DIp DIn DX ADX Min. :15.90 Min. : 5.468 Min. : 0.00831 Min. : 5.482 1st Qu.:41.21 1st Qu.: 33.599 1st Qu.: 8.05849 1st Qu.:14.046 Median :47.36 Median : 43.216 Median :16.95423 Median :18.099 Mean :47.14 Mean : 46.170 Mean :19.73032 Mean :19.609 3rd Qu.:53.31 3rd Qu.: 55.315 3rd Qu.:27.97471 3rd Qu.:23.961 Max. :80.12 Max. :199.251 Max. :81.08751 Max. :52.413 NA's :16 NA's :16 NA's :16 NA's :31
矩阵开头有31个未定义的值(na)。然后对所有指标执行相同的操作,此处不作详细说明。
3.3.2.2。Aroon(HL,N)-1输出(振荡器)
计算并观察了初始200个只有一个变量的振子指数圆柱。
> ar<-aroon(price[ , c('High', 'Low')], n = 16)[ ,'oscillator']
> plot(head(ar, 200), t = "l")
> abline(h = 0)
4
图14。指示器Aroon(HL,N)
> summary(ar) Min. 1st Qu. Median Mean 3rd Qu. Max. NA's -100.00 -56.25 -18.75 -7.67 43.75 100.00 16
3.3.2.3。商品渠道指数-CCI(HLC,N)-1输出
> cci<-CCI(price[ ,2:4], n = 16)
> plot.ts(head(cci, 200))
> abline(h = 0)
5
图15。商品渠道指数-CCI(HLC,N)
> summary(cci) Min. 1st Qu. Median Mean 3rd Qu. Max. NA's -469.10 -90.95 -18.74 -14.03 66.91 388.20 15
柴金波动率-柴金波动率(HLC,N)-1输出
> chv<-chaikinVolatility(price[ , 2:4], n = 16)
> summary(chv)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
-0.67570 -0.29940 0.02085 0.12890 0.41580 5.15700 31
> plot(head(chv, 200), t = "l")
> abline(h = 0)
6
图16。指标柴金波动率(HLC,N)
3.3.2.5钱德动量振荡器-CMO(Med,N)-1输出
> cmo<-CMO(price[ ,'Med'], n = 16)
> plot(head(cmo, 200), t = "l")
> abline(h = 0)
7
图17。钱德动量振荡器指数-CMO(Med,N)
> summary(cmo) Min. 1st Qu. Median Mean 3rd Qu. Max. NA's -97.670 -32.650 -5.400 -6.075 19.530 93.080 16
3.3.2.6。MACD振荡器-MACD(MED、NFAST、NSLOW、NSIG)使用一个输出(MACD)
> macd<-MACD(price[ ,'Med'], 12, 26, 9)[ ,'macd'] > plot(head(macd, 200), t = "l") > abline(h = 0)
8
图18。MACD振荡器指数
> summary(macd) Min. 1st Qu. Median Mean 3rd Qu. Max. NA's -0.346900 -0.025150 -0.005716 -0.011370 0.013790 0.088880 25
3.3.2.7。OSMA(MED、NFAST、NSLOW、NSIG)-1出
> osma<-macd - MACD(price[ ,'Med'],12, 26, 9)[ ,'signal'] > plot(head(osma, 200), t = "l") > abline(h = 0)
9
图19。指示器OSMA(MED、NFAST、NSLOW、NSIG)
> summary(osma) Min. 1st Qu. Median Mean 3rd Qu. Max. NA's -0.10560 -0.00526 0.00034 0.00007 0.00646 0.05922 33
3.3.2.8。相对强度指数-rsi(med,n)-1输出
> rsi<-RSI(price[ ,'Med'], n = 16)
> plot(head(rsi, 200), t = "l")
> abline(h = 50)
0
数字。20。相对强度指数-RSI(Med,N)
> summary(rsi) Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 5.32 37.33 47.15 46.53 55.71 84.82 16
3.3.2.9。随机振荡器-STOCH(HLC,NFASTK=14,NFASTD=3,NSLOWD=3)-3个输出
> stoh<-stoch(price[ ,2:4], 14, 3, 3) > plot.ts(head(stoh, 200))
1
图21。斯托克(HLC,NFASTK=14,NFASTD=3,NSLOWD=3)
> summary(stoh) fastK fastD slowD Min. :0.0000 Min. :0.01782 Min. :0.02388 1st Qu.:0.2250 1st Qu.:0.23948 1st Qu.:0.24873 Median :0.4450 Median :0.44205 Median :0.44113 Mean :0.4622 Mean :0.46212 Mean :0.46207 3rd Qu.:0.6842 3rd Qu.:0.67088 3rd Qu.:0.66709 Max. :1.0000 Max. :0.99074 Max. :0.97626 NA's :13 NA's :15 NA's :17
3.3.2.10。随机动量指数-SMI(HLC,n=13,nfast=2,nslow=25,nsig=9)-2输出
> smi<-SMI(price[ ,2:4],n = 13, nFast = 2, nSlow = 25, nSig = 9) > plot.ts(head(smi, 200))
2
图22。随机动量指数指数-SMI(HLC,n=13,nfast=2,nslow=25,nsig=9)
> summary(smi) SMI signal Min. :-82.185 Min. :-78.470 1st Qu.:-33.392 1st Qu.:-31.307 Median : -9.320 Median : -8.839 Mean : -8.942 Mean : -8.985 3rd Qu.: 15.664 3rd Qu.: 14.069 Max. : 71.878 Max. : 63.865 NA's :25 NA's :33
3.3.2.11。波动性(Yang and Zhang)-波动性(ohlc,n,calc=“Yang.张”,n=96)-1输出
> vol<-volatility(price[ ,1:4],n = 16,calc = "yang.zhang", N =96) > plot.ts(head(vol, 200))
3
图23。波动率(Yang和Zhang)指数-波动率(Ohlc,n,calc=“Yang.张”,n=96)
> summary(vol) Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 0.000599 0.001858 0.002638 0.003127 0.004015 0.012840 16
到目前为止,我们从11个指标中获得了15分钟4000欧元圆柱形OHLC样品的17个变量。
使用它们形成矩阵,并将上述参数写入带有形式参数的函数中,这将用于优化。
使用以下公式计算输入参数矩阵:
In<-function(p = 16){ adx<-ADX(price, n = p); ar<-aroon(price[ ,c('High', 'Low')], n=p)[ ,'oscillator']; cci<-CCI(price[ ,2:4], n = p); chv<-chaikinVolatility(price[ ,2:4], n = p); cmo<-CMO(price[ ,'Med'], n = p); macd<-MACD(price[ ,'Med'], 12, 26, 9)[ ,'macd']; osma<-macd - MACD(price[ ,'Med'],12, 26, 9)[ ,'signal']; rsi<-RSI(price[ ,'Med'], n = p); stoh<-stoch(price[ ,2:4],14, 3, 3); smi<-SMI(price[ ,2:4],n = p, nFast = 2, nSlow = 25, nSig = 9); vol<-volatility(price[ ,1:4],n = p,calc="yang.zhang", N=96); In<-cbind(adx, ar, cci, chv, cmo, macd, osma, rsi, stoh, smi, vol); return(In) } > X<-In() > tail(X) DIp DIn DX ADX ar cci chv [3995,] 46.49620 36.32411 12.28212 18.17544 25.0 168.0407 0.1835102 [3996,] 52.99009 31.61164 25.26952 18.61882 37.5 227.7030 0.3189822 [3997,] 58.11948 28.16241 34.72000 19.62515 37.5 145.2337 0.3448520 [3998,] 56.00323 30.48687 29.50206 20.24245 37.5 118.5831 0.3068059 [3999,] 55.96197 28.78737 32.06467 20.98134 37.5 116.5376 0.3517668 [4000,] 54.97777 26.85440 34.36713 21.81795 62.5 160.0767 0.6169701 cmo macd osma rsi fastK [3995,] 29.71342 -0.020870825 0.01666593 52.91932 0.8832685 [3996,] 41.89526 -0.009654368 0.02230591 61.49793 0.8833819 [3997,] 30.98237 -0.002051532 0.02392699 58.94513 0.7259475 [3998,] 33.84813 0.003454534 0.02354645 58.00549 0.7930029 [3999,] 38.84892 0.009590136 0.02374564 60.63806 0.8367347 [4000,] 54.71698 0.019303110 0.02676689 66.64815 0.9354120 fastD slowD SMI signal vol [3995,] 0.7773581 0.7735064 -35.095406 -47.27712 0.003643196 [3996,] 0.7691688 0.7761507 -26.482951 -43.11828 0.003858942 [3997,] 0.8308660 0.7924643 -19.699762 -38.43458 0.003920541 [3998,] 0.8007775 0.8002707 -13.141932 -33.37605 0.003916109 [3999,] 0.7852284 0.8056239 -6.569699 -28.01478 0.003999789 [4000,] 0.8550499 0.8136852 2.197810 -21.97226 0.004293766
准备原始输入数据。
3.3.3输出数据(目标)
现在我们可以形成输出(目标数据)。如前所述,我们将使用之字形。
我们将使用通道宽度为37的之字形。使用平均价格计算之字形。HL价格可以用来计算指数,但在这种情况下,平均价格可以使指数更稳定。将分析信号(0-买入,1-卖出)转化为网络模型的输入矩阵。
编写函数:
Out<-function(ch=0.0037){ # ZigZag has values on each bar and not only in the points zz<-ZigZag(price[ ,'Med'], change = ch, percent = F, retrace = F, lastExtreme = T); n<-1:length(zz); # On the last bars substitute the undefined values for the last known ones for(i in n) { if(is.na(zz[i])) zz[i] = zz[i-1];} #Define the speed of ZigZag changes and move one bar forward dz<-c(diff(zz), NA); #If the speed >0 - signal = 0(Buy), if <0, signal = 1 (Sell) otherwise NA sig<-ifelse(dz>0, 0, if else(dz<0, 1, NA)); return(sig); }
计算信号。
> Y<-Out() > table(Y) Y 0 1 1567 2423
类型比例不平衡。一种类型的数目大于另一种类型的数目。所有分类模型在此数据集中都不理想。
当我们将数据分为培训和测试样本时,我们将纠正这种情况。
3.3.4。清除数据
从未定义的数据中清除数据集。在这种情况下,清理意味着大量的工作。这包括清除“虚拟零”、强相关值和其他任务,我们在这里不讨论这些任务。
编写一个函数来清除数据
Clearing<-function(x, y){ dt<-cbind(x,y); n<-ncol(dt) dt<-na.omit(dt) return(dt); } > dt<-Clearing(X,Y); nrow(dt) [1] 3957
矩阵减少43个柱面。
3.3.5.培训和测试样本的形成
有很多方法可以将源数据划分为培训和测试样本。我们将原始数据按8:10的比例用常规的随机划分方法划分为训练集和测试集。样本是分层的这一事实非常重要,这意味着训练和测试样本中的分类实例比例必须与原始数据集中的比例相同。纠正源数据集中分类的不平衡也将有利于后续操作。有两种方法可以做到这一点-调整到较大或较小的类别。因为我们需要更多的样本,我们将调整较大的类别“1”。这里我们将使用“插入符号”工具箱。
让我们创建一个平衡的数据集,其中两个分类具有相同数量的实例,并且与较大的实例相同。
3.3.6分类余额
下面是一个函数,它调整较大一侧的分类数(如果差异大于15%),并返回一个均衡矩阵。
Balancing<-function(DT){ #Calculate a table with a number of classes cl<-table(DT[ ,ncol(DT)]); #If the divergence is less than 15%, return the initial matrix if(max(cl)/min(cl)<= 1.15) return(DT) #Otherwise level by the greater side DT<-if(max(cl)/min(cl)> 1.15){ upSample(x = DT[ ,-ncol(DT)],y = as.factor(DT[ , ncol(DT)]), yname = "Y") } #Convert у (factor) into a number DT$Y<-as.numeric(DT$Y) #Recode у from 1,2 into 0,1 DT$Y<-ifelse(DT$Y == 1, 0, 1) #Convert dataframe to matrix DT<-as.matrix(DT) return(DT); }
解释。首先,计算每个分类的实例数(向量、维度和分类相等)。
找到大小向量的比例,如果小于预设阈值,则退出。如果比率大于预设阈值,则分别计算函数并以x和y传递。Y必须预先转换为因子。
这是upsample()函数参数的要求。因为我们不需要目标变量作为因子,所以我们将其转换回数值变量0和1。注意,当我们将数字变量(0,1)转换为因子时,我们将收到文本变量“0”和“1”。当转换回数值变量时,我们得到1和2(!)。我们使用0和1代替。数据集从“数据帧”转换为“矩阵”类型。计算:
dt.b<-Balancing(dt) x<-dt.b[ ,-ncol(dt.b)] y<-dt.b[ , ncol(dt.b)]
这样,我们得到了源数据集(输入和输出)和平衡数据集dt.b。
分为训练样本和测试样本。
“rminer”包中的holdout()函数用于获取培训和测试样本的索引。
> library('rminer') > t<-holdout(y, ratio = 8/10, mode = "random")
对象t是训练(t$tr)和测试(t$ts)数据集的索引列表。获得的数据集是分层的。
3.3.7.预处理
我们的输入源数据变量具有不同的值范围。本质上,深度学习神经网络是一种具有特殊权重初始化方法的常规网络。
神经网络可以接收范围为(-1;1)或(0,1)的输入变量。将输入变量规范化为[-1,1]。
使用“caret”包中的预处理()函数。注意,预处理参数是根据训练数据集计算的,并存储用于处理测试数据集和新输入数据。
> spSign<-preProcess(x[t$tr, ], method = "spatialSign") > x.tr<-predict(spSign, x[t$tr, ]) > x.ts<-predict(spSign, x[t$ts, ])
到目前为止,我们已经具备了构建、训练和测试深层神经网络的所有要素。
3.4。构建、培训和测试模型
我们将构建和培训dn-sae模型。模型公式和变量描述:
sae.dnn.train(x, y, hidden = c(10), activationfun = "sigm", learningrate = 0.8, momentum = 0.5, learningrate_scale = 1, output = "sigm", sae_output = "linear", numepochs = 3, batchsize = 100, hidden_dropout = 0, visible_dropout = 0)
在这里:
- 为输入数据矩阵;
- y是目标变量的向量或矩阵。
- hidden是每个隐藏层中神经元数量的向量。默认值(10);
- 激活乐趣是激活隐藏神经元的功能。它可以是“sigm”、“linear”、“tanh”。默认值为sigm。
- LearningRate是一个梯度下降的训练系列。默认值=0.8;
- 动量是梯度下降的动量。默认值=0.5;
- 每次迭代后,LearningRate_Scale培训级别乘以该值。默认值=1;
- numepochs是训练迭代次数。默认值=3;
- BachSize是经过培训的少量数据的大小。默认值=100;
- 输出是输出神经元的激活函数,可以是sigm、线性和软最大值,默认为sigm。
- sae_输出是sae输出神经元的激活功能,可以是“sigm”、“linear”、“soft max”。默认为“线性”;
- hidden_dropout是隐藏层的可删除部分。默认值=0;
- Visible_Dropout是可见(输入)层的可移动部分。默认值=0。
我们打算创建一个具有维度(17、100、100、100、1)的模型并对其进行培训,注意培训时间并观察其预测结果。
> system.time(SAE<-sae.dnn.train(x= x.tr, y= y[t$tr], hidden=c(100,100,100), activationfun = "tanh", learningrate = 0.6, momentum = 0.5, learningrate_scale = 1.0, output = "sigm", sae_output = "linear", numepochs = 10, batchsize = 100, hidden_dropout = 0, visible_dropout = 0)) 开始训练 sae ...... training layer 1 autoencoder ... training layer 2 autoencoder ... training layer 3 autoencoder ... sae 训练完毕。 开始训练深度神经网络 ...... 深度神经网络训练完毕。 user system elapsed 12.92 0.00 13.09
我们可以看到有两个步骤。首先,对自动编码器进行分层训练,然后进行神经网络训练。
以这种方式有意建立三层训练次数较少的隐藏神经元。整个过程需要13秒!
让我们来评估预测因子测试集的预测效果。
> pr.sae<-nn.predict(SAE, x.ts); > summary(pr.sae) V1 Min. :0.2649 1st Qu.:0.2649 Median :0.5881 Mean :0.5116 3rd Qu.:0.7410 Max. :0.7410
转换为0.1并计算测量值
> pr<-ifelse(pr.sae>mean(pr.sae), 1, 0) > confusionMatrix(y[t$ts], pr) 模糊矩阵统计 Reference Prediction 0 1 0 316 128 1 134 378 Accuracy : 0.7259 95% CI : (0.6965, 0.754) No Information Rate : 0.5293 P-Value [Acc > NIR] : <2e-16 Kappa : 0.4496 Mcnemar's Test P-Value : 0.7574 Sensitivity : 0.7022 Specificity : 0.7470 Pos Pred Value : 0.7117 Neg Pred Value : 0.7383 Prevalence : 0.4707 Detection Rate : 0.3305 Detection Prevalence : 0.4644 Balanced Accuracy : 0.7246 'Positive' Class : 0
这不是一个很好的相关系数。与相关系数相比,我们更感兴趣的是使用这些信号可以获得多少利润。它在500个气缸上进行了测试(大约一周)。我们将在最近的500个连续酒吧接收来自训练有素的网络的信号。
对最新500个气缸的输入数据进行归一化,从训练的神经网络接收预测信号,并将其转换为-1=(卖出)和1=(买入)。
> new.x<-predict(spSign,tail(dt[ ,-ncol(dt)], 500)) > pr.sae1<-nn.predict(SAE, new.x) > pr.sig<-ifelse(pr.sae1>mean(pr.sae1), -1, 1) > table(pr.sig) pr.sig -1 1 235 265 > new.y<-ifelse(tail(dt[ , ncol(dt)], 500) == 0, 1, -1) > table(new.y) new.y -1 1 201 299 > cm1<-confusionMatrix(new.y, pr.sig) > cm1 模糊矩阵统计 Reference Prediction -1 1 -1 160 41 1 75 224 Accuracy : 0.768 95% CI : (0.7285, 0.8043) No Information Rate : 0.53 P-Value [Acc > NIR] : < 2.2e-16 Kappa : 0.5305 Mcnemar's Test P-Value : 0.002184 Sensitivity : 0.6809 Specificity : 0.8453 Pos Pred Value : 0.7960 Neg Pred Value : 0.7492 Prevalence : 0.4700 Detection Rate : 0.3200 Detection Prevalence : 0.4020 Balanced Accuracy : 0.7631 'Positive' Class : -1
精度系数也不错,但我们更关心的是盈利能力而不是系数。
利用我们的预测信号,我们测试了最近500个气缸的交易利润,并获得了一条资本曲线:
> bal<-cumsum(tail(price[ , 'CO'], 500) * pr.sig) > plot(bal, t = "l") > abline(h = 0)
4
图24。根据神经网络信号交易的最新500柱面资本曲线
资本曲线的计算不考虑实际市场的点差、滑动点等相关特征。
比较理想ZZ信号的资本曲线。红线是神经网络信号的资金曲线:
> bal.zz<-cumsum(tail(price[ , 'CO'], 500) * new.y) > plot(bal.zz, t = "l") > lines(bal, col = 2)
5
图25。近500列神经网络信号与之字形信号
的资金曲线
还有改进的余地。
编写两个辅助功能估算()和测试()。第一个生成精度/误差系数,第二个生成余额/余额资本曲线。
它允许直接更改网络参数以获得结果,并观察哪些参数对网络质量有影响。
遗传算法可以在不影响交易过程的情况下找到最优的网络参数。在本文中,我们将不花时间研究这个问题,而是在其他时候详细讨论它。
以下是函数估计(),用于计算误差/精度系数:
Estimation<-function(X, Y, r = 8/10, m = "random", norm = "spatialSign", h = c(10), act = "tanh", LR = 0.8, Mom = 0.5, out = "sigm", sae = "linear", Ep = 10, Bs = 50, CM=F){ #Indices of the training and test data set t<-holdout(Y, ratio = r, mode = m) #Parameters of preprocessing prepr<-preProcess(X[t$tr, ], method = norm) #Divide into train and test data sets with preprocessing x.tr<-predict(prepr, X[t$tr, ]) x.ts<-predict(prepr, X[t$ts, ]) y.tr<- Y[t$tr]; y.ts<- Y[t$ts] #Train the model SAE<-sae.dnn.train(x = x.tr , y = y.tr , hidden = h, activationfun = act, learningrate = LR, momentum = Mom, output = out, sae_output = sae, numepochs = Ep, batchsize = Bs) #Obtain a forecast on the test data set pr.sae<-nn.predict(SAE, x.ts) #Recode it into signals 1,0 pr<-ifelse(pr.sae>mean(pr.sae), 1, 0) #Calculate the Accuracy coefficient or classification error if(CM) err<-unname(confusionMatrix(y.ts, pr)$overall[1]) if(!CM) err<-nn.test(SAE, x.ts, y.ts, mean(pr.sae)) return(err) }
形式参数:
- x—输入原预测矩阵;
- y——目标变量向量;
- R-列车/试验比;
- M—采样模式(随机或连续);
- nor—输入参数的归一化模式([-1,1]=“空间符号”;[0,1]=“范围”);
- h-隐藏层神经元向量;
- ACT暗示神经元激活功能;
- LR——培训系列;
- -动量;
- 输出层激活功能;
- 自动编码器激活功能;
- ep——培训周期数;
- Bs——小样本量;
- M-布尔变量,如果为真,则打印精度。否则,打印错误。
作为一个例子,我们将使用一个三个隐藏层中每层30个神经元的网络来计算不平衡数据集dt的分类误差:
> Err<-Estimation(X = dt[ ,-ncol(dt)], Y = dt[ ,ncol(dt)], h=c(30, 30, 30), LR= 0.7) 开始训练 sae ...... training layer 1 autoencoder ... training layer 2 autoencoder ... training layer 3 autoencoder ... sae 训练完毕。 开始训练深度神经网络 ...... 深度神经网络训练完毕。 > Err [1] 0.1376263
测试()函数通过预测信号或理想信号(之字形)计算资本曲线:
Testing<-function(dt1, dt2, r=8/10, m = "random", norm = "spatialSign", h = c(10), act = "tanh", LR = 0.8, Mom = 0.5, out = "sigm", sae = "linear", Ep = 10, Bs=50, pr = T, bar = 500){ X<-dt1[ ,-ncol(dt1)] Y<-dt1[ ,ncol(dt1)] t<-holdout(Y, ratio = r, mode = m) prepr<-preProcess(X[t$tr, ], method = norm) x.tr<-predict(prepr, X[t$tr, ]) y.tr<- Y[t$tr]; SAE<-sae.dnn.train(x = x.tr , y = y.tr , hidden = h, activationfun = act, learningrate = LR, momentum = Mom, output = out, sae_output = sae, numepochs = Ep, batchsize = Bs) X<-dt2[ ,-ncol(dt2)] Y<-dt2[ ,ncol(dt2)] x.ts<-predict(prepr, tail(X, bar)) y.ts<-tail(Y, bar) pr.sae<-nn.predict(SAE, x.ts) sig<-ifelse(pr.sae>mean(pr.sae), -1, 1) sig.zz<-ifelse(y.ts == 0, 1,-1 ) bal<-cumsum(tail(price[ ,'CO'], bar) * sig) bal.zz<-cumsum(tail(price[ ,'CO'], bar) * sig.zz) if(pr) return(bal) if(!pr) return(bal.zz) }
形式参数:
- DT1——训练网络的输入矩阵和目标变量;
- DT2-用于测试网络的输入矩阵和目标变量;
- pr布尔变量根据预测的信号事务打印资本曲线为真,否则根据之字形索引事务打印资本曲线。
- bar-用于计算资本曲线的气缸数。
将具有相同参数的神经网络训练到平衡数据集dt.b上,计算出最后500个圆柱数据集dt的资金曲线。
> Bal<-Testing(dt.b, dt, h=c(30, 30, 30), LR= 0.7) 开始训练 sae ...... training layer 1 autoencoder ... training layer 2 autoencoder ... training layer 3 autoencoder ... sae 训练完毕。 开始训练深度神经网络 ...... 深度神经网络训练完毕。 > plot(Bal, t = "l") > abline(h = 0)
6
图26。根据神经网络H(30、30、30)信号交易的最新500柱面资本曲线
如果我们将其与之前的资本曲线进行比较,我们会发现有很大的改进。但这还不是最有趣的事情。
如果我们看看最后500个气缸的价格,我们就能看到神经网络的最佳部分(150-350巴)。
> plot(tail(price[ ,'Close'], 500), t = "l") > abline(v = c(150,350), col=2)
7
数字。27。在最近500列中绘制收盘价
注:解码输出预测时,我们使用大于/小于平均值的简单方案。当然,也可以使用其他方案。
如果该值大于0.6或小于0.4,则0.4和0.6之间的不稳定部分将被移除。验证后可以得到更精确的分类边界。这将在后面讨论。
我们引入了一个额外的参数dec,测试()函数略有变化。因此,我们可以选择解码方法(“mean”或“60/40”),并检查预测值,以了解其对基金曲线几何的影响。
Testing.1<-function(dt1, dt2, r = 8/10, m = "random", norm = "spatialSign", h = c(10), act = "tanh", LR = 0.8, Mom = 0.5, out = "sigm", sae = "linear", Ep = 10, Bs = 50, pr = T, bar = 500, dec=1){ X<-dt1[ ,-ncol(dt1)] Y<-dt1[ ,ncol(dt1)] t<-holdout(Y, ratio = r, mode = m) prepr<-preProcess(X[t$tr, ], method = norm) x.tr<-predict(prepr, X[t$tr, ]) y.tr<- Y[t$tr]; SAE<-sae.dnn.train(x = x.tr , y = y.tr , hidden = h, activationfun = act, learningrate = LR, momentum = Mom, output = out, sae_output = sae, numepochs = Ep, batchsize = Bs) X<-dt2[ ,-ncol(dt2)] Y<-dt2[ ,ncol(dt2)] x.ts<-predict(prepr, tail(X, bar)) y.ts<-tail(Y, bar) pr.sae<-nn.predict(SAE, x.ts) #Вариант +/- mean if(dec == 1) sig<-ifelse(pr.sae>mean(pr.sae), -1, 1) #Вариант 60/40 if(dec == 2) sig<-ifelse(pr.sae>0.6, -1, ifelse(pr.sae<0.4, 1, 0)) sig.zz<-ifelse(y.ts == 0, 1,-1 ) bal<-cumsum(tail(price[ ,'CO'], bar) * sig) bal.zz<-cumsum(tail(price[ ,'CO'], bar) * sig.zz) if(pr) return(bal) if(!pr) return(bal.zz) }
使用第一和第二解码方法计算和评估资金曲线。
为了重现结果,在同一位置设置了一个伪随机数发生器。
> set.seed<-1245 > Bal1<-Testing.1(dt.b, dt, h = c(30, 30, 30), LR = 0.7, dec = 1) 开始训练 sae ...... training layer 1 autoencoder ... training layer 2 autoencoder ... training layer 3 autoencoder ... sae 训练完毕。 开始训练深度神经网络 ...... 深度神经网络训练完毕。 > set.seed<-1245 > Bal2<-Testing.1(dt.b, dt, h = c(30, 30, 30), LR = 0.7, dec = 2) 开始训练 sae ...... training layer 1 autoencoder ... training layer 2 autoencoder ... training layer 3 autoencoder ... sae 训练完毕。 开始训练深度神经网络 ...... 深度神经网络训练完毕。 > plot(Bal2, t = "l") > lines(Bal1, col = 2)
8
图28。最近500条柱面资本曲线采用不同的方法解码后的神经网络信号。
显然,60/40译码方法有更好的资本曲线。还有改进的余地。
这是最后一个要检查的地方。从理论上讲,多个神经网络的结合可以得到更好、更稳定的结果。我们将测试多个神经网络的组合,并在同一个样本上训练它们,尽管它们也可以在单独的样本上训练。组合网络的预测结果是神经网络所有预测结果的简单平均值。还有其他更复杂的平均方法。
我们打算改进函数测试(),添加一个参数-ans=1,定义为组合中的网络数量。
3.4.1并行计算
由于多个独立模型的操作可以很容易地并行处理,因此我们打算利用R语言提供的机会创建一个具有多个处理器核心的集群或独立于操作系统的本地计算机网络。
要实现这一点,我们需要使用“foreach”和“doparallel”工具包。这是一个简单的函数,可以加载集群中的所有处理器核心。
library(doParallel) library(foreach) puskCluster<-function(){ cores<-detectCores() cl<-makePSOCKcluster(cores) registerDoParallel(cl) clusterSetRNGStream(cl) return(cl) }
这里有几个要点要解释。前两行代码加载必要的类库。它们需要预先安装在您的计算机上。然后我们确定处理器中有多少个核心,创建一个集群,注册一个用于并行计算的包,在每个计算线程中注册一个独立的伪随机数生成器,并返回集群句柄。每个模型的伪随机数生成器的质量非常重要,但这是一个单独的主题。
在计算集群负载并完成所有必需的操作之后,我们必须记住关闭它:
cl<-puskCluster() stopCluster(cl)
并行操作通过以下公式“foreach”执行:
SAE<-foreach(times(ans), .packages = "deepnet") %dopar% sae.dnn.train(x = x.tr , y = y.tr , hidden = h, activationfun = act, learningrate = LR, momentum = Mom, output = out, sae_output = sae, numepochs = Ep, batchsize = Bs)
Times(ans)是我们想要得到的网络号码,以及。packages指向获取计算函数的包。
结果是列出了我们需要的经过训练的神经网络的数量。
然后我们从每个网络中得到预测值,并计算出平均值。
pr.sae<-(foreach(i = 1:ans, .combine = "+") %do% nn.predict(SAE[[i]], x.ts))/ans
这里我是训练网络向量的索引。comb=“+”确定所有神经网络应返回的预测值的形式。这里,我们不需要并行计算(运算符%do%),而是要求按顺序返回和执行总和和值。得到的和结果将除以神经网络的个数,这是最终的结果。它很好也很简单。
在与上述参数相同的情况下,采用60/40模式对由三个和四个神经网络组成的基金曲线进行了计算和解码。比较了相同神经网络的结果。为了评估并行计算的效果,将周期增加到300并计算预测时间。
1。神经网络:
> system.time(Bal21<-Testing.1(dt.b, dt, h = c(30, 30, 30), LR = 0.7, dec = 2, Ep=300)) 开始训练 sae ...... training layer 1 autoencoder ... ####loss on step 10000 is : 0.000057 ####loss on step 20000 is : 0.000043 training layer 2 autoencoder ... ####loss on step 10000 is : 0.000081 ####loss on step 20000 is : 0.000086 training layer 3 autoencoder ... ####loss on step 10000 is : 0.000072 ####loss on step 20000 is : 0.000066 sae 训练完毕。 开始训练深度神经网络 ...... ####loss on step 10000 is : 0.069451 ####loss on step 20000 is : 0.079629 深度神经网络训练完毕。 user system elapsed 115.78 0.00 116.96 > plot(Bal21, t = "l") > abline(h = 0)
2。三种神经网络的组合:
> system.time(Bal41<-Testing.2(dt.b, dt, h = c(30, 30, 30), LR = 0.7, Ep=300, dec = 2, ans=3)) user system elapsed 0.22 0.06 233.64 > lines(Bal41, col=4)
三。神经网络的四种组合:
> system.time(Bal44<-Testing.2(dt.b, dt, h = c(30, 30, 30), LR = 0.7, Ep=300, dec = 2, ans=4)) user system elapsed 0.13 0.03 247.86 > lines(Bal44, col=2)
如果线程数是处理器数的倍数,则并行计算运行速度最快。我用的是2核处理器。
现金支取无明显差异。下图中,有三个网络为蓝色-四个为红色,一个为黑色。
9
数字。29。基于三、四和一个网络场景的信号交易后,最近500个柱面上的基金曲线
一般来说,结果取决于许多因素,如输入和输出数据、标准化方法、隐藏层的数量和这些层中的神经元数量、训练序列、训练周期的数量等。
最后三个例子。以每层神经元数目不同的三个隐层和三个神经网络作为信号发生器,计算出最后1000个柱面的资金曲线。
> system.time(Bal0<-Testing.1(dt.b, dt, h = c(30, 30, 30), LR = 0.7, dec = 2, Ep=300, bar=1000)) 开始训练 sae ...... training layer 1 autoencoder ... ####loss on step 10000 is : 0.000054 ####loss on step 20000 is : 0.000044 training layer 2 autoencoder ... ####loss on step 10000 is : 0.000078 ####loss on step 20000 is : 0.000079 training layer 3 autoencoder ... ####loss on step 10000 is : 0.000090 ####loss on step 20000 is : 0.000072 sae 训练完毕。 开始训练深度神经网络 ...... ####loss on step 10000 is : 0.072633 ####loss on step 20000 is : 0.057917 深度神经网络训练完毕。 user system elapsed 116.09 0.02 116.26 > max(Bal0) [1] 0.04725 > plot(Bal0, t="l") > tail(Bal0,1) [1] 0.03514
最大利润是472点,最新的专栏文章截止点是351点。这个数字是黑色的。
> system.time(Bal0<-Testing.1(dt.b, dt, h = c(13, 8, 5), LR = 0.7, dec = 2, Ep=300, bar=1000)) 开始训练 sae ...... training layer 1 autoencoder ... ####loss on step 10000 is : 0.005217 ####loss on step 20000 is : 0.004846 training layer 2 autoencoder ... ####loss on step 10000 is : 0.051324 ####loss on step 20000 is : 0.046230 training layer 3 autoencoder ... ####loss on step 10000 is : 0.023292 ####loss on step 20000 is : 0.026113 sae 训练完毕。 开始训练深度神经网络 ...... ####loss on step 10000 is : 0.057788 ####loss on step 20000 is : 0.056932 深度神经网络训练完毕。 user system elapsed 64.04 0.01 64.24 报警信息: In sae$encoder[[i - 1]]$W[[1]] %*% t(train_x) + sae$encoder[[i - : longer object length is not a multiple of shorter object length > lines(Bal0, col="blue")
显然,这是无效的。
第三种:
> system.time(Bal0<-Testing.1(dt.b, dt, h = c(50, 50, 50), LR = 0.7, dec = 2, Ep=300, bar=1000)) 开始训练 sae ...... training layer 1 autoencoder ... ####loss on step 10000 is : 0.000018 ####loss on step 20000 is : 0.000013 training layer 2 autoencoder ... ####loss on step 10000 is : 0.000062 ####loss on step 20000 is : 0.000048 training layer 3 autoencoder ... ####loss on step 10000 is : 0.000053 ####loss on step 20000 is : 0.000055 sae 训练完毕。 开始训练深度神经网络 ...... ####loss on step 10000 is : 0.096490 ####loss on step 20000 is : 0.084860 深度神经网络训练完毕。 user system elapsed 186.18 0.00 186.39 > lines(Bal0, col="red") > max(Bal0) [1] 0.0543
0
图30。采用三种不同数量隐藏神经元的神经网络作为信号发生器,计算出最后1000个柱面的资本曲线。
结果表明,第三个是最佳的,最大利润为543分。仅仅改变隐藏神经元的数量就有很大的不同。采用遗传算法寻找最优参数。这是留给读者自己学习的。nbsp;
读者应该记住,作者的算法没有在这个包中完全实现。
4。成就(指标和EA)
现在我们需要编写一个索引和EA程序来接收深度神经网络交易信号。
实现这一点有两种方法:
- 第一种方式。神经网络的训练是在RSTUDIO中人工进行的。在获得可接受的结果后,将网络保存在适当的目录中。然后在图表上加载EA和度量。EA将加载经过训练的神经网络。指标将每个新列上的输入数据组织成向量并传递给EA。EA呈现神经网络数据,接收事务信号并执行事务。EA执行诸如打开、关闭和跟踪停止等常规操作。索引的目标是准备并将每个新列的输入数据传输到EA,最重要的是在图上显示网络的预测信号。实践证明,视觉控制是评价神经网络最有效的方法。
- 第二种方法。在图表上加载EA和度量。加载后,度量值将通过一个大型预先准备的输入输出数据集传递给EA。EA开始训练、测试和选择最好的神经网络。之后的操作与第一种方法相同。
我们打算根据第一个算法编写一个索引EA关联程序。EA的最简单实现。
为什么这么难?此实现允许不同货币对/时间框架上的多个指标与相同的EA关联,并正常工作。要实现这一点,EA必须进行细微的调整。我们打算稍后再讨论。
以下是指标与EA的互动结构:
–
数字。31。指标与EA
的交互结构
4.1。培训与保存模式
将度量加载到我们感兴趣的图表上,以获取必要的源数据。例如,将度量值放在图表上,将输入参数send设置为false,可视化表示不会发送到服务器。在第一次加载到货币对或时间帧后,指示器将在终端的数据文件夹下创建以下目录(/mql4/files):/symbol/tf/test_data/。
这样的目录组织将使实验结果不同于预先培训的网络模型,新数据将不覆盖旧数据。中间结果将存储在/symbol/tf/test_data/目录中,EA将使用的网络模型将位于/symbol/tf/目录中(必须手动放置在此处)。当第一次加载到新的货币对图表或EA时间框架上时,将获得相同的结果。
因此,对于30欧元,2014年10月14日有4000个气缸。我们使用dt[]时间框架。
基金:
> dt.b<-Balancing(dt) > table(dt.b[ ,ncol(dt.b)]) 0 1 2288 2288
现在我们用test.1()函数训练500和300个周期的深部神经网络,并将神经网络预测的信号进行交换,得到最近的500条圆柱资本曲线。
> system.time(bal<-Testing.1(dt.b, dt, h = c(50, 50, 50), LR = 0.7, dec = 2, Ep=500, bar=500)) 开始训练 sae ...... training layer 1 autoencoder ... ####loss on step 10000 is : 0.000017 ####loss on step 20000 is : 0.000015 ####loss on step 30000 is : 0.000015 training layer 2 autoencoder ... ####loss on step 10000 is : 0.000044 ####loss on step 20000 is : 0.000041 ####loss on step 30000 is : 0.000039 training layer 3 autoencoder ... ####loss on step 10000 is : 0.000042 ####loss on step 20000 is : 0.000042 ####loss on step 30000 is : 0.000036 sae 训练完毕。 开始训练深度神经网络 ...... ####loss on step 10000 is : 0.089417 ####loss on step 20000 is : 0.043276 ####loss on step 30000 is : 0.069399 深度神经网络训练完毕。 user system elapsed 267.59 0.08 269.37 > plot(bal, t="l")
用另一个名称保存神经网络并训练另一个网络。
> SAE1<-SAE > system.time(bal<-Testing.1(dt.b, dt, h = c(50, 50, 50), LR = 0.7, dec = 2, Ep=300, bar=500)) 开始训练 sae ...... training layer 1 autoencoder ... ####loss on step 10000 is : 0.000020 ####loss on step 20000 is : 0.000016 training layer 2 autoencoder ... ####loss on step 10000 is : 0.000050 ####loss on step 20000 is : 0.000050 training layer 3 autoencoder ... ####loss on step 10000 is : 0.000051 ####loss on step 20000 is : 0.000043 sae 训练完毕。 开始训练深度神经网络 ...... ####loss on step 10000 is : 0.083888 ####loss on step 20000 is : 0.083941 深度神经网络训练完毕。 user system elapsed 155.32 0.02 156.25 > lines(bal, col=2)
看看资本曲线(最新的结果是红色的)。
–
图32。根据基金曲线
对最近500个气缸的神经网络信号交易进行了500和300个周期的训练。
如我们所见,经过300个训练周期后,神经网络的结果要优于500个。
如果我们想在这个时间框架和培训课程中快速地重新学习,后者的培训时间更合适。
我们需要两个对象来进一步操作实际图形:训练模型“sae”和规范化参数“prepr”用于输入。将它们保存在相关目录中,这里是“d:/alpari limited mt4/mql4/files/eurusdus/m30/test_2014-10-14”。如果打开RSTDIO中指示器保存的“i_sae_eurusdus_30.rdata”工作区,这是已定义和操作的数据。
save(SAE, prepr, file="SAE.model")
在“SAE”中。模型文件,我们保存模型本身和规范化参数。不使用它们的模型毫无意义。你可以每天测试并保存你最喜欢的模型。它们将保存在文件夹“/file/symbol/tf/test_data”中。对于使用模型的EA,手动将“sae.model”文件放在“file/symbol/tf/”文件夹下。此文件夹只能保留一个模型,EA将使用该模型进行工作。
加载“SAE”后。model“文件,ea将这些对象加载到工作区中以便运行。此时,手工部分的工作就结束了,您可以在图表上加载指示器-ea进行实际测试。
需要定量标准来了解EA的有效性。此时精度系数不太稳定。
由之字形得到的预测资本的平均比率,以及最近的圆柱资本与圆柱资本数的比率。这是基于之字形指数的基金余额:
sig.zz<-ifelse(tail(dt[ , ncol(dt)], 500) == 0, 1, -1) bal.zz<-cumsum(tail(price[ , 'CO'], 500) * sig.zz) Kzz<-mean(bal.zz / bal) > Kzz [1] 0.9173312
这是一个非常好的结果,但只是相对的。
如果我们观察一段时间后,我们会发现最初的50-100个圆柱体是不稳定的,但它们逐渐接近常数。统计如下:
> plot(bal/bal.zz, t="l") > summary(bal/bal.zz) Min. 1st Qu. Median Mean 3rd Qu. Max. -15.2500 0.7341 0.7844 0.9173 0.8833 55.0000
3
图33。与
相比,曲折指数交易所获得的交易和基金余额的神经网络预测
第二个更准确,因为它显示了在长度为N.
的圆柱形间隔内每根钢筋上获得的利润点数量。
例如,神经网络预测交易中500个气缸的资本余额:
> Kb<-tail(bal,1)/length(bal)*10^Dig > Kb [1] 11.508
之字形信号交易:
> Kbz<-tail(bal.zz,1)/length(bal)*10^Dig > Kbz [1] 13.784
当一个参数的有效下限被定义时,我们可以对神经网络进行再训练或对其参数进行优化。
ea将在图表上显示以下参数:op-执行操作,acc-精度,k-是以前定义的kb,kmax-与kb相同,但由大写高度定义,给出此参数的最大值与最近列上的值之间的差。
4.2。安装和加载命令
在附件sae.zip中:
- i_sae.mq4索引放在~/mql4/indicators/目录中。
- e_sae.mq4 ea,位于~/mql4/experts/目录中。
- mt4rb7.dll库位于~/mql4/libraries/目录中。
- mt4rb7.mqh头文件放在~/mql4/include/目录中。库和头文件由BerndKreuss开发。文件名包含最新更新版本的索引号(B7)。当有许多相同名称的版本时,它将是混乱的,需要花费大量的时间来整理它。
- R脚本:I_Sae.r(主指标脚本)、I_Sae_Fun.r(指标脚本函数)、E_Sae.r(EA脚本)、E_Sae_Init.r(EA初始化脚本)、Sae_SetDir.r(验证脚本和创建目录脚本)。脚本不依赖于货币对或时间帧,它们可以存储在单独的目录中。我把它写在“c:rdata/sae/”下面。“c:rdata/”目录包含未附加到任何项目的不同脚本。如果您的脚本与我的不同,请确保在metrics和ea中对其进行修改,以便它能够正确调用脚本。
- SAE。模型是包含“sae”模型和规范化参数“prepr”的文件。该车型采用欧元兑美元(M30)进行培训,最新上市时间为2014年10月14日。培训过程已在上文中进行了解释。
不要忘记R语言包存储在您的计算机上的位置。
最好从以下步骤开始。将EA加载到图中。如果您决定将EA加载到另一个货币对中,则需要标识与先前加载的服务器不同的端口。例如,端口8886(默认端口8888)。
小心。这显然不是一种有效的方法。每个服务器空间约为120-130 MB。这就是今天的情况。
EA初始化后,报警“无计算结果!将出现货币对。然后安装带有外部参数send=true的指示器,并确定指示器连接到的服务器端口(请参见上文)。如果所有的工作都正确,实际数据“操作”、精度、k和kmax将出现在输出字符串中,并开始执行事务。
管理此进程的最有效方法是通过Windows任务管理器。加载EA或度量时,如果rterm未出现在任务列表中,则R处理器崩溃。这个问题的主要原因是脚本中的语法错误,这是由于接收到的MQL向量的长度与从rterm解析的向量的长度不匹配造成的。
这个问题可以通过在rstudio中从头到尾调试脚本来解决。
不幸的是,我无法在策略测试人员中加载这个EA,因为它必须使用模拟帐户进行测试。
4.3。提高质量特性的途径和手段
- 更改用作输入的度量集。
- 更改输入数据的规范化方式。
- 优化“主管”和指标的输入参数。
- 更改具有两列的矩阵的输入变量编码。校准预测信号。
- 优化网络参数(隐层神经元数、层数、学习序列、周期数)。
总结
我们已经创建、训练和测试了深部神经网络模型,并通过隐藏层中的sae初始化了神经元的权重。重新培训网络非常快,不需要中断交易过程。
神经网络显示结果为统计平均。理想的结果不是最初的目标。
使用这样的模型和有效系数的连续评估,模型和优化不会破坏交易过程。
圈地:
- sae.zip-指标、EA和相关文件。
- 与俄罗斯文学相关的导论。
- deeplarning.zip-与深入学习相关的文献。
本文由MetaQuotes Software Corp.翻译自俄语原文
,网址为https://www.mql5.com/ru/articles/1103。
MyFxtop迈投(www.myfxtop.com)-靠谱的外汇跟单社区,免费跟随高手做交易!
免责声明:本文系转载自网络,如有侵犯,请联系我们立即删除,另:本文仅代表作者个人观点,与迈投财经(www.myfxtop.cn)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。