简介

时间序列简单的说就是各时间点上形成的数值序列,时间序列分析就是通过观察历史数据预测未来的值。预测未来股价走势是一个再好不过的例子了。在本文中,我们将看到如何在递归神经网络的帮助下执行时间序列分析。我们将根据过去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. ArcGIS自定义工具箱-字段分割

    ArcGIS自定义工具箱-字段分割 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:用指定分割符分割字段, 用例:湖南省长沙市=>湖南/长沙 数据源: 使 ...

  2. CSS 图像

    CSS 图像 <上一节下一节> 通过CSS可以控制图像的大小和对齐方式. 图像大小 虽然在HTML中,img标签有属性height.width设置高和宽,在工作中却使用得非常少,通常使用C ...

  3. 对于链表中tada的绝对值相等的点,仅保留第一次出现的结点而删除其余绝对值相等的点

    算法的核心思想是用空间换时间,使用辅助数组记录链表中已出现的数值  从而只需对链表进行一趟扫描 typedef struct node { int data; struct node* next; } ...

  4. html转换pdf

    项目需求:移动端APP项目需要在手机上签订合同,将html转换成pdf格式的文件 解决方案:是用插件wkhtmltopdf; 记录用法:1.网址https://wkhtmltopdf.org/ 下载压 ...

  5. 坑之mysql 字符串与数字操作

    select "123"+1 = 124; select "1a23"+1 = 2; select "aa23"+1 = 1; select ...

  6. python的int方法实现数据类型转换

    int方法默认以十进制来实现数据类型的转换: 举例: str1=" #给定的内容最好是纯数字,当然也可以是数字再掺杂点别的,最好别掺杂,因为会报错 print(type(str1),str) ...

  7. Python设计模式 - 创建型 - 单例模式(Singleton) - 十种

    对于很多开发人员来说,单例模式算是比较简单常用.也是最早接触的设计模式了,仔细研究起来单例模式似乎又不像看起来那么简单.我们知道单例模式适用于提供全局唯一访问点,频繁需要创建及销毁对象等场合,的确方便 ...

  8. layui模板和jfinal混合使用注意

    <!-- 列表信息展示 --> <div class="layui-row"> <table class="layui-table" ...

  9. python—切片

    切片就是list取值的一种方式 l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(l[1:5]) #取值方式顾头不顾尾 print(l[:5]) #冒号 前面 没写代 ...

  10. jsonarray根据id排序

    List<JSONObject> jsonValue=new ArrayList<JSONObject>(); JSONArray sortJsonarr=new JSONAr ...