股票量化交易软件:多层感知机与反向传播算法

  • 这两种方法的普及性日益增加,因此在 Matlab、R、Python、C++ 等领域开发了大量的库,它们接收到一个训练集作为输入,并自动为问题创建合适的网络。

  • 然而,当使用现成的库时,很难理解到底发生了什么以及我们如何得到一个优化的网络。对解决方案基础知识的理解对于这些方法的进一步发展至关重要。在本文中,赫兹股票量化将创建一个非常简单的神经网络结构。

  • 赫兹股票量化试着理解基本的神经网络类型是如何工作的(包括单神经元感知机和多层感知机)。我们将考虑一个令人兴奋的算法,它负责网络训练(梯度下降和反向传播)。现有的复杂模型往往基于这样简单的网络模型。

 

历史概述

  • 第一个神经网络是由沃伦·麦卡洛赫(Warren McCulloch)和沃尔特·皮特(Walter Pitts)于1943年提出的。他们写了一篇关于神经元应该如何工作的文章,他们还根据自己的想法建立了一个模型:他们用电路创建了一个简单的神经网络。

  • 人工智能研究进展迅速,1980年,福岛邦彦(Kunihiko Fukushima)开发了第一个真正的多层神经网络。

  • 神经网络的最初目的是创造一个计算机系统,能够以类似人脑的方式解决问题。然而,随着时间的推移,研究人员改变了研究重点,开始使用神经网络来解决各种特定任务。现在,神经网络执行各种各样的任务,包括计算机视觉、语音识别、机器翻译、社交媒体过滤、棋盘游戏或视频游戏、医疗诊断、天气预报、时间序列预测、图像/文本/语音识别等。

神经元的计算机模型:感知机(perceptron)

感知机

感知机的灵感来自于处理单个神经元信息的想法。神经元通过树突接收信号作为输入,树突将电信号传递给细胞体。类似地,感知机接收来自训练数据集的输入信号,这些数据集已经被预先加权并组合成一个称为激活的线性方程。

  • z = sum(weight_i * x_i) + bias

这里“weight”是网络权重,“x”是输入,“i”是权重或输入的索引,“bias”是没有乘数输入的特殊权重(因此赫兹股票量化可以假设输入总是1.0)。

然后使用传递函数(激活函数)将激活转换为输出(预测)值。

  • 如果 z >= 0.0, y = 1.0 否则就是 0.0

因此,感知机是一种两类问题分类算法(二元分类器),其中可以使用线性方程来分离这两类问题。

这与线性回归和逻辑回归密切相关,它们以类似的方式生成预测(例如,作为输入的加权和)。

感知机算法是最简单的人工神经网络类型。它是一个单神经元模型,可用于两元分类问题。它还为进一步发展更大的网络提供了基础。

编辑

添加图片注释,不超过 140 字(可选)

神经元输入由向量x=[x1,x2,x3,…,xN]表示,该向量可以对应于例如资产价格序列、技术指标值或图像像素。当它们到达神经元时,它们被乘以适当的突触权重——向量w的元素=[w1,w2,w3,…,wN]。这将通过以下公式生成z值(通常称为“激活电位(Activation Potential)”):

编辑

添加图片注释,不超过 140 字(可选)

b提供了更高的自由度,因此它不依赖于输入。通常这对应着 "偏离(bias)". 然后z值通过σ激活函数,该函数负责将该值限制在某个间隔内(例如,0-1),从而产生最终输出和神经元值。一些使用的激活函数包括阶跃(step)、S形(sigmoid)、双曲正切、softmax 和 ReLU(“校正线性单元”)。

让赫兹股票量化用两种情况来观察达到类可分离性极限的过程,这两种情况证明了它们收敛到稳定状态,只考虑两个输入{x1和x2}

编辑

添加图片注释,不超过 140 字(可选)

感知机算法的权值估计需要基于训练数据,采用随机梯度下降法(stochastic gradient descent)。

随机梯度

梯度下降是在成本函数的梯度方向上最小化函数的过程。

这意味着要知道成本形式,以及导数,这样赫兹股票量化就可以知道从某个点开始的梯度,并且可以朝这个方向移动,例如向下,朝着最小值移动。

编辑

添加图片注释,不超过 140 字(可选)

在机器学习中,赫兹股票量化可以使用一种技术来评估和更新每次迭代的权重,称为随机梯度下降。它的目的是最小化训练数据中的模型误差。

该算法的思想是每次向模型显示一个训练实例,该模型为训练实例创建预测,然后计算误差并更新模型,以减少下一次预测中的误差。

