跳转至


课程  因子投资  机器学习  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 

从"股价预测"到"因果卷积":一篇让金融小白也能彻底理解的文章

最后更新: 2026-03-23


从"股价预测"到"因果卷积":一篇让金融小白也能彻底理解的文章

前言:为什么你应该关心因果卷积?

想象一个场景:

2024年某天,你看到一只股票连续上涨了5天。你会不会觉得"明天还会涨"?

大多数人的直觉是。但作为一个严谨的金融数学学习者,你会问:

  • 这个"连续上涨"意味着什么?
  • 如何用数学语言精确描述这个现象?
  • 如果我想让计算机自动学习"什么时候该追涨,什么时候该止损",该怎么建模?

今天要介绍的因果卷积,正是解决这类问题的核心技术之一。它不仅是深度学习中的基础构件,更是时间序列分析的有力工具。

读完这篇文章,你将理解: 1. 因果卷积是什么——用金融视角 2. 为什么是"加权求和"——从数学原理到直觉 3. 它和金融中的哪些概念异曲同工——RSI、MACD、移动平均 4. TCN如何革新时间序列预测——与传统方法的对比


第一部分:一个让你终身难忘的比喻

1.1 炒股的三个境界

境界一:看山是山

"这只股票涨了5天,明天应该还会涨吧?"

这是散户的思维——简单的趋势外推。

境界二:看山不是山

"虽然涨了5天,但最近3天涨幅在缩小,动量在衰减..."

这是技术分析师的思维——开始关注变化的模式,而不只是结果。

境界三:看山还是山

"让我用一个统一的框架,把短期动量、中期趋势、长期均值全部量化出来,然后让模型自己学习什么时候用什么信号。"

这是量化分析师的思维——因果卷积正是实现这个目标的工具。

1.2 因果卷积的通俗定义

一句话总结:

因果卷积,就是用"加权求和"的方式,把过去一段时间的数据,整合成一个有意义的数值。

我们把它拆开来看:

关键词 金融含义
"过去一段时间" 回顾窗口,比如最近5天、最近20天
"加权求和" 给不同天的数据不同的重要性
"有意义的数值" 一个综合得分,可以用来做决策

类比:基金经理的综合评分

想象一个基金经理的年终评分: 最终得分 = 0.30×年化收益率 + 0.25×夏普比率 + 0.20×最大回撤 + 0.15×规模 + 0.10×流动性 = 0.30×15% + 0.25×1.8 + 0.20×(-8%) + 0.15×50亿 + 0.10×80% = 4.5 + 0.45 - 1.6 + 7.5 + 8% = 10.85分(满分大概15分左右) 这个公式本质上就是一个卷积

  • 输入 = [收益率, 夏普比率, 回撤, 规模, 流动性]
  • 卷积核 = [0.30, 0.25, 0.20, 0.15, 0.10](权重)
  • 输出 = 10.85分(综合评分)

因果卷积就是:把这个思想应用到"时间序列"上。


第二部分:从移动平均讲起

2.1 你每天都在用的技术指标

打开任何炒股软件,都会看到这些指标: ┌─────────────────────────────────────────┐ │ MA5 = 5日简单移动平均 = (P1+P2+P3+P4+P5)/5 │ │ MA10 = 10日简单移动平均 │ │ MA20 = 20日简单移动平均 │ │ EMA12 = 12日指数移动平均 │ └─────────────────────────────────────────┘ MA5 的计算(以股价为例): 日期: Day1 Day2 Day3 Day4 Day5 Day6 Day7 股价: 100 102 101 105 107 106 108

Day5 的 MA5 = (100 + 102 + 101 + 105 + 107) / 5 = 103.0 Day6 的 MA5 = (102 + 101 + 105 + 107 + 106) / 5 = 104.2 Day7 的 MA5 = (101 + 105 + 107 + 106 + 108) / 5 = 105.4 你发现了吗?这其实就是一种"加权求和"!

只不过权重是均等的:[1/5, 1/5, 1/5, 1/5, 1/5]

2.2 加权移动平均(EMA)

EMA 的核心思想:越近的数据越重要 EMA_t = α × Price_t + (1-α) × EMA_{t-1}

展开后等价于: EMA_t = α×P[t] + α(1-α)×P[t-1] + α(1-α)²×P[t-2] + α(1-α)³×P[t-3] + ...

权重分别是: P[t] 的权重 = α P[t-1] 的权重 = α(1-α) P[t-2] 的权重 = α(1-α)² P[t-3] 的权重 = α(1-α)³ ... 以 α=0.3 为例: P[t] 的权重 = 0.3 P[t-1] 的权重 = 0.3 × 0.7 = 0.21 P[t-2] 的权重 = 0.3 × 0.7² = 0.147 P[t-3] 的权重 = 0.3 × 0.7³ = 0.103 P[t-4] 的权重 = 0.3 × 0.7⁴ = 0.072 ... ↓ 所有权重之和 = 0.3 + 0.21 + 0.147 + 0.103 + 0.072 + ... ≈ 1.0 这就是"指数衰减"的加权求和!

