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.85T1...Tn:指向A的所有节点C(Ti):节点Ti的出度
关键理解:阻尼系数d模拟了「随机跳转」的概率。在股票网络里,这相当于资金在不同股票间随机流动的可能性。我习惯取0.85,但如果你做高频策略,可以试试0.7——资金切换更快。
在量化回测里,我一般这样用PageRank:
- 构建股票关联图:用相关系数矩阵作为边权重,阈值设为0.6以上才连边
- 计算PageRank值:迭代直到收敛(通常20-30次就够了)
- 作为因子: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值当成万能因子,结果回测曲线漂亮得像假的一样——后来发现是数据泄露了。记住,任何因子都要经过严格的回测验证,图因子也不例外。