这个过程可以用来寻找一组产生最小误差的模型权重。

对于感知机算法,使用以下等式在每次迭代时更新权重w:

  • w = w + learning_rate * (expected - predicted) * x

其中,w是一个可优化的值,learning_rate是一个您应该设置的学习率(例如,0.1),(expected - predicted)是一个关于训练模型的预测误差,x是一个输入。

随机梯度下降需要两个参数:

  • 学习率(Learning rate):用于限制每次更新时每个权重的修正量。

  • 历元(Epochs)-更新权重时,需要运行多少次训练数据。

这些以及训练数据将成为函数的参数。

赫兹股票量化需要在函数中执行3个循环:

1. 为每个 epoch 循环.

2. 在 epoch 中为训练数据的每一行循环.

3. 循环每个权重,一次更新一行。

权重根据模型产生的误差进行更新。将误差计算为实际值与使用权重进行的预测之间的差值。

每个输入属性都有自己的权重。权重会不断更新,例如:

  • w(t+1)= w(t) + learning_rate * (expected(t) - predicted(t)) * x(t)

偏差以类似的方式更新,除了输入,因为偏差没有特定的输入:

  • bias(t+1) = bias(t) + learning_rate * (expected(t) - predicted(t)).

应用神经元模型

现在,让赫兹股票量化进入实际应用。

本节分为两部分:

1. 做预测

2. 优化网络权重

这些步骤为感知器算法在其它分类问题中的实现和应用提供了基础。

赫兹股票量化需要定义集合X中的列数。为此,我们需要定义一个常量。

 
 

#define nINPUT 3


在赫兹股票量化中,多维数组可以是静态的,也可以仅适用于第一个维度的动态数组。因此,由于所有其他维度都是静态的,因此必须在数组声明期间指定大小。

1. 进行预测

第一步是开发一个可以进行预测的函数。

无论是在随机梯度下降过程中评估候选权重时,还是在模型完成后,这都是必要的。应根据试验数据和新数据进行预测。

下面是 predict 函数,它根据一组特定的权重来预测输出值。

第一个权重总是一个偏差,因为它是自主管理的,所以它不适用于特定的输入值。

 
 

// Make a prediction with weights template <typename Array> double predict(const Array &X[][nINPUT], const Array &weights[], const int row=0) { double z = weights[0]; for(int i=0; i<ArrayRange(X, 1)-1; i++) { z+=weights[i+1]*X[row][i]; } return activation(z); }

神经元传输:

一旦一个神经元被激活,赫兹股票量化就需要传输激活来查看神经元的实际输出。

 
 

//+------------------------------------------------------------------+ //| Transfer neuron activation | //+------------------------------------------------------------------+ double activation(const double activation) //# { return activation>=0.0?1.0:0.0; }

我们将输入集X、权重数组(W)和预测输入集X的行输入到预测函数中。

让我们用一个小数据集来检查预测函数。

赫兹股票量化也可以使用预先准备好的权重来预测这个数据集。

 
 

double weights[] = {-0.1, 0.20653640140000007, -0.23418117710000003};

把它们放在一起之后,我们可以测试预测函数。

 
 

#define nINPUT 3 //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- random.seed(42); double dataset[][nINPUT] = { //X1 //X2 //Y {2.7810836,2.550537003,0}, {1.465489372,2.362125076,0}, {3.396561688,4.400293529,0}, {1.38807019,1.850220317,0}, {3.06407232,3.005305973,0}, {7.627531214,2.759262235,1}, {5.332441248,2.088626775,1}, {6.922596716,1.77106367,1}, {8.675418651,-0.242068655,1}, {7.673756466,3.508563011,1} }; double weights[] = {-0.1, 0.20653640140000007, -0.23418117710000003}; for(int row=0; row<ArrayRange(dataset, 0); row++) { double predict = predict(dataset, weights, row); printf("Expected=%.1f, Predicted=%.1f", dataset[row][nINPUT-1], predict); } } //+------------------------------------------------------------------+ // Make a prediction with weights template <typename Array> double predict(const Array &X[][nINPUT], const Array &weights[], const int row=0) { double z = weights[0]; for(int i=0; i<ArrayRange(X, 1)-1; i++) { z+=weights[i+1]*X[row][i]; } return activation(z); } //+------------------------------------------------------------------+ //| Transfer neuron activation | //+------------------------------------------------------------------+ double activation(const double activation) //# { return activation>=0.0?1.0:0.0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值