一级资本充足率:CET1 扣减、AT1 加回与 RWA
Tier-1 Capital Ratio: CET1 Deductions, AT1 Add-back, and RWA
开始编码实现 solution(common_equity_tier1: float, additional_tier1: float, capital_deductions: list[float], exposures: list[float], risk_weights: list[float]) -> float。监管报送组每日需要 Basel III 一级资本充足率。两个标量输入分别是毛 CET1 资本与毛 AT1 资本(美元);capital_deductions 是 CET1 扣减项的逐项列表(商誉、递延所得税资产等);exposures 与 risk_weights 是等长的并列数组,给出每笔资产的 Exposure-at-Default 与 Basel 风险权重。
输出 ratio 由如下可观测公式定义:
- 扣减后净 CET1:
net_cet1 = common_equity_tier1 - sum(capital_deductions)。扣减项超过 CET1 时可为负——输出带符号值。 - 一级资本:
tier1_capital = net_cet1 + additional_tier1。AT1 是加到分子上。net_cet1 + AT1 < 0时同样可为负。 - 风险加权资产合计:
total_rwa = sum_i exposures[i] * risk_weights[i]。始终非负。 - 最终 Tier-1 ratio:
total_rwa > 0时ratio = tier1_capital / total_rwa;total_rwa == 0且tier1_capital > 0返回float('inf');total_rwa == 0且tier1_capital < 0返回float('-inf');total_rwa == 0且tier1_capital == 0返回float('nan')。
例
solution(100.0, 20.0, [5.0, 3.0], [200.0, 100.0, 50.0], [1.0, 0.5, 0.2]) 返回 0.4307692307692308。该行毛 CET1 为 100、AT1 为 20、两笔扣减合计 8、三笔资产敞口为 200、100、50,Basel 风险权重分别为 1.0(公司)、0.5(中评级)、0.2(主权)。净 CET1 为 100 - 8 = 92。一级资本为 92 + 20 = 112。RWA 为 200*1.0 + 100*0.5 + 50*0.2 = 260。ratio 为 112 / 260 ~ 0.4308——远高于 Basel 6% 的最低线。
一个扣减项超过 CET1、ratio 为负的算例:solution(80.0, 10.0, [60.0, 50.0], [100.0], [1.0]) 返回 -0.2。净 CET1 为 80 - 110 = -30;一级资本为 -30 + 10 = -20(为负,监管资本已经穿底——典型的极度承压信号)。RWA 为 100。ratio 为 -20 / 100 = -0.2。输出带符号值,不要钳到 0。
边界:exposures 为空(无风险资产)且 Tier-1 资本为正时返回 float('inf');全空(CET1 = AT1 = 0、无扣减、无敞口)返回 float('nan')。RWA 为 0 而 Tier-1 资本为负时返回 float('-inf')。Basel 对部分证券化档次明文规定的 1250% 风险权重(在本题中编码为 12.5)会把敞口乘 12.5 而非 1.0,因此高权重资产会主导 RWA 合计。本函数对约束区间内的任何输入都不抛异常;inf、-inf、nan 哨兵就是 RWA 为 0 退化情形下的合同输出。
实现细节由 stubs/stub.py 提供。
实践背景
Basel III 监管要求每家银行 Tier-1 资本充足率不低于 6%(其中 CET1 子项不低于 4.5%)。该比率衡量核心监管资本——CET1 加 AT1,再扣除商誉、递延所得税资产、无形资产以及其他监管扣除项后——除以风险加权资产。本函数 solution(...) 输出的就是日度 Tier-1 数字,会接到监管资本看板上,用于实时监控离 6% 最低线的距离,并据此对计划中的资本动作(新发、分红、回购)做规模估计。本函数刻意把"扣减作用于 CET1"这条概念约定显式化:尽管 (CET1 + AT1 - sum(deductions)) / RWA 与 (net_CET1 + AT1) / RWA 在本题数值上等价,但这条扣减约定对任何姊妹指标都重要,比如 CET1 ratio 或 CET1 缓冲层。本函数同时锁住的几条不变量——AT1 是加而非减、RWA 是 exposure 乘以 weight 而非相加、ratio 是资本除以 RWA 而非反过来、扣减项可以让分子为负而这个负号本身就是监管信号——正是工业资本计量管线和监管自查里最常发生的方向性错误。一遍线性扫描(一段对扣减项、一段对敞口,都是 O(100),再做一次常数比)就是该日度合计的标准模式。
约束条件
- 0.0 <= common_equity_tier1 <= 1e9 且 0.0 <= additional_tier1 <= 1e9
- 0 <= len(capital_deductions) <= 100 且 0.0 <= capital_deductions[i] <= 1e9
- 0 <= len(exposures) == len(risk_weights) <= 100
- 0.0 <= exposures[i] <= 1e9 且 0.0 <= risk_weights[i] <= 12.5
- 输出为带符号 float(扣减项超过 CET1+AT1 时可为负) 或 float('inf')(RWA 为 0 且 Tier-1 > 0) 或 float('-inf')(RWA 为 0 且 Tier-1 < 0) 或 float('nan')(RWA 为 0 且 Tier-1 == 0);浮点比较器使用 rel_tol=1e-9, abs_tol=1e-9
样例
Case 1 · statement-example: healthy bank ratio about 0.43
输入: [100,20,[5,3],[200,100,50],[1,0.5,0.2]]
期望: 0.4307692307692308
净 CET1 = 100 - 8 = 92;Tier-1 = 92 + 20 = 112;RWA = 200*1.0 + 100*0.5 + 50*0.2 = 260;ratio = 112 / 260 ~ 0.4308。
Case 2 · statement-example: deductions exceed CET1 yields negative ratio -0.2
输入: [80,10,[60,50],[100],[1]]
期望: -0.2
净 CET1 = 80 - 110 = -30;Tier-1 = -30 + 10 = -20;RWA = 100*1.0 = 100;ratio = -20 / 100 = -0.2。
Case 3 · visible: empty exposures and positive Tier-1 returns inf
输入: [100,50,[10],[],[]]
期望: "Infinity"
RWA = 0 且 Tier-1 = 100 - 10 + 50 = 140 > 0,返回 float('inf')。
Case 4 · visible: everything zero returns nan
输入: [0,0,[],[],[]]
期望: "NaN"
Tier-1 = 0 且 RWA = 0,返回 float('nan')。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: healthy bank ratio about 0.43
输入: [100,20,[5,3],[200,100,50],[1,0.5,0.2]]
期望: 0.4307692307692308
净 CET1 = 100 - 8 = 92;Tier-1 = 92 + 20 = 112;RWA = 200*1.0 + 100*0.5 + 50*0.2 = 260;ratio = 112 / 260 ~ 0.4308。
Case 2 · statement-example: deductions exceed CET1 yields negative ratio -0.2
输入: [80,10,[60,50],[100],[1]]
期望: -0.2
净 CET1 = 80 - 110 = -30;Tier-1 = -30 + 10 = -20;RWA = 100*1.0 = 100;ratio = -20 / 100 = -0.2。
Case 3 · visible: empty exposures and positive Tier-1 returns inf
输入: [100,50,[10],[],[]]
期望: "Infinity"
RWA = 0 且 Tier-1 = 100 - 10 + 50 = 140 > 0,返回 float('inf')。
Case 4 · visible: everything zero returns nan
输入: [0,0,[],[],[]]
期望: "NaN"
Tier-1 = 0 且 RWA = 0,返回 float('nan')。