2.3 MACD:多个卷积的组合

MACD 是华尔街最流行的技术指标之一: MACD Line = EMA(12) - EMA(26) Signal Line = EMA(9) of MACD Line Histogram = MACD Line - Signal Line 从卷积的角度看: MACD = [12日权重] × [价格] - [26日权重] × [价格] = 卷积(价格, 权重_12) - 卷积(价格, 权重_26) MACD 本质上就是:两个不同窗口的加权求和之差!


第三部分:因果卷积的数学原理

3.1 形式化定义

对于一个长度为 \(T\) 的时间序列 \(\{x_1, x_2, \ldots, x_T\}\)因果卷积定义为:

\[ h_t = \sum_{k=0}^{K-1} f[k] \cdot x_{t-k} \]

其中:

  • \(h_t\) 是时刻 \(t\) 的输出
  • \(f[k]\) 是卷积核在位置 \(k\) 的权重(需要学习)
  • \(K\) 是卷积核大小(回顾窗口长度)

关键约束:因果性

\[ h_t \text{ 只依赖于 } \{x_1, x_2, \ldots, x_t\} \]

即:输出只用当前和过去的信息,不使用未来数据。

3.2 图解因果卷积

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
时间:      t=1     t=2     t=3     t=4     t=5     t=6
│       │       │       │       │       │
输入 x:   [x₁]    [x₂]    [x₃]    [x₄]    [x₅]    [x₆]
│       │       │       │       │       │
│   ┌───┴───┐   │       │       │       │
卷积核 k=3:   │ [f₀,f₁,f₂] │       │       │       │
│   └─┬─┬─┬─┘   │       │       │       │
│     ↓↓↓       │       │       │       │
输出 h:           h₃       h₄      h₅      h₆
←──────────────→
 只用过去和现在

h₃ = f₀·x₃ + f₁·x₂ + f₂·x₁
h₄ = f₀·x₄ + f₁·x₃ + f₂·x₂
h₅ = f₀·x₅ + f₁·x₄ + f₂·x₃
h₆ = f₀·x₆ + f₁·x₅ + f₂·x₄

3.3 膨胀因果卷积:增大感受野

问题: 如果只用 \(K=3\) 的卷积核,感受野只有3。

解决: 引入膨胀(dilation)机制。

膨胀卷积的定义:

\[ h_t = \sum_{k=0}^{K-1} f[k] \cdot x_{t-d \cdot k} \]

其中 \(d\) 是膨胀率。

dilation=2 的效果:

1
2
3
4
5
普通卷积 (d=1):  ★──★──★──★──★──★──★──★    感受野=3
                 ↑
膨胀卷积 (d=2):  ★─────★─────★─────★─────★    感受野=5
                 ↑
d=4:             ★─────────★─────────★        感受野=9

TCN 的多层膨胀结构:

1
2
3
4
Layer 1 (d=1):  ★──★──★──★──★──★──★──★    感受野=3
Layer 2 (d=2):    ★──★──★──★──★──★──★──★  感受野=7
Layer 3 (d=4):      ★──★──★──★──★──★──★──★感受野=15
Layer 4 (d=8):        ★──★──★──★──★──★──★──★感受野=31

感受野公式:

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

其中 \(L\) 是层数。


第四部分:金融数学视角的深入分析

4.1 与时间序列分析的对比

概念 传统时间序列 因果卷积
核心模型 ARIMA TCN
权重来源 自相关函数 可学习
非线性处理 需要手动指定 自动学习
长期依赖 困难(需差分) 膨胀卷积轻松捕获
计算效率 O(n) 递推 O(n log n) 并行

4.2 从随机过程角度理解

\(\{X_t\}\) 是一个随机过程(股价序列),因果卷积的输出 \(\{H_t\}\) 定义为:

\[ H_t = \sum_{k=0}^{\infty} f[k] \cdot X_{t-k} \]

前提条件: \(\{f[k]\}\) 绝对可和,即 \(\sum_{k=0}^{\infty} |f[k]| < \infty\)

这意味着什么?

  • 输出是输入的线性泛函
  • 类比于线性滤波器
  • 在信号处理中,这就是一个线性时不变系统(LTI)

4.3 与卡尔曼滤波的联系

卡尔曼滤波的状态更新:

\[ \hat{X}_t = A\hat{X}_{t-1} + B y_t \]

因果卷积的形式:

\[ H_t = \sum_{k} f[k] \cdot X_{t-k} \]

