卷积神经网络CNN预测苹果公司股价AAPL

本文介绍如何使用卷积神经网络(CNN)预测股票价格,通过20天的苹果公司股价数据预测下一天的价格。文章详细展示了从数据准备到模型训练及预测的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

在大多数同学的眼中,CNN可能只是用来做图像识别的,没办法将他和预测放在一起,我也是,至少我几个小时之前才突然发现原来CNN也是可以做预测的,其实CNN做预测的原理就是利用卷积核的能力,可以感受数据一段时间的情况,根据这数据之前一段时间的情况来做出预测,原理存在,实践开始:


提示:以下是本篇文章正文内容,下面案例可供参考

一、CNN可以做预测吗?

可以。
准确的说,是所有的神经网络都可以,简单来说y=ax+b都可以预测,cnn为什么不能?[公式] ,函数 [公式] 可以有很多形式,CNN就是其中一种,当然可以给定输入,输出预测值。区别可能在于他们的功能、准确度和损失率可能有些差距,CNN大放光彩的是它在图像领域的成绩,但这并不影响他也可以出色的完成预测的任务,下面是根据前20天的苹果公司股价,来预测下一天的成交价格的实例,注释我写的简介明白。效果图如下:(红色为预测值,蓝色为实际值),虽然有点差距,但是走势一样,哈哈哈哈。
在这里插入图片描述

二、实现步骤

1.准备工作(下载数据集)

数据集可以在雅虎.财经网站上搜索苹果公司最新的股价数据,当然了也可以下载你喜欢的公司的股票数据,这是网站链接:

https://finance.yahoo.com/?guccounter=1&guce_referrer=aHR0cHM6Ly93d3cuc28uY29tL2xpbms_bT1ieExod1pPMHd1WXRiY0liZXVCOCUyQmVDZkJad2toekNmMDREZHFvUiUyRlNiUWs1SDA0eXM2SDd0OVlVU3BtOVJxdkkwaEtmdk90JTJGQkhLMzZNWHpVY0xkQWlJZ1FHZnBuVXdYU3FKYzNJT3dRUnY5ejJDek9PcVF6MGR6V0NzJTNE&guce_referrer_sig=AQAAAKEY_jOyLj9ebmmTrbI7ATJS54FU9ibrssNItDvfFchNj5bGDS7LykxqUGMGnaY1eqylsuJK45YXLk3I8LOPfhSkHYD6h1lPEkVh99bFjejA4auVtngjhvpj-R_jcG8lMVyeMp2-0hAe15Q6-jlTnJEpwM8f0rS1UnpP8NxQ7KAn

2.实战开始

(1)导入所需包

来回来去就这几个,全导入没坏处。

import tensorflow as tf 
import numpy as np 
import matplotlib. pyplot as plt 
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Flatten,Reshape,Dropout,Activation
from tensorflow.keras.layers import Conv2D,MaxPooling2D
from tensorflow.keras.layers import Conv1D,MaxPooling1D
from tensorflow.keras.optimizers import SGD
from sklearn.model_selection import train_test_split

(2)读取数据集并处理

这块看着有点多,但是其实并不复杂,我把每行都写上了注释,读取CSV文件,取出要预测的列,在将这行数据都转化为0-1的数字,最后在定义所需要的变量,比如列数x0、频率p、输入输出量X,y。最后再把数据集分成训练集和测试集,准备工作完毕!


df = pd.read_csv('AAPL.csv')  #读取APPLE 公司股票文件

#df.head()  #显示前五行的股票数据
x0 =df['Adj Close'].values  #取出所需的Adj Close列,此时已经转化为了arrdy数组
#len(x0)#查看x0的行数

#数据预处理,将所有的x0数据都转化为0-1之间的数字,并查看前十个数字
m=max(x0)
x0=x0/m
x0[:10]

n=len(x0)#此时的n是x0的个数,p是每20天即预测一次开盘的频率
p=20

x=np.array([x0[k:k+p]for k in range(n-p+1)])#将每个K以后20天的值都对应好
x.shape

y=np.array(x0[p:])#y是20天预测的数据
y.shape

X=x[:-1]#X是实际可以预测到的数量,比给的数量应当少一笔
X=X[:,:,np.newaxis]#给X赋值,np.newaxis的功能:插入新维度
X.shape

x_train, x_test, y_train, y_test=train_test_split(X,y,test_size=0.2,shuffle=False)  #拆分数据集,将test集为0.2,参数不同
x_train.shape

(3)重头戏,模型搭建!

一如既往选择贯序模型,这是序贯模型是多个网络层的线性堆叠,也就是“一条路走到黑”。我觉得贯序模型就比较友好,简单粗暴。
接下来就是添加一维的卷积层和池化层,还有Flatten层和全连接层,其中的参数都在注释里标的很清楚。CNN结构如下图所示。
另外,回答一个疑问:“为什莫最后的激活函数选择了relu,而不是之前一直在用的softmax”,因为这个预测,我理解的它算是一个回归问题,而sofftmax激活函数在分类问题中是最好用的,因此使用了relu。

model=Sequential()#选择贯序模型


#添加一维卷积层,卷积核数量为50个4维的,补0策略为same,保留卷积后的边界,激活函数为relu,输入的尺寸形状为(20,1)
model.add(Conv1D(50,4,padding='same',activation='relu',input_shape=(p,1)))

model.add(MaxPooling1D(2))#添加一维池化层,选择最大池化,(池化层大小是2,每两个数字留一个)

model.add(Flatten()) #添加Flatten层,Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。

model.add(Dense(20))#20个神经元的全连接层
model.add(Dropout(0.2))#dropout是CNN中防止过拟合提高效果的一个大杀器,隐含节点dropout率设置为0.2
model.add(Activation('relu'))

model.add(Dense(1))#输出层
model.add(Activation('relu'))


在这里插入图片描述

(4)模型编译与训练

编译(损失函数、优化器、评价函数)
训练(回合数为50、每次取样本为32)
因为都是数字,没有图片,CPU计算也极快,一秒就完成了,为了降低损失率,大家可以多设置回合数。当然,也可以自己修改优化器,换成Adam应该不错,而且他还有默认的学习率。

model.compile(loss='mse',optimizer=SGD(lr=0.2),metrics=['accuracy'])#编译模型,损失函数、优化器、学习率、评价函数
model.summary()#查看神经网络模型结构

#训练模型+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
model.fit(x_train,y_train,epochs=50,batch_size=32)#训练50回合,每次30个样本

(5)模型预测

把测试集数据加入到模型中,就可以预测到 结果了,进行可视化处理后就能以图表形式展示啦!

#模型预测=======================================================================================================
y_predict=model.pridict(x_test)#输入测试集进行预测

plt.plot(y_test[:100])
plt.plot(y_predict[:100],'r')

(6)效果图展示

在这里插入图片描述

总结

股票预测这个数据集相对好获取,数据全面且准确是个不错的练习项目。
之所以选择苹果公司这种大型公司的股票进行预测,是因为在某种意义上,大盘股被单股力量操纵的可能性比较低,通俗来说,大型公司的股票不会大起大跌,而且数据充足。
不尽人意的是:在训练过程中,也出现了categorical_accuracy: 0.0000e+00的问题,原因还在寻找,期望早点解决!

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仓鼠球球-O-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值