超越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 什么是声明式导航?…...
【RabbitMQ重试】重试三次转入死信队列
以下是基于RabbitMQ死信队列实现消息重试三次后转存的技术方案: 方案设计要点 队列定义改造(核心参数配置) 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 项目(选择 Vue3 或 Vue2 模板)。 安装依赖 如果需要在 UniApp 中使用 HTTP 请求,推荐使用 uni.requ…...
网络爬虫js逆向之异步栈跟栈案例
【注意!!!】 前言: 1. 本章主要讲解js逆向之异步栈跟栈的知识(通过单步执行调试) 2. 使用关键字搜定位加密入口 3. 本专栏通过多篇文章【文字案例】的形式系统化进行描述 4. 本文章全文进行了脱敏处理 5. 详…...
机器学习 - 需要了解的条件概率、高斯分布、似然函数
似然函数是连接数据与参数的桥梁,通过“数据反推参数”的逆向思维,成为统计推断的核心工具。理解它的关键在于区分“参数固定时数据的概率”与“数据固定时参数的合理性”,这种视角转换是掌握现代统计学和机器学习的基础。 一、在学习似然函…...
