目录

1. 引言:为什么股票预测依然困难?

2. 项目背景与研究动机

2.1 为什么选择 TCN?

2.2 为什么加入 Multi-Head Attention?

2.3 为什么使用 KAN 作为预测头?

2.4 为什么引入 KOA?

3. 模型整体架构

4. 各模块原理详解

4.1 TCN:用因果膨胀卷积提取局部时序模式

4.2 Multi-Head Attention:让模型知道哪些历史更重要

4.3 KAN Head:用可学习基函数增强非线性拟合

4.4 KOA:用于超参数优化,而不是预测主干

5. 数学公式推导

5.1 时序样本构造

5.2 特征归一化

5.3 TCN 因果卷积

5.4 残差映射

5.5 Scaled Dot-Product Attention

5.6 KAN Head 输出

5.7 损失函数与多任务学习

5.8 KOA 适应度函数

5.9 评价指标

6. 数据集与特征工程

7. 实验设计

8. 实验结果与分析

9. 可视化与图表分析

10. 模型优势、局限与反思

1. 引言:为什么股票预测依然困难?

股票价格预测一直是时间序列建模中最具挑战性的任务之一。原因并不只是“股票市场噪声大”这么简单,而是金融时间序列同时具备多种复杂性质:非线性、非平稳、高噪声、厚尾分布、阶段性结构变化,以及短期波动和长期趋势并存。

对于股票收盘价序列而言,短期内可能受到成交量、技术指标、市场情绪甚至突发事件影响;长期又可能受到行业景气度、宏观利率、企业基本面等因素驱动。因此,一个有效的股票预测模型不能只记住近期价格,也不能只捕捉长期趋势,而需要同时具备局部模式提取、长距离依赖建模、非线性拟合和稳定调参能力。

传统统计模型如 ARIMA、SARIMA 在趋势和线性结构上有清晰解释,但对强非线性关系较弱。SVR、Random Forest、XGBoost 等机器学习模型能够处理非线性特征,但通常需要将时序窗口展平成静态样本,难以充分建模序列结构。LSTM、GRU、Transformer 等深度模型虽然具备序列建模能力,但在金融数据这种“小噪声规律 + 大随机扰动”混合场景下,模型结构和超参数选择会显著影响效果。

基于这些问题,我构建了一个混合模型:

Hybrid-KOA-TCN-KAN-Multihead-Attention

它的整体思想是:

用 TCN 提取局部时序特征,用 Multi-Head Attention 捕捉长距离依赖,用 KAN Head 增强非线性映射能力,再用 KOA 对关键超参数进行自动搜索。

2. 项目背景与研究动机

这个项目不是把多个热门模块简单拼接起来,而是围绕金融时间序列的几个核心难点进行设计。

2.1 为什么选择 TCN?

TCN,即 Temporal Convolutional Network,适合处理时间序列数据。相比 RNN、LSTM、GRU,TCN 有三个优点:

第一,卷积结构可以并行计算,训练效率较高。
第二,因果卷积能够保证模型不看到未来信息。
第三,膨胀卷积可以在不显著增加参数量的情况下扩大感受野。

在股票预测中,短期价格形态、均线交叉、成交量变化、波动率放大等模式往往具有局部连续性,TCN 正好适合提取这类局部时序特征。

2.2 为什么加入 Multi-Head Attention?

TCN 擅长提取局部模式,但金融序列中有些影响并不局限于最近几天。例如,某次剧烈波动后的市场修复可能持续数周,或者某个长期均线附近的反复震荡会影响后续价格走势。

Multi-Head Attention 的作用是让模型自动判断历史窗口中哪些时间步更重要。它不是简单地平均历史信息,而是为不同时间位置分配不同权重。

2.3 为什么使用 KAN 作为预测头?

传统深度学习模型最后通常使用 MLP 作为回归头。MLP 虽然表达能力强,但解释性有限。KAN,即 Kolmogorov-Arnold Network,其核心思想是通过可学习的一维函数组合表达复杂非线性映射。

在本项目中,KAN Head 采用了一个简化可运行版本:

Linear + spline-like nonlinear basis + Linear

