从0开始用TCN预测股价

源码地址

由于用的是tensflow,其实和pytorch差不多看懂就行(pytorch版本我还在改,有些难度)因为这里面的tcn结构是用的
别人的代码https://github.com/philipperemy/keras-tcn

首先说一下什么是TCN

首先我想说 我们预测股票价格的时候,我们是用以前的数据预测当前数据
所以我们TCN的概念就是让我们的网络通过卷积的方式使得我们的模型能够大量记忆我们之前的状态,来保证我们网络的预测能力。

它包含三个结构
因果卷积膨胀卷积残差链接。

因果卷积

很简单,一句话就是通过之前的状态预测现在的状态。但是我们希望每次进行卷积的时候,我们的原始层(也就是被卷积核卷积的那个时间序列)长度最好不变,因为我们用常规思维思考的时候,我们肯定会觉得想获得更多的以前数据,只需要增加序列长度就行了,那么假如这样你可能不知道参数是如何增长的。**好的,我的意思是想保证每次卷积的时候序列不变,但是能获得更多的以前数据我该怎么做?**这个时候就不得不提到膨胀卷积了
在这里插入图片描述

膨胀卷积

很简单,一句话就是更多的卷积层,来获得更多的以前数据,其实就是感受野打个比方就是第1层卷积后变成第二层,第二层就是第一层以前数据的浓缩,那么我们可以在通过改变卷积核的大小(添0)来让我们获得更多以前数据。
在这里插入图片描述

残差链接

就是防止梯度消失,说人话就是怕卷着卷着最开始的数据或者卷积过程中的数据没了,毕竟我们要卷积很多次。

实现

##环境安装

tushare                   1.4.6 
tensorflow                2.16.1 

其他的都是直接安装

首先是获取数据集

这里用tushare的00001号股票做好的csv文件
代码如下先生成但是你得先取tushare里面找到自己的api替换到下面的xxx中

在这里插入图片描述

但是要先安装相应接口

pip install tushare
import torch
import tushare as ts
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from torch import nn
from torch.utils.data import TensorDataset
from tqdm import tqdm

# 替换成你的Tushare Pro Token
pro = ts.pro_api('xxx')#xxx替换为你的api

# 获取股票数据 (深圳交易所股票代码为 000001 的股票数据) 获取2013 7月11到2024 4月8号的
df = pro.daily(ts_code='000001.SZ', start_date='20130711', end_date='20240408')

# 确保trade_date列存在
if 'trade_date' in df.columns:
    df.index = pd.to_datetime(df.trade_date)  # 索引转为日期
    df = df.iloc[::-1]  # 数据倒序调整

    # 保存为CSV文件
    df.to_csv('000001_Daily_2013_2024.csv', index=False)
    print("数据已保存为 '000001_SZ_20130711_20240408.csv'")
else:
    print("数据中没有找到 'trade_date' 列,请检查数据结构!")

定义一些参数

window_size = 10   # 窗口大小(也就是时间步数)
batch_size = 32    # 训练批次大小
epochs = 30        # 训练轮数
filter_nums = 10   # filter数量 也就是输出通道的数量。
kernel_size = 4    # kernel大小卷积核大小

划分数据集

def get_dataset():
    df = pd.read_csv('./keras-tcn/000001_Daily_2013_2024.csv')
    scaler = MinMaxScaler()
    open_arr = scaler.fit_transform(df['open'].values.reshape(-1, 1)).reshape(-1)
    X = np.zeros(shape=(len(open_arr) - window_size, window_size))
    label = np.zeros(shape=(len(open_arr) - window_size))
    for i in range(len(open_arr) - window_size):
        X[i, :] = open_arr[i:i+window_size]
        label[i] = open_arr[i+window_size]
    train_size = 2000
    test_size = 611
    train_X = X[:train_size, :]
    train_label = label[:train_size]
    test_X = X[train_size:train_size + test_size, :]
    test_label = label[train_size:train_size + test_size]
    print("train_X" + str(train_X.shape), "train_label_shape" + str(train_label.shape))
    return train_X, train_label, test_X, test_label, scaler, open_arr

定义模型并训练保存参数

