跳转至


课程  因子投资  机器学习  Python  Poetry  ppw  tools  programming  Numpy  Pandas  pandas  算法  hdbscan  聚类  选股  Algo  minimum  numpy  回测  数据标准化  algo  FFT  模式识别  配对交易  GBDT  LightGBM  XGBoost  statistics  CDF  KS-Test  monte-carlo  VaR  过拟合  algorithms  machine learning  strategy  python  sklearn  pdf  概率  数学  面试题  量化交易  策略分类  风险管理  Info  interview  career  强化学习  监督学习  AI量化  复权  数据  tushare  akshare  xgboost  PCA  wavelet  时序事件归因  SHAP  Figures  Behavioral Economics  graduate  arma  garch  人物  职场  Quantopian  figure  Banz  金融行业  买方  卖方  story  量化传奇  rsi  zigzag  穹顶压力  因子  ESG  因子策略  投资  策略  pe  ORB  Xgboost  Alligator  Indicator  factor  alpha101  alpha  技术指标  wave  quant  algorithm  pearson  spearman  套利  LOF  白银  因子分析  Alphalens  涨停板  herd-behaviour  momentum  因子评估  review  SMC  聪明钱  trade  history  indicators  zscore  波动率  lightgbm  顶背离  另类数据  freshman  resources  others  AI  DeepSeek  network  量子计算  金融交易  IBM  weekly  进化论  logic-factor  machine-learning  neutralization  basics  LLT  backtest  backtrader  研报  papers  UBL  quantlib  jupyter-notebook  scikit-learn  pypinyin  qmt  xtquant  blog  static-site  duckdb  工具  colors  free resources  barra  world quant  Alpha  openbb  risk-management  llm  prompt  CANSLIM  Augment  arsenal  copilot  vscode  code  量化数据存储  hdf5  h5py  cursor  augment  trae  Jupyter  jupysql  pyarrow  parquet  数据源  quantstats  几何收益  实盘  clickhouse  polars  滑动窗口  notebook  sqlite  sqlite-utils  fastlite  大数据  PyArrow  UV  Pydantic  Engineering  redis  remote-agent  AI-tools  Moonshot  回测,研报,tushare  dividend 

TCN:为什么你应该关注这个AI工具

最后更新: 2026-03-23


TCN:为什么你应该关注这个AI工具


开头先说个真实的故事

2020年3月12日,币圈"312"大暴跌。

那天晚上: - 比特币从7900美元 - 一路暴跌到3800美元 - 24小时跌幅51%

整个市场血流成河。

然后发生了两件事:

事件A: - 散户:恐慌抛售 - "完了完了,要归零了" - "赶紧卖!" - 结果:卖在最低点

事件B: - 某量化基金:用TCN模型分析后 - "这不是崩盘,这是机会" - "加仓!"


所以我想问你一个问题

你觉得这两个人的区别是什么?

有人说是运气。 有人说是心态。 有人说是信息差。

但真相是: - 他们看到的东西根本不一样。

散户看K线: - "今天跌了5%,完了完了"

TCN看K线: - "从更长维度看,这只是正常回调 - 历史数据显示:这种级别的回调后, - 70%的概率会在30天内收复跌幅"

这不是玄学。 这是数学。


好,那TCN到底是什么?

TCN = Temporal Convolutional Network = 时间卷积网络

用人话来说: - TCN是一种AI模型 - 能从历史数据里找出规律 - 然后用这个规律预测未来

你可以理解成: - 一个永远不会累的"老手" - 每天盯着K线图看 - 试图找出"涨的规律"和"跌的规律"


但TCN跟普通的看K线有什么不同?

普通看K线: - 盯着屏幕,看MACD金叉了 - 看KDJ超卖了 - 看布林带碰到下轨了

TCN看K线: - 把过去60天的所有数据 - 转化成数字 - 然后用数学方法分析

区别在哪?

-普通看K线 = 凭感觉 -TCN看K线 = 凭数据

当然,TCN不是100%准 但它比凭感觉强太多了


第一章:TCN的第一大法器——因果卷积

1.1 先说个生活中的例子

你想预测明天天气。

你能用明天的数据来预测明天吗?

当然不能! 因为明天还没到,数据还没出来。

你能用今天的数据吗? 当然能!因为今天已经过去了,数据是确定的。

