TensorFlow深度学习!构建神经网络预测股票价格!⛵

本文涉及的产品
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
NLP 自学习平台,3个模型定制额度 1个月
简介: 股票价格数据是一个时间序列形态的数据。所以,我们使用『循环神经网络(RNN)』对这种时序相关的数据进行建模,并将其应用在股票数据上进行预测。
a6660fb917d385b447a50402ceac5781.png
💡 作者: 韩信子@ ShowMeAI
📘 深度学习实战系列https://www.showmeai.tech/tutorials/42
📘 TensorFlow 实战系列https://www.showmeai.tech/tutorials/43
📘 本文地址https://www.showmeai.tech/article-detail/327
📢 声明:版权所有,转载请联系平台与作者并注明出处
📢 收藏 ShowMeAI查看更多精彩内容
cf8c06ea187570c1b5331af6b7ca09aa.png

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

dde22f5191dc34a1b2371f097344d1cc.png

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

4dfe016166b19ead4a98a79050603825.png

对于循环神经网络的详细信息讲解,大家可以阅读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)
dbf0f23753da8cac83207cd5d4d57f2a.png

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

90c7bdd38a916626149253d1048a71fb.png

💡 数据处理

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

# 读取数据
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:]

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

07cb4b5902b203331d4cbc3d194eb904.png
# 构建滑窗数据
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减小速度很快,后逐渐趋于平稳。

0bc8dadf088914cb908a8d4dcd63f48e.png

大约 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()

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

275f7854502d82228a3f71b3e3b2a47d.png

💡 模型预测&应用

我们要评估模型的真实表现,需要在它没有见过的测试数据上评估,大家记得我们在数据切分的时候预留了 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()
7f44199240534842e68e9cc9c4538bca.png

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

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

55e2996be3efa7328a0d66330567f45d.png
afb40e26ea71aafd8eeb9c04fc371c89.png

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

参考资料

e9190f41b8de4af38c8a1a0c96f0513b~tplv-k3u1fbpfcp-zoom-1.image

目录
相关文章
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络:从理论到实践
【10月更文挑战第35天】在人工智能的浪潮中,深度学习技术以其强大的数据处理能力成为科技界的宠儿。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,在图像识别和视频分析等领域展现出了惊人的潜力。本文将深入浅出地介绍CNN的工作原理,并结合实际代码示例,带领读者从零开始构建一个简单的CNN模型,探索其在图像分类任务中的应用。通过本文,读者不仅能够理解CNN背后的数学原理,还能学会如何利用现代深度学习框架实现自己的CNN模型。
|
6天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第36天】探索卷积神经网络(CNN)的神秘面纱,揭示其在图像识别领域的威力。本文将带你了解CNN的核心概念,并通过实际代码示例,展示如何构建和训练一个简单的CNN模型。无论你是深度学习的初学者还是希望深化理解,这篇文章都将为你提供有价值的见解。
|
3天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
20 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
7天前
|
机器学习/深度学习 人工智能 自动驾驶
深入解析深度学习中的卷积神经网络(CNN)
深入解析深度学习中的卷积神经网络(CNN)
21 0
|
9天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习的奇迹:如何用神经网络识别图像
【10月更文挑战第33天】在这篇文章中,我们将探索深度学习的奇妙世界,特别是卷积神经网络(CNN)在图像识别中的应用。我们将通过一个简单的代码示例,展示如何使用Python和Keras库构建一个能够识别手写数字的神经网络。这不仅是对深度学习概念的直观介绍,也是对技术实践的一次尝试。让我们一起踏上这段探索之旅,看看数据、模型和代码是如何交织在一起,创造出令人惊叹的结果。
19 0
|
6天前
|
机器学习/深度学习 人工智能 测试技术
深度学习在图像识别中的应用与挑战
本文探讨了深度学习技术,尤其是卷积神经网络(CNN)在图像识别任务中的最新进展和面临的主要挑战。通过分析不同的网络架构、训练技巧以及优化策略,文章旨在提供一个全面的概览,帮助研究人员和实践者更好地理解和应用这些技术。
36 9
|
2天前
|
机器学习/深度学习 人工智能 算法
深度学习在图像识别中的应用与挑战
本文探讨了深度学习技术在图像识别领域的应用,重点分析了卷积神经网络(CNN)的工作原理及其在处理图像数据方面的优势。通过案例研究,展示了深度学习如何提高图像识别的准确性和效率。同时,文章也讨论了当前面临的主要挑战,包括数据不足、过拟合问题以及计算资源的需求,并提出了相应的解决策略。
|
4天前
|
机器学习/深度学习 分布式计算 并行计算
深度学习在图像识别中的应用与挑战
本文深入探讨了深度学习技术在图像识别领域的应用,分析了当前主流的卷积神经网络(CNN)架构,并讨论了在实际应用中遇到的挑战和可能的解决方案。通过对比研究,揭示了不同网络结构对识别准确率的影响,并提出了优化策略。此外,文章还探讨了深度学习模型在处理大规模数据集时的性能瓶颈,以及如何通过硬件加速和算法改进来提升效率。
|
4天前
|
机器学习/深度学习 人工智能 计算机视觉
深度学习在图像识别中的应用与挑战
【10月更文挑战第38天】本文将深入探讨深度学习如何在图像识别领域大放异彩,并揭示其背后的技术细节和面临的挑战。我们将通过实际案例,了解深度学习如何改变图像处理的方式,以及它在实际应用中遇到的困难和限制。
|
4天前
|
机器学习/深度学习 传感器 自动驾驶
深度学习在自动驾驶中的应用与挑战####
本文探讨了深度学习技术在自动驾驶领域的应用现状、面临的主要挑战及未来发展趋势。通过分析卷积神经网络(CNN)和循环神经网络(RNN)等关键算法在环境感知、决策规划中的作用,结合特斯拉Autopilot和Waymo的实际案例,揭示了深度学习如何推动自动驾驶技术向更高层次发展。文章还讨论了数据质量、模型泛化能力、安全性及伦理道德等问题,为行业研究者和开发者提供了宝贵的参考。 ####