def build_model():
    train_X, train_label, test_X, test_label, scaler, open_arr = get_dataset()
    train_X = train_X.reshape(-1, window_size, 1)  # 把输入变成TCN的维度输入[batchsize,时间步数,特征数] 因为是每个批次中一列数据是10个以前数据来预测今日数据所以我们只需要每10个时间步数的开盘价(open)就行
    test_X = test_X.reshape(-1, window_size, 1)  # 同理

    model = keras.models.Sequential([
        keras.layers.Input(shape=(window_size, 1)),
        TCN(nb_filters=filter_nums, kernel_size=kernel_size, dilations=[1, 2, 4, 8]),
        keras.layers.Dense(units=1, activation='relu')#输出只需要我们的预测值
    ])
    model.summary()
    model.compile(optimizer='adam', loss='mae', metrics=['mae'])
    model.fit(train_X, train_label, validation_split=0.2, epochs=epochs)

    model.save('my_model.h5')  # 保存模型

    prediction = model.predict(test_X)
    scaled_prediction = scaler.inverse_transform(prediction.reshape(-1, 1)).reshape(-1)
    scaled_test_label = scaler.inverse_transform(test_label.reshape(-1, 1)).reshape(-1)
    print('RMSE ', RMSE(scaled_prediction, scaled_test_label))
    plot_and_save(scaled_prediction, scaled_test_label)

    return model, scaler, open_arr

利用模型预测股价


def load_model_and_predict():
    model = keras.models.load_model('my_model.h5', custom_objects={'TCN': TCN, 'mae': tf.keras.losses.MeanAbsoluteError()})
    _, _, _, _, scaler, open_arr = get_dataset()
    # 预测明天的股价
    last_window = open_arr[-window_size:]  # 获取最近的window_size天的数据
    last_window_scaled = scaler.transform(last_window.reshape(-1, 1)).reshape(1, window_size, 1)
    next_day_prediction = model.predict(last_window_scaled)
    next_day_price = scaler.inverse_transform(next_day_prediction.reshape(-1, 1)).reshape(-1)
    print('Predicted price for the next day (loaded model):', next_day_price[0])

def predict_next_day():
    model, scaler, open_arr = build_model()
    # 预测明天的股价
    last_window = open_arr[-window_size:]  # 获取最近的window_size天的数据
    last_window_scaled = scaler.transform(last_window.reshape(-1, 1)).reshape(1, window_size, 1)
    next_day_prediction = model.predict(last_window_scaled)
    next_day_price = scaler.inverse_transform(next_day_prediction.reshape(-1, 1)).reshape(-1)
    print('Predicted price for the next day:', next_day_price[0])

全部代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tcn.tcn import TCN
from tensorflow import keras
import tensorflow as tf

window_size = 10   # 窗口大小(也就是时间步数)
batch_size = 32    # 训练批次大小
epochs = 30        # 训练轮数
filter_nums = 10   # filter数量 也就是输出通道的数量。
kernel_size = 4    # kernel大小卷积核大小

def get_dataset():
 df = pd.read_csv('./keras-tcn/000001_Daily_2013_2024.csv')
 scaler = MinMaxScaler()
 open_arr = scaler.fit_transform(df['open'].values.reshape(-1, 1)).reshape(-1)
 X = np.zeros(shape=(len(open_arr) - window_size, window_size))
 label = np.zeros(shape=(len(open_arr) - window_size))
 for i in range(len(open_arr) - window_size):
     X[i, :] = open_arr[i:i+window_size]
     label[i] = open_arr[i+window_size]
 train_size = 2000
 test_size = 611
 train_X = X[:train_size, :]
 train_label = label[:train_size]
 test_X = X[train_size:train_size + test_size, :]
 test_label = label[train_size:train_size + test_size]
 print("train_X" + str(train_X.shape), "train_label_shape" + str(train_label.shape))
 return train_X, train_label, test_X, test_label, scaler, open_arr

def RMSE(pred, true):
 return np.sqrt(np.mean(np.square(pred - true)))

def plot(pred, true):
 fig = plt.figure()
 ax = fig.add_subplot(111)
 ax.plot(range(len(pred)), pred)
 ax.plot(range(len(true)), true)
 plt.show()

