作者:韩信子@ShowMeAI

深度学习实战系列https://www.showmeai.tech/tutorials/42

TensorFlow 实战系列https://www.showmeai.tech/tutorials/43

本文地址https://www.showmeai.tech/article-detail/327

声明:版权所有,转载请联系平台与作者并注明出处

收藏ShowMeAI查看更多精彩内容

股票价格数据是一个时间序列形态的数据,诚然,股市的涨落和各种利好利空消息更相关,更多体现的是人们的信心状况,但是它的形态下,时序前后是有一定的相关性的,我们可以使用一种特殊类型的神经网络『循环神经网络 (RNN)』来对这种时序相关的数据进行建模和学习。

在本篇内容中,ShowMeAI将给大家演示,如何构建训练神经网络并将其应用在股票数据上进行预测。

对于循环神经网络的详细信息讲解,大家可以阅读ShowMeAI整理的系列教程和文章详细了解:

数据获取

在实际建模与训练之前,我们需要先获取股票数据。下面的代码使用 Ameritrade API 获取并生成数据,也可以使用其他来源。

import matplotlib.pyplot as plt
import mplfinance as mpl
import pandas as pd td_consumer_key = 'YOUR-KEY-HERE'
# 美国航空股票
ticker = 'AAL'
##periodType - day, month, year, ytd
##period - number of periods to show
##frequencyTYpe - type of frequency for each candle - day, month, year, ytd
##frequency - the number of the frequency type in each candle - minute, daily, weekly
endpoint = 'https://api.tdameritrade.com/v1/marketdata/{stock_ticker}/pricehistory?periodType={periodType}&period={period}&frequencyType={frequencyType}&frequency={frequency}' # 获取数据
full_url = endpoint.format(stock_ticker=ticker,periodType='year',period=10,frequencyType='daily',frequency=1)
page = requests.get(url=full_url,params={'apikey' : td_consumer_key})
content = json.loads(page.content) # 转成pandas可处理格式
df = pd.json_normalize(content['candles']) # 设置时间戳为索引
df['timestamp'] = pd.to_datetime(df.datetime, unit='ms')
df = df.set_index("timestamp") # 绘制数据
plt.figure(figsize=(15, 6), dpi=80)
plt.plot(df['close'])
plt.legend(['Closing Price'])
plt.show() # 存储前一天的数据
df["previous_close"] = df["close"].shift(1)
df = df.dropna() # 删除缺失值 # 存储
df.to_csv('../data/stock_'+ticker+'.csv', mode='w', index=True, header=True)

上面的代码查询 Ameritrade API 并返回 10 年的股价数据,例子中的股票为『美国航空公司』。 数据绘图结果如下所示:

数据处理

我们加载刚才下载的数据文件,并开始处理预测。

# 读取数据
ticker = 'AAL'
df = pd.read_csv("../data/stock_"+ticker+".csv") # 设置索引
df['DateIndex'] = pd.to_datetime(df['timestamp'], format="%Y/%m/%d")
df = df.set_index('DateIndex')

下面我们对数据进幅度缩放,以便更好地送入神经网络和训练。(神经网络是一种对于输入数据幅度敏感的模型,不同字段较大的幅度差异,会影响网络的训练收敛速度和精度。)

# 幅度缩放
df2 = df
cols = ['close', 'volume', 'previous_close']
features = df2[cols]
scaler = MinMaxScaler(feature_range=(0, 1)).fit(features.values)
features = scaler.transform(features.values)
df2[cols] = features

在这里,我们重点处理了收盘价成交量前几天收盘价列

数据切分

接下来我们将数据拆分为训练和测试数据集。

# 收盘价设为目标字段
X = df2.drop(['close','timestamp'], axis =1)
y = df2['close'] import math
# 计算切分点(以80%的训练数据为例)
train_percentage = 0.8
split_point = math.floor(len(X) * train_percentage) # 时序切分
train_x, train_y = X[:split_point], y[:split_point]
test_x, test_y = X[split_point:], y[split_point:]

接下来,我们对数据进行处理,构建滑窗数据,沿时间序列创建数据样本。(因为我们需要基于历史信息对未来的数值进行预测)

