← 返回编程题库
coding-leverage-ratio-with-ccf中等免费版2000ms未尝试

Basel III 杠杆率:表外项的信用转换系数(CCF)合计

Basel III Leverage Ratio: Credit Conversion Factors over Off-Balance Items

开始编码

实现 solution(tier1_capital: float, on_balance_exposure: float, off_balance_gross: list[float], ccf: list[float], derivative_potential_exposure: float, repo_exposure: float) -> float。监管报送组每日需要 Basel III 杠杆率。tier1_capital 是已扣减后的 Tier-1(带符号,美元);on_balance_exposure 是表内敞口合计(美元);off_balance_grossccf 是等长并列数组,分别给出每个表外项的毛名义与对应的 Credit Conversion Factor,CCF 取值范围 [0.0, 1.0]derivative_potential_exposure 是衍生品潜在未来敞口(PFE);repo_exposure 是证券融资类交易(SFT / 回购)敞口。

输出 ratio 由如下可观测公式定义:

  1. CCF 后表外off_balance_total = sum_i off_balance_gross[i] * ccf[i]逐项乘积再求和。始终非负。
  2. 总敞口度量total_exposure = on_balance_exposure + off_balance_total + derivative_potential_exposure + repo_exposure四段之和。始终非负。
  3. 最终杠杆率total_exposure > 0ratio = tier1_capital / total_exposuretotal_exposure == 0tier1_capital > 0 返回 float('inf')total_exposure == 0tier1_capital < 0 返回 float('-inf')total_exposure == 0tier1_capital == 0 返回 float('nan')

solution(60.0, 900.0, [200.0, 100.0], [0.5, 1.0], 50.0, 50.0) 返回 0.05。该行 Tier-1 资本为 60、表内敞口为 900、两个表外项的毛名义为 200100,对应 CCF 为 0.5(如中等期限承诺)与 1.0(直接信用替代品),衍生品 PFE 为 50,回购敞口为 50。CCF 后表外为 200*0.5 + 100*1.0 = 200。总敞口为 900 + 200 + 50 + 50 = 1200。ratio 为 60 / 1200 = 0.05——刚好踩在 5% 的 G-SIB 底线上,远高于 3% 基准。

一个CCF = 0 让某个表外项归零的算例:solution(30.0, 500.0, [400.0, 200.0], [0.0, 0.5], 0.0, 0.0) 返回 30.0 / (500.0 + 0.0*400.0 + 0.5*200.0 + 0.0 + 0.0) = 30.0 / 600.0 = 0.05。第一个表外项的 CCF 为 0.0(如 Basel II/III 下无条件可撤销承诺),对总敞口贡献为 0;只有第二项的 200 * 0.5 = 100 进入表外桶。

一个 Tier-1 为负的算例:solution(-10.0, 100.0, [], [], 0.0, 0.0) 返回 -0.1。Tier-1 资本为 -10(极度承压信号——例如扣减项已经超过毛 CET1 且 AT1 也补不回正);总敞口为 100;ratio 为 -0.1。输出带符号值,不要钳到 0。

边界off_balance_gross/ccf 为空,且表内、PFE、回购全为 0、Tier-1 为正时返回 float('inf');全空(Tier-1 = 0、所有敞口都为 0)返回 float('nan')。总敞口为 0 而 Tier-1 为负时返回 float('-inf')。本函数对约束区间内的任何输入都不抛异常;inf、-inf、nan 哨兵就是总敞口为 0 退化情形下的合同输出。Basel III 杠杆率底线为 3%(部分司法辖区对 G-SIB 提到 5%);跌穿底线时银行必须采取资本动作。

实现细节由 stubs/stub.py 提供。

实践背景

Basel III 监管要求每家银行杠杆率不低于 3%(部分司法辖区对全球系统重要性银行 G-SIB 提到 5%)。该比率衡量 Tier-1 监管资本对非风险加权的总敞口度量:表内资产,加 CCF 后的表外项,加衍生品潜在未来敞口,加证券融资类交易(SFT / 回购)。杠杆率作为风险加权 Tier-1 ratio 的后备线——它不奖励低风险权重资产构造,所以那些靠堆低权重资产去美化风险加权 ratio 的银行,仍要在原始敞口上踩过 3% 的底线。本函数 solution(...) 输出的就是日度数字,会接到银行的杠杆率看板上,用于实时监控离 3% 最低线的距离。函数刻意把工业资本计量管线里最常见的方向性错误显式化:CCF 作用于表外项(表内已是面值,衍生品 PFE 与回购各自有独立的转换方法,把所有四段都套上 CCF 就是隐式重复贴现);表外合计是逐项乘积之和,不是和与和的乘积;总敞口是四段之和(漏掉衍生品 PFE 或回购就是典型的隐式低报);ratio 方向把资本放分子(颠倒会得到约 30 倍杠杆而不是 3% 比率);以及 Tier-1 是带符号量、负值会原样穿透到 ratio 上。一遍线性扫描(一段对表外项,O(N))加三次常量加法、一次除法,就是该日度合计的标准模式。

