简介

时间序列简单的说就是各时间点上形成的数值序列,时间序列分析就是通过观察历史数据预测未来的值。预测未来股价走势是一个再好不过的例子了。在本文中,我们将看到如何在递归神经网络的帮助下执行时间序列分析。我们将根据过去5年的股价预测苹果公司之后的股价。

数据集

我们将使用从2013年1月1日到2017年12月31日的苹果股票价格作为训练集,2018年1月的价格作为测试集。所以,为了评估算法的效果,也要下载2018年1月的实际股票价格。

打开包含五年数据的苹果股票价格的训练文件后可以看到如下几列:“Date,Open,High,Low,Close,Adj Close,Volume”。本文,我们只关注日期和开盘价格,也即“Date”和“Open”两列。

我们先把日期和开盘价直观表示出来:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('./AAPL_train.csv')

x, y = pd.to_datetime(df['Date']), df['Open']

plt.title('AAPL Opening Stock Prices Against The Date')
plt.plot(x, y)

plt.show()

结果如下:

从图中可以看出,这种趋势是高度非线性的,我们很难用这些信息来总结趋势规律。这时候 LSTM 就可以派上用场了。LSTM(Long Short-Term Memory Network,长短期记忆网络)是一种能够记忆过去信息的递归神经网络,在预测未来值的同时,将过去的信息考虑在内。

现在让我们看看 LSTM 是如何用于时间序列分析的。

预测未来股价

股票价格预测与其他机器学习问题一样,都是先其中给定一组特征,然后再去预测相应的值。下面是执行步骤:

导入库

首先导入所需的库:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout

导入数据集

读取数据集并且只保留开盘价数据:

apple_training_complete = pd.read_csv('./AAPL_train.csv')
apple_training_processed = apple_training_complete.iloc[:, 1:2].values

数据归一化

这里将使用 sklear.preprocessing 中的 MinMaxScaler 类进行数据归一化,其中参数 feature_range 是用来指定缩放数据的范围:

scaler = MinMaxScaler(feature_range=(0, 1))

apple_training_scaled = scaler.fit_transform(apple_training_processed)

转换训练数据

如前文所提,在一个时间序列问题中,我们要根据天数 T-N 的数据去预测时间T的值,其中N可以是任意数。这里我们将根据过去60天的股票开盘价数据去预测股票开盘价。当然,你可以将60改成别的数字去看看运行效果,反正我这里是60是最好的选择。

下面我们将前60天的数据作为特征集,第61天的数据作为标签。创建特征和标签集:

features_set = []
labels = []
for i in range(60, 1260):
    features_set.append(apple_training_scaled[i - 60:i, 0])
    labels.append(apple_training_scaled[i, 0])

将特征集和标签集转换为 numpy 数组:

features_set, labels = np.array(features_set), np.array(labels)
features_set = np.reshape(features_set, (features_set.shape[0], features_set.shape[1], 1))

训练

创建四个 LSTM 层 与一个全连接层的训练模型,编译后开始训练。

model = Sequential()

model.add(LSTM(units=50, return_sequences=True, input_shape=(features_set.shape[1], 1)))
model.add(Dropout(0.2))