这就是"因果"的意思:

  • 原因在前,结果在后
  • 预测未来只能用过去的数据

1.2 回到K线图

预测明天的股价走势:

你能用明天的K线吗? 不能!明天的K线还没走出来。

你能用今天和之前的数据吗? 能!因为这些已经发生了。

TCN保证的就是这件事: - 预测第T天 - 只用第1, 2, 3, ..., T天的数据 - 绝对不用第T+1, T+2...天的数据

这就是因果卷积。

1.3 因果卷积的数学原理

标准卷积公式:

\[(x * w)_t = \sum_{k=1}^{K} w_k \cdot x_{t+k-1}\]

这个公式说的是:输出在位置 \(t\) 的值,等于卷积核 \(w\) 与输入 \(x\) 的加权和。

问题在哪?

当 t=5 时: - y_5 = w_1 · x_6 + w_2 · x_7 + w_3 · x_8

卷积核从右往左采样: - 采样位置:x_6, x_7, x_8 - 这是"未来"的数据!

这违反了因果性原则!

因果卷积的公式:

\[(x * w)_t = \sum_{k=1}^{K} w_k \cdot x_{t-k+1}\]

当 t=5 时: - y_5 = w_1 · x_5 + w_2 · x_4 + w_3 · x_3

卷积核从右往左采样: - 采样位置:x_5, x_4, x_3 - 这都是"过去"的数据!

✅ 符合因果性:预测第5天,只用第3、4、5天的数据

1.4 图示对比

标准卷积(违反因果性):

1
2
3
4
5
6
7
8
时间:    ...    3     4     5     6     7     8    ...
         ↓      ↓     ↓     ↓     ↓     ↓     ↓
输入:   [x₃]  [x₄]  [x₅]  [x₆]  [x₇]  [x₈]
              [w₂] [w₁] [w₀]
                        ↓
输出:                   y₅ = w₀·x₅ + w₁·x₆ + w₂·x₇
                              ↑
                        用到了x₆, x₇(未来数据)❌

因果卷积(符合因果性):

1
2
3
4
5
6
7
8
时间:    ...    2     3     4     5     6     7    ...
         ↓      ↓     ↓     ↓     ↓     ↓     ↓
输入:   [x₂]  [x₃]  [x₄]  [x₅]  [x₆]  [x₇]
                    [w₂] [w₁] [w₀]
                        ↓
输出:                   y₅ = w₀·x₅ + w₁·x₄ + w₂·x₃
                                                ↑
                                          只用到x₃,x₄,x₅(过去数据)✅

1.5 因果 Padding

为了保持输入输出序列长度相同,需要在左侧进行填充:

\[padding = K - 1\]

输入序列: [x₀] [x₁] [x₂] [x₃] [x₄] 左侧填充2个: [0] [0] [x₀] [x₁] [x₂] [x₃] [x₄]

卷积后: [y₀] [y₁] [y₂] [y₃] [y₄] ↑ 输出长度与原输入相同


第二章:TCN的第二大法器——膨胀卷积

2.1 先问你一个问题

你分析一只股票的时候: 你会看它最近几天的走势? 还是会看它最近几个月的走势?

大多数人说:都看!

但问题是: - 你真的能同时"记住"几个月的数据吗? - 你真的能从中找出规律吗?

人脑的短期记忆是有限的。 7个数字以上就记不住了。

但TCN可以!

2.2 膨胀卷积是什么?

普通方法: - 1天1天地看 - 要看60天前的数据 = 需要记住60天的信息 - 累死CPU

膨胀卷积: - 跳着看! - 就像望远镜,不用爬上去,直接跳到最远的地方

2.3 膨胀卷积的数学原理

标准卷积(膨胀率 \(d=1\)):

\[(x * w)_t = \sum_{k=1}^{K} w_k \cdot x_{t-k+1}\]

采样间隔:1

膨胀卷积(膨胀率 \(d\)):

\[(x *_d w)_t = \sum_{k=1}^{K} w_k \cdot x_{t-(k-1) \cdot d}\]

采样间隔:\(d\)

当 K=3, d=2 时:

(x *_2 w)_5 = w_1 · x_5 + w_2 · x_3 + w_3 · x_1 ↑ ↑ ↑ 间隔0 间隔2 间隔4