约束条件

  • -1e9 <= tier1_capital <= 1e9(带符号;极端承压时可为负)
  • 0.0 <= on_balance_exposure <= 1e10
  • 0 <= len(off_balance_gross) == len(ccf) <= 100
  • 0.0 <= off_balance_gross[i] <= 1e9 且 0.0 <= ccf[i] <= 1.0
  • 0.0 <= derivative_potential_exposure <= 1e9 且 0.0 <= repo_exposure <= 1e9
  • 输出为带符号 float(tier1_capital 为负时可为负)或 float('inf')(总敞口为 0 且 Tier-1 > 0)或 float('-inf')(总敞口为 0 且 Tier-1 < 0)或 float('nan')(总敞口为 0 且 Tier-1 == 0);浮点比较器使用 rel_tol=1e-9, abs_tol=1e-9

样例

Case 1 · statement-example: G-SIB 5 percent ratio

输入: [60,900,[200,100],[0.5,1],50,50]

期望: 0.05

CCF 后表外 = 200*0.5 + 100*1.0 = 200;总敞口 = 900 + 200 + 50 + 50 = 1200;ratio = 60 / 1200 = 0.05。

Case 2 · statement-example: CCF zero kills first item

输入: [30,500,[400,200],[0,0.5],0,0]

期望: 0.05

第一项 CCF=0 贡献为 0;表外仅来自 200*0.5 = 100;总敞口 = 500 + 100 = 600;ratio = 30 / 600 = 0.05。

Case 3 · statement-example: negative Tier-1 yields negative ratio

输入: [-10,100,[],[],0,0]

期望: -0.1

Tier-1 = -10、总敞口 = 100;ratio = -10 / 100 = -0.1。带符号输出,不钳零。

Case 4 · visible: empty everything except positive Tier-1 returns inf

输入: [50,0,[],[],0,0]

期望: "Infinity"

总敞口 = 0 且 Tier-1 = 50 > 0,返回 float('inf')。

Case 5 · visible: all zero everywhere returns nan

输入: [0,0,[],[],0,0]

期望: "NaN"

Tier-1 = 0 且总敞口 = 0,返回 float('nan')。

Case 6 · visible: zero exposure with negative Tier-1 returns -inf

输入: [-5,0,[],[],0,0]

期望: "-Infinity"

总敞口 = 0 且 Tier-1 < 0,返回 float('-inf')。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

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

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

Case 1 · statement-example: G-SIB 5 percent ratio

输入: [60,900,[200,100],[0.5,1],50,50]

期望: 0.05

CCF 后表外 = 200*0.5 + 100*1.0 = 200;总敞口 = 900 + 200 + 50 + 50 = 1200;ratio = 60 / 1200 = 0.05。

Case 2 · statement-example: CCF zero kills first item

输入: [30,500,[400,200],[0,0.5],0,0]

期望: 0.05

第一项 CCF=0 贡献为 0;表外仅来自 200*0.5 = 100;总敞口 = 500 + 100 = 600;ratio = 30 / 600 = 0.05。

Case 3 · statement-example: negative Tier-1 yields negative ratio

输入: [-10,100,[],[],0,0]

期望: -0.1

Tier-1 = -10、总敞口 = 100;ratio = -10 / 100 = -0.1。带符号输出,不钳零。

Case 4 · visible: empty everything except positive Tier-1 returns inf

输入: [50,0,[],[],0,0]

期望: "Infinity"

总敞口 = 0 且 Tier-1 = 50 > 0,返回 float('inf')。

Case 5 · visible: all zero everywhere returns nan

输入: [0,0,[],[],0,0]

期望: "NaN"

Tier-1 = 0 且总敞口 = 0,返回 float('nan')。

Case 6 · visible: zero exposure with negative Tier-1 returns -inf

输入: [-5,0,[],[],0,0]

期望: "-Infinity"

总敞口 = 0 且 Tier-1 < 0,返回 float('-inf')。