最近应一位读金融学朋友的求助,正好最近任务不忙,决定花小半天的时间帮他写一份有关股价预测的代码,也当作给自己练练手了。于是想把这个过程记录下来,希望可以帮助到像我一样的小白。

一、 数据集

1. 数据分析

首先,先看看数据集长什么样。

这是最简单的单变量时间序列数据,是自2016/11/01到2021/10/29的上证医疗指数收盘价,由于这是单变量时间序列数据,所以不需要考虑特征工程,对于多变量的任务,可以通过特征工程对变量进行筛选,这里对此不过多解释,有需要的话自行搜索。

2. 读取数据

首先,加载数据并对数据进行可视化的操作。

# data reading
df = pd.read_csv(r'*****\000109.csv', index_col=0, parse_dates=['time'])
print(df)# visualization
plt.figure(figsize=(12, 4))
plt.grid(True)
plt.plot(df['close'])
plt.show()

得到打印的数据和折线图:

3. 数据处理

读取数据之后,就要对数据进行处理,此处主要有两点,第一个是对数据进行归一化操作,第二是将数据集分成训练集和验证集。

  • 对数据进行归一化操作的目的是归纳统一样本的统计分布性,此处将数据归一化到(-1,1)上,是统计的坐标分布。因为神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测的,且Sigmoid函数的取值是0到1之间,网络最后一个节点输出也是如此,所以要对样本的输出进行归一化处理。
  • 将数据集分成训练集和验证集,本次数据共有1216组,本次实验将最后的75组数据作为验证集,用以预测并和真实值进行比较。
# divide the dataset into training set and test set
y = df['close'].values.astype(float)
print('y is')
print(y)
test_size = 76
train_set = y[:-test_size]
test_size = y[-test_size:]# normalization
scaler = MinMaxScaler(feature_range=(-1, 1))    # normalize the data into(-1,1)
train_norm = scaler.fit_transform(train_set.reshape(-1, 1))
print(train_norm)# transfer to tensor
train_norm = torch.FloatTensor(train_norm).view(-1)
window_size = 76

此处直接将test_size设置为76,是为了预测2021/11/01的股价。

二、 建立CNN模型

时间序列预测有很多方法,如传统的时序建模方法ARIMA、周期因子法、深度学习网络等,本次实验采用最简单的卷积神经网络进行训练。对于用CNN处理时序数据,通常使用一维卷积网络Conv1d;本次实验的结构是:卷积层通过2*2卷积核将一维数据展开为三维张量,使用激活函数ReLU将小于0的数据丢弃,再使用全连接层将三维张量转换为一维张量,最后通过两次Linear线性变换得到最后预测值。

class CNNmodel(nn.Module):def __init__(self):super(CNNmodel, self).__init__()self.conv1d = nn.Conv1d(1, 64, kernel_size=2)self.relu = nn.ReLU(inplace=True)self.Linear1 = nn.Linear(64*75, 50)self.Linear2 = nn.Linear(50, 1)def forward(self, x):x = self.conv1d(x)x = self.relu(x)x = x.view(-1)x = self.Linear1(x)x = self.relu(x)x = self.Linear2(x)return x

三、 模型训练

对于训练阶段,本次实验采用MSELoss(均方损失函数),使用Adam优化器,将训练学习率设置为0.001,训练周期为50(一般像本次实验这么少的数据量,epochs用大概30-50就ok了,epochs设置为100太大了,容易过拟合)

# training
model = CNNmodel()
print(model)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
epochs = 50
model.train()
start_time = time.time()
for epoch in range(epochs):for seq, y_train in train_data:# The gradient is zeroed and initialized before each parameter updateoptimizer.zero_grad()# reshape# convert to conv1d input size(batch size, channel, series length)y_pred = model(seq.reshape(1,1,-1))loss = criterion(y_pred, y_train)loss.backward()optimizer.step()print(f'Epoch: {epoch+1:2} Loss: {loss.item():10.8f}')
print(f'\nDuration: {time.time() - start_time:.0f} seconds')

四、 数据预测

众所周知,节假日是不开盘的,当时没想起来,出了点问题,在这边卡了很久hhh。模型训练过后是验证阶段和测试阶段。此处将最后75天的预测股价与真实值进行比较。最后预测出2021/11/01的股价为14298.55013075。

# validating
future = 76
# Select the last 75 values of the sequence to start the prediction
preds = train_norm[-window_size:].tolist()
# set to eval mode
model.eval()
# Each step of the cycle represents sliding back one space in the time series
for i in range(future):seq = torch.FloatTensor(preds[-window_size:])with torch.no_grad():preds.append(model(seq.reshape(1,1,-1)).item())
# Inverse normalization restores the true value
true_predictions = scaler.inverse_transform(np.array(preds[window_size:]).reshape(-1, 1))
# Compare the actual value with the predicted value
plt.figure(figsize=(12,4))
plt.grid(True)
plt.plot(df['close'])
x = np.arange('2021-07-08', '2021-11-02', dtype='datetime64[D]')
index = [2, 3, 9, 10, 16, 17, 23, 24, 30, 31, 37, 38, 44, 45, 51, 52, 58, 59, 65, 66, 72, 73, 74, 75, 79, 80, 85, 86, 87, 88, 89, 90, 91, 93, 94, 100, 101, 107, 108, 114, 115]
x = np.delete(x, index)
print(true_predictions)
print('The predicted stock price of 2021-11-01 is:', true_predictions[-1])
plt.plot(x, true_predictions)
plt.show()

五、 总结

