Basel III 产出底线:分阶段过渡期资本要求向量
Basel III Output Floor — Capital Requirement Across Phase-In Schedule
开始编码按 Basel III 终稿(欧盟为 CRR3),使用 Internal-Ratings-Based(IRB)模型计提信用风险资本的银行,必须把 IRB 资本与按 Standardised-Approach(SA)资本一定百分比设定的「产出底线」做比较,并按二者中较高的一方计提。底线从 50%(自 2022 年起)渐次过渡到 72.5%(至 2027 年)。请实现 solution(irb_capital: float, sa_capital: float, phase_in_floors: list[float]) -> list[float],返回各过渡期阶段的资本要求:
capital_required[k] = max(irb_capital, phase_in_floors[k] * sa_capital)输出长度与 phase_in_floors 相同,顺序保持一致。当 len(phase_in_floors) == 0 时返回 []。当 irb_capital >= sa_capital 时底线不会绑定,所有条目都等于 irb_capital。当 irb_capital == 0 且 sa_capital > 0 时,每个条目等于 phase_in_floors[k] * sa_capital。
算法是对 phase_in_floors 的一次线性扫描。对列表中的每个 f,计算 floored_sa = f * sa_capital,把 float(max(irb_capital, floored_sa)) 追加到输出。整体时间 O(K),输出空间 O(K),附加空间 O(1)。不要对 phase_in_floors 排序,不要去重,不要把底线乘到 irb_capital 上。
例
某银行 irb_capital = 8.0e9、sa_capital = 12.0e9,使用公布的 2022→2027 过渡期 phase_in_floors = [0.50, 0.55, 0.60, 0.65, 0.70, 0.725]。各阶段的「底线 × SA」依次是 6.0e9, 6.6e9, 7.2e9, 7.8e9, 8.4e9, 8.7e9。第 0..3 阶段 IRB 资本 8.0e9 都高于经底线加权的 SA,底线不绑定,条目为 8.0e9。第 4 阶段(0.70)经底线加权的 SA 为 8.4e9 > 8.0e9,底线绑定,条目为 8.4e9。第 5 阶段(0.725)为 8.7e9,条目为 8.7e9。solution(...) 返回 [8.0e9, 8.0e9, 8.0e9, 8.0e9, 8.4e9, 8.7e9]。
实践背景
写这道题最常踩的五个坑都很值得注意。第一是*最大值,不是最小值*:产出底线是资本的下限——它阻止 IRB 把资本压得过低。写 min(irb, floor*sa) 会让每个绑定阶段都欠资本。第二是*底线只乘 SA*:底线百分比只乘 Standardised-Approach 数值,绝不乘 IRB;写成 irb * floor 得到的是没有任何监管含义的量。第三是*顺序保持*:output[k] 必须对应 phase_in_floors[k],监管团队需要把每个条目对应回它的过渡期日期。即使输入本身是单调上升的(看起来按日期天然有序),排序也会破坏位置契约。第四是*重复底线*:如果输入包含重复底线(例如把底线在两个日期之间「持平」的压力情景),输出必须按输入条目数逐一发出——不要去重。第五是*绑定状态非对称*:当一家银行的 IRB 资本本来就高于 SA 资本时,底线在任何过渡期阶段都不会绑定,整个输出等于 irb_capital,监管资本曲线是平的。solution(...) 的下游用途是把分阶段的资本要求送入资本规划仪表盘,由此驱动整个过渡期窗口里的分红、回购和 AT1 发行决策。
约束条件
- `0.0 <= irb_capital <= 1e10` 且为有限值。Internal-Ratings-Based 资本要求,单位美元;非负。
- `0.0 <= sa_capital <= 1e10` 且为有限值。Standardised-Approach 资本要求,单位美元;非负。
- `0 <= len(phase_in_floors) <= 30`。过渡期最多 30 个阶段(Basel III 终稿公布的是 2022→2027 共 6 阶段;上限留出按子年度插值的余地)。
- `0.0 <= phase_in_floors[k] <= 1.0`。每个条目是分数形式的底线百分比(0.725 表示 72.5%)。
- 输出为长度等于 `len(phase_in_floors)` 的 `list[float]`;每个条目非负;比较使用浮点容差 `rel_tol=1e-9, abs_tol=1e-9`。
样例
Case 1 · statement-example 2022-2027 phase-in IRB binds at last two stages
输入: [8000000000,12000000000,[0.5,0.55,0.6,0.65,0.7,0.725]]
期望: [8000000000,8000000000,8000000000,8000000000,8399999999.999999,8700000000]
IRB 8e9 与底线加权 SA 6e9..8.7e9 比较。第 4 阶段 (0.70 -> 8.4e9) 与第 5 阶段 (0.725 -> 8.7e9) 底线绑定;第 0..3 阶段保持 8e9 不变。
Case 2 · visible empty phase-in schedule
输入: [500000000,700000000,[]]
期望: []
空 phase_in_floors -> 空输出列表。长度为 0,无条目。
Case 3 · visible IRB exceeds SA so floor never binds
输入: [10000000000,5000000000,[0.5,0.6,0.725,1]]
期望: [10000000000,10000000000,10000000000,10000000000]
IRB 1e10 > SA 5e9;对任何 [0,1] 区间内的底线,floor*SA <= 5e9 < 1e10,底线在任何阶段都不绑定。每个条目都等于 IRB = 1e10。
Case 4 · visible IRB equals zero floor binds at every positive stage
输入: [0,4000000000,[0.5,0.725]]
期望: [2000000000,2900000000]
IRB=0 时 max(0, floor*sa) = floor*sa。底线 0.50 与 0.725 对 SA 4e9 分别得到 2e9 与 2.9e9。
Case 5 · visible single floor element K=1
输入: [1500000000,2000000000,[0.725]]
期望: [1500000000]
单元素调度。floor*SA = 0.725*2e9 = 1.45e9 < IRB 1.5e9,底线不绑定,条目为 1.5e9。
Case 6 · visible duplicate floors emit duplicate entries
输入: [1000000000,2000000000,[0.5,0.5,0.5]]
期望: [1000000000,1000000000,1000000000]
三个相同底线 -> 三个相同条目。floor*SA = 1e9 == IRB 1e9,每个位置 max 都为 1e9。
Case 7 · visible IRB equals SA capital
输入: [3000000000,3000000000,[0.5,0.725,1]]
期望: [3000000000,3000000000,3000000000]
IRB == SA == 3e9。每个阶段 floor*SA <= SA = IRB,因此每个条目 = IRB = 3e9。
Case 8 · visible floor zero disables floor entry equals IRB
输入: [1200000000,5000000000,[0,0,0.5]]
期望: [1200000000,1200000000,2500000000]
floor=0 使 floor*SA=0;前两个阶段 max(IRB, 0) = IRB = 1.2e9。第 2 阶段底线 0.5*5e9 = 2.5e9 > 1.2e9,底线绑定。
Case 9 · visible floor one full SA
输入: [1000000000,4000000000,[1]]
期望: [4000000000]
floor=1.0 时条目 = max(IRB, SA) = max(1e9, 4e9) = 4e9。
Case 10 · visible both capitals zero
输入: [0,0,[0.5,0.725,1]]
期望: [0,0,0]
IRB 与 SA 都为 0;floor*SA=0;每个阶段 max(0,0)=0。
Case 11 · visible non-monotone phase-in floors order preserved
输入: [1500000000,3000000000,[0.725,0.5,0.6]]
期望: [2175000000,1500000000,1800000000]
即使底线不按升序排列,输出保持输入顺序:floor*SA = 2.175e9, 1.5e9, 1.8e9;与 IRB 1.5e9 取 max 得到 2.175e9, 1.5e9, 1.8e9。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example 2022-2027 phase-in IRB binds at last two stages
输入: [8000000000,12000000000,[0.5,0.55,0.6,0.65,0.7,0.725]]
期望: [8000000000,8000000000,8000000000,8000000000,8399999999.999999,8700000000]
IRB 8e9 与底线加权 SA 6e9..8.7e9 比较。第 4 阶段 (0.70 -> 8.4e9) 与第 5 阶段 (0.725 -> 8.7e9) 底线绑定;第 0..3 阶段保持 8e9 不变。
Case 2 · visible empty phase-in schedule
输入: [500000000,700000000,[]]
期望: []
空 phase_in_floors -> 空输出列表。长度为 0,无条目。
Case 3 · visible IRB exceeds SA so floor never binds
输入: [10000000000,5000000000,[0.5,0.6,0.725,1]]
期望: [10000000000,10000000000,10000000000,10000000000]
IRB 1e10 > SA 5e9;对任何 [0,1] 区间内的底线,floor*SA <= 5e9 < 1e10,底线在任何阶段都不绑定。每个条目都等于 IRB = 1e10。
Case 4 · visible IRB equals zero floor binds at every positive stage
输入: [0,4000000000,[0.5,0.725]]
期望: [2000000000,2900000000]
IRB=0 时 max(0, floor*sa) = floor*sa。底线 0.50 与 0.725 对 SA 4e9 分别得到 2e9 与 2.9e9。
Case 5 · visible single floor element K=1
输入: [1500000000,2000000000,[0.725]]
期望: [1500000000]
单元素调度。floor*SA = 0.725*2e9 = 1.45e9 < IRB 1.5e9,底线不绑定,条目为 1.5e9。
Case 6 · visible duplicate floors emit duplicate entries
输入: [1000000000,2000000000,[0.5,0.5,0.5]]
期望: [1000000000,1000000000,1000000000]
三个相同底线 -> 三个相同条目。floor*SA = 1e9 == IRB 1e9,每个位置 max 都为 1e9。
Case 7 · visible IRB equals SA capital
输入: [3000000000,3000000000,[0.5,0.725,1]]
期望: [3000000000,3000000000,3000000000]
IRB == SA == 3e9。每个阶段 floor*SA <= SA = IRB,因此每个条目 = IRB = 3e9。
Case 8 · visible floor zero disables floor entry equals IRB
输入: [1200000000,5000000000,[0,0,0.5]]
期望: [1200000000,1200000000,2500000000]
floor=0 使 floor*SA=0;前两个阶段 max(IRB, 0) = IRB = 1.2e9。第 2 阶段底线 0.5*5e9 = 2.5e9 > 1.2e9,底线绑定。
Case 9 · visible floor one full SA
输入: [1000000000,4000000000,[1]]
期望: [4000000000]
floor=1.0 时条目 = max(IRB, SA) = max(1e9, 4e9) = 4e9。
Case 10 · visible both capitals zero
输入: [0,0,[0.5,0.725,1]]
期望: [0,0,0]
IRB 与 SA 都为 0;floor*SA=0;每个阶段 max(0,0)=0。
Case 11 · visible non-monotone phase-in floors order preserved
输入: [1500000000,3000000000,[0.725,0.5,0.6]]
期望: [2175000000,1500000000,1800000000]
即使底线不按升序排列,输出保持输入顺序:floor*SA = 2.175e9, 1.5e9, 1.8e9;与 IRB 1.5e9 取 max 得到 2.175e9, 1.5e9, 1.8e9。