当前位置: 首页 > article >正文

超越LSTM!TCN模型如何精准预测股市波动(附代码)

作者:老余捞鱼

原创不易,转载请标明出处及原作者。

写在前面的话:最近我用TCN时间卷积网络预测了标普500指数(SPX)的每日回报率,发现效果远超传统方法。TCN通过因果卷积和膨胀卷积捕捉时间序列的长期依赖关系,结合残差连接提升模型性能。这篇文章将带你从数据准备到模型训练,一步步实现金融预测的AI实战。

一、什么是时序卷积网络(TCN)?

时序卷积网络(Temporal Convolutional Network, TCN)是一种用于处理序列数据的深度学习模型。与传统的循环神经网络(RNN)不同,TCN利用卷积操作来捕捉时间序列中的依赖关系。TCN通过因果卷积和扩张卷积的组合,能够有效地处理长序列数据,并且在许多任务中表现出色,如时间序列预测、语音处理和自然语言处理等。

1.1 TCN的基本原理

TCN的核心思想是使用卷积层来替代RNN中的递归结构。其主要特点包括:

  • 因果卷积:确保当前时刻的输出仅依赖于当前及之前的输入,避免未来信息的泄露。
  • 扩张卷积:通过在卷积核之间引入间隔,使得网络能够在不增加计算复杂度的情况下,捕捉更长范围的依赖关系。
  • 残差连接:通过引入残差连接,TCN能够更好地训练深层网络,减轻梯度消失的问题。

上为TCN的简单架构示意图。

1.2 TCN的优点

  • 并行计算:与RNN不同,TCN的卷积操作可以并行计算,显著提高训练速度。
  • 长距离依赖:扩张卷积使得TCN能够有效捕捉长距离的时间依赖关系。
  • 灵活性:TCN可以轻松调整卷积核的大小和扩张因子,以适应不同的序列长度和特征。

1.3 TCN的应用场景

TCN在多个领域得到了广泛应用,包括但不限于:

  • 时间序列预测:如股市预测、气象预测等。
  • 语音识别:处理音频信号中的时间特征。
  • 自然语言处理:用于文本生成和情感分析等任务。

时序卷积网络(TCN)是一种强大的序列建模工具,凭借其独特的卷积结构和高效的训练方式,在处理时间序列数据方面展现了优越的性能。随着深度学习技术的不断发展,TCN有望在更多应用场景中发挥重要作用。

二、TCN的应用实例

下面这个实例将基于标普500指数(SPX)过去15年的历史数据进行模型训练。

为了提高模型的稳定性和预测效果,我们选择使用收益序列而非价格序列,因为收益序列具有更好的静态特性。

此外,在特征工程环节,我们还引入了最近10天的波动率和成交量数据作为补充特征,这些数据能够有效捕捉市场动态,从而进一步提升预测的准确性。

2.1 导入库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from tensorflow.keras import layers, models
import yfinance as yf

  • numpy 和 pandas 用于数据处理。
  • matplotlib.pyplot 用于绘图。
  • StandardScaler 用于特征标准化。
  • train_test_split 用于划分训练集和测试集。
  • tensorflow.keras 用于构建和训练深度学习模型。
  • yfinance 用于从 Yahoo Finance 获取金融数据。

2.2 数据准备

data_spx = yf.download("^GSPC", start="2010-01-01", end="2024-12-01")
price = data_spx['Adj Close']
volume = data_spx['Volume']

使用 yfinance 下载标普500指数(SPX)从2010年1月1日到2024年12月1日的调整后收盘价和成交量数据。

data = pd.DataFrame({'Price': price,'Volume': volume
})

将价格和成交量数据存储在一个 DataFrame 中。

data['Return'] = np.log(data['Price'] / data['Price'].shift(1))

计算对数收益率(log returns),即每日价格变化的对数。

rolling_window = 10
data['Volatility'] = data['Return'].rolling(window=rolling_window).std()

计算10天滚动窗口的波动率(volatility),即收益率的滚动标准差。

data['LogVolume'] = np.log(data['Volume'] + 1)

对成交量进行对数变换,以减小数据的尺度差异。

data = data.dropna()

删除由于滚动操作产生的 NaN 值。

2.3 特征和标签准备

features = data[['Return', 'Volatility', 'LogVolume']].values
labels = data['Return'].shift(-10).dropna().values

  • 特征包括收益率、波动率和对数成交量。
  • 标签是未来10天的收益率。

