净稳定资金比例:ASF 比 RSF 聚合
Net Stable Funding Ratio: ASF over RSF Aggregation
开始编码实现 solution(asf_components: list[float], asf_weights: list[float], rsf_components: list[float], rsf_weights: list[float]) -> float。资金部需要每日的 Basel III 净稳定资金比例(NSFR)。四个输入分为两对独立的 (component, weight)——asf_components 与 asf_weights(Available Stable Funding 类别:资本、稳定零售存款、欠稳定批发资金……),以及 rsf_components 与 rsf_weights(Required Stable Funding 类别:现金、Level-1 HQLA、不可续期贷款、难融资资产……)。每对长度相等、两对之间长度独立。component 是非负美元金额;weight 是 [0.0, 1.0] 区间的小数。
输出 NSFR 由如下可观测公式定义:
- 加权 ASF 合计:
total_asf = sum_i asf_components[i] * asf_weights[i]。 - 加权 RSF 合计:
total_rsf = sum_j rsf_components[j] * rsf_weights[j]。 - 最终 NSFR:
total_rsf > 0时NSFR = total_asf / total_rsf;total_rsf == 0且total_asf > 0返回float('inf');total_rsf == 0且total_asf == 0返回float('nan')。
例
solution([1000.0, 1000.0], [1.0, 0.5], [500.0, 500.0], [1.0, 0.0]) 返回 3.0。该行持有两块 ASF:1000 资本走 ASF 权重 1.0,加 1000 欠稳定批发资金走 ASF 权重 0.5,故 total_asf = 1000*1.0 + 1000*0.5 = 1000 + 500 = 1500。需要支撑两块 RSF:500 难融资资产走 RSF 权重 1.0,加 500 现金走 RSF 权重 0.0,故 total_rsf = 500*1.0 + 500*0.0 = 500 + 0 = 500。NSFR = 1500 / 500 = 3.0——远高于 1.0 的最低线。
一个 NSFR 恰好在最低线的算例:solution([1000.0], [0.95], [950.0], [1.0]) 给出 total_asf = 950、total_rsf = 950、NSFR = 1.0——刚好到 Basel III 地板。
一个 NSFR 低于最低线的算例:solution([500.0], [0.5], [500.0], [1.0]) 给出 total_asf = 250、total_rsf = 500、NSFR = 0.5——银行的稳定资金只覆盖一半所需稳定资金,监管违反。
方向说明:NSFR 是 ASF / RSF——可用稳定资金在分子、所需稳定资金在分母。监管最低线为 NSFR >= 1.0(100%)。把比例反过来(RSF / ASF)就得到倒数 1/NSFR——表达成"融资需求是稳定资金的几倍",是错误的监管概念。
逐元素乘积说明:加权 ASF 合计是逐对 (component * weight) 的求和:sum_i (asf_components[i] * asf_weights[i])。不是 sum(asf_components) * sum(asf_weights)(重复计数);也不是 sum(asf_components) * mean(asf_weights)(丢掉了逐桶配对)。配对只发生在同一对内部;ASF 的权重不能掺到 RSF 的求和里、反之亦然。
边界:total_asf > 0 而 total_rsf == 0(无所需稳定资金)返回 float('inf')(完全覆盖、无需求);全零返回 float('nan')(0/0 未定义)。两对中任意一对为空时该对求和贡献 0.0、永不抛错。
实现细节由 stubs/stub.py 提供。
实践背景
Basel III 监管要求每家银行报送净稳定资金比例,衡量长期稳定融资来源与所需为不流动资产及表外承诺提供的稳定融资之间的结构性匹配度。NSFR 与 30 天流动性覆盖率(LCR)一起出现在监管流动性看板上——LCR 是短期闸门,NSFR 是覆盖一年期限的结构性融资闸门。监管最低线为 NSFR >= 1.0(100%);持续低于地板会触发逐级升级的监管行动。标准公式为 NSFR = 加权 ASF 合计 / 加权 RSF 合计,其中 Available Stable Funding 类别(资本、长期存款、稳定零售存款、欠稳定批发资金……)带 Basel 规定的 ASF 权重(0 到 1),Required Stable Funding 类别(现金、Level-1 HQLA、抵押贷款、不可续期贷款、难融资资产……)带 Basel 规定的 RSF 权重(0 到 1)。ASF 表与 RSF 表是两张独立的监管表——资本拿 ASF 权重 1.0(视为完全稳定的资金),现金拿 RSF 权重 0.0(视为不需要融资);两张表回答两个不同的问题、不能混为一谈。资金部在每日盘后从监管流动性数据仓库里跑这套聚合:资产负债表的负债与权益按 ASF 类别分桶并取对应表内权重,资产与表外承诺按 RSF 类别分桶并取对应表内权重。本函数输出的就是当日 NSFR 数字,会接到监管流动性报表与管理层内部流动性看板上。一遍简单的两段聚合——两段独立点积加一次比——就是这套聚合的标准模式:两段求和之间无数据依赖,工业实现可以并行算,但简单顺序写法对几十量级类别就足够快。
约束条件
- 0 <= len(asf_components) == len(asf_weights) <= 50
- 0 <= len(rsf_components) == len(rsf_weights) <= 50
- 0.0 <= asf_components[i], rsf_components[j] <= 1e10
- 0.0 <= asf_weights[i], rsf_weights[j] <= 1.0
- 输出为非负 float 或 float('inf')(无 RSF 且 ASF > 0)或 float('nan')(全零),float 比较器使用 rel_tol=1e-9, abs_tol=1e-9
样例
Case 1 · statement-example: capital + less-stable funding versus hard-to-fund + cash yields NSFR 3.0
输入: [[1000,1000],[1,0.5],[500,500],[1,0]]
期望: 3
ASF: 1000*1.0 + 1000*0.5 = 1500;RSF: 500*1.0 + 500*0.0 = 500;NSFR = 1500/500 = 3.0。
Case 2 · visible: both pairs empty returns nan sentinel
输入: [[],[],[],[]]
期望: "NaN"
两对均为空:total_asf=0、total_rsf=0;0/0 返回 float('nan')。
Case 3 · visible: ASF positive with empty RSF returns inf sentinel
输入: [[1000,500],[1,0.95],[],[]]
期望: "Infinity"
ASF=1475、RSF=0(空数组);total_rsf=0 且 total_asf>0 故返回 float('inf')。
Case 4 · visible: NSFR exactly at the 1.0 regulatory minimum
输入: [[1000],[0.95],[950],[1]]
期望: 1
ASF=950、RSF=950;NSFR=1.0——刚好到 Basel III 监管最低线。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: capital + less-stable funding versus hard-to-fund + cash yields NSFR 3.0
输入: [[1000,1000],[1,0.5],[500,500],[1,0]]
期望: 3
ASF: 1000*1.0 + 1000*0.5 = 1500;RSF: 500*1.0 + 500*0.0 = 500;NSFR = 1500/500 = 3.0。
Case 2 · visible: both pairs empty returns nan sentinel
输入: [[],[],[],[]]
期望: "NaN"
两对均为空:total_asf=0、total_rsf=0;0/0 返回 float('nan')。
Case 3 · visible: ASF positive with empty RSF returns inf sentinel
输入: [[1000,500],[1,0.95],[],[]]
期望: "Infinity"
ASF=1475、RSF=0(空数组);total_rsf=0 且 total_asf>0 故返回 float('inf')。
Case 4 · visible: NSFR exactly at the 1.0 regulatory minimum
输入: [[1000],[0.95],[950],[1]]
期望: 1
ASF=950、RSF=950;NSFR=1.0——刚好到 Basel III 监管最低线。