资讯动态

融合局部聚类特征的银行间网络重构:最大熵、RAS与系统性风险

发布时间:2026/9/18 1:49:42 来源:尧图企业网站定制
简介这份资源是一篇银行间网络重构方向的学术研究文档面向金融风险管理、系统性风险传染与复杂网络建模领域的研究生、科研人员和从业者讨论如何更准确地推测银行间拆借矩阵。内容围绕最大熵方法与最小密度方法展开前者假设完全连接网络易高估风险传染范围后者虽刻画了异配性与稀疏性却丢失了核心银行间的局部聚类特征并可能低估连边密度。为此文章提出融合局部聚类特性、可自适应调整连边密度的重构思路以更贴近实证网络的「核心—外围」结构并给出模型方法推导、拆借概率与适应度方程等细节便于读者理解重构流程与风险传染模拟基础。压缩包共1个docx文件约215KB体量轻便适合作为文献精读或建模参考。目前已有63人学习。1. 银行间网络重构为什么不能只靠最大熵手里只有各行的同业资产、同业负债加总数却要回答“A 行倒下会不会拖垮 C 行”这是同业风控建模里最常见的窘境。银行间网络重构要做的事就是在双边敞口矩阵不可观测的前提下把 n×n 敞口矩阵反推出来。经典解法是最大熵RAS 迭代把行和列和对齐代价是网络被摊平——节点近乎均匀连向所有交易对手局部聚类系数趋近零。真实市场不是这样资金常在同类、同区域机构之间绕圈三角闭合明显高于随机图而三角结构正是冲击在局部反复放大、最后外溢的关键通道。融合局部聚类特征的银行间网络重构是在熵最大化框架里嵌一层“局部抱团”先验总量约束照旧严格满足边的分配不再只看规模乘积还要看邻域里已经存在的三角关系。做系统性风险仿真、同业授信额度测算的人绕不开这套东西。2. 银行间网络重构的数据底座从总额约束到双边敞口矩阵2.1 银行间网络重构的输入到底是什么节点强度与总量守恒做银行间网络重构第一步不是挑算法而是确认手里到底有什么。绝大多数场景能拿到的只是每家银行资产负债表里的两个加总数同业资产存放同业及其他金融机构款项和同业负债同业及其他金融机构存放款项。这两个数是你唯一可靠的锚点分别对应重构矩阵的行和与列和。设网络有 n 家机构待重构矩阵 X 为 n×nX_ij 表示银行 i 对银行 j 的敞口。硬约束有四个行和 sum_j X_ij a_i列和 sum_i X_ij l_j对角元 X_ii 0自己不对自己拆借所有元素非负。系统层面还要求 sum a_i sum l_j否则问题无可行解。实务里这两个总数经常对不上因为统计口径把境外机构、非银机构也算了进去。我一般不会去硬凑而是先做一次比例缩放把缺口摊到各行或者显式加一个“外部部门”节点把差额吃掉。前者简单后者更诚实因为差额确实来自网络之外的对手方。输入字段含义在重构中的角色同业资产 a_i银行 i 对其他机构的债权合计行和硬约束同业负债 l_j银行 j 对其他机构的债务合计列和硬约束对角元自借自贷强制置 0系统总量 S同业敞口总额归一化基准机构类型标签大行 / 股份行 / 城商行 / 农商行局部聚类特征的先验分组注册地域省 / 市聚类先验的另一维规模总资产或同业资产对数相似度带宽的输入对不上的时候先跑这段缩放比后面反复调参省事得多import numpy as np def balance_margins(a, l): 让同业资产总额与同业负债总额一致返回缩放后的 (a, l) a np.asarray(a, dtypefloat) l np.asarray(l, dtypefloat) ta, tl a.sum(), l.sum() if ta 0 or tl 0: raise ValueError(两侧总量必须为正检查是否有负数或空行) target np.sqrt(ta * tl) # 取几何均值作为共同目标总量 a a * (target / ta) # 债权侧整体缩放 l l * (target / tl) # 债务侧整体缩放 assert abs(a.sum() - l.sum()) 1e-6 return a, l逻辑很直白两侧总量不等时谁大谁就多承担一点缩放几何均值能避免把小的一侧放得过大。参数上只需要 a 和 l 两个一维数组长度必须相同索引顺序要和机构名单严格一致——顺序错位是这类重构最常见的低级事故行列对不上但代码不报错。2.2 最大熵与最小密度法在银行间网络重构中的失效边界最大熵法的思路是在所有满足行和列和约束的非负矩阵里挑熵最大的那个。闭式解是 X_ij 正比于 a_i 乘 l_j再用 RAS也叫迭代比例拟合、IPF把行和列和精确对齐。它有两个优点解唯一、收敛快几十次迭代就能把误差压到 1e-10 以下。问题出在结构上。最大熵解的连接概率只和两端规模有关本质是一个以度序列为条件的随机图节点之间没有“抱团”机制。它的局部聚类系数期望值极低平均路径长度偏短传染模拟里冲击会像水一样均匀摊开而不是在某个小圈子里反复折射。这会导致系统性风险被系统性低估——尤其是同业业务高度同质化的中小银行群体。最小密度法是另一个极端在满足约束的前提下让非零边尽可能少最后往往得到一个近似树或近似匹配的结构。它够稀疏贴近真实网络的连通度但树结构里三角数几乎为零聚类特征比最大熵解还差。真实银行间网络处在两者之间既不是完全图也不是树而是“稀疏但局部密集”这正是局部聚类特征要补的那块。还有两个容易被忽略的失效点。一是度分布的尾部最大熵解给出的度分布过于集中重构网络里找不到真正的枢纽节点而枢纽节点恰恰是“太互联而不能倒”讨论的核心。二是匹配性真实网络里大行倾向和大行交易、小行倾向和小行交易最大熵解的同配系数接近零跨层级的传染路径被凭空造出来。2.3 局部聚类特征进入约束体系的位置硬约束还是软惩罚局部聚类特征不能写成硬约束。原因很直接你根本不知道真实的聚类系数是多少写死了就是拍脑袋而且聚类系数是 X 的非线性函数作为等式约束会让原本线性的 RAS 问题变成非凸问题求解代价和不确定性都陡增。可行做法是放进目标函数做成软惩罚min_X D(X || Q) λ · Σ_i (C_i(X) − C_i^target)² s.t. Σ_j X_ij a_i , Σ_i X_ij l_j , X_ii 0 , X_ij ≥ 0其中 D(X || Q) 是相对熵Q 是先验矩阵C_i(X) 是节点 i 的局部聚类系数λ 控制聚类目标的权重。这个形式的好处是保留了 RAS 的可解性只要把 Q 设计成“已经包含聚类信息”的先验后面照旧用 RAS 精确满足行列约束聚类特征是通过 Q 间接注入的。于是有两条工程路线。路线 A 把聚类信息全部揉进先验 Q a_i·l_j·exp(γ·S_ij)S 是可观测的相似度矩阵一次 RAS 出结果快、稳、可复现。路线 B 保留外循环每次 RAS 后回算聚类系数再反推修正 Q适合需要把平均聚类系数精确校准到某个目标值的场景。我一般先用 A 做敏感性分析确定 γ 的合理区间再上 B 做精细校准。3. 局部聚类特征的构造从共同邻居到加权聚类系数3.1 局部聚类系数在有向加权银行间网络中的定义与改写标准无向无权定义的局部聚类系数是 C_i 2E_i / (k_i(k_i − 1))k_i 是节点 i 的邻居数E_i 是这些邻居之间实际存在的边数。但银行间网络是有向加权图直接套会出问题A 对 B 有债权、B 对 A 有债务方向不同含义不同敞口金额差异巨大权重也得进来。工程上我采用两步改写。第一步对称化令 W X X^T把有向图折成无向加权图。理由是“同一个小圈子”这个概念本身不区分债权债务方向某家城商行既买 A 行的存单、又向 A 行拆借这两个关系共同构成它和 A 行的紧密联系。第二步用 Onnela 形式的加权聚类系数对每个节点 i取邻居集 N(i)计算C_i^w 2 / (k_i(k_i − 1)) · Σ_{jh, j,h∈N(i)} (ŵ_ij · ŵ_ih · ŵ_jh)^{1/3}其中 ŵ 是把 W 除以全网络最大权重后的归一化值。用几何平均而不是算术平均是为了惩罚“只有一条边很粗”的伪三角——真正的三角关系应该三条边都够粗。两个实现细节必须盯住。一是零权重如果 j 和 h 之间没有边W_jh 0立方根没问题但要确保不会把 0 当成有效边。二是度数下限k_i 2 时 C_i 无定义不要置 0 混进平均值否则小度数机构会把整体聚类水平拉低掩盖真实结构。我一般在算平均聚类系数时按度数加权。3.2 用可观测信息构造局部聚类特征相似度打分与共同邻居真实的 X 拿不到S_ij 只能从可观测的机构属性里造。经验上有效的分量有三个规模相似度、机构类型同异、地域重叠。规模相似用对数资产的高斯核因为同业授信的额度往往和授信对象的体量挂钩机构类型是个强信号大行之间的拆借市场和城商行之间的资金往来几乎是两套生态地域重叠在省联社体系里尤其明显。共同邻居是第四个分量也是唯一带网络结构的分量。它需要一个种子图 X0——可以是最小密度法生成的骨架也可以是公开披露的大额同业往来。计算出 S 之后先验写成 Q_ij a_i · l_j · exp(γ · S_ij)再对角置零。特征分量取值来源取值范围对聚类的作用规模相似度对数总资产高斯核01强决定同层级抱团机构类型同异监管分类编码τ1强跨类型保底值地域重叠注册地 Jaccard01中区域性机构敏感共同邻居种子图二跳计数01中直接注入三角信息业务同质性同业存单发行量比值01弱视数据可得性取舍import numpy as np def build_affinity(size, bank_type, region, w(0.5, 0.3, 0.2), sigma0.8, tau0.1): size: 各机构同业资产规模 (n,) bank_type: 机构类型编码 (n,)相同即为同类 region: 注册地编码 (n,) w: 三个分量的权重 (规模 / 类型 / 地域) sigma: 规模相似度的高斯带宽越大越宽松 tau: 跨类型机构之间的保底相似度 log_s np.log(np.maximum(size, 1e-6))[:, None] diff (log_s - log_s.T) / sigma sim_size np.exp(-diff ** 2) # 规模越接近越接近 1 same_type (bank_type[:, None] bank_type[None, :]) sim_type np.where(same_type, 1.0, tau) # 跨类型给低但不为零的值 same_region (region[:, None] region[None, :]) sim_region np.where(same_region, 1.0, 0.0) S w[0] * sim_size w[1] * sim_type w[2] * sim_region np.fill_diagonal(S, 0.0) # 自环不参与相似度 return S / S.max() # 归一到 [0, 1]逻辑说明三个分量各算出 n×n 的对称矩阵按权重线性合成后归一化。参数上 sigma 是最需要试的取 0.5 时只有体量非常接近的机构才拿到高相似度取 1.5 时跨层级连接会明显增多tau 控制机构类型这道墙的高度设成 0 等于认为类型完全不影响交易关系设成 0.5 以上则同质化过度聚类会虚高。3.3 特征归一化、共线性与先验矩阵的生成合成之前先做共线性检查。规模相似度和机构类型高度相关——大行就是那几家城商行体量就是那几个量级。如果 VIF 超过 10我会把类型分量降权或者直接删掉只留规模和地域。归一化统一用 min-max 到 [0,1]不要用 z-score因为后面要进 exp(γ·S)负值会让权重反转。先验矩阵生成时还有一个数值陷阱γ 大、S 接近 1 的时候 exp(γ·S) 会溢出。稳妥做法是先减去 S 的最大值再取指数或者把 γ 限制在 5 以内。另外对角元必须在取指数之后置零否则自环会拿到最大的先验权重RAS 之后对角线上会残留大量虚假敞口行和看着对但网络结构完全错。4. 融合局部聚类特征的银行间网络重构实现4.1 重构目标函数熵项、强度约束与聚类惩罚项完整的重构问题在 2.3 已经给出形式。落到代码里路线 A 的实现只有三步构造先验 Q、跑 RAS、回算聚类系数。路线 B 多一层 γ 的校准用二分搜索逼近目标平均聚类系数。两条路线都不需要梯度下降这是我认为这个方案最实用的地方——没有学习率、没有局部极小值施工队能直接接手。RAS 的收敛性有明确保证只要先验矩阵 Q 的行列支撑满足约束的可约性条件不存在某个子集的行和为零但列和为正迭代必然收敛到唯一解。实际用下来n 在几百量级、tol 取 1e-10 时通常 100 到 300 次迭代收敛耗时不到一秒。4.2 用 Python 跑通 RAS 迭代与聚类惩罚外循环import numpy as np def ras(Q, a, l, tol1e-10, max_iter1000): 经典 RAS行缩放、列缩放交替直到行列和同时匹配 X Q.copy() err np.inf for it in range(max_iter): X * (a / np.maximum(X.sum(axis1), 1e-12))[:, None] # 行缩放 X * (l / np.maximum(X.sum(axis0), 1e-12))[None, :] # 列缩放 err max(np.abs(X.sum(axis1) - a).max(), np.abs(X.sum(axis0) - l).max()) if err tol: return X, it 1, err return X, max_iter, err def weighted_clustering(W): Onnela 加权局部聚类系数W 为对称化后的敞口矩阵 n W.shape[0] C np.zeros(n) mx W.max() if mx 0: return C Wn W / mx for i in range(n): nb np.where(Wn[i] 0)[0] k len(nb) if k 2: # 度数不足聚类系数无定义 continue s 0.0 for jj in range(k): for hh in range(jj 1, k): j, h nb[jj], nb[hh] s (Wn[i, j] * Wn[i, h] * Wn[j, h]) ** (1 / 3) C[i] 2 * s / (k * (k - 1)) return C def reconstruct(a, l, S, gamma1.5, eps1e-9): 路线 A把局部聚类特征注入先验一次 RAS 出解 prior a[:, None] * l[None, :] * np.exp(gamma * S) prior np.maximum(prior, eps) # 避免零先验导致不可约 np.fill_diagonal(prior, 0.0) # 自环置零必须在取指数之后 X, iters, err ras(prior, a, l) return X, weighted_clustering(X X.T), iters, err逻辑说明ras 是纯缩放循环行缩放和列缩放交替进行每一步都保证被缩放的那一侧精确满足约束最终两侧同时收敛。weighted_clustering 按节点遍历邻居对用三次方根乘积累加三角强度。reconstruct 先按 a_i·l_j 打底再乘 exp(γ·S) 抬高相似机构之间的先验权重。参数上 gamma 是最关键的旋钮取 0 就退化成最大熵解取 3 以上容易出现少数机构吃掉绝大部分边的极端解。如果要把平均聚类系数校准到特定目标值加一层二分def calibrate_gamma(a, l, S, target_C, lo-2.0, hi6.0, steps30): 二分搜索 γ使重构网络的平均加权聚类系数逼近目标值 for _ in range(steps): mid 0.5 * (lo hi) _, C, _, _ reconstruct(a, l, S, gammamid) valid C[C 0] # 剔除度数不足的节点 cur valid.mean() if valid.size else 0.0 if cur target_C: lo mid else: hi mid return 0.5 * (lo hi)二分的前提是平均聚类系数对 γ 单调不减实践中这一点基本成立因为抬高相似机构间的先验只会让局部三角更密。若出现非单调通常是有节点度数掉到 2 以下需要在 reconstruct 里把 eps 调大一点。4.3 局部聚类特征融合的三个必调参数λ、γ 与收敛阈值参数含义推荐区间调大后的影响γ局部聚类特征强度05初值 1.5聚类系数上升但过度依赖 S先验偏差被放大λ聚类惩罚权重路线 B0.53三角结构更密单边敞口误差随之变大σ规模相似度带宽0.51.5跨规模连接增多同层级抱团减弱τ跨类型保底相似度0.050.3过大就会抹平机构类型差异tolRAS 收敛阈值1e-101e-8过松则行列和残留误差污染后续指标eps先验下限1e-91e-6过小可能不可约过大引入结构性噪声调参顺序建议是先 σ 后 γ 再 τ。σ 决定网络的层级结构定下来之后 γ 才有一个合理的比较基准。判断 γ 是否过大的一个粗暴信号重构网络的度分布基尼系数突然跳升说明边在向少数节点集中。4.4 守恒校验与聚类系数回算出结果之后必须做三项校验缺一项都可能把错误矩阵带进下游模型。def check(X, a, l, tol1e-8): row_err np.abs(X.sum(axis1) - a).max() col_err np.abs(X.sum(axis0) - l).max() diag_err np.abs(np.diag(X)).max() C weighted_clustering(X X.T) valid C[C 0] return { 行和最大误差: row_err, 列和最大误差: col_err, 对角元最大残差: diag_err, 平均加权聚类系数: valid.mean() if valid.size else 0.0, 有效节点占比: valid.size / len(a), 非零边占比: (X tol).sum() / (X.size - len(a)), }三个误差指标应该在 1e-8 以下对角元残差严格为 0。平均加权聚类系数拿来和 γ0 的基线对比——如果提升不到 10%说明 S 没有提供有效信息得回去检查特征构造。非零边占比是稠密度的体检指标真实银行间网络通常在 5% 到 25% 之间超过 40% 基本可以判定 γ 取大了。5. 重构网络的验证、排错与集成用法5.1 用代理参照网络验证局部聚类特征是否真的起了作用重构网络的验证没有真值可用但有两条参照线。下界用配置模型保持每个节点的度序列不变随机重连生成一批代理网络它们的聚类系数反映“给定度分布下的随机水平”。上界用可得的历史双边数据年份哪怕只有一期也能给出量级参考。具体操作是跑消融实验γ0 解一次γ1.5 解一次再各跑 200 次配置模型代理网络比较平均聚类系数、平均路径长度、同配系数三个指标。如果 γ1.5 解落在配置模型分布内说明聚类特征没起作用如果超出上界参照太多说明过拟合了先验。理想位置是介于配置模型的上四分位数与历史参照之间。更贴近业务的验证是传染损失对比。在同一套违约冲击场景下分别用两个重构矩阵跑 DebtRank 或级联违约模型看损失分布的差异。如果 γ 调大之后损失分位数几乎不动那聚类特征对该场景就是冗余的没必要为它增加参数复杂度。5.2 融合局部聚类特征重构时的典型失败模式排查现象可能原因处理动作RAS 迭代到上限仍未收敛先验存在整行或整列为零把 eps 调大或对零行给均匀小先验平均聚类系数异常高γ 过大或 k2 节点被算进均值按度数加权检查 γ 是否超过 5少数节点占用大部分敞口规模化相似度带宽过小τ 过高放大 σ下调 τ重看度分布基尼系数行列和对齐但结构明显失真对角元在取指数前被置零把 fill_diagonal 移到 exp 之后聚类系数提升但传染损失无变化聚类集中在低敞口边上在聚类系数里加权重门槛过滤微小边换个年份结果跳变剧烈机构名单顺序不一致用机构编码做索引不用位置索引5.3 别只输出一个矩阵重构网络的集成生成与压力传导用法单个矩阵永远带有先验选择的主观性工程上更稳妥的做法是生成一个矩阵集合。具体是对相似度矩阵 S 加乘性噪声对数正态σ 取 0.05 到 0.15对行和列和做 bootstrap 扰动γ 在标定值附近取 ±20% 的区间批量跑 500 次重构得到一个敞口矩阵的分布。然后所有下游指标都输出分布而不是点值违约损失报 P50 和 P95枢纽节点排名报出现频率传染路径报常见链路的支持度。这样做的好处是当监管或业务方质疑“凭什么这么连”时你回答的是一个稳健区间而不是一个孤零零的矩阵。计算代价也不高n 在几百量级时500 次 RAS 迭代在普通笔记本上几分钟就能跑完真正耗时的是 clustring 回算那一层循环——n 超过 1000 时建议改用稀疏矩阵存储配合邻居表避免 n³ 的稠密遍历。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价