首页 股吧 正文

4万亿救市股票正弦波(股票正弦波理论)

2023-11-23 06:11:53 7
神七论市
作者介绍:

Jakob Aungiers 现就职于汇丰银行伦敦总部,担任全球财物办理的开发副总裁。拿手机器学习,神经网络等范畴。(以下为译文)

谈及机器学习,神经网络无疑是当时的热门话题。因而,在网络上环绕神经网络的教程和社区多不胜数。现在虽然有很多的公共研讨论文和文章触及LSTM,但我发现,这些理论和比如并没有显现出LSTM在时刻序列猜测上的实在实力。有鉴于此,我决议以本文作抛砖引玉之用,运用LSTM来猜测一些时刻序列—例如股市(运用Keras包,对应Python版别为2.7)。

此项意图完好代码能够在GitHub页面上找到(链接)。

简略的正弦波

让咱们从最基本的工作开端----标准正弦波函数。首要创立数据,然后模仿这个函数的多个振动,以便进行LSTM网络练习。我做了一个excel电子表格,这是一个起伏和频率为1(给出角频率为6.28)的正弦波,我运用该函数取得超越5001个数据点的时刻段,时刻增量为0.01。其成果看起来是这样的:

(用作练习/测验文件的链接在这里)这些数据有什么用呢?LSTM将从这一组窗口巨细数据值来学习正弦波,然后LSTM会据此来进行时序猜测以画出n步后的波形图。

咱们首要从CSV文件中转化和载入数据到numpy数组中,然后喂养LSTM。Keras LSTM层的工作方式是经过接纳3维(N,W,F)的数字阵列,其间N是练习序列的数目,W是序列长度,F是每个序列的特征数目。我挑选的一个序列长度(读取窗口巨细)为50,这可让网络在每个序列中知道正弦波的形状,然后教会自身根据从前窗口信息的前提下树立序列的形式。序列自身是滑动的窗口,因而每次移动1长度后,会坚持与从前窗口的稳定堆叠。长度为50的序列的示例

下面是将练习数据CSV加载到正确形状numpy数组中的代码:

def load_data(filename): f = open(\'sinwave.csv\', \'rb\').read() data = f.split(\'\\r\\n\') sequence_length = 50 result = [] for index in range(len(data) - sequence_length): result.append(data[index: index + sequence_length]) result = np.array(result) row = round(0.9 * result.shape[0]) train = result[:row, :] np.random.shuffle(train) x_train = train[:, :-1] y_train = train[:, -1] x_test = result[row:, :-1] y_test = result[row:, -1] x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1)) x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1)) return [x_train, y_train, x_test, y_test]

接下来,咱们需求实践构建网络自身。我运用了[1,50,100,1]的网络结构,其间咱们有1个输入层(由巨细为50的序列组成),该输入层喂养50个神经元给LSTM层,接着该LSTM层喂养100个神经元给另一个LSTM层,然后运用一个线性激活函数来喂养一个彻底衔接的正常层以用于下一个时刻步的猜测。

模型构建函数代码如下:

def build_model(layers): model = Sequential() model.add(LSTM( input_dim=layers[0], output_dim=layers[1], return_sequences=True)) model.add(Dropout(0.2)) model.add(LSTM( layers[2], return_sequences=False)) model.add(Dropout(0.2)) model.add(Dense( output_dim=layers[3])) model.add(Activation("linear")) start = time.time() modelpile(loss="mse", optimizer="rmsprop") print "Compilation Time : ", time.time() - start return model

最终是练习网络上的数据,看看咱们得到了什么。在该LSTM我只运用了1个练习时期,这有别于需求很多练习数据的传统网络。由于咱们运用的是简的具可猜测形式的正弦波,1练习时期将满足取得十分近似的全sin函数。

放入run.py模块后的代码:

epochs = 1seq_len = 50print \'Loading data... \'X_train, y_train, X_test, y_test = lstm.load_data(\'sinwave.csv\')print \'\\nData Loaded. Compiling...\\n\'model = lstm.build_model([1, 50, 100, 1])model.fit( X_train, y_train, batch_size=512, nb_epoch=epochs, validation_split=0.05)predicted = lstm.predict_point_by_point(model, X_test)

假如你留意到你会留意到咱们在上面的load_data()函数中,咱们将数据分为练习/测验集,这是机器学习问题的标准做法。但是,咱们需求留意的是,咱们实践上想要在时刻序列完成猜测。

假如咱们运用测验集,咱们将运转每个窗口的实在数据来猜测下一个时刻步。下图是运用该办法后的成果:epochs = 1, window size = 50

但是,假如咱们想要猜测许更多的时刻步,咱们需运用来自测验数据的第一个窗口作为发动窗口。 在每个时刻步,弹出窗口后边的最早条目,并将下一个时刻步猜测附加到窗口的前面,实质上是移动窗口,所以它是慢慢地用猜测树立自己,直到窗口都是猜测值(在咱们的比如中,由于咱们的窗口巨细为50,这将发生在50个时刻步之后)。 然后,咱们无限期地坚持这一点,猜测下一步对未来时刻进程的猜测,然后完成看到趋势猜测。

下图显现了仅从实在测验数据的初始开端窗口猜测的正弦波时刻序列,然后猜测约500步:

epochs = 1, window size = 50

除了简略的正弦波猜测,LSTM还能做更杂乱的猜测吗?答案是必定的,例如以下的有关股票市场的时刻序列猜测。什么?!股票猜测!!是的。这是LSTM另一个技术--潜在躲藏趋势预判。

首要我预备了一个CSV文件(链接),其保存的是标准普尔500股权指数从2000年1月到2016年8月的收盘数据。我使它与咱们的正弦波数据具彻底相同的格局,然后运转相同的模型。

这之前咱们需求对咱们的数据做一个细小的改动,由于正弦波已经是一个很标准的重复形式,但股票数据是不标准的。因而为了应对这种状况,咱们需求使练习/测验数据的每个n巨细的窗口进行标准化,以反映从该窗口开端的百分比改变(因而点i = 0处的数据将一直为0)。咱们将运用以下方程式进行归一化,然后在猜测进程结束时进行反标准化,以得到猜测中的实在国际数:

n =价格改变的标准化列表[窗口]

p =原始列表[窗口]调整的每日报答价格

标准化公式:

-1)