联系: 两者都是线性组合过去信息的方式,只是:

  • 卡尔曼滤波:递归形式,权重由状态空间模型决定
  • 因果卷积:显式加权和,权重由神经网络学习得到

4.4 金融应用:波动率建模

GARCH(1,1) 模型:

\[ \sigma_t^2 = \omega + \alpha \epsilon_{t-1}^2 + \beta \sigma_{t-1}^2 \]

TCN 膨胀卷积:

\[ \sigma_t = \sum_{k=0}^{K-1} f[k] \cdot r_{t-k}^2 \]

对比: GARCH 是固定结构的加权(递归),TCN 是可学习结构的加权(灵活)。


第五部分:为什么是加权求和?(理论保证)

5.1 万能逼近定理

定理(Universal Approximation):

任何一个连续函数 \(g(x)\),都可以由有限个加权求和 + 非线性激活来近似。

用数学语言:

\[ \forall \epsilon > 0, \exists N, f_i, w_i, b_i: \left| g(x) - \sum_{i=1}^{N} w_i \cdot \sigma(f_i \cdot x + b_i) \right| < \epsilon \]

翻译成人话:

无论真实的股票涨跌关系多复杂,只要有足够多的"加权求和+非线性"组合,就能完美逼近它。

5.2 线性假设的合理性

金融学中大量模型基于线性假设

  • CAPM: \(R_i = \alpha + \beta R_m + \epsilon\)
  • APT: \(R_i = \sum_{k} \beta_{ik} F_k + \epsilon_i\)
  • 线性因子模型

因果卷积继承了线性可解释性,同时通过多层结构获得非线性表达能力。

5.3 计算效率

操作 时间复杂度
RNN(BPTT) \(O(T \cdot D^2)\)
TCN(并行卷积) \(O(T \cdot K \cdot C \cdot \log T)\)

对于长序列,TCN 比 RNN 快几个数量级。


第六部分:实战代码演示

6.1 用 PyTorch 实现因果卷积

 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
import torch
import torch.nn as nn

class CausalConv1D(nn.Module):
    """
    因果卷积层
    确保输出只依赖于当前及之前的数据
    """
    def __init__(self, in_channels, out_channels, kernel_size, dilation=1):
        super().__init__()
        self.kernel_size = kernel_size
        self.dilation = dilation

        # 关键:padding = (kernel_size - 1) × dilation
        # 这样可以保持序列长度,同时确保因果性
        self.padding = (kernel_size - 1) * dilation

        self.conv = nn.Conv1d(
            in_channels, 
            out_channels, 
            kernel_size,
            padding=self.padding,  # 左侧填充
            dilation=dilation     # 膨胀率
        )

    def forward(self, x):
        """
        x: (batch, channels, length)
        """
        x = self.conv(x)

        # 裁剪右侧:移除因padding产生的多余输出
        if self.padding > 0:
            x = x[:, :, :-self.padding]

        return x

# 测试
batch_size = 32
in_ch = 1
out_ch = 16
seq_len = 100

x = torch.randn(batch_size, in_ch, seq_len)
conv = CausalConv1D(in_ch, out_ch, kernel_size=3, dilation=1)
y = conv(x)

print(f"输入形状: {x.shape}")      # [32, 1, 100]
print(f"输出形状: {y.shape}")     # [32, 16, 100]
print(f"因果性验证: ✓ 输出只依赖输入的前3个时间点")

6.2 完整 TCN 残差块

 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
class ResidualBlock(nn.Module):
    """
    TCN 残差块:包含两个因果卷积 + 残差连接
    """
    def __init__(self, channels, kernel_size=3, dilation=1, dropout=0.2):
        super().__init__()

        # 第一个因果卷积
        self.conv1 = CausalConv1D(channels, channels, kernel_size, dilation)
        self.ln1 = nn.LayerNorm(channels)

        # 第二个因果卷积
        self.conv2 = CausalConv1D(channels, channels, kernel_size, dilation)
        self.ln2 = nn.LayerNorm(channels)

        self.dropout = nn.Dropout(dropout)

        # 投影层(维度不匹配时使用)
        self.shortcut = nn.Identity()

    def forward(self, x):
        """
        x: (batch, channels, length)
        """
        residual = self.shortcut(x)

        # 第一个卷积块
        out = self.conv1(x)
        out = out.transpose(1, 2)      # (B, L, C)
        out = self.ln1(out)
        out = out.transpose(1, 2)      # (B, C, L)
        out = F.relu(out)
        out = self.dropout(out)

        # 第二个卷积块
        out = self.conv2(out)
        out = out.transpose(1, 2)
        out = self.ln2(out)
        out = out.transpose(1, 2)
        out = F.relu(out)
        out = self.dropout(out)

        # 残差连接
        return out + residual