# 构建滑窗数据
import numpy.lib
from numpy.lib.stride_tricks import sliding_window_view def genWindows(X_in, y_in, window_size):
X_out = []
y_out = []
length = X_in.shape[0]
for i in range(window_size, length):
X_out.append(X_in[i-window_size:i, 0:4])
y_out.append(y_in[i-1])
return np.array(X_out), np.array(y_out) # 窗口大小为5
window_size = 5
X_train_win, y_train_win = genWindows(np.array(train_x), np.array(train_y), window_size)
X_test_win, y_test_win = genWindows(np.array(test_x), np.array(test_y), window_size)

模型构建&训练

构建完数据之后,我们就要构建 RNN 模型了,具体的代码如下所示。注意到下面使用了1个回调函数,模型会在验证集性能没有改善的情况下提前停止训练,防止模型过拟合影响泛化能力。

from tensorflow.keras import callbacks

# 早停止 回调函数
callback_early_stopping = callbacks.EarlyStopping(
monitor="loss",
patience=10,#look at last 10 epochs
min_delta=0.0001,#loss must improve by this amount
restore_best_weights=True,
) from tensorflow import keras
from tensorflow.keras import layers
from keras.models import Sequential # 构建RNN模型,结构为 输入-RNN-RNN-连续值输出
input_shape=(X_train_win.shape[1],X_train_win.shape[2])
print(input_shape)
model = Sequential(
[
layers.Input(shape=input_shape),
layers.SimpleRNN(units=128, return_sequences=True),
layers.SimpleRNN(64, return_sequences=False),
layers.Dense(1, activation="linear"),
]
) # 优化器
optimizer = keras.optimizers.Nadam(learning_rate=0.0001)
model.compile(optimizer=optimizer, loss="mse") # 模型结构总结
model.summary() # 模型训练
batch_size = 20
epochs = 50
history = model.fit(X_train_win, y_train_win,
batch_size=batch_size, epochs=epochs,
callbacks=[
callback_early_stopping
])

模型训练过程的损失函数(训练集上)的变化如下图所示。随着训练过程推进,模型损失不断优化,初期的优化和loss减小速度很快,后逐渐趋于平稳。

大约 10 个 epoch 后达到了最佳结果,训练好的模型就可以用于后续预测了,我们可以先对训练集进行预测,验证一下在训练集上学习的效果。

# 训练集预测
pred_train_y = model.predict(X_train_win) # 绘图
plt.figure(figsize=(15, 6), dpi=80)
plt.plot(np.array(train_y))
plt.plot(pred_train_y)
plt.legend(['Actual', 'Predictions'])
plt.show()

模型在训练集上学习的效果还不错,大家可以看到预测结果和真实值对比绘图如下:

模型预测&应用

我们要评估模型的真实表现,需要在它没有见过的测试数据上评估,大家记得我们在数据切分的时候预留了 20% 的数据,下面我们用模型在这部分数据上预测并评估。

# 测试集预测
pred_test_y = model.predict(X_test_win) # 预测结果绘制
plt.figure(figsize=(15, 6), dpi=80)
plt.plot(np.array(test_y))
plt.plot(pred_test_y)
plt.legend(['Actual', 'Predictions'])
plt.show()

相对训练集来说,大家看到测试集上的效果稍有偏差,但是总体趋势还是预测得不错。

我们要考察这个模型对于时间序列预测的泛化能力,可以进行更严格一点的建模预测,比如将训练得到的模型应用与另一支完全没见过的股票上进行预测。如下为我们训练得到的模型对 Microsoft/微软股票价格的预测:

我们从图上可以看到,模型表现良好(预测存在一定程度的噪音,但它对总体趋势的预测比较准确)。

参考资料

