网络构建技术:从数据到关系的桥梁

各位同学,今天我们来聊聊网络构建技术。说白了,就是把一堆看似杂乱的数据,变成一张能用的关系网。我在做量化策略的初期,总觉得选股就是看财务指标、看K线,后来才发现——真正赚钱的秘密,往往藏在股票之间的“关系”里。

核心观点:网络构建不是简单的数据堆砌,而是把“谁和谁有关系”这件事,用数学语言表达出来。你构建的网络质量,直接决定了后续分析的成败。

一、基于共现关系的网络构建

共现关系,说白了就是“经常一起出现”。在股票市场里,如果两只股票经常在同一天大涨,或者经常被同一批机构调研,那它们之间很可能存在某种关联。

具体怎么做?我习惯用滑动窗口法。举个例子:

import pandas as pd
import numpy as np

# 假设我们有20只股票,1000个交易日的数据
# 构建共现矩阵
def build_cooccurrence_matrix(returns, threshold=0.05, window=20):
    n_stocks = returns.shape[1]
    co_matrix = np.zeros((n_stocks, n_stocks))
    
    for i in range(n_stocks):
        for j in range(i+1, n_stocks):
            # 计算两只股票在滑动窗口内的共现次数
            overlap = 0
            for t in range(window, len(returns)):
                ret_i = returns.iloc[t-window:t, i]
                ret_j = returns.iloc[t-window:t, j]
                # 如果两只股票同时超过阈值,算一次共现
                if (ret_i.mean() > threshold) and (ret_j.mean() > threshold):
                    overlap += 1
            co_matrix[i, j] = overlap
            co_matrix[j, i] = overlap
    return co_matrix

嗯,这里要注意:阈值怎么选?我踩过坑。曾经把阈值设得太低,结果网络里全是噪声,根本看不出结构。后来我总结了一个经验:阈值取收益率序列的75%分位数,效果比较稳

我的小技巧:共现关系适合捕捉短期联动。比如同行业的股票,在财报季经常一起异动。但如果是跨行业的长期关系,共现法就不太灵了。

二、基于权重的网络构建

共现关系只告诉你“有没有关系”,但没告诉你“关系有多强”。权重网络就是来解决这个问题的。

权重怎么算?我个人最常用的是三种方法:

方法 计算公式 适用场景
皮尔逊相关系数 ρ = Cov(X,Y) / (σx·σy) 线性关系明显的场景
互信息 MI(X,Y) = Σp(x,y)log(p(x,y)/(p(x)p(y))) 非线性关系、高维数据
距离相关系数 dCor(X,Y) = dCov(X,Y) / sqrt(dVar(X)·dVar(Y)) 任意关系,包括非线性

你想想看,如果只用皮尔逊相关系数,遇到那种“同涨同跌但幅度不同”的情况,结果会失真。我曾在做行业轮动策略时,用互信息发现了银行股和地产股之间的非线性关系——这在传统相关系数里是看不到的。

# 互信息计算示例
from sklearn.feature_selection import mutual_info_regression

def build_weighted_network(returns, method='mutual_info'):
    n = returns.shape[1]
    weight_matrix = np.zeros((n, n))
    
    for i in range(n):
        for j in range(i+1, n):
            if method == 'mutual_info':
                mi = mutual_info_regression(
                    returns.iloc[:, i].values.reshape(-1,1),
                    returns.iloc[:, j].values
                )[0]
                weight_matrix[i, j] = mi
                weight_matrix[j, i] = mi
    return weight_matrix

避坑指南:我曾经在构建权重网络时,直接用了原始收益率数据,结果网络里全是市场整体波动的影响。后来我改用残差收益率(剔除市场因子后),才真正捕捉到个股之间的独特关系。

三、动态网络构建

静态网络有个致命问题:市场是变化的。去年同涨的股票,今年可能就分道扬镳了。所以,我们需要动态网络。

动态网络的核心思想:让网络结构随时间变化。我常用的方法有两种:

  • 滑动窗口法:固定窗口大小(比如60个交易日),每20天重新构建一次网络
  • 指数衰减法:给历史数据赋予递减的权重,越近的数据权重越大

我个人更偏爱指数衰减法。为什么呢?因为它平滑,不会因为窗口边界的变化导致网络结构突变。

# 指数衰减权重计算
def exponential_decay_weights(window_size, decay_rate=0.05):
    weights = np.exp(-decay_rate * np.arange(window_size))
    return weights / weights.sum()

# 动态网络构建
def build_dynamic_network(returns, window=60, step=20, decay=True):
    n_stocks = returns.shape[1]
    n_periods = (len(returns) - window) // step + 1
    networks = []
    
    for t in range(n_periods):
        start = t * step
        end = start + window
        window_data = returns.iloc[start:end]
        
        if decay:
            w = exponential_decay_weights(window)
            # 加权计算相关系数
            weighted_corr = np.corrcoef(
                window_data.values.T * w.reshape(-1,1)
            )
        else:
            weighted_corr = np.corrcoef(window_data.values.T)
        
        networks.append(weighted_corr)
    
    return networks

关键洞察:动态网络能捕捉到“关系的变化”。比如2020年疫情初期,医药股和科技股突然形成强关联,而传统消费股则被孤立。这种结构变化,往往是策略调仓的重要信号。

四、三种方法的对比与选择

说了这么多,到底该用哪种?我给大家一个决策框架:

场景 推荐方法 原因
快速探索、初步筛选 共现关系 计算快,容易发现强关联
精细分析、策略构建 权重网络 量化关系强度,可排序
实时监控、高频交易 动态网络 捕捉结构变化,及时调整

嗯,这里要提醒一句:不要迷信任何一种方法。我见过有人只用动态网络,结果被频繁的信号变化搞得晕头转向。我的习惯是:先用共现关系做粗筛,再用权重网络做精排,最后用动态网络做监控。

实战经验:在构建A股市场的投资网络时,我建议把行业分类作为先验知识。比如,先把同行业的股票强制连起来,再通过数据挖掘发现跨行业的隐藏关系。这样构建的网络,既有先验的稳定性,又有数据驱动的灵活性。

五、本章知识体系总览

下面这张图,是我自己总结的网络构建技术全景图。你看一眼,就能明白今天讲的内容是怎么串起来的。

网络构建技术全景图 原始数据 收益率/成交量/舆情 共现关系 阈值判定 滑动窗口 二值网络 权重网络 皮尔逊/互信息 距离相关系数 加权网络 动态网络 滑动窗口法 指数衰减法 时序网络 投资关联网络 社区发现 中心性分析 策略生成

从这张图你能看到,整个流程是:原始数据 → 三种构建方法 → 投资网络 → 下游应用。每种方法都有它的适用场景,没有银弹。

好了,今天的内容就到这里。记住:网络构建不是目的,发现关系才是。下次当你看到两只股票同涨同跌时,不妨想想——它们之间,到底藏着什么故事?


公众号:蓝海资料掘金营,微信deep3321