def build_model():
 train_X, train_label, test_X, test_label, scaler, open_arr = get_dataset()
 train_X = train_X.reshape(-1, window_size, 1)  # 把输入变成TCN的维度输入[batchsize,时间步数,特征数] 因为是每个批次中一列数据是10个以前数据来预测今日数据所以我们只需要每10个时间步数的开盘价(open)就行
 test_X = test_X.reshape(-1, window_size, 1)  # 同理

 model = keras.models.Sequential([
     keras.layers.Input(shape=(window_size, 1)),
     TCN(nb_filters=filter_nums, kernel_size=kernel_size, dilations=[1, 2, 4, 8]),
     keras.layers.Dense(units=1, activation='relu')#输出只需要我们的预测值
 ])
 model.summary()
 model.compile(optimizer='adam', loss='mae', metrics=['mae'])
 model.fit(train_X, train_label, validation_split=0.2, epochs=epochs)

 model.save('my_model.h5')  # 保存模型

 prediction = model.predict(test_X)
 scaled_prediction = scaler.inverse_transform(prediction.reshape(-1, 1)).reshape(-1)
 scaled_test_label = scaler.inverse_transform(test_label.reshape(-1, 1)).reshape(-1)
 print('RMSE ', RMSE(scaled_prediction, scaled_test_label))
 plot_and_save(scaled_prediction, scaled_test_label)

 return model, scaler, open_arr

def plot_and_save(pred, true, filename="plot.png"):
 fig = plt.figure()
 ax = fig.add_subplot(111)
 ax.plot(range(len(pred)), pred, label='Prediction')
 ax.plot(range(len(true)), true, label='True')
 ax.legend()
 plt.xlabel("Time")
 plt.ylabel("Value")
 plt.title("Prediction vs True Values")
 plt.savefig(filename)
 plt.close(fig)

def predict_next_day():
 model, scaler, open_arr = build_model()
 # 预测明天的股价
 last_window = open_arr[-window_size:]  # 获取最近的window_size天的数据
 last_window_scaled = scaler.transform(last_window.reshape(-1, 1)).reshape(1, window_size, 1)
 next_day_prediction = model.predict(last_window_scaled)
 next_day_price = scaler.inverse_transform(next_day_prediction.reshape(-1, 1)).reshape(-1)
 print('Predicted price for the next day:', next_day_price[0])
 

def load_model_and_predict():
 model = keras.models.load_model('my_model.h5', custom_objects={'TCN': TCN, 'mae': tf.keras.losses.MeanAbsoluteError()})
 _, _, _, _, scaler, open_arr = get_dataset()
 # 预测明天的股价
 last_window = open_arr[-window_size:]  # 获取最近的window_size天的数据
 last_window_scaled = scaler.transform(last_window.reshape(-1, 1)).reshape(1, window_size, 1)
 next_day_prediction = model.predict(last_window_scaled)
 next_day_price = scaler.inverse_transform(next_day_prediction.reshape(-1, 1)).reshape(-1)
 print('Predicted price for the next day (loaded model):', next_day_price[0])

if __name__ == '__main__':
 build_model()  # 训练并保存模型
 load_model_and_predict()  # 加载模型并预测

 

效果

拟合还不错
在这里插入图片描述
也是成功的可以取买股票了哈哈哈哈
在这里插入图片描述

后记

pytorch版本之后写好再发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/683396.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Science项目文章 | 中国农科院作科所研究团队解析“复粒稻”多粒簇生的机制

2024年3月8日,由中国农业科学院作物科学研究所童红宁研究员领衔的研究团队在Science发表题为“Enhancing rice panicle branching and grain yield through tissue-specific brassinosteroid inhibition”的研究论文。该研究报道了复粒稻多粒簇形成的机制&#xff0…

python-flask项目的服务器线上部署

在部署这部分我首先尝试了宝塔面板,始终连接失败 换了一种思路选择了Xshell成功连接 首先我们需要下载个免费版本的Xshell 免费的:家庭/学校免费 - NetSarang Website 下载完毕打开 1新建-> 输入服务器的账号密码: 在所有会话中点击自…

WalleWeb简化你的DevOps部署流程

walle-web:简化部署流程,提升开发效率,Walle Web让DevOps触手可及 - 精选真开源,释放新价值。 概览 Walle Web是一个功能强大且免费开源的DevOps平台,旨在简化和自动化代码部署流程。它支持多种编程语言,包…

学习axios拦截器

axios拦截器的作用:用于在请求发送前和响应返回后对请求和响应进行统一处理,例如添加公共请求头、处理请求参数、统一处理错误信息等。拦截器提供了一种灵活、高效的方式来管理HTTP请求和响应,帮助在前端开发中更好地处理数据交互。 这是一个…

Commons-Collections篇-CC3链

前言 我们分析前两条链CC1和CC6时,都是利用invoke反射调用的Runtime().getRuntime().exec()来执行命令。而很多时候服务器的代码当中的黑名单会选择禁用Runtime CC3链主要通过动态加载类加载机制来实现自动执行恶意类代码 1.环境安装 可以接着使用我们之前分析C…