features = features[:-10]

对齐特征和标签,确保特征和标签的长度一致。

scaler = StandardScaler()
features = scaler.fit_transform(features)

对特征进行标准化处理,使其均值为0,标准差为1。

sequence_length = 30
X, y = [], []
for i in range(len(features) - sequence_length):X.append(features[i:i + sequence_length])y.append(labels[i + sequence_length - 1])
X, y = np.array(X), np.array(y)

将特征数据转换为时间序列格式,每个样本包含30个时间步的特征。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

将数据集划分为训练集和测试集,测试集占20%。

2.4 TCN模型定义

model = models.Sequential([layers.Input(shape=(sequence_length, X.shape[2])),layers.Conv1D(filters=64, kernel_size=3, dilation_rate=1, activation='relu'),layers.Conv1D(filters=64, kernel_size=3, dilation_rate=2, activation='relu'),layers.GlobalAveragePooling1D(),layers.Dense(1)
])

  • 定义一个简单的TCN模型,包含两个1D卷积层,分别使用不同的膨胀率(dilation rate)。
  • 使用全局平均池化层(GlobalAveragePooling1D)将时间维度压缩为单个值。
  • 最后是一个全连接层(Dense),输出未来10天的收益率预测。

model.compile(optimizer='adam', loss='mse')

使用Adam优化器和均方误差(MSE)作为损失函数来编译模型。

2.5 模型训练

epochs = 1000
batch_size = 32
history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=batch_size)

训练模型,设置1000个epoch,批量大小为32。

2.6 模型评估

y_pred = model.predict(X_test)

使用测试集进行预测。

plt.figure(figsize=(10, 6))
plt.plot(y_test[-50:], label='Actual Returns', alpha=0.7)
plt.plot(y_pred[-50:], label='Predicted Returns', alpha=0.7)
plt.title('Comparison of Actual vs Predicted Returns')
plt.legend()
plt.show()

绘制实际收益率和预测收益率的对比图。

2.7 保存模型和结果

model.save("tcn_model.h5")

将训练好的模型保存为 tcn_model.h5 文件。

model.summary()

打印模型的摘要信息。

下图为TCN 基础预测与 SPX 最近 50 天的实际回报率对比。

这段代码实现了一个基于TCN的模型,用于预测标普500指数未来10天的收益率。代码涵盖了数据获取、预处理、模型构建、训练、评估和保存的完整流程。

全源代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from tensorflow.keras import layers, models
import yfinance as yf# === Data Preparation ===
# Simulate example data (replace this with actual SPX data)
#np.random.seed(42)
#n_days = 1000
#price = np.cumprod(1 + np.random.normal(0, 0.01, n_days)) * 1000
#volume = np.random.randint(1e6, 1e7, n_days)# Step 1: Fetch SPX data
data_spx = yf.download("^GSPC", start="2010-01-01", end="2024-12-01")
price = data_spx['Adj Close']
volume = data_spx['Volume']# Create a DataFrame
data = pd.DataFrame({'Price': price,'Volume': volume
})# Compute returns (log returns)
data['Return'] = np.log(data['Price'] / data['Price'].shift(1))# Compute rolling volatility (10-day window)
rolling_window = 10
data['Volatility'] = data['Return'].rolling(window=rolling_window).std()# Log-transform volume
data['LogVolume'] = np.log(data['Volume'] + 1)# Drop NaN values caused by rolling operations
data = data.dropna()# Prepare features and labels
features = data[['Return', 'Volatility', 'LogVolume']].values
labels = data['Return'].shift(-10).dropna().values  # Predict 10-day-ahead return# Align features with labels
features = features[:-10]# Standardize features
scaler = StandardScaler()
features = scaler.fit_transform(features)# Reshape features for TCN (samples, timesteps, features)
sequence_length = 30  # Lookback window
X, y = [], []
for i in range(len(features) - sequence_length):X.append(features[i:i + sequence_length])y.append(labels[i + sequence_length - 1])
X, y = np.array(X), np.array(y)# Split into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# === TCN Model Definition ===
# Define the TCN architecture
model = models.Sequential([layers.Input(shape=(sequence_length, X.shape[2])),layers.Conv1D(filters=64, kernel_size=3, dilation_rate=1, activation='relu'),layers.Conv1D(filters=64, kernel_size=3, dilation_rate=2, activation='relu'),layers.GlobalAveragePooling1D(),layers.Dense(1)  # Single output for next return prediction
])# Compile the model
model.compile(optimizer='adam', loss='mse')# === Model Training ===
# Train the model
epochs = 1000
batch_size = 32
history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=batch_size)# === Model Evaluation ===
# Predict on the test set
y_pred = model.predict(X_test)# Plot actual vs predicted returns
plt.figure(figsize=(10, 6))
plt.plot(y_test[-50:], label='Actual Returns', alpha=0.7)
plt.plot(y_pred[-50:], label='Predicted Returns', alpha=0.7)
plt.title('Comparison of Actual vs Predicted Returns')
plt.legend()
plt.show()# === Save Model and Results ===
# Save the model
model.save("tcn_model.h5")# Print summary
model.summary()

