← 返回编程题库
coding-basel-output-floor-phase-in-schedule中等免费版1000ms未尝试

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 == 0sa_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.0e9sa_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.7e9solution(...) 返回 [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 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

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。