G-SIB 系统重要性评分与可替代性上限
G-SIB Systemic-Importance Score with Substitutability Cap
开始编码实现 solution(size: float, size_total: float, interconnectedness: float, interconnectedness_total: float, substitutability: float, substitutability_total: float, complexity: float, complexity_total: float, cross_jurisdictional: float, cross_jurisdictional_total: float) -> float。监管报送组每日需要 Basel G-SIB 系统重要性评分(单位:基点)。十个输入是五对 (bank_value, system_total),对应 G-SIB 五个指标类别:规模(size)、关联度(interconnectedness)、可替代性(substitutability)、复杂度(complexity)、跨境业务(cross_jurisdictional)。
输出 score 由如下可观测公式定义:
- 逐类别基点份额:对每个类别计算
share_bps_i = (bank_value_i / system_total_i) * 10000。这是本行在该类别上占全系统的份额,单位为基点。 - 可替代性封顶(除后封、仅此一类):若
share_bps_substitutability > 500,钳到500.0。其余四类不封顶;恰好等于500不动。 - score(等权平均):
score_bps = (size_bps + interconnectedness_bps + substitutability_bps_capped + complexity_bps + cross_jurisdictional_bps) / 5。五个类别每类权重1/5。 - 零分母哨兵:任何一个
*_total等于0.0,返回float('nan')。本函数不抛ZeroDivisionError。
例
solution(50.0, 1000.0, 30.0, 1000.0, 80.0, 1000.0, 40.0, 1000.0, 60.0, 1000.0) 返回 460.0。每类份额按 (value / 1000) * 10000 计算:size 500、interconnectedness 300、substitutability 800、complexity 400、cross-jurisdictional 600。substitutability 800 > 500 钳到 500。score = (500 + 300 + 500 + 400 + 600) / 5 = 2300 / 5 = 460.0。封顶比不封顶((500 + 300 + 800 + 400 + 600) / 5 = 520)少 60 bps。
一个所有类别均为 100% 份额的算例:solution(1000.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0) 返回 8100.0。每个原始份额都是 10000 bps;substitutability 被钳到 500;score = (10000 + 10000 + 500 + 10000 + 10000) / 5 = 40500 / 5 = 8100.0。当每个 bank 值都不超过对应 system_total 时,这是 score 的最大值;若 bank 值大于系统总量(口径不一致),仍按公式计算,未封顶类别的份额可超过 10000,从而 score 可能超过 8100。
边界:所有 bank 值为 0、总量为正时返回 0.0(本行对任何类别都没有贡献)。substitutability 份额恰好等于 500 时位于封顶边界,不触发钳制(封顶是单边严格大于)。任意一个 *_total 等于 0.0 返回 float('nan')——系统口径未定义、所占份额也无意义。某类别 bank 值与该类别总量相等时该类别份额为 10000 bps(若是 substitutability 则为封顶后的 500)。
实现细节由 stubs/stub.py 提供。
实践背景
在 Basel Committee 的全球系统重要性银行(G-SIB)框架下,监管者每年为每家大型银行计算一个基点制的系统重要性评分。该评分对五个等权指标类别——规模、关联度、可替代性/金融基础设施、复杂度、跨境业务——取均值,每个指标都是该行在全球大型银行样本上报口径中所占的份额。可替代性类别封顶 500 bps,目的是让某家在单一服务(托管、支付、承销)上独大的银行不能仅凭这一类就把分数抬到很高。score 进而映射到桶(日常使用为 1~4 桶;第 5 桶是空置的威慑桶),桶位决定该行在 Basel III 标准最低线之上还要额外持有的 CET1 资本附加费。本函数 solution(...) 输出的就是基点制 score,下游代码再把 score 映射到桶并算附加费。本函数刻意锁住的几条概念约定——封顶在除完之后、且只对 substitutability 生效;五类等权;score 是均值不是总和;单位是基点不是分数——正是会把桶位算错、从而把资本要求算错的实现性错误。一遍 O(1) 计算(五次除、一次封、一次均值)就是该日度看板的标准合计模式。
约束条件
- 0.0 <= size, interconnectedness, substitutability, complexity, cross_jurisdictional <= 1e12
- 0.0 <= size_total, interconnectedness_total, substitutability_total, complexity_total, cross_jurisdictional_total <= 1e14
- 输出为按上述公式计算的基点 float 或 float('nan')(任一系统总量为 0 时)。当每个正的 bank 值都不超过对应 system_total 时,score 落在 [0, 8100](最大值 8100 由 substitutability 钳到 500、其余四类各取 10000 得到);若输入存在 bank_value > system_total(数据口径不一致),仍按公式计算,未封顶类别的份额可超过 10000、最终 score 也可能超过 8100,按原样返回。浮点比较器使用 rel_tol=1e-9, abs_tol=1e-9。
样例
Case 1 · statement-example: cap binds on substitutability gives 460 bps
输入: [50,1000,30,1000,80,1000,40,1000,60,1000]
期望: 460
shares = 500, 300, 800, 400, 600 bps;substitutability 800 > 500 钳到 500;score = (500+300+500+400+600)/5 = 460。
Case 2 · statement-example: all 100 percent shares give max score 8100 bps
输入: [1000,1000,1000,1000,1000,1000,1000,1000,1000,1000]
期望: 8100
每类原始份额 10000 bps;substitutability 钳到 500;score = (10000+10000+500+10000+10000)/5 = 8100。
Case 3 · visible: zero substitutability_total returns nan
输入: [50,1000,30,1000,80,0,40,1000,60,1000]
期望: "NaN"
substitutability_total = 0,返回 float('nan')。
Case 4 · visible: all bank values zero gives score zero
输入: [0,1000,0,1000,0,1000,0,1000,0,1000]
期望: 0
每类份额都是 0,score = 0。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: cap binds on substitutability gives 460 bps
输入: [50,1000,30,1000,80,1000,40,1000,60,1000]
期望: 460
shares = 500, 300, 800, 400, 600 bps;substitutability 800 > 500 钳到 500;score = (500+300+500+400+600)/5 = 460。
Case 2 · statement-example: all 100 percent shares give max score 8100 bps
输入: [1000,1000,1000,1000,1000,1000,1000,1000,1000,1000]
期望: 8100
每类原始份额 10000 bps;substitutability 钳到 500;score = (10000+10000+500+10000+10000)/5 = 8100。
Case 3 · visible: zero substitutability_total returns nan
输入: [50,1000,30,1000,80,0,40,1000,60,1000]
期望: "NaN"
substitutability_total = 0,返回 float('nan')。
Case 4 · visible: all bank values zero gives score zero
输入: [0,1000,0,1000,0,1000,0,1000,0,1000]
期望: 0
每类份额都是 0,score = 0。