三、观点总结

时序卷积网络(TCN)在时间序列预测任务中表现卓越,主要得益于其出色的长程依赖关系建模能力。与传统的递归架构(如LSTM或GRU)不同,TCN采用扩张卷积运算,能够高效捕捉长时间跨度内的时间模式,同时避免了递归模型中常见的梯度消失问题。这种独特的设计使其在处理复杂时间序列数据时更具优势。

  • TCN的关键组成部分包括随意卷积(Casual Convolutions)、稀释卷积(Dilated Convolutions)和残差连接(Residual Connection)。
  • TCN能够并行处理整个序列,这使得它比RNN更快地训练。
  • TCN通过稀释卷积能够捕捉跳跃时间序列,并且能够处理长内存
  • 通过残差连接和无递归,TCN减少了梯度消失等不稳定性问题
  • 在实际应用中,TCN模型使用了SPX指数的历史数据,包括收益率、波动性和成交量,以及如何预测未来10天的回报率
  • TCN在时间序列预测任务中的优越性能,尤其是在处理长期依赖关系和避免梯度消失问题方面有良好表现。

感谢您阅读到最后,希望这篇文章为您带来了新的启发和实用的知识!如果觉得有帮助,请不吝点赞和分享,您的支持是我持续创作的动力。祝您投资顺利,收益长虹!如果对文中内容有任何疑问,欢迎留言,我会尽快回复!


本文内容仅限技术探讨和学习,不构成任何投资建议。

相关文章:

超越LSTM!TCN模型如何精准预测股市波动(附代码)

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:最近我用TCN时间卷积网络预测了标普500指数(SPX)的每日回报率,发现效果远超传统方法。TCN通过因果卷积和膨胀卷积捕捉时间序列的长期依赖关…...

[每周一更]-(第133期):Go中MapReduce架构思想的使用场景

文章目录 **MapReduce 工作流程**Go 中使用 MapReduce 的实现方式:**Go MapReduce 的特点****哪些场景适合使用 MapReduce?**使用场景1. 数据聚合2. 数据过滤3. 数据排序4. 数据转换5. 数据去重6. 数据分组7. 数据统计8.**统计文本中单词出现次数****代码…...

QML初识

目录 一、关于QML 二、布局定位和锚点 1.布局定位 2.锚点详解 三、数据绑定 1.基本概念 2.绑定方法 3.数据模型绑定 四、附加属性及信号 1.附加属性 2.信号 一、关于QML QML是Qt框架中的一种声明式编程语言,用于描述用户界面的外观和行为;Qu…...

查询已经运行的 Docker 容器启动命令

一、导语 使用 get_command_4_run_container 查询 docker 容器的启动命令 获取镜像 docker pull cucker/get_command_4_run_container 查看容器命令 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock cucker/get_command_4_run_container 容器id或容器名 …...

项目管理中的13个数据分析思维

01 信度与效度思维 信度:是指一个数据或指标自身的可靠程度,包括准确性和稳定性。 效度:是指一个数据或指标的生成,需贴合它所要衡量的事物,即指标的变化能够代表该事物的变化。 在项目管理中,信度和效度的…...

快速查看ROS节点的CPU和内存占用情况

他们可能是在排查资源泄漏的问题,所以需要监控节点的CPU和内存使用情况。可能他们遇到了节点占用过多资源导致服务器崩溃的情况,需要快速定位问题节点。现有的Linux命令方面,top和htop可以实时查看进程资源使用,但用户想要的是针对ROS节点的,可能需要更针对性的工具。ROS本…...

Centos Stream 10 根目录下的文件夹结构

