Skip to content

图神经网络与金融关系建模

概述

金融市场本质上是一个复杂的关系网络 (Relational Network):公司之间存在供应链关系、行业关联、股权结构等多维连接。图神经网络 (Graph Neural Network, GNN) 能够在图结构数据上进行消息传递 (Message Passing) 和特征聚合,是建模这类关系数据的天然工具。本文介绍 GCN、GAT 的基本原理及其在金融关系建模中的应用。

GNN 基础:消息传递范式

GNN 的核心思想是通过邻居节点的信息聚合 (Neighborhood Aggregation) 更新节点表示。通用的消息传递框架为:

\[h_v^{(l+1)} = \text{UPDATE}\left(h_v^{(l)}, \text{AGGREGATE}\left(\{h_u^{(l)} : u \in \mathcal{N}(v)\}\right)\right)\]

其中 \(h_v^{(l)}\) 为节点 \(v\) 在第 \(l\) 层的特征表示,\(\mathcal{N}(v)\) 为节点 \(v\) 的邻居集合。

图卷积网络 (GCN)

Kipf & Welling (2017) 提出的 GCN 使用归一化邻接矩阵进行特征传播:

\[H^{(l+1)} = \sigma\left(\tilde{D}^{-1/2}\tilde{A}\tilde{D}^{-1/2}H^{(l)}W^{(l)}\right)\]

其中:

  • \(\tilde{A} = A + I_N\) 为加入自环 (Self-loop) 的邻接矩阵
  • \(\tilde{D}_{ii} = \sum_j \tilde{A}_{ij}\) 为度矩阵 (Degree Matrix)
  • \(W^{(l)}\) 为第 \(l\) 层的可训练参数
  • \(\sigma\) 为非线性激活函数

对单个节点 \(v\),GCN 的更新规则为:

\[h_v^{(l+1)} = \sigma\left(\sum_{u \in \mathcal{N}(v) \cup \{v\}} \frac{1}{\sqrt{\tilde{d}_v \tilde{d}_u}} h_u^{(l)} W^{(l)}\right)\]

GCN 的频谱解读

GCN 可视为图信号的低通滤波器 (Low-pass Filter),对邻居节点特征做平滑。在金融场景中,这意味着相关联的公司(如同行业、供应链上下游)的特征表示会趋于相似,符合"物以类聚"的经济直觉。

图注意力网络 (GAT)

GAT (Velickovic et al., 2018) 引入注意力机制动态计算邻居节点的重要性权重:

\[\alpha_{vu} = \frac{\exp\left(\text{LeakyReLU}\left(a^T[Wh_v \| Wh_u]\right)\right)}{\sum_{k \in \mathcal{N}(v)} \exp\left(\text{LeakyReLU}\left(a^T[Wh_v \| Wh_k]\right)\right)}\]
\[h_v^{(l+1)} = \sigma\left(\sum_{u \in \mathcal{N}(v)} \alpha_{vu} W h_u^{(l)}\right)\]

其中 \(\|\) 表示拼接 (Concatenation),\(a\) 为注意力参数向量。

多头注意力版本:

\[h_v^{(l+1)} = \|_{k=1}^{K} \sigma\left(\sum_{u \in \mathcal{N}(v)} \alpha_{vu}^k W^k h_u^{(l)}\right)\]

GAT vs GCN 在金融中的选择

GCN 假设所有邻居同等重要(仅基于度归一化),而 GAT 自适应学习不同关系的重要性。在金融关系网络中,核心供应商 vs 边缘供应商的影响力差异巨大,GAT 更能捕捉这种异质性。

金融关系图的构建

公司关系图 (Company Relation Graph)

import torch
from torch_geometric.data import Data

def build_financial_graph(companies, relations):
    """构建金融关系图"""
    # 节点特征: 公司的财务/量价因子
    node_features = []
    for company in companies:
        features = extract_features(company)  # ROE, PE, 动量, 波动率等
        node_features.append(features)
    x = torch.tensor(node_features, dtype=torch.float)

    # 边: 公司间关系
    edge_index = []  # (2, num_edges)
    edge_attr = []   # 边特征
    for src, dst, rel_type, weight in relations:
        edge_index.append([src, dst])
        edge_attr.append([rel_type_to_id[rel_type], weight])

    edge_index = torch.tensor(edge_index, dtype=torch.long).t()
    edge_attr = torch.tensor(edge_attr, dtype=torch.float)

    return Data(x=x, edge_index=edge_index, edge_attr=edge_attr)

