3. 图算法入门:PageRank算法、社区发现算法、图嵌入技术

图算法这块,说实话,刚接触量化的人容易绕晕。我当年第一次看PageRank公式时,脑子里全是问号——这玩意儿跟股票有啥关系?后来在实盘回测里踩过几次坑,才慢慢摸到门道。今天咱们就把这三个核心算法掰开揉碎,讲清楚它们在图因子验证里到底怎么用。

3.1 PageRank算法:从网页排名到股票影响力

PageRank最初是Google用来给网页排名的。核心思想很简单:一个节点的重要性,取决于指向它的其他节点的重要性之和。你想想看,这像不像股票市场里「被大资金盯上的股票,往往更重要」?

公式长这样:

PR(A) = (1-d) + d * (PR(T1)/C(T1) + ... + PR(Tn)/C(Tn))

其中:

  • PR(A):节点A的PageRank值
  • d:阻尼系数,通常取0.85
  • T1...Tn:指向A的所有节点
  • C(Ti):节点Ti的出度

关键理解:阻尼系数d模拟了「随机跳转」的概率。在股票网络里,这相当于资金在不同股票间随机流动的可能性。我习惯取0.85,但如果你做高频策略,可以试试0.7——资金切换更快。

在量化回测里,我一般这样用PageRank:

  1. 构建股票关联图:用相关系数矩阵作为边权重,阈值设为0.6以上才连边
  2. 计算PageRank值:迭代直到收敛(通常20-30次就够了)
  3. 作为因子:PR值高的股票,说明它在网络里处于「枢纽」位置,资金流向敏感

我的经验:PageRank因子在行业轮动策略里特别有效。我曾经用它做银行股和科技股的轮动,年化超额收益能到8%左右。但要注意——别用在市值太小的股票上,流动性差会导致PR值失真。

3.2 社区发现算法:找到「抱团」的股票群体

社区发现,说白了就是找「小圈子」。在股票市场里,同一个行业的股票往往走势相似,这就是一个天然社区。但有些跨行业的「隐形抱团」——比如「茅指数」里的消费和医药——用传统行业分类是抓不到的。

我最常用的算法是Louvain,它基于模块度优化:

Q = (1/2m) * Σ[A_ij - (k_i*k_j)/2m] * δ(c_i, c_j)

其中:

  • A_ij:节点i和j之间的边权重
  • k_i:节点i的度
  • m:总边数
  • δ(c_i, c_j):如果i和j在同一社区则为1,否则为0

避坑指南:我曾经在2018年用Louvain做社区发现,结果把茅台和五粮液分到了不同社区——因为那段时间五粮液跌得狠,茅台在涨。后来我加了「时间窗口滑动」机制,每3个月重新计算一次社区归属,效果就好多了。

社区发现的应用场景:

  • 风险对冲:同一社区的股票,做多一个、做空另一个,对冲掉行业风险
  • 因子合成:社区内股票的因子取均值,比单只股票更稳定
  • 异常检测:如果某只股票突然脱离原社区,往往是重大事件信号

3.3 图嵌入技术:把图结构变成向量

图嵌入,就是把每个节点(股票)映射到一个低维向量空间。这样,原本复杂的图结构,就变成了我们熟悉的「特征向量」——可以直接扔进机器学习模型里。

主流方法有三种:

方法 核心思想 量化场景
DeepWalk 随机游走 + Word2Vec 捕捉股票间的「共现关系」
Node2Vec 带偏置的随机游走 平衡同质性和结构性
GCN 图卷积神经网络 融合节点特征和结构信息

我个人最常用Node2Vec,因为它有两个超参数可以调:

  • p:返回参数,控制是否回到上一个节点
  • q:进出参数,控制是否探索新区域

实战技巧:做行业轮动时,我习惯设p=0.5, q=2.0——这样游走偏向于探索不同社区,能抓到跨行业的资金流动信号。如果是做同行业内的选股,就反过来,p=2.0, q=0.5。

图嵌入的代码实现也不复杂:

from node2vec import Node2Vec

# 构建图
G = nx.Graph()
# 添加边和权重...

# 生成嵌入
node2vec = Node2Vec(G, dimensions=64, walk_length=30, num_walks=200)
model = node2vec.fit(window=10, min_count=1)

# 获取股票A的向量
embedding_a = model.wv['stock_A']

嗯,这里要注意:图嵌入的维度不要设太高。64维对于1000只股票的网络已经够用了。我试过128维,结果过拟合严重,回测漂亮但实盘一塌糊涂。

3.4 三种算法的对比与选择

这三种算法各有侧重,我整理了一张对比表:

算法 输出 适合场景 计算复杂度
PageRank 单一数值 节点重要性排序 O(n)
社区发现 社区标签 群体划分、风险对冲 O(n log n)
图嵌入 向量 机器学习输入 O(n^2)

怎么选?我的建议是:

  • 如果你只想快速得到一个「影响力因子」,用PageRank
  • 如果你想做组合管理、风险分散,用社区发现
  • 如果你要跟深度学习模型结合,用图嵌入

曾经踩过的坑:别把三种算法一股脑全用上。我试过把PageRank值、社区标签、图嵌入向量一起作为因子输入,结果多重共线性严重,模型根本没法解释。后来我只选一种,或者用PCA降维后再组合。

图算法在量化回测中的应用框架 股票关联图 PageRank 社区发现 图嵌入 影响力因子 社区标签 特征向量 图因子 → 回测验证

这张图是我自己画的工作流。你看,从股票关联图出发,三条路径都能走到「图因子」这一步。但实际项目中,我建议你先从PageRank入手——它最简单,也最容易解释给基金经理听。

最后说一句:图算法不是银弹。我见过有人把PageRank值当成万能因子,结果回测曲线漂亮得像假的一样——后来发现是数据泄露了。记住,任何因子都要经过严格的回测验证,图因子也不例外。

专注资料整理