/ ├── bin -> usr/bin ├── boot ├── dev ├── etc ├── home ├── lib -> usr/lib ├── lib64 -> usr/lib64 ├── lostfound ├── media ├── mnt ├── opt ├── proc ├── root ├── run ├── sbin -> usr/sbin ├── srv ├─…...

协议_CAN协议

物理层特征 信号传输原理: CAN控制器根据CAN_L和CAN_H上的电位差来判断总线电平,总线电平分为显性电平(CAN_H与CAN_L压差 2v)、隐性电平(CAN_H与CAN_L压差 0v),发送方通过总线电平的变化&am…...

nuxt3中报错: `setInterval` should not be used on the server.

那是因为在后端渲染没有浏览器的执行环境,一些浏览器环境提供的对象和方法都无法使用,代码判断下就行。 if (import.meta.client) {setInterval(() > {}, 1000) }Import meta Nuxt API...

leetcode_深度搜索和广度搜索 101. 对称二叉树

101. 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称思路: 1.判断根节点的左右子树是否为空, 若都为空则返回True2.根节点的左右子树其中之一为空或子树的根节点的值不同则返回False3.分别判断根节点左右子树是否相同, 判断时, 左边子树的左节点要对应…...

QT修仙之路2-2 对话框 尚欠火候

警告对话框 相关代码 错误对话框 相关代码 消息对话框 相关代码 询问对话框 相关代码 相关代码 警告对话框 QMessageBox::warning(this,"错误","账号密码不能为空",QMessageBox::Ok);错误对话框 QMessageBox msgBox(QMessageBox::Critical,"错误…...

NFT Insider #168:The Sandbox 推出新春{金蛇礼服}套装;胖企鹅合作 LINE Minini

引言:NFT Insider 由 NFT 收藏组织 WHALE Members、BeepCrypto 联合出品, 浓缩每周 NFT 新闻,为大家带来关于 NFT 最全面、最新鲜、最有价值的讯息。每期周报将从 NFT 市场数据,艺术新闻类,游戏新闻类,虚拟…...

ZooKeeper 技术全解:概念、功能、文件系统与主从同步

引言 随着分布式系统变得越来越复杂,对协调服务的需求也在不断增长。ZooKeeper 作为一个由 Apache 维护的开源分布式协调服务框架,广泛用于 Hadoop 生态系统和其他需要协调的分布式环境中。这一系统旨在解决分布式应用中常见的挑战,如配置管…...

什么是deepseek?

AI国产免费开源强大 DeepSeek 是由国内团队开发的一款开源人工智能工具库,专注于提供高效易用的 AI 模型训练与推理能力。它既包含预训练大语言模型(如 DeepSeek-R1 系列),也提供配套工具链,助力开发者快速实现 AI 应用…...

容器服务基础

1.腾讯云容器服务 使用该服务,开发者将无需安装、运维、扩展您的集群管理基础设施,只需进行简单的API调用,便可启动和停止 Docker 应用程序,查询集群的完整状态,以及使用各种云服务。 创建集群--创建工作负载/创建ingr…...

C++基础知识(二)之数据类型、指针和内存、数组

六、C数据类型 1、sizeof运算符 sizeof运算符用于求数据类型或变量占用的内存空间。 用于数据类型:sizeof(数据类型) 用于变量:sizeof(变量名) 或 sizeof 变量名 注意: 在32位和64位操作系统中,同一种数据类型占用的内存空间…...

LLMs之DeepSeek r1:Logic-RL的简介、安装和使用方法、案例应用之详细攻略

LLMs之DeepSeek r1:Logic-RL的简介、安装和使用方法、案例应用之详细攻略 目录 Logic-RL的简介 1、Logic-RL的特点 2、性能 Logic-RL 的安装和使用方法 1、安装 2、使用方法 数据准备 基础模型 指令模型 训练执行 实现细节 Logic-RL的案例应用 Logic-RL…...

AUTOSAR汽车电子嵌入式编程精讲300篇-基于FPGA的CAN FD汽车总线数据交互系统设计

目录 前言 汽车总线以及发展趋势 汽车总线技术 汽车总线发展趋势 CAN FD总线国内外研究现状 2 系统方案及CAN FD协议分析 2.1系统控制方案设计 2.2 CAN FD总线帧结构分析 2.2.1数据帧分析 2.2.2远程帧分析 2.2.3过载帧分析 2.2.4错误帧分析 2.2.5帧间隔分析 2.3位…...

【神经网络框架】非局部神经网络

一、非局部操作的数学定义与理论框架 1.1 非局部操作的通用公式 非局部操作(Non-local Operation)是该研究的核心创新点,其数学定义源自经典计算机视觉中的非局部均值算法(Non-local Means)。在深度神经网络中,非局部操作被形式化为: 其中: 1.2 与传统操作的对比分析…...

22.[前端开发]Day22-CSS单位-CSS预处理器-移动端视口

1 CSS常见单位详解 CSS中的单位 CSS中的绝对单位( Absolute length units ) CSS中的相对单位( Relative length units ) 1.em: 相对自己的font-size;如果自己没有设置, 那么会继承父元素的font-size 2.如果font-size中…...

深入讲解MyBatis

1. MyBatis 的背景和优势 背景:在 Java 开发中,传统的 JDBC 操作数据库代码繁琐,需要手动管理数据库连接、编写 SQL 语句、处理结果集等,开发效率低且容易出错。MyBatis 应运而生,它通过将 SQL 语句与 Java 代码分离&a…...

URL调用本地Ollama模型

curl http://192.168.2.247:11434/api/generate -d "{ \"model\": \"deepseek-r1:8b\", \"prompt\": \"Who r u?\" ,\"stream\":false}" 连续对话...

DeepSeek和ChatGPT的优劣或者区别(答案来DeepSeek和ChatGPT)

DeepSeek的答案 DeepSeek与ChatGPT作为当前两大主流AI模型,在架构设计、性能表现、应用场景等方面存在显著差异,以下从多个维度进行对比分析: 一、架构与训练效率 架构设计 DeepSeek:采用混合专家(MoE)框架…...

【python】matplotlib(animation)

文章目录 1、matplotlib.animation1.1、FuncAnimation1.2、修改 matplotlib 背景 2、matplotlib imageio2.1、折线图2.2、条形图2.3、散点图 3、参考 1、matplotlib.animation 1.1、FuncAnimation matplotlib.animation.FuncAnimation 是 Matplotlib 库中用于创建动画的一个…...

ubuntu24.04安装布置ros

最近换电脑布置机器人环境,下了24.04,但是网上的都不太合适,于是自己试着布置好了,留作有需要的人一起看看。 文章目录 目录 前言 一、确认 ROS 发行版名称 二、检查你的 Ubuntu 版本 三、安装正确的 ROS 发行版 四、对于Ubuntu24…...

Vue Router 导航方式详解:声明式导航与编程式导航

Vue Router 是 Vue.js 官方推荐的路由管理器,提供了两种主要的导航方式:声明式导航和编程式导航。这两种方式各有特点,适用于不同的场景。本文将详细介绍它们的用法、区别以及底层实现原理。 1. 声明式导航 1.1 什么是声明式导航&#xff1f…...

【RabbitMQ重试】重试三次转入死信队列

以下是基于RabbitMQ死信队列实现消息重试三次后转存的技术方案&#xff1a; 方案设计要点 队列定义改造&#xff08;核心参数配置&#xff09; Bean public Queue auditQueue() {Map<String, Object> args new HashMap<>();args.put("x-dead-letter-exchan…...

接入 deepseek 实现AI智能问诊

1. 准备工作 注册 DeepSeek 账号 前往 DeepSeek 官网 注册账号并获取 API Key。 创建 UniApp 项目 使用 HBuilderX 创建一个新的 UniApp 项目&#xff08;选择 Vue3 或 Vue2 模板&#xff09;。 安装依赖 如果需要在 UniApp 中使用 HTTP 请求&#xff0c;推荐使用 uni.requ…...

网络爬虫js逆向之异步栈跟栈案例

【注意&#xff01;&#xff01;&#xff01;】 前言&#xff1a; 1. 本章主要讲解js逆向之异步栈跟栈的知识&#xff08;通过单步执行调试&#xff09; 2. 使用关键字搜定位加密入口 3. 本专栏通过多篇文章【文字案例】的形式系统化进行描述 4. 本文章全文进行了脱敏处理 5. 详…...

机器学习 - 需要了解的条件概率、高斯分布、似然函数

似然函数是连接数据与参数的桥梁&#xff0c;通过“数据反推参数”的逆向思维&#xff0c;成为统计推断的核心工具。理解它的关键在于区分“参数固定时数据的概率”与“数据固定时参数的合理性”&#xff0c;这种视角转换是掌握现代统计学和机器学习的基础。 一、在学习似然函…...