植物大战僵尸杂交版2.0.88最新版安装包

游戏简介 游戏中独特的杂交植物更是为游戏增添了不少亮点。这些杂交植物不仅外观独特,而且拥有更强大的能力,能够帮助玩家更好地应对游戏中的挑战。玩家可以通过一定的条件和方式,解锁并培养这些杂交植物,从而不断提升自己的战斗…

重大变化,2024软考!

根据官方发布的2024年度计算机技术与软件专业技术资格(水平)考试安排,2024年软考上、下半年开考科目有着巨大变化,我为大家整理了相关信息,大家可以看看! 🎯2024年上半年:5月25日&am…

【动手学深度学习】卷积神经网络(AlexNet)的研究详情

目录 🌊1. 研究目的 🌊2. 研究准备 🌊3. 研究内容 🌍3.1 卷积神经网络(AlexNet) 🌍3.2 练习 🌊4. 研究体会 🌊1. 研究目的 多层感知机模型选择:比较不同…

【devops】 Bytebase 一站式开源 数据库DevOps平台

初识 Bytebase 1、安装 安装地址 https://www.bytebase.com/docs/get-started/self-host/#docker 安装指令 docker run --init \--name bytebase \--publish 8080:8080 --pull always \--volume ~/.bytebase/data:/var/opt/bytebase \bytebase/bytebase:2.18.02、登录-dashboa…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十七)- 微服务(7)

11.1 : 同步调用的问题 11.2 异步通讯的优缺点 11.3 MQ MQ就是事件驱动架构中的Broker 安装MQ docker run \-e RABBITMQ_DEFAULT_USERxxxx \-e RABBITMQ_DEFAULT_PASSxxxxx \--name mq \--hostname mq1 \-p 15672:15672 \-p 5672:5672 \-d \rabbitmq:3-management 浏览器访问1…

gkuubibiih

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…

SwiftUI中Menu和ControlGroup的使用

本篇文章主要介绍一下Menu组件和ControlGroup组件的使用。Menu组件是在iOS 14(tvOS 17)推出的一个组件,点击后提供一个可选择的操作列表。ControlGroup组件是一个容器视图,以视觉上适当的方式为给定的上下文显示语义相关的控件&am…

钢基础知识介绍

钢铁是一种铁碳合金,含有一定量的碳和其他合金元素,如硅、锰等。而钢材则是经过加工处理后的钢铁材料,具有更高的强度、硬度、塑性和韧性。钢铁的硬度、强度和耐磨性相对较低,而钢材经过加工处理后,其硬度、强度和耐磨…

训练营第二十七天 | 491.递增子序列46.全排列47.全排列 II332.重新安排行程51. N皇后

491.递增子序列 力扣题目链接(opens new window) 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]] 说明: …

企业(园区)智慧能源双碳平台解决方案

园区作为工业企业集聚区,在提供了大量基础设施和公共服务的同时也成为了碳排放的主要源头。工业园区的耗能约占全社会总耗能的69%,碳排放占全国总排放约31%。工业园区节能、减耗、提质、减碳工作的落实,是我国实现碳达峰碳中和目标的必然要求…

关系代数与规范化

本文是根据自己的理解,结合实践整理所得,有兴趣的可以参考学习。

P3. 创建个人中心页面

P3. 创建个人中心页面 0 概述Tips1 个人中心页面1.1 创建 Bot 表及 pojo, mapper1.2 实现 Bot 增删改查的 API1.3 实现个人中心页面前端 0 概述 主要介绍了一下添加一个表(类),及其CRUD的前端和后端的实现方式,介绍的是通用的方法。 后端的CRUD很好写&am…

TCP/IP协议介绍——三次握手四次挥手

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议…

Capture One Pro 23:专业 Raw 图像处理的卓越之选

在当今的数字摄影时代,拥有一款强大的图像处理软件至关重要。而 Capture One Pro 23 for Mac/Win 无疑是其中的佼佼者,为摄影师和图像爱好者带来了前所未有的体验。 Capture One Pro 23 以其出色的 Raw 图像处理能力而闻名。它能够精准地解析和处理各种…

Priority_queue

一、priority_queue的介绍和使用 1.1 priority_queue的介绍 1.优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。 2.优先队列类似于堆, 在堆中可以随时插入元素, 并且只能检索最大堆…