TensorFlow深度学习!构建神经网络预测股票价格!⛵的更多相关文章

  1. 没有博士学位,照样玩转TensorFlow深度学习

    教程 | 没有博士学位,照样玩转TensorFlow深度学习 机器之心2017-01-24 12:32:22 程序设计 谷歌 操作系统 阅读(362)评论(0) 选自Codelabs 机器之心编译 参 ...

  2. 针对深度学习(神经网络)的AI框架调研

    针对深度学习(神经网络)的AI框架调研 在我们的AI安全引擎中未来会使用深度学习(神经网络),后续将引入AI芯片,因此重点看了下业界AI芯片厂商和对应芯片的AI框架,包括Intel(MKL CPU). ...

  3. (转) TensorFlow深度学习,一篇文章就够了

    TensorFlow深度学习,一篇文章就够了 2016/09/22 · IT技术 · TensorFlow, 深度学习 分享到:6   原文出处: 我爱计算机 (@tobe迪豪 )    作者: 陈迪 ...

  4. TensorFlow深度学习,一篇文章就够了

    http://blog.jobbole.com/105602/ 作者: 陈迪豪,就职小米科技,深度学习工程师,TensorFlow代码提交者. TensorFlow深度学习框架 Google不仅是大数 ...

  5. 问题集录--TensorFlow深度学习

    TensorFlow深度学习框架 Google不仅是大数据和云计算的领导者,在机器学习和深度学习上也有很好的实践和积累,在2015年年底开源了内部使用的深度学习框架TensorFlow. 与Caffe ...

  6. Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.2

    3.Spark MLlib Deep Learning Convolution Neural Network(深度学习-卷积神经网络)3.2 http://blog.csdn.net/sunbow0 ...

  7. TensorFlow 深度学习中文第二版·翻译完成

    原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>, ...

  8. Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1

    3.Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1 http://blog.csdn.net/sunbow0 ...

  9. windows下Anaconda3配置TensorFlow深度学习库

    Anaconda3(python3.6)安装tensorflow Anaconda3中安装tensorflow3是非常简单的,仅需通过 pip install tensorflow 测试代码: imp ...

随机推荐

  1. 1.5_HTML基础标签实战演练

    基本的 HTML 标签 HTML 标题 HTML 标题(Heading)是通过 <h1> - <h6> 等标签进行定义的. <h1>This is a headin ...

  2. 【SwiftUI】学习笔记1-创建第一个iOS应用

    本系列将会开发大量实际的项目. 系列为本人学习笔记,资料:<SwiftUI自学成长笔记>-刘铭 资源源代码下载资源:可以在gitee上下载,搜索刘铭即可. 第一章:创建项目 也可以在菜单栏 ...

  3. Html飞机大战(七):发射第一颗子弹

    好家伙,终于到子弹了 我们先来理一理思路: 子弹由飞机射出,所以我们把发射子弹的方法写在英雄类中 当然了,子弹也必须有自己独立的类 后期会有很多子弹射出,所以一个个将子弹类实例化肯定是不对的 我们也需 ...

  4. rh358 003 ansible部署双网卡绑定 DNS原理 bind正向解析

    双网卡绑定 绑定多张网卡成为逻辑口,从而实现链路冗余,以及数据流量的负载均衡 1.创建team口 [root@servera ~]# nmcli connection add type team co ...

  5. Android同屏、摄像头RTMP推送常用的数据接口设计探讨

    前言 好多开发者在调用Android平台RTMP推送或轻量级RTSP服务接口时,采集到的video数据类型多样化,如420sp.I420.yv12.nv21.rgb的,还有的拿到的图像是倒置的,如果开 ...

  6. JAVA反序列化漏洞修复解决方法

    MyObject类建立了Serializable模块,而且重新写过了readObject()变量,仅有建立了Serializable模块的类的目标才能够被实例化,沒有建立此模块的类将无法使他们的任意状 ...

  7. Linux 配置ODBC连接Oracle

    在使用kdb_database_link 扩展插件连接Oracle数据库时,必须先配置ODBC,确保通过ODBC能连接Oracle数据库.以下是配置ODBC的过程. 一.安装ODBC 1.安装 [ro ...

  8. 【读书笔记】C#高级编程 第二十二章 安全性

    (一)身份验证和授权 安全性的两个基本支柱是身份验证和授权.身份验证是标识用户的过程,授权在验证了所标识用户是否可以访问特性资源之后进行的. 1.标识和Principal 使用标识可以验证运行应用程序 ...

  9. EntityFrameworkCore 模型自动更新(上)

    话题 嗯,距离上一次写博文已经过去近整整十个月,还是有一些思考,但还是变得懒惰了,心思也不再那么专注,有点耗费时间,学习也有点停滞不前,那就顺其自然,随心所欲吧,等哪天心血来潮,想写了就写写 模型自动 ...

  10. flink-cdc实时同步mysql数据到elasticsearch

    本文首发于我的个人博客网站 等待下一个秋-Flink 什么是CDC? CDC是(Change Data Capture 变更数据获取)的简称.核心思想是,监测并捕获数据库的变动(包括数据 或 数据表的 ...