第三章:图论基础与股票关系建模

说实话,刚接触量化选股那会儿,我总觉得图论这东西离金融太远了。直到有一次,我尝试用传统因子模型去捕捉产业链传导效应,结果发现——嗯,完全抓不住。后来我才意识到,股票市场本质上就是个巨大的关系网络,而图论,恰恰是描述这种网络的最佳语言。

这一章,我们就来聊聊怎么用图论给股票市场建模。我会从最基础的概念讲起,然后一步步带你构建股票之间的关系网络。

3.1 图的基本概念

图是什么?说白了,就是一堆节点和连接它们的边。节点可以代表股票,边可以代表它们之间的关系。就这么简单。

我个人习惯把图分为三类:

  • 无向图:边没有方向。比如两只股票同属一个行业,这种关系是对称的。
  • 有向图:边有方向。比如产业链中,上游到下游的传导关系。
  • 加权图:边上有权重。比如相关性系数的大小。

我在项目中遇到过一个问题:刚开始建模时,我一股脑把所有股票都连起来,结果图变得又大又稀疏,模型根本学不到东西。后来我学乖了——先想清楚你要表达什么关系,再决定用哪种图。

核心要点:图的结构决定了你能捕捉到的信息类型。无向图适合表达「同类」关系,有向图适合表达「因果」关系,加权图则能表达「强弱」关系。

3.2 股票关联关系构建

股票之间的关系,其实比你想的要多。我总结了三种最常用的构建方式:

3.2.1 行业关联

同行业的股票,往往有相似的走势。为什么?因为它们面对同样的政策、同样的原材料价格、同样的市场需求。

构建方法很简单:

  • 按申万一级行业分类,同行业股票之间连边
  • 边权可以设为1(简单连接)或基于行业集中度加权

你想想看,如果两只股票都是半导体行业的,它们之间没有关系才奇怪吧?

3.2.2 产业链关联

这个就更有意思了。上游涨价,下游成本上升,利润被压缩——这种传导关系,用有向图来表达再合适不过。

我记得有一次做光伏产业链建模,从硅料、硅片到电池片、组件,每个环节的利润变化都会沿着产业链传导。用有向图建模后,模型预测准确率提升了将近15%。

小技巧:产业链关系可以从公司年报、行业研报中提取。我一般会用自然语言处理技术,从文本中自动抽取上下游关系。

3.2.3 相关性关联

这是最「数据驱动」的方式。直接计算股票收益率之间的相关系数,超过某个阈值就建立连接。

但这里有个坑——我曾经直接用皮尔逊相关系数,结果发现很多股票因为市场整体波动而「伪相关」。后来我改用偏相关系数,剔除了市场因子的影响,效果才好起来。

3.3 邻接矩阵与边权设计

图建好了,怎么喂给模型?答案就是邻接矩阵。

邻接矩阵是一个 N×N 的矩阵,N 是股票数量。如果股票 i 和股票 j 之间有边,那么 A[i][j] 就是边的权重;如果没有边,就是 0。

边权设计,我个人觉得是图神经网络选股中最关键的一步。权重设得不好,模型学到的全是噪声。

几种常见的边权设计方式:

关系类型 边权设计 适用场景
行业关联 1(等权)或行业市值占比 行业轮动策略
产业链关联 上下游交易金额占比 产业链传导策略
相关性关联 相关系数(经偏相关处理) 统计套利策略
混合关联 加权求和(需调参) 综合选股策略

避坑指南:我曾经把相关性阈值设得太低(比如0.3),结果图变得非常稠密,模型训练慢不说,还引入了大量噪声。建议从0.6开始尝试,逐步调低。

下面是我常用的邻接矩阵构建代码片段:

import numpy as np

def build_adjacency_matrix(stock_returns, threshold=0.6):
    """
    基于相关性构建邻接矩阵
    stock_returns: DataFrame, 股票收益率数据
    threshold: 相关性阈值
    """
    n = stock_returns.shape[1]
    adj_matrix = np.zeros((n, n))
    
    # 计算偏相关系数(剔除市场因子)
    market_returns = stock_returns.mean(axis=1)
    for i in range(n):
        for j in range(i+1, n):
            # 计算偏相关
            corr = partial_corr(stock_returns.iloc[:, i], 
                               stock_returns.iloc[:, j], 
                               market_returns)
            if abs(corr) > threshold:
                adj_matrix[i][j] = corr
                adj_matrix[j][i] = corr
    
    return adj_matrix

嗯,这里要注意:邻接矩阵是对称的(无向图),但如果你用有向图,矩阵就不对称了。

3.4 本章知识体系总览

为了让你更直观地理解这一章的内容,我画了一张图:

图神经网络选股:图论基础与关系建模 图论基础 无向图 / 有向图 加权图 / 非加权图 节点 = 股票 边 = 关系 股票关系构建 行业关联 产业链关联 相关性关联 混合关联 邻接矩阵 N×N 矩阵 对称/非对称 稀疏/稠密 边权设计(关键!) 等权 / 相关系数 / 交易金额占比 / 加权求和 阈值选择:0.6 → 逐步调低 输入图神经网络 节点特征 + 邻接矩阵 → 选股预测

这张图清晰地展示了从图论基础到最终输入图神经网络的完整流程。你可以看到,关系构建和边权设计是中间最关键的两个环节——它们直接决定了模型能学到什么。

总结一下:图论给了我们描述股票关系的「语法」,关系构建决定了「词汇」,而边权设计则是「修辞」。三者缺一不可。

好了,这一章的内容就到这里。下一章我们会深入图神经网络的核心——消息传递机制,看看信息是如何在股票网络中流动的。


专注资料整理