也就是说,用类似样条/RBF 的基函数来近似 KAN 中的非线性函数映射。这样既能保持工程可运行,又保留了后续升级到标准 KAN 的接口。

2.4 为什么引入 KOA?

深度模型对超参数非常敏感。窗口长度、TCN 层数、通道数、卷积核大小、Attention heads、KAN hidden dim、学习率、weight decay 等都会影响结果。

如果完全手工调参,效率低且不稳定。因此项目中引入 KOA,即 Kepler Optimization Algorithm,作为超参数优化器。它不参与预测主干,而是用验证集 RMSE 等指标评价候选超参数组合,并逐步搜索更优结构。

3. 模型整体架构

Hybrid-KOA-TCN-KAN-Multihead-Attention 的主干流程可以写成:

假设每个交易日有d 个特征,滑动窗口长度为 L,则单个样本输入为:

\mathbf{X}_t\in\mathbb{R}^{L\times d}

在工程实现中,输入张量形状为:

[batch_size, window_size, feature_dim]

经过 TCN 后,输出为:

[batch_size, window_size, tcn_channels]

再经过 Multi-Head Attention:

[batch_size, window_size, attention_dim]

最后通过 pooling 得到:

[batch_size, attention_dim]

再送入 KAN Head 输出:

regression: [batch_size, 1] classification: [batch_size, 1]

4. 各模块原理详解

4.1 TCN:用因果膨胀卷积提取局部时序模式

TCN 的关键是因果卷积和膨胀卷积。

因果卷积保证预测第 t+1日时,只能使用 t日及以前的信息,不能泄露未来数据。膨胀卷积则通过间隔采样扩大感受野,使浅层网络也能看到更长历史。

在项目中,TCNBlock 的核心代码如下

class TCNBlock(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, dilation, dropout):
        padding = (kernel_size - 1) * dilation
        self.net = nn.Sequential(
            nn.Conv1d(in_channels, out_channels, kernel_size,
                      padding=padding, dilation=dilation),
            Chomp1d(padding),
            ChannelLayerNorm(out_channels),
            nn.GELU(),
            nn.Dropout(dropout),
            nn.Conv1d(out_channels, out_channels, kernel_size,
                      padding=padding, dilation=dilation),
            Chomp1d(padding),
            ChannelLayerNorm(out_channels),
            nn.GELU(),
            nn.Dropout(dropout),
        )
        self.downsample = nn.Conv1d(in_channels, out_channels, 1) \
            if in_channels != out_channels else nn.Identity()

    def forward(self, x):
        return self.net(x) + self.downsample(x)

这段代码对应 TCN 的因果膨胀卷积和残差映射。Chomp1d 的作用是裁剪右侧填充,确保卷积输出不包含未来时间步信息。

4.2 Multi-Head Attention:让模型知道哪些历史更重要

Attention 的核心思想是:当前时间步并不是同等依赖所有历史时间步,而是会对不同历史片段分配不同权重。

在项目中,Attention 模块的关键实现如下:

class MultiHeadSelfAttention(nn.Module):
    def forward(self, x):
        z = self.input_proj(x)
        attn_out, weights = self.attn(
            z, z, z,
            need_weights=True,
            average_attn_weights=False
        )
        z = self.norm1(z + self.dropout(attn_out))
        z = self.norm2(z + self.dropout(self.ffn(z)))
        return z, weights

这里的 weights 就是注意力权重,可以进一步绘制 Attention 热力图,用来解释模型关注了哪些历史时间位置。

4.3 KAN Head:用可学习基函数增强非线性拟合

项目中的 KAN Head 是一个可运行近似版本。它用 RBF/spline-like basis 模拟 KAN 中的一维非线性函数。

核心代码如下:

class SplineBasisLayer(nn.Module):
    def forward(self, x):
        x_expanded = x.unsqueeze(-1)
        width = torch.exp(self.log_width).clamp_min(1e-3)
        basis = torch.exp(
            -((x_expanded - self.centers) ** 2) / (2 * width ** 2)
        )
        basis = basis.reshape(x.shape[0], -1)
        return self.linear(basis) + self.skip(x)

这段代码实际上是在构造一组可学习的非线性基函数。相比直接使用 MLP,它更方便观察输入特征经过基函数后的响应形态。