采样位置:x_5, x_3, x_1(跳着采样)

2.4 图示

膨胀率 d=1(普通卷积):

1
2
3
4
[x₀] [x₁] [x₂] [x₃] [x₄] [x₅] [x₆]
  ↓    ↓    ↓
 [w₀] [w₁] [w₂]
采样:x₆, x₅, x₄(连续)

膨胀率 d=2:

1
2
3
4
[x₀] [x₁] [x₂] [x₃] [x₄] [x₅] [x₆]
  ↓         ↓
 [w₀]      [w₁]      [w₂]
采样:x₆, x₄, x₂(跳1个)

膨胀率 d=4:

1
2
3
4
[x₀] [x₁] [x₂] [x₃] [x₄] [x₅] [x₆]
  ↓                    ↑
 [w₀]                 [w₁]      [w₂]
采样:x₆, x₂, x₀(跳3个)

2.5 多层膨胀卷积的效果

各层的膨胀率配置:

1
2
3
4
5
6
第1层(d=1):感受野 = 3
第2层(d=2):感受野 = 5
第3层(d=4):感受野 = 9
第4层(d=8):感受野 = 17
第5层(d=16):感受野 = 33
第6层(d=32):感受野 = 65

结论:6层就能看到65天前的数据!

2.6 感受野的计算公式

单层感受野:

\[r_d = 1 + (K-1) \cdot d\]

K=3, d=1: r = 1 + 2×1 = 3 K=3, d=2: r = 1 + 2×2 = 5 K=3, d=4: r = 1 + 2×4 = 9

多层堆叠后的总感受野:

\[R_L = 1 + (K-1) \cdot \sum_{l=0}^{L-1} d_l\]

\(d_l = 2^l\) 时:

\[R_L = 1 + (K-1) \cdot (2^L - 1)\]

验证:K=3, L=6, d_l = [1,2,4,8,16,32]

R = 1 + 2 × (1+2+4+8+16+32) = 1 + 2 × 63 = 127

✅ 127天 ≈ 4个月

2.7 这在金融里意味着什么?

做短线的人:看1-2周 做波段的人:看1-2个月 做长线的人:看3-6个月

TCN的配置: - [1,2,4,8] = R = 1 + 2×(1+2+4+8) = 31天 ≈ 1个月 - [1,2,4,8,16] = R = 1 + 2×(1+2+4+8+16) = 63天 ≈ 2个月 - [1,2,4,8,16,32] = R = 1 + 2×(1+2+4+8+16+32) = 127天 ≈ 4个月

所以不管你是做短做长 TCN都能调到合适的"视野"


第三章:TCN的第三大法器——残差连接

3.1 深度学习的坑

你是不是听过: - "神经网络层数越多越好" - "越深越强大"

这是扯淡!

实际情况是: - 层数太多 = 梯度消失 - 就像传话游戏: - 第1个人说:"茅台今天涨了5%" - 第10个人听到:"茅台今天好像涨了" - 第60个人听到:"茅台今天...好像...涨了?"

前面的层根本学不到东西!

TCN的解决方法是: - 残差连接 = 抄近道

3.2 残差连接的数学原理

普通网络的映射:

\[y = H(x)\]

普通网络学习的是从输入 \(x\) 到输出 \(y\) 的直接映射 \(H(\cdot)\)

残差网络的映射:

\[y = F(x) + x\]

残差网络把映射拆成两部分: - \(F(x)\):需要学习的残差映射 - \(x\):恒等映射(直接传过来)

3.3 为什么残差连接有效?

关键洞察: - 让网络学习"恒等映射"比学习"复杂映射"更容易

普通网络的问题: - 假设最优映射是 H(x) = x - 但网络需要学习 H(x) = x 这个恒等函数 - 这其实很难!因为中间层必须"什么也不做"

残差网络的解决方案: - 假设最优映射是 H(x) = x - 那残差 F(x) = H(x) - x = 0 - 学习 F(x) = 0 比学习 H(x) = x 容易多了!

因为: - 当 F(x) ≈ 0 时,y = F(x) + x ≈ x(自动获得恒等映射) - 当 F(x) 有用时,y = F(x) + x = x + F(x)(增强映射)

3.4 残差连接的另一大优势:梯度流动

