TCN时序卷积网络实战:用PyTorch搭建股票价格预测模型(附完整代码)
最近几年,在量化交易和金融数据分析的圈子里,大家讨论模型时,LSTM和GRU这类循环神经网络几乎成了默认选项。但如果你仔细跟踪过顶级会议上的论文,或者尝试复现过一些最新的时间序列预测项目,可能会发现一个趋势:一种基于卷积神经网络(CNN)的架构——时序卷积网络(TCN),正悄然成为许多场景下的新宠。我第一次接触TCN是在处理一个高频股价预测的私密项目时,当时LSTM在捕捉长期依赖上的表现总是不尽如人意,训练速度也慢得让人头疼。直到尝试了TCN,不仅预测精度有提升,更关键的是,模型训练时间缩短了近70%,这让我开始重新审视卷积在序列建模上的潜力。
今天,我们就抛开复杂的理论推导,直接从实战出发。我会手把手带你用PyTorch搭建一个完整的TCN模型,目标是预测股票价格。我们将使用雅虎财经的实时数据,从数据获取、预处理、模型构建、训练到评估,形成一个闭环。更重要的是,我会将TCN与大家熟悉的LSTM在同一个数据集上进行“背靠背”的对比,用可视化的结果直观展示两者的差异。文章末尾会提供一个可以直接在Google Colab上运行的Notebook链接,你完全可以跟着代码一步步操作,甚至替换成自己感兴趣的数据集。
1. 为什么是TCN?重新思考序列建模的范式
在深入代码之前,我们有必要先理解TCN的核心优势。传统上,我们认为循环神经网络(RNN)及其变体(LSTM、GRU)是处理序列数据的“天然”选择,因为它们具有内在的时序结构。然而,这种结构也带来了几个固有的挑战:
- 梯度问题:尽管LSTM缓解了梯度消失,但长序列训练中梯度不稳定仍是常见问题。
- 顺序计算:RNN必须按时间步顺序处理数据,无法充分利用现代GPU的大规模并行计算能力,导致训练缓慢。
- 记忆长度有限:虽然有了注意力机制等改进,但模型有效记忆的上下文长度仍然受限。
TCN从另一个角度切入。它使用一维卷积来捕捉序列模式,并通过两个关键技术解决了传统卷积用于时间序列预测的弊端:
- 因果卷积(Causal Convolution):确保时刻
t的输出仅依赖于t及之前时刻的输入,不会“窥见”未来信息,这是预测任务的基本要求。 - 膨胀卷积(Dilated Convolution):通过引入膨胀因子(dilation rate),让卷积核在输入序列上间隔采样,从而在不增加参数量的情况下,指数级地扩大感受野。一个层数为
n的网络,感受野长度可以达到2^n。
这种设计带来了几个直观的好处:
- 并行性:整个输出序列可以并行计算,训练速度极快。
- 灵活的感受野:通过堆叠膨胀卷积层,可以轻松捕捉非常长期的依赖关系。
- 稳定梯度:与CNN类似,反向传播路径更短、更直接,梯度流动更稳定。
为了更清晰地对比TCN与经典RNN/LSTM的差异,我整理了一个核心特性对照表:
| 特性维度 | TCN (时序卷积网络) | LSTM/RNN (循环神经网络) |
|---|---|---|
| 计算方式 | 并行计算(整个序列) | 顺序计算(按时间步) |
| 训练速度 | 通常更快,利于GPU并行 | 相对较慢,受序列长度限制 |
| 梯度流动 | 路径较短,相对稳定 | 路径长,易出现梯度消失/爆炸 |
| 感受野 | 通过膨胀卷积可灵活设计,可捕捉极长期依赖 | 理论上能捕捉长期依赖,实际中可能受限于“记忆”能力 |
| 输入/输出长度 | 输入输出长度可以相同(全卷积) | 通常需要设计(如Seq2Seq) |
| 内存占用 | 训练时相对较高(需保存中间特征) | 推理时相对较低(按步更新状态) |
提示:选择TCN并不意味着LSTM过时了。对于非常短的序列或在线学习(流式数据)场景,LSTM仍有其优势。TCN更适合离线训练、需要捕捉长期模式且对训练速度有要求的批量预测任务。
我第一次在股价预测项目中使用TCN时,最惊讶的不是最终指标提升了几个百分点,而是迭代效率的质变。原本需要跑一晚上的实验,现在午饭时间就能看到结果,这让我有更多机会进行超参数调优和模型结构探索。
2. 实战环境搭建与数据管道构建
任何机器学习项目都始于数据和环境。为了让我们的实验可复现,我强烈建议使用Google Colab,它提供了免费的GPU资源(通常是Tesla T4或V100),非常适合运行深度学习模型。当然,本地有GPU环境的朋友也可以轻松跟进。
2.1 环境与依赖安装
首先,我们需要安装核心库。除了PyTorch,我们还会用到 yfinance 来获取雅虎财经数据,用 plotly 来做交互式可视化,让结果更直观。
# 在Colab Notebook的第一个单元格中执行
!pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
!pip install yfinance pandas numpy scikit-learn plotly
安装完成后,在代码开头导入所有必要的模块:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader, TensorDataset
import numpy as np
import pandas as pd
import yfinance as yf
from sklearn.preprocessing import MinMaxScaler
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import warnings
warnings.filterwarnings('i
213



被折叠的 条评论
为什么被折叠?