常见的关系类型包括:

关系类型 数据来源 图特性
行业分类 GICS/中信行业 同行业全连接
供应链 财报披露、FactSet 有向图
股权关联 股东信息 有向加权图
收益率相关性 历史收益率 动态图
分析师覆盖 研报数据 二部图

动态图构建

金融关系随时间演变。基于收益率相关性的动态图:

\[A_{ij}^{(t)} = \mathbb{1}\left[\text{Corr}(r_i, r_j)_{[t-w, t]} > \tau\right]\]

供应链网络 (Supply Chain Network)

import torch.nn as nn
from torch_geometric.nn import GATConv

class SupplyChainGNN(nn.Module):
    def __init__(self, in_dim, hidden_dim=64, out_dim=1, heads=4):
        super().__init__()
        self.gat1 = GATConv(in_dim, hidden_dim, heads=heads, dropout=0.2)
        self.gat2 = GATConv(hidden_dim * heads, hidden_dim, heads=1,
                            concat=False, dropout=0.2)
        self.predictor = nn.Sequential(
            nn.Linear(hidden_dim, 32),
            nn.ReLU(),
            nn.Linear(32, out_dim)
        )

    def forward(self, data):
        x, edge_index = data.x, data.edge_index
        x = torch.relu(self.gat1(x, edge_index))
        x = torch.relu(self.gat2(x, edge_index))
        return self.predictor(x)  # 每只股票的预测收益率

# 训练: 预测供应链传导后的股票收益
model = SupplyChainGNN(in_dim=num_features)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)

for epoch in range(100):
    model.train()
    pred = model(graph_data)
    loss = nn.MSELoss()(pred.squeeze(), graph_data.y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

供应链信号的经济逻辑

当核心客户的股价异动时,其供应商的股价通常滞后反应。GNN 通过供应链图的消息传递,可以提前捕捉这种传导效应 (Contagion Effect),构建具有预测能力的 Alpha 信号。

风险传染建模 (Risk Contagion Modeling)

金融风险通过关系网络传播,GNN 可建模系统性风险 (Systemic Risk) 的传染路径。

信用风险传染

节点状态 \(s_v \in \{0, 1\}\) 表示是否违约。传染概率与邻居违约比例相关:

\[P(s_v = 1 | \mathcal{N}(v)) = \sigma\left(\beta_0 + \beta_1 \sum_{u \in \mathcal{N}(v)} w_{vu} \cdot s_u + \beta_2^T x_v\right)\]
class RiskContagionGNN(nn.Module):
    def __init__(self, node_dim, edge_dim, hidden_dim=32):
        super().__init__()
        self.node_embed = nn.Linear(node_dim, hidden_dim)
        self.edge_embed = nn.Linear(edge_dim, hidden_dim)
        self.message_fn = nn.Sequential(
            nn.Linear(hidden_dim * 2 + hidden_dim, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, hidden_dim)
        )
        self.update_fn = nn.GRUCell(hidden_dim, hidden_dim)
        self.risk_head = nn.Linear(hidden_dim, 1)

    def forward(self, x, edge_index, edge_attr, n_steps=3):
        h = self.node_embed(x)
        e = self.edge_embed(edge_attr)
        for step in range(n_steps):
            # 消息传递: 模拟风险传染的多步扩散
            messages = self.compute_messages(h, edge_index, e)
            h = self.update_fn(messages, h)
        return torch.sigmoid(self.risk_head(h))  # 违约概率

系统性风险的非线性

金融风险传染具有强烈的非线性和阈值效应:当违约比例超过临界点时,整个网络可能发生级联崩溃 (Cascade Failure)。传统线性模型难以捕捉这种相变 (Phase Transition) 现象,而多层 GNN 通过迭代消息传递可以模拟这种级联扩散过程。

小结

图神经网络为金融关系建模提供了结构化的学习框架。GCN 和 GAT 分别提供了固定权重和自适应权重的邻域聚合方案。在供应链分析、风险传染和关系驱动选股等场景中,GNN 能够有效利用拓扑信息增强预测能力。关键挑战在于金融图的动态性、稀疏性以及关系数据的获取质量。