从结果来看,使用CNN来处理时间序列数据产生的预测值总体来说还行,但与真实值存在一定出入。对于股票来说,影响股价波动因素繁多,单单从历史股价进行预测未来股价是不足够的,这也符合弱式有效市场假说,即技术分析失败;另一方面,本次实验采用的网络结构较简单,采用更强大的网络进行回归预测任务则会得到更好的效果。

时间序列预测--基于CNN的股价预测相关推荐

  1. 基于Informer的股价预测(量化交易综述)

    摘要 股票市场是金融市场中不可或缺的组成部分.准确预测股票趋势对于投资者和市场参与者具有重要意义,因为它们可以指导投资决策.优化投资组合以及降低金融风险.而且可以提升国家国际地位以及金融风险控制能力, ...

  2. [Kaggle比赛] 高频股价预测小结

    高频股价预测 文章目录 高频股价预测 问题描述 问题分析 数据分析 数据集 数据清洗 解决方案 数据预处理 归一化 Prices Volume 时间信息 对于预测值的处理 噪声 模型探索 基于LSTM ...

  3. Keras深度学习实战——股价预测

    Keras深度学习实战--股价预测 0. 前言 1. 股价预测 1.1 数据集介绍 1.2 神经网络模型分析 1.2 使用神经网络进行股价预测 2. 使用函数式 API 2.1 神经网络模型分析 2. ...

  4. 【时间序列预测】股价预测零售预测

    股价预测.零售时间序列预测 1.什么是时间序列预测 时间序列(time series)是一组按照时间发生先后顺序进行排列的数据 时间序列(time series forecaing,简称时序预测.预估 ...

  5. [时间序列预测]基于BP、LSTM、CNN-LSTM神经网络算法的单特征用电负荷预测[保姆级手把手教学]

    系列文章目录 深度学习原理-----线性回归+梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网 ...

  6. 银行股价预测——基于pytorch框架RNN神经网络

    银行股价预测--基于pytorch框架RNN神经网络 任务目标 数据来源 完整代码 流程分析 1.导包 2.读入数据并做预处理 3.构建单隐藏层Rnn模型 4.设计超参数,训练模型 5.加载模型,绘图 ...

  7. [时间序列预测]基于BP、RNN、LSTM、CNN-LSTM算法多特征(多影响因素)用电负荷预测[保姆级手把手教学]

    系列文章目录 深度学习原理-----线性回归+梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网 ...

  8. bagging和时间序列预测_时间序列的LSTM模型预测——基于Keras

    一.问题背景     现实生活中,在一系列时间点上观测数据是司空见惯的活动,在农业.商业.气象军事和医疗等研究领域都包含大量的时间序列数据.时间序列的预测指的是基于序列的历史数据,以及可能对结果产生影 ...

  9. 生猪价格matlab,基于时间序列的BP神经网络猪肉价格预测

    科技创新 2m6钎第20期I科技创新与应用 基于时间序列的BP神经网络猪肉价格预测 张津张瑞斌 (成都理工大学管理科学学院,四川成都610059) 摘要:猪肉价格是不稳定的,起伏变化的,猪肉价格的预测 ...

  10. 时间序列预测专项——基于Prophet的业务预测

    时间序列预测专项 基于Prophet的业务预测 1. 趋势模型 1.1 饱和增长模型 1.2 分段线性模型 1.3 变点自动选择 2. 季节模型 3. 节假日模型 4. Prophet模型参数解读 5 ...

最新文章

  1. Microbiome:香港理工李向东组-医院源可吸入耐药基因与宿主群落、临床关联和环境风险...
  2. 使用Identity Server 4建立Authorization Server (3)
  3. pythonppt教材_PPT、H5、Python、大数据……浙江中小学新教材9月投入使用!
  4. 用tftp 下载/更新ios和配置文件
  5. SpringBoot中使用Redis数据库
  6. java I/O系统总结
  7. lcd取模如何取16位_两种方式实现取16位变量的高低8位, 不严谨对比
  8. iview 级联选择组件_vue组件递归渲染实例
  9. linux+awk忽略tab符号,awk 如何避免文本中出现特殊符号的影响?
  10. 数据结构--二叉树--路径 假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结
  11. C++ 面向对象(一)—— 类(Classes)
  12. 整数线性规划实现(lingo,python分枝界定法)
  13. mysql无法添加或更新子行_MySQL无法添加或更新子行
  14. java的泛,java_泛型
  15. tp5设置session过期时间
  16. 纯OC实现iOS DLNA投屏功能了解一下
  17. 麒麟Kylin系统适配gStore图数据库系统
  18. 前端之vue3使用动画库animate.css(含动画、过渡)
  19. 解决了联想i908手机SIM卡注册失败、受限服务的BUG
  20. C#中使用EntityFramework出现报错问题

热门文章

  1. 夺命故障!炸出了投资人!
  2. 报告显示,宝爸参与度不断提升,超三成男性提前服用营养品备孕
  3. 水花兄弟(Splash Brothers)
  4. 面向对象设计,ORM,NHIBERNATE杂谈(有感)
  5. 宏批量替换多个word指定文字
  6. word整个表格首行缩进_Word段落首行无法缩进、不能输入空格与表格首行缩进的解决方法...
  7. 蓝牙电话之HFP-连接
  8. 网站备案必须有服务器吗,域名备案必须有服务器吗
  9. 黑群晖折腾之docker系列之迅雷远程下载
  10. 服务器wifi无线放大器,旧路由器改wifi放大器详细教程【图】