6.3 股价预测示例

 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
class StockPredictorTCN(nn.Module):
    """
    基于 TCN 的股价预测模型
    输入:过去5天的 [开盘价, 最高价, 最低价, 收盘价, 成交量]
    输出:明天的涨跌概率
    """
    def __init__(self, input_dim=5, hidden_dim=64, num_classes=2):
        super().__init__()

        # 初始投影层
        self.input_conv = nn.Conv1d(input_dim, hidden_dim, 1)

        # TCN 残差块(膨胀率:1, 2, 4, 8)
        self.tcn_blocks = nn.ModuleList([
            ResidualBlock(hidden_dim, kernel_size=3, dilation=1),
            ResidualBlock(hidden_dim, kernel_size=3, dilation=2),
            ResidualBlock(hidden_dim, kernel_size=3, dilation=4),
            ResidualBlock(hidden_dim, kernel_size=3, dilation=8),
        ])

        # 输出层
        self.output_conv = nn.Conv1d(hidden_dim, hidden_dim // 2, 1)
        self.classifier = nn.Linear(hidden_dim // 2, num_classes)

    def forward(self, x):
        """
        x: (batch_size, seq_len, features)
        输出: (batch_size, num_classes) 涨跌概率
        """
        # (B, L, F) -> (B, F, L)
        x = x.transpose(1, 2)

        # 初始投影
        x = self.input_conv(x)

        # TCN 残差块
        for block in self.tcn_blocks:
            x = block(x)

        # 取最后一个时间点
        x = x[:, :, -1]  # (B, C)

        # 分类
        x = self.output_conv(x.transpose(1, 2)).squeeze()
        return self.classifier(x)


# 使用示例
model = StockPredictorTCN(input_dim=5, hidden_dim=64, num_classes=2)

# 模拟输入:batch=32, 序列长度=5, 特征=5
x = torch.randn(32, 5, 5)  # [开盘, 最高, 最低, 收盘, 成交量] × 5天
output = model(x)  # [32, 2]  每行是 [P(跌), P(涨)]

print(f"输入: {x.shape}")
print(f"输出: {output.shape}")
print(f"预测结果: {torch.softmax(output, dim=1)[:3]}")

第七部分:因果卷积 vs 其他方法

7.1 全面对比

特性 简单移动平均 ARIMA LSTM TCN
捕捉趋势
捕捉周期
长期依赖 ⚠️ ⚠️
计算速度
可并行
非线性建模
端到端学习

7.2 为什么 TCN 在时间序列上表现好?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
**1. 并行计算 + 长距离依赖 = 兼得**
RNN:     x₁ → x₂ → x₃ → x₄ → x₅ → ...    必须等前一个算完
↑_____________________________|
长期依赖(梯度衰减)

TCN:     x₁ ─┬─ x₃ ─┬─ x₅ ─┐
│      │      │
x₂ ─┘  x₄ ─┘  x₆ ─┘           同时计算
↑________|
短期+长期(膨胀卷积)

2. 稳定的梯度

RNN 的梯度随时间指数衰减,TCN 的梯度路径长度仅为 \(O(\log T)\)

3. 灵活的感受野

通过调整层数和膨胀率,可以精确控制模型关注的时间尺度


第八部分:学术前沿与展望

8.1 相关研究论文

年份 论文 主要贡献
2016 WaveNet 首次将膨胀因果卷积用于音频生成
2018 TCN (Bai et al.) 系统性评估 TCN 在序列建模的能力
2020 Temporal Fusion Transformer TCN + Attention 用于多元时间序列
2022 Informer 长序列时间序列预测

8.2 开放问题

  1. 理论理解:为什么 TCN 在某些任务上不如 Transformer?
  2. 最优架构:如何自动搜索最佳的 TCN 超参数?
  3. 可解释性:如何解释卷积核学到的特征?

8.3 推荐阅读

  • Bai et al., "An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling" (2018)
  • Oord et al., "WaveNet: A Generative Model for Raw Audio" (2016)
  • Vaswani et al., "Attention Is All You Need" (2017) — 对比学习

结语:回到最初的问题

文章开头问:

一只股票连续上涨5天,明天还会涨吗?

现在你可以用因果卷积的方式回答: 1. 定义特征:用加权求和提取过去5天的价格模式

  • 短期动量:近期权重更高
  • 波动特征:检测是否有异常
  • 构建模型:用 TCN 捕捉不同时间尺度的依赖

  • Layer 1 (d=1): 日内模式

  • Layer 2 (d=2): 2-3天趋势
  • Layer 3 (d=4): 周级别模式
  • Layer 4 (d=8): 月级别周期
  • 预测输出:P(明天上涨 | 历史模式)
  • 决策:根据概率 + 风险偏好做交易决策