反标准化公式:

)

在代码中增加一个normalise_windows(window_data)函数,并更新load_data(filename)函数以包括一个条件调用,以及获取序列长度和标准化标志load_data(filename,seq_len,normalise_window):

代码如下:

def load_data(filename, seq_len, normalise_window): f = open(filename, \'rb\').read() data = f.split(\'\\r\\n\') sequence_length = seq_len + 1 result = [] for index in range(len(data) - sequence_length): result.append(data[index: index + sequence_length]) if normalise_window: result = normalise_windows(result) result = np.array(result) row = round(0.9 * result.shape[0]) train = result[:row, :] np.random.shuffle(train) x_train = train[:, :-1] y_train = train[:, -1] x_test = result[row:, :-1] y_test = result[row:, -1] x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1)) x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1)) return [x_train, y_train, x_test, y_test]def normalise_windows(window_data): normalised_data = [] for window in window_data: normalised_window = [((float(p) / float(window[0])) - 1) for p in window] normalised_data.append(normalised_window) return normalised_data

归一化了如上所述的窗口后,咱们现在能够经过LSTM网络运转咱们的股票数据。 让咱们看看它的运转状况:在如上所述的单个逐点猜测上运转数据给出了与实践适当挨近的图形。但这是欺骗性的!为什么?假如你更细心地看,猜测线由单一的猜测点组成,它们在它们之后具有整个从前的实在前史窗口。因而,网络并不依靠时刻序列自身,除了每下一个点或许不会离最终一点太远。因而,即便它得到过错猜测的点,下一个猜测可在考虑实在前史后疏忽不正确的猜测,并答应再次出现过错。

那么,咱们来看看是否真的有一些潜在的形式在价格中变化切可区分?接下来让咱们做对正弦波问题做的相同工作,让网络猜测点序列而不是下一个点。

这样,咱们现在能够看到,与作为正弦波序列的正弦波不同,它与实在数据简直相同,咱们的股票数据猜测很快地收敛到某种平衡。epochs = 50, window size = 50epochs = 1, window size = 50

让咱们进一步研讨回归收敛,将咱们的猜测序列约束到50个未来时刻步长,然后每次将发动窗口移动50单位:

epochs = 1, window size = 50, sequence shift = 50

而当epochs增加到时(这应该使模型形式更精确),咱们看到,实践上它现在仅仅企图猜测简直每个时刻段的向上动量。epochs = , window size = 50, sequence shift = 50

小结:

LSTM的使用日益广泛,例如文本猜测,AI智能谈天,自驾车等许多前沿范畴。 期望本文能有助你开辟LSTM在时刻序列中使用的视界。

本文由北邮@爱可可-爱日子 教师引荐,阿里云云栖社区安排翻译。

文章原标题《LSTM NEURAL NETWORK FOR TIME SERIES PREDICTION》,作者:Jakob Aungiers ,译者:伍昆

更多深度文章,欢迎重视云栖社区:yq.aliyun/cloud

收藏
分享
海报
7