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

news2025/2/11 9:22:11

作者:老余捞鱼

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

写在前面的话:最近我用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在时间序列预测任务中的优越性能,尤其是在处理长期依赖关系和避免梯度消失问题方面有良好表现。

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


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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[每周一更]-(第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或容器名 …

协议_CAN协议

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

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 市场数据,艺术新闻类,游戏新闻类,虚拟…

什么是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…

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

一、非局部操作的数学定义与理论框架 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中…

URL调用本地Ollama模型

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

【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…

接入 deepseek 实现AI智能问诊

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

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

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

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

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

【Spring】什么是Spring?

什么是Spring? Spring是一个开源的轻量级框架,是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…

[笔记] 汇编杂记(持续更新)

文章目录 前言举例解释函数的序言函数的调用栈数据的传递 总结 前言 举例解释 // Type your code here, or load an example. int square(int num) {return num * num; }int sub(int num1, int num2) {return num1 - num2; }int add(int num1, int num2) {return num1 num2;…