图神经网络与金融关系建模
概述
金融市场本质上是一个复杂的关系网络 (Relational Network):公司之间存在供应链关系、行业关联、股权结构等多维连接。图神经网络 (Graph Neural Network, GNN) 能够在图结构数据上进行消息传递 (Message Passing) 和特征聚合,是建模这类关系数据的天然工具。本文介绍 GCN、GAT 的基本原理及其在金融关系建模中的应用。
GNN 基础:消息传递范式
GNN 的核心思想是通过邻居节点的信息聚合 (Neighborhood Aggregation) 更新节点表示。通用的消息传递框架为:
其中 \(h_v^{(l)}\) 为节点 \(v\) 在第 \(l\) 层的特征表示,\(\mathcal{N}(v)\) 为节点 \(v\) 的邻居集合。
图卷积网络 (GCN)
Kipf & Welling (2017) 提出的 GCN 使用归一化邻接矩阵进行特征传播:
其中:
- \(\tilde{A} = A + I_N\) 为加入自环 (Self-loop) 的邻接矩阵
- \(\tilde{D}_{ii} = \sum_j \tilde{A}_{ij}\) 为度矩阵 (Degree Matrix)
- \(W^{(l)}\) 为第 \(l\) 层的可训练参数
- \(\sigma\) 为非线性激活函数
对单个节点 \(v\),GCN 的更新规则为:
GCN 的频谱解读
GCN 可视为图信号的低通滤波器 (Low-pass Filter),对邻居节点特征做平滑。在金融场景中,这意味着相关联的公司(如同行业、供应链上下游)的特征表示会趋于相似,符合"物以类聚"的经济直觉。
图注意力网络 (GAT)
GAT (Velickovic et al., 2018) 引入注意力机制动态计算邻居节点的重要性权重:
其中 \(\|\) 表示拼接 (Concatenation),\(a\) 为注意力参数向量。
多头注意力版本:
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 | 有向图 |
| 股权关联 | 股东信息 | 有向加权图 |
| 收益率相关性 | 历史收益率 | 动态图 |
| 分析师覆盖 | 研报数据 | 二部图 |
动态图构建
金融关系随时间演变。基于收益率相关性的动态图:
供应链网络 (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\}\) 表示是否违约。传染概率与邻居违约比例相关:
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 能够有效利用拓扑信息增强预测能力。关键挑战在于金融图的动态性、稀疏性以及关系数据的获取质量。