反向传播时:

普通网络: - ∂L/∂x = ∂L/∂y · ∂y/∂x - 梯度要一层层传回去 - 乘以每一层的权重 - 层数多了,梯度越来越小 → 消失

残差网络: - ∂L/∂x = ∂L/∂y · ∂y/∂x - = ∂L/∂y · (∂F/∂x + 1) - = ∂L/∂y · (∂F/∂x) + ∂L/∂y

梯度有两条路: 1. 走残差路径:直接传回来,无衰减 2. 走普通路径:乘以权重,可能衰减

即使①的梯度很大,也不会比普通网络更小 所以梯度消失的问题被解决了!

3.5 残差块的结构

1
2
3
4
5
6
7
8
9
┌─────────────────────────────────────┐
│                                     │
│  输入 x                             │
│    │                                │
│    ├──→ [Conv] → [Act] → [Conv] → Add ──→ 输出 y │
│    │                                               │
│    └───────────────── 1×1 Conv ──────────────────┘│
│                                     │
└─────────────────────────────────────┘

公式:y = F(x) + W · x

其中 W 是 1×1 卷积,负责调整 x 的维度以匹配 F(x) 的输出


第四章:完整的TCN架构

4.1 TCN的两大核心特性

TCN必须满足两个条件:

条件一:因果卷积 - ✓ 保证时间因果性 - ✓ 预测第T天只用前T天的数据

条件二:膨胀卷积 - ✓ 指数扩大感受野 - ✓ 少量层数覆盖长时间跨度

4.2 完整的TCN Block

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
输入
  ↓
┌─────────────────────────────────────┐
│                                     │
│  [因果膨胀卷积] → [Weight Norm]     │
│    ↓                                │
│  [ReLU]                             │
│    ↓                                │
│  [Dropout]                          │
│    ↓                                │
│  [因果膨胀卷积] → [Weight Norm]     │
│    ↓                                │
│  [ReLU]                             │
│    ↓                                │
│  [Dropout]                          │
│    ↓                                │
│  [1×1 卷积](调整维度)             │
│    ↓                                │
│  输入 ───────── Add ──→ 输出        │
│                                     │
└─────────────────────────────────────┘

4.3 多层堆叠

TCN通常由多个Block组成:

1
2
3
Block 1: dilations = [1, 2, 4, 8]  → 感受野 31天
Block 2: dilations = [1, 2, 4, 8]  → 感受野 31天
Block 3: dilations = [1, 2, 4, 8]  → 感受野 31天

总感受野 ≈ 90天(综合多个Block的信息)


第五章:TCN vs LSTM——选哪个?

5.1 先说结论

在金融时间序列预测这个场景: TCN全面优于LSTM。

这不是我说的,是学术界和工业界的共识。

5.2 对比

维度 LSTM TCN
计算方式 串行(等一步算一步) 并行(一步到位)
时间复杂度 O(T) O(1)
空间复杂度 O(T) O(1)
感受野控制 有限(60天基本极限) 可控(轻松100+天)
梯度流动 容易消失 残差保护
结构复杂度 高(门机制) 低(就是卷积)
超参数数量 多(难调) 少(易调)
GPU利用率

5.3 数学上的区别

LSTM的前向计算: - 必须等第t-1步算完,才能算第t步 - → 这是串行的,无法并行

TCN的前向计算: - 第t步的输出只依赖前几步的输入 - 所有时间步可以同时计算 - → 这是并行的,GPU可以加速


第六章:实战指南

6.1 TCN能帮你做什么?

✓ 预测明天涨还是跌 ✓ 判断现在是趋势的开始还是结束 ✓ 找到合适的买入/卖出时机 ✓ 判断仓位应该多重

✗ 不能预测黑天鹅 ✗ 不能保证100%赚钱 ✗ 不能替代你的决策

6.2 不同策略的配置

短线(持有一天到几天): - 视野:20-30天 - 膨胀率:[1,2,4,8] - 层数:4 - 适合:日内波动、日内趋势

中线(持有几周到几个月): - 视野:60-90天 - 膨胀率:[1,2,4,8,16] - 层数:5 - 适合:波段操作

长线(持有几个月): - 视野:120-180天 - 膨胀率:[1,2,4,8,16,32] - 层数:6 - 适合:趋势跟踪、价值投资