4.4 KOA:用于超参数优化,而不是预测主干

KOA 在本项目中负责搜索超参数。每个个体表示一组候选超参数,例如:

window_size, tcn_layers, tcn_channels, kernel_size,
dropout, attention_heads, kan_hidden_dim,
learning_rate, weight_decay, batch_size

优化过程可以概括为:

for iteration in range(max_iter):
    for individual in population:
        params = decode(individual)
        fitness = train_and_validate(params)
        update_best(params, fitness)

    population = kepler_orbit_update(population, best_position)
    population = clip_to_bounds(population)

它和随机搜索的区别在于:随机搜索每次独立采样,而 KOA 会利用当前最优个体引导种群逐步收敛。

5. 数学公式推导

5.1 时序样本构造

设第 t日的特征向量为:

\mathbf{x}_t=[x_{t,1},x_{t,2},\ldots,x_{t,d}]

滑动窗口长度为 L,预测步长为 h,则输入样本为:

\mathbf{X}_t=[\mathbf{x}_{t-L+1},\mathbf{x}_{t-L+2},\ldots,\mathbf{x}_t]\in\mathbb{R}^{L\times d}

对应标签为:

y_t=Close_{t+h}

公式解释:
公式(1)表示模型使用过去 L个交易日的多维特征作为输入。公式(2)表示预测目标是未来第 h 个交易日的收盘价。这样构造样本可以保证输入全部来自预测日前的历史数据,不会产生未来信息泄露。

5.2 特征归一化

对第 j个特征,训练集均值为 mu_j,标准差为 sigma_j,归一化公式为:

\tilde{x}_{t,j}=\frac{x_{t,j}-\mu_j}{\sigma_j+\epsilon}

公式解释:
\tilde{x}_{t,j}是归一化后的特征值,\epsilon用于避免除零。需要注意的是,\mu_j\sigma_j 只能由训练集计算,验证集和测试集只能使用训练集统计量进行变换。

工程实现上,对应 StandardScaler:

if fit_scaler:
    scaler_x.fit(train_features)

features = scaler_x.transform(features)

