资本留存缓冲:MDA 因子四分位表
Capital Conservation Buffer: MDA Factor Quartile Schedule
开始编码实现 solution(cet1_ratio: float, minimum_cet1: float, conservation_buffer: float) -> float。资本管理台每日运行一道分配政策门控:给定当前 CET1 比率与监管"最低 + 缓冲"要求,返回最大可分配金额(MDA)因子——在 Basel III 资本留存缓冲(CCB)制度下,银行可以以分红、奖金、回购等形式分配出去的盈利占比上限。
输出由如下可观测公式定义:
- 缓冲占用:
buffer_occ = (cet1_ratio - minimum_cet1) / conservation_buffer。表示银行已经在最低要求之上累积了缓冲层宽度的多少比例,无量纲。 - 四分位表(内部断点左开右闭):
buffer_occ <= 0.0→0.0(资本不超过最低要求;全限制)0.0 < buffer_occ <= 0.25→0.0(第一四分位;全限制)0.25 < buffer_occ <= 0.50→0.20(第二四分位)0.50 < buffer_occ <= 0.75→0.40(第三四分位)0.75 < buffer_occ < 1.00→0.60(第四四分位)buffer_occ >= 1.0→1.0(缓冲层已建满;无限制)
例
solution(0.060, 0.045, 0.025) 返回 0.40。该行 CET1 比率为 6.0%,最低要求 4.5%、留存缓冲 2.5%。缓冲占用 (0.060 - 0.045) / 0.025 = 0.60——落在第三四分位 (0.50, 0.75],因此 MDA 因子为 0.40。即:该行最多可分配 40% 的合资格盈利,其余 60% 必须留存以重建缓冲。
一个顶部边界算例:solution(0.070, 0.045, 0.025) 返回 1.0。CET1 比率正好等于 minimum + buffer = 0.045 + 0.025 = 0.070,缓冲占用恰为 1.0,无限制。
一个低于最低要求的算例:solution(0.030, 0.045, 0.025) 返回 0.0。该行 CET1 已跌破最低要求,缓冲占用 (0.030 - 0.045) / 0.025 = -0.6,落在 <= 0 分支——全限制。
边界:cet1_ratio = minimum_cet1 时缓冲占用为 0.0,MDA 为 0.0(缓冲层尚未建立——全限制)。cet1_ratio = minimum_cet1 + 0.5 * conservation_buffer 时缓冲占用恰为 0.5,落在第二四分位的右闭区间 (0.25, 0.50],MDA 为 0.20。cet1_ratio = minimum_cet1 + 1.5 * conservation_buffer 时缓冲占用为 1.5,MDA 为 1.0(无限制上限——超过 1.0 的额外缓冲不会让 MDA 超过 1.0)。本函数对约束区间内的任何输入都不抛异常。
实现细节由 stubs/stub.py 提供。
实践背景
Basel III 监管要求每家银行 CET1 资本不低于监管最低要求(标准规则下为 RWA 的 4.5%),并在最低要求之上额外计提资本留存缓冲(标准规则下为 RWA 的 2.5%)。当 CET1 比率落在缓冲区间内——介于"最低要求"与"最低要求 + 缓冲"之间——监管会限制银行通过分红、可自由裁量的奖金、回购等形式向外派发盈利的比例,剩余部分必须留存以重建缓冲。具体限制以一张分段常数的最大可分配金额因子表呈现:把缓冲层等分成四个四分位,自下而上的派发上限分别为 0.0、0.20、0.40、0.60;当缓冲层已经建满(buffer_occ >= 1.0)银行不再受限(MDA = 1.0);当 CET1 比率跌破最低要求时银行处于资本赤字、完全受限(MDA = 0.0)。本函数 solution(...) 输出的就是日度 MDA 因子,资本管理台会把它接到分红政策门控上——可分配盈利 = MDA 因子 × 合资格盈利——监管也会拿这个值与该行报送的 CET1 比率做核对。本函数刻意把几条概念约定显式化:缓冲占用必须以缓冲层宽度归一化(不是以最低要求或 CET1 比率归一化);四分位断点是 0.25、0.50、0.75、1.0(不是 0.20、0.40、0.60、0.80);MDA 取值是 0.0、0.20、0.40、0.60、1.0,且从 0.60 到 1.0 在缓冲顶部有一个非均匀跳变;内部断点右闭,顶部断点也右闭——这些正是工业资本计量管线和监管自查里最容易踩的方向性错误。整个计算是常数时间:一次减法、一次除法、一串比较。
约束条件
- 0.0 <= cet1_ratio <= 0.50
- 0.0 <= minimum_cet1 <= 0.20
- 0.001 <= conservation_buffer <= 0.20
- 输出为 float,取值集合 {0.0, 0.20, 0.40, 0.60, 1.0};浮点比较器使用 rel_tol=1e-9, abs_tol=1e-9
样例
Case 1 · statement-example: third quartile MDA 0.40
输入: [0.06,0.045,0.025]
期望: 0.4
buffer_occ = (0.060 - 0.045) / 0.025 = 0.60,落在第三四分位 (0.50, 0.75],MDA = 0.40。
Case 2 · statement-example: top boundary buffer fully met returns 1.0
输入: [0.07,0.045,0.025]
期望: 1
buffer_occ = (0.070 - 0.045) / 0.025 = 1.0,正好建满缓冲,无限制。
Case 3 · statement-example: below minimum returns 0.0
输入: [0.03,0.045,0.025]
期望: 0
buffer_occ = (0.030 - 0.045) / 0.025 = -0.6,跌破最低要求,全限制。
Case 4 · visible: mid second quartile MDA 0.20
输入: [0.054,0.045,0.025]
期望: 0.2
buffer_occ = (0.054 - 0.045) / 0.025 = 0.36,落在 (0.25, 0.50],MDA = 0.20。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: third quartile MDA 0.40
输入: [0.06,0.045,0.025]
期望: 0.4
buffer_occ = (0.060 - 0.045) / 0.025 = 0.60,落在第三四分位 (0.50, 0.75],MDA = 0.40。
Case 2 · statement-example: top boundary buffer fully met returns 1.0
输入: [0.07,0.045,0.025]
期望: 1
buffer_occ = (0.070 - 0.045) / 0.025 = 1.0,正好建满缓冲,无限制。
Case 3 · statement-example: below minimum returns 0.0
输入: [0.03,0.045,0.025]
期望: 0
buffer_occ = (0.030 - 0.045) / 0.025 = -0.6,跌破最低要求,全限制。
Case 4 · visible: mid second quartile MDA 0.20
输入: [0.054,0.045,0.025]
期望: 0.2
buffer_occ = (0.054 - 0.045) / 0.025 = 0.36,落在 (0.25, 0.50],MDA = 0.20。