第七章:代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import torch
import torch.nn as nn


class Chomp1d(nn.Module):
    """处理因果padding"""
    def __init__(self, chomp_size):
        super().__init__()
        self.chomp_size = chomp_size

    def forward(self, x):
        return x[:, :, :-self.chomp_size].contiguous()


class TCNBlock(nn.Module):
    def __init__(self, in_ch, out_ch, kernel_size=3, dilation=1, dropout=0.3):
        super().__init__()
        padding = (kernel_size - 1) * dilation

        self.conv1 = nn.Conv1d(in_ch, out_ch, kernel_size,
                               padding=padding, dilation=dilation)
        self.conv1 = nn.utils.weight_norm(self.conv1)
        self.chomp1 = Chomp1d(padding)

        self.conv2 = nn.Conv1d(out_ch, out_ch, kernel_size,
                               padding=padding, dilation=dilation)
        self.conv2 = nn.utils.weight_norm(self.conv2)
        self.chomp2 = Chomp1d(padding)

        self.ln = nn.LayerNorm(out_ch)
        self.dropout = nn.Dropout(dropout)
        self.relu = nn.ReLU()

        self.downsample = nn.Conv1d(in_ch, out_ch, 1) if in_ch != out_ch else None

    def forward(self, x):
        residual = x

        out = self.conv1(x)
        out = self.chomp1(out)
        out = self.relu(out)
        out = self.dropout(out)

        out = self.conv2(out)
        out = self.chomp2(out)
        out = self.ln(out.transpose(1, 2)).transpose(1, 2)
        out = self.dropout(out)

        if self.downsample is not None:
            residual = self.downsample(residual)
        return self.relu(out + residual)


class StockPredictor(nn.Module):
    def __init__(self, input_size=5, num_channels=[64,64,64,64], dropout=0.3):
        super().__init__()
        layers = []
        for i in range(len(num_channels)):
            dilation = 2 ** i
            in_ch = input_size if i == 0 else num_channels[i-1]
            out_ch = num_channels[i]
            layers.append(TCNBlock(in_ch, out_ch, dilation=dilation, dropout=dropout))

        self.network = nn.Sequential(*layers)
        self.fc = nn.Linear(num_channels[-1], 1)

    def forward(self, x):
        # x: [batch, seq_len, features]
        out = self.network(x.transpose(1, 2))
        out = out[:, -1, :]  # 取最后一个时间步
        return self.fc(out)

第八章:总结

8.1 核心公式汇总

1. 因果卷积:

\[(x * w)_t = \sum_{k=1}^{K} w_k \cdot x_{t-k+1}\]

2. 膨胀卷积:

\[(x *_d w)_t = \sum_{k=1}^{K} w_k \cdot x_{t-(k-1) \cdot d}\]

3. 单层感受野:

\[r_d = 1 + (K-1) \cdot d\]

4. 总感受野:

\[R_L = 1 + (K-1) \cdot \sum_{l=0}^{L-1} d_l\]

5. 残差连接:

\[y = F(x) + x\]

8.2 TCN三大法器总结

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
┌─────────────────────────────────────────────┐
│                                             │
│  ① 因果卷积                                  │
│     公式:(x * w)_t = Σ w_k · x_{t-k+1}    │
│     作用:保证时间因果性                      │
│                                             │
│  ② 膨胀卷积                                  │
│     公式:(x *_d w)_t = Σ w_k · x_{t-(k-1)d}│
│     作用:指数扩大感受野                      │
│                                             │
│  ③ 残差连接                                  │
│     公式:y = F(x) + x                       │
│     作用:解决梯度消失,允许更深的网络        │
│                                             │
└─────────────────────────────────────────────┘

彩蛋

回到开头那个故事。

"312"暴跌那天晚上: - 散户在恐慌抛售 - 量化基金在加仓

他们的区别是什么?

不是运气。 不是心态。 不是信息差。

是他们"看到"的东西不一样。

散户看到的:K线在暴跌 TCN看到的:从历史数据看,这种跌幅之后70%会反弹

这不是玄学。 这是TCN用数学告诉你的答案。

数学不会骗人。 但你的眼睛会。


看完这篇,你应该比大多数人更懂TCN的原理了。