model.add(LSTM(units=50, return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(units=50, return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(units=50))
model.add(Dropout(0.2))

model.add(Dense(units=1))

model.compile(optimizer='adam', loss='mean_squared_error')

model.fit(features_set, labels, epochs=100, batch_size=32)

训练要花上一些时间,当然电脑好的话就不用愁了,反正我是等了很久。

测试

apple_testing_complete = pd.read_csv('./AAPL_test.csv')
apple_testing_processed = apple_testing_complete.iloc[:, 1:2].values

apple_total = pd.concat((apple_training_complete['Open'], apple_testing_complete['Open']), axis=0)

test_inputs = apple_total[len(apple_total) - len(apple_testing_complete) - 60:].values
test_inputs = test_inputs.reshape(-1, 1)
test_inputs = scaler.transform(test_inputs)

test_features = []
for i in range(60, 80):
    test_features.append(test_inputs[i - 60:i, 0])

test_features = np.array(test_features)
test_features = np.reshape(test_features, (test_features.shape[0], test_features.shape[1], 1))

predictions = model.predict(test_features)
predictions = scaler.inverse_transform(predictions)

plt.figure(figsize=(10, 6))
plt.plot(apple_testing_processed, color='blue', label='Actual Apple Stock Price')
plt.plot(predictions, color='red', label='Predicted Apple Stock Price')
plt.title('Apple Stock Price Prediction')
plt.xlabel('Date')
plt.ylabel('Apple Stock Price')
plt.legend()
plt.show()

预测结果:

图中蓝线2018年1月1日至今的实际股价,而红线表示预测的股价。很明显,该预测方法还是挺准的。如果对其他公司感兴趣的当然也可以去下载其他公司的数据根据本文给出的方法进行测试。欢迎关注呀~

基于 Keras 的 LSTM 时间序列分析——以苹果股价预测为例的更多相关文章

  1. 基于 Keras 用 LSTM 网络做时间序列预测

    目录 基于 Keras 用 LSTM 网络做时间序列预测 问题描述 长短记忆网络 LSTM 网络回归 LSTM 网络回归结合窗口法 基于时间步的 LSTM 网络回归 在批量训练之间保持 LSTM 的记 ...

  2. 【R实践】时间序列分析之ARIMA模型预测___R篇

    时间序列分析之ARIMA模型预测__R篇 之前一直用SAS做ARIMA模型预测,今天尝试用了一下R,发现灵活度更高,结果输出也更直观.现在记录一下如何用R分析ARIMA模型. 1. 处理数据 1.1. ...

  3. 基于R语言的时间序列分析预测

    数据来源: R语言自带 Nile 数据集(尼罗河流量) 分析工具:R-3.5.0 & Rstudio-1.1.453 #清理环境,加载包 rm(list=ls()) library(forec ...

  4. 用R做时间序列分析之ARIMA模型预测

    昨天刚刚把导入数据弄好,今天迫不及待试试怎么做预测,网上找的帖子跟着弄的. 第一步.对原始数据进行分析 一.ARIMA预测时间序列 指数平滑法对于预测来说是非常有帮助的,而且它对时间序列上面连续的值之 ...

  5. 时间序列分析之ARIMA模型预测__R篇

    http://www.cnblogs.com/bicoffee/p/3838049.html

  6. 时间序列分析工具箱——sweep

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/kMD8d5R/article/details/81977856 作者:徐瑞龙.量化分析师,R语言中文 ...

  7. 【转】时间序列分析——基于R,王燕

    <时间序列分析——基于R>王燕,读书笔记 笔记: 一.检验: 1.平稳性检验: 图检验方法:     时序图检验:该序列有明显的趋势性或周期性,则不是平稳序列     自相关图检验:(ac ...

  8. 《时间序列分析——基于R》王燕,读书笔记

    笔记: 一.检验: 1.平稳性检验: 图检验方法:     时序图检验:该序列有明显的趋势性或周期性,则不是平稳序列     自相关图检验:(acf函数)平稳序列具有短期相关性,即随着延迟期数k的增加 ...

  9. 手把手教你用 Keras 实现 LSTM 预测英语单词发音

    1. 动机 我近期在研究一个 NLP 项目,根据项目的要求,需要能够通过设计算法和模型处理单词的音节 (Syllables),并对那些没有在词典中出现的单词找到其在词典中对应的押韵词(注:这类单词类似 ...

随机推荐

  1. kaggle首秀之intel癌症预测(续篇)

    之前写了这篇文章.现在把他搬到知乎live上了.书非借不能读也,因此搞了点小费用,如果你觉得贵,加我微信我给你发红包返回给你. 最近的空余时间拿去搞kaggle了, 好久没更新文章了.今天写写kagg ...

  2. ElasicSearch(2) Linux运行

    1.org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearc ...

  3. svn的下载及安装

    什么是SVN: SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. SVN的下载安装: 下载地址:https: ...

  4. jquery之过滤filter,not

    <body> <h1>欢迎来到我的主页</h1> <p>我是唐老鸭</p> <p class="intro"> ...

  5. Intersect交集Except差集Union并集实例

    int[] oldArray = { 1, 2, 3, 4, 5 };int[] newArray = { 2, 4, 5, 7, 8, 9 };var jiaoJi = oldArray.Inter ...

  6. vue浏览器滚动加载更多

    created () { var that = this; window.addEventListener('scroll',this.scroll,true) console.log(this.$r ...

  7. Fiddler响应post的请求 request body

    是想传json格式的数据,请求头可以这样写:(应该先勾选 post,然后写上正确滴请求地址) User-Agent: Fiddler Host: localhost:1455 <span sty ...

  8. Pandas合并数据集之merge、join方法

    合并数据集 pandas.merge 可根据一个或多个键将不同DataFrame中的行连接起来. pandas.concat 可以沿着一条轴将多个对象堆叠到一起. combine_first merg ...

  9. C程序的编译与链接

    编译器驱动程序 编译器驱动程序可以在用户需要时调用语言预处理器.编译器.汇编器和链接器. 例如使用GNU编译系统,我们需要使用如下命令来调用GCC驱动程序: gcc -o main main.c 编译 ...

  10. 【python中二叉树的实现】python中二叉树的创建、三种方式递归遍历和非递归遍历

    代码如下: # coding=utf-8 class myNode(object): def __init__(self, data=-1, lchild=None, rchild=None): se ...