简介

时间序列简单的说就是各时间点上形成的数值序列,时间序列分析就是通过观察历史数据预测未来的值。预测未来股价走势是一个再好不过的例子了。在本文中,我们将看到如何在递归神经网络的帮助下执行时间序列分析。我们将根据过去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. 定时器和函数的使用初级------移动一个div元素

    在页面的动画效果中,经常有看到某个小块从一个地方移动到另一个地方的现象,现在,我们也来自己做一个这样的小动画,涉及到的基础包括定时器的使用和函数的使用 例如,我们要实现一个小方块从左面移动到右面,然后 ...

  2. 1.Ansible安装以及配置

    本节内容以Centos7为系统环境进行讲解: 1.安装epel源,方便直接yum安装: wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun ...

  3. JAVA获取系统信息以及系统时间

    在做测试的时候,经常需要获取系统信息,并且用获取到的系统时间给生成的报告取名字. 以下代码实在TestNG展示的,没有Test NG的话需要些一个main方法. import java.net.Ine ...

  4. gitlab 常用维护命令

    GitLab简介 GitLab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务.Github是公共的git仓库,而Gitlab适合于搭建企业内部私有gi ...

  5. python的arp扫描

    python的arp扫描 from optparse import *from scapy.all import *parser = OptionParser()parser.add_option(& ...

  6. MySQL 详细学习笔记

    Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...

  7. localStorage,sessionStorage,cookie使用场景和区别

    localStorage:HTML5新增的在浏览器端存储数据的方法.设置和获取localStorage的方法: 设置: localStorage.name = 'zjj'; 获取: localStor ...

  8. Python+Selenium学习--控制浏览器控制条

    场景 有时候web 页面上的元素并非直接可见的,就算把浏览器最大化,我们依然需要拖动滚动条才能看到想要操作的元素,这个时候就要控制页面滚动条的拖动,但滚动条并非页面上的元素,可以借助JavaScrip ...

  9. NoSql 数据库理解

    主要分类: 键值(Key-Value)存储数据库 这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据.Key/value模型对于IT系统来说的优势在于简单.易部署.但是 ...

  10. Eigen矩阵基本运算

    1 矩阵基本运算简介 Eigen重载了+,-,*运算符.同时提供了一些方法如dot(),cross()等.对于矩阵类的运算符重载只支持线性运算,比如matrix1*matrix2是矩阵相乘,当然必须要 ...