这段代码对应公式(3,也是避免信息泄露的关键步骤。

5.3 TCN 因果卷积

普通一维卷积可以写为:

h_t=\sum_{i=0}^{k-1}w_ix_{t-i}

公式解释:
这里 k是卷积核大小,w_i是卷积核参数。由于只使用 x_t,x_{t-1},\dots等历史输入,因此它是因果的。

膨胀卷积进一步写为:

h_t=\sum_{i=0}^{k-1}w_ix_{t-r\cdot i}

公式解释:
r是膨胀率。当 r=1时是普通因果卷积;当 r>1时,卷积会间隔采样历史时间步,从而扩大感受野。对于股票数据,这意味着模型可以同时捕捉近期波动和更早的趋势信息。

5.4 残差映射

TCNBlock 中的残差连接可以表示为:

\mathbf{H}^{(l)}=F(\mathbf{H}^{(l-1)})+\phi(\mathbf{H}^{(l-1)})

公式解释:
F(\cdot)表示卷积、归一化、激活和 Dropout 组成的非线性变换;\phi(\cdot)是残差分支,当输入输出通道不同,需要用 times 1 卷积调整维度。残差连接可以缓解深层网络训练中的梯度衰减问题。

5.5 Scaled Dot-Product Attention

给定查询矩阵 \mathbf{Q}、键矩阵\mathbf{K}、值矩阵 \mathbf{V},注意力计算为:

Attention(\mathbf{Q},\mathbf{K},\mathbf{V})=softmax\left(\frac{\mathbf{Q}\mathbf{K}^T}{\sqrt{d_k}}\right)\mathbf{V}

公式解释:
\mathbf{Q}\mathbf{K}^T 表示不同时间步之间的相似度,\sqrt{d_k}用于缩放,防止点积过大导致 softmax 饱和。softmax 后得到的权重表示模型对不同历史时间步的关注程度。

多头注意力为:

head_i=Attention(\mathbf{Q}\mathbf{W}_i^Q,\mathbf{K}\mathbf{W}_i^K,\mathbf{V}\mathbf{W}_i^V)

MHA(\mathbf{H})=Concat(head_1,head_2,\ldots,head_m)\mathbf{W}^O

公式解释:
不同 head 可以学习不同角度的时间依赖。例如,有的头可能关注近期波动,有的头可能关注窗口开头的趋势拐点。

5.6 KAN Head 输出

设 Attention 后的池化表示为 \(\mathbf{z}\),KAN Head 中的基函数可写为:

\psi_b(z_j)=\exp\left(-\frac{(z_j-c_b)^2}{2\sigma_b^2}\right)

公式解释:

c_b\sigma_b 分别是第 b个基函数的中心和宽度。输入越接近中心,基函数响应越强。

回归输出为:

\hat{y}=f_{KAN}(\mathbf{z})

分类输出为:

\hat{p}=\sigma(g_{KAN}(\mathbf{z}))=\frac{1}{1+e^{-g_{KAN}(\mathbf{z})}}

公式解释:
\hat{y}是预测收盘价或收益率,\hat{p} 是下一交易日上涨的概率。

5.7 损失函数与多任务学习

回归损失可使用 MSE:

\mathcal{L}_{MSE}=\frac{1}{N}\sum_{i=1}^{N}(y_i-\hat{y}_i)^2

分类损失使用二分类交叉熵:

\mathcal{L}_{BCE}=-\frac{1}{N}\sum_{i=1}^{N}[c_i\log(\hat{p}_i)+(1-c_i)\log(1-\hat{p}_i)]

多任务总损失为:

\mathcal{L}=\lambda_1\mathcal{L}_{reg}+\lambda_2\mathcal{L}_{cls}+\lambda_3\mathcal{L}_{dir}

公式解释:
\lambda_1\lambda_2\lambda_3控制价格回归、方向分类和方向约束损失的权重。这样做的好处是,模型不仅拟合价格数值,也学习涨跌方向。

对应代码如下:

reg_loss = reg_loss_fn(outputs["regression"], y_reg)
cls_loss = nn.BCEWithLogitsLoss()(
    outputs["classification"].view(-1),
    y_cls.float()
)

loss = lambda_reg * reg_loss + lambda_cls * cls_loss

5.8 KOA 适应度函数

KOA 的目标是最小化验证集误差:

Fitness(\theta)=RMSE_{val}(\theta)=\sqrt{\frac{1}{N}\sum_{i=1}^{N}(y_i-\hat{y}_i(\theta))^2}

公式解释:
\theta表示一组超参数,例如窗口长度、通道数、学习率等。KOA 搜索的目标就是找到让验证集 RMSE 最小的 \theta

5.9 评价指标

MAE:

MAE=\frac{1}{N}\sum_{i=1}^N|y_i-\hat{y}_i|

RMSE:

RMSE=\sqrt{\frac{1}{N}\sum_{i=1}^N(y_i-\hat{y}_i)^2}

MAPE:

MAPE=\frac{100\%}{N}\sum_{i=1}^N\left|\frac{y_i-\hat{y}_i}{y_i}\right|

R^2:

R^2=1-\frac{\sum_{i=1}^N(y_i-\hat{y}_i)^2}{\sum_{i=1}^N(y_i-\bar{y})^2}

方向准确率:

DA=\frac{1}{N}\sum_{i=1}^N\mathbb{I}[sign(y_i-y_{i-1})=sign(\hat{y}_i-y_{i-1})]

公式解释:
MAE 和 RMSE 衡量预测误差,MAPE 衡量相对误差,R^2衡量拟合程度,方向准确率衡量模型是否判断对涨跌方向。对于股票预测,方向准确率往往比单纯价格误差更贴近交易决策。

6. 数据集与特征工程

项目默认使用 yfinance 获取美股数据,例如 AAPL、TSLA、SPY。原始字段包括:

  • Open
  • High
  • Low
  • Close
  • Adj Close
  • Volume

在此基础上,项目构造了多类技术指标:

  • 均线类:MA5、MA10、MA20、EMA12、EMA26
  • 趋势类:DIF、DEA、MACD
  • 超买超卖类:RSI、KDJ
  • 波动类:Bollinger Bands、ATR、Volatility
  • 动量类:ROC、Momentum
  • 成交量类:OBV
  • 收益类:Return、Log Return

技术指标不是为了“神奇预测”,而是把价格序列中的趋势、动量、波动和成交量结构显式暴露给模型。

7. 实验设计

实验任务包括两类:

第一,单步价格预测,即预测下一交易日收盘价。
第二,涨跌方向预测,即判断下一交易日上涨还是下跌。

模型支持三种训练模式:

regression
classification
multitask

baseline 模型包括:

  • ARIMA
  • SVR
  • Random Forest
  • XGBoost
  • MLP
  • LSTM
  • GRU
  • TCN
  • Transformer
  • KAN
  • Hybrid-KOA-TCN-KAN-Multihead-Attention

消融实验包括:

  • 去掉 KOA
  • 去掉 KAN,改成 MLP Head
  • 去掉 Multi-Head Attention
  • 去掉 TCN
  • 不加技术指标
  • 不加方向损失

8. 实验结果与分析

从实验分析角度,不应只看“哪个模型最好”,而要回答三个问题:

第一,模型是否真的降低了预测误差?
第二,性能提升来自哪些模块?
第三,模型在哪些场景下仍然不稳定?

在与 ARIMA、SVR、Random Forest、XGBoost 等传统模型比较时,Hybrid 模型的优势主要来自序列建模能力。传统模型通常将窗口展平,虽然可以使用技术指标,但对时间步之间的顺序关系表达不足。

与 LSTM、GRU 相比,TCN 的并行卷积结构训练更稳定,而且因果膨胀卷积可以明确控制历史感受野。对于金融时间序列这种局部形态较多、长期依赖较弱但不能忽略的场景,TCN 往往具有较好的效率和鲁棒性。

与单独 TCN 相比,加入 Multi-Head Attention 后,模型可以重新分配历史时间步的重要性。尤其在震荡行情或趋势反转阶段,Attention 权重能够帮助模型关注关键拐点附近的信息。

与普通 MLP Head 相比,KAN Head 的价值主要体现在非线性映射层。股票特征与未来收益之间通常不是线性关系,例如 RSI 在 50 附近和在 80 附近代表的市场含义并不相同。KAN 风格基函数可以更灵活地表达这种分段非线性。

如果运行多股票实验,例如 AAPL、TSLA、SPY,可以进一步观察模型的泛化能力。通常来说,波动更剧烈的股票预测难度更高,模型误差也更大;指数类标的如 SPY 可能更加平滑,预测误差相对稳定。

对于多步预测,随着预测步长从 1 日增加到 3 日、5 日甚至 10 日,误差通常会上升。这是因为未来不确定性累积,技术指标对远期价格的解释力下降。

9. 可视化与图表分析

高质量股票预测项目不能只给结果表,还要通过图表说明模型行为。

10. 模型优势、局限与反思

这个混合模型的优势主要体现在四点。

第一,结构分工清晰。TCN 负责局部时序特征,Attention 负责长距离依赖,KAN Head 负责非线性预测,KOA 负责超参数搜索。

第二,适合做科研实验。项目天然支持 baseline、消融实验、KOA 收敛曲线、Attention 可视化和 KAN 基函数可视化。

第三,工程可扩展性较好。数据接口、技术指标、模型模块、优化器、绘图函数都做了模块化封装,后续可以加入新闻情绪、宏观变量或多股票训练。

第四,多任务输出更接近金融需求。单纯预测价格误差并不一定代表交易有效,而方向预测可以补充决策层面的信息。

但模型也有局限。

首先,股票市场噪声极强,深度模型无法消除市场本身的不确定性。
其次,KOA 虽然可以改善调参效率,但计算成本较高,因为每个候选个体都需要训练模型。
再次,当前 KAN Head 是简化近似实现,还不是严格标准 KAN。
最后,模型复杂度高于单一模型,在小样本或弱信号股票上可能出现过拟合。

因此,使用这个模型时不能只关注测试集 RMSE,还应结合残差分析、方向准确率、回测收益、最大回撤和跨股票泛化表现进行综合判断。

需要源代码的,请在评论区下留言。制作不易,请点个赞和收藏!!!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