基于均匀两两违约相关性的有效独立债务人数
Effective Number of Independent Obligors from Uniform Pairwise Default Correlation
开始编码实现 solution(num_obligors: int, avg_pairwise_correlation: float) -> float。信贷风险官每日把公司贷款账面上的原始债务人数与一个均匀两两违约相关性 rho_bar 一起,翻译成一个「等价的独立债务人数」。函数返回单个 float effective_n,刻画相关违约扣除后还剩下多少分散度收益。
输出由如下闭式 Hill 风格公式定义:
effective_n = N / (1 + (N - 1) * rho_bar)其中 N = num_obligors、rho_bar = avg_pairwise_correlation。分子是原始头数;分母放大量为 (N - 1) * rho_bar ——即每户名下与其相关的另外 N - 1 户对单户方差的贡献。
退化输入哨兵:
num_obligors == 0->float('nan')。根本没有账面;指标未定义(裸公式在 rho_bar = 0 时给出 0/1 = 0,但「债务人数为零时的有效债务人数」语义本身就有歧义,因此参考合同为 NaN)。num_obligors == 1->1.0。单户即唯一户;(N - 1) 因子为零,公式化为1 / (1 + 0 * rho_bar) = 1.0,与rho_bar取值无关。
例
solution(10, 0.5) 返回 1.8181818181818181。十户、均匀两两相关 0.5,分母为 1 + 9 * 0.5 = 5.5,effective_n = 10 / 5.5 ~= 1.818。即使账面挂着十户对手方,高相关性意味着账面表现像约 1.8 户独立债务人——十分之九的分散度收益已被相关性侵蚀。
独立基准 (rho_bar = 0) 算例:solution(10, 0.0) 返回 10.0。分母坍缩为 1 + 9 * 0 = 1,effective_n = 10 / 1 = 10.0。两两相关性为零时,有效计数等于原始头数;十户都贡献独立方差。
同向极限 (rho_bar = 1) 算例:solution(10, 1.0) 返回 1.0。分母为 1 + 9 * 1 = 10,effective_n = 10 / 10 = 1.0。完美两两相关时,账面坍缩到单户名头——十户永远一同违约的债务人,与一户在总损失方差上等价。
低相关性现实算例:solution(10, 0.05) 返回 6.896551724137931。分母为 1 + 9 * 0.05 = 1.45,effective_n = 10 / 1.45 ~= 6.897。5% 的均匀相关性——对中等分散度的公司账面是典型水平——仍然把有效计数从 10 侵蚀到约 6.9。
边界:num_obligors == 0 返回 NaN(空账面)。num_obligors == 1 对 [0, 1] 内任意 rho_bar 都返回 1.0(单户账面)。rho_bar == 0 返回原始 num_obligors 的 float 形式(独立)。rho_bar == 1 且 num_obligors >= 2 返回精确 1.0(同向极限)。本函数对约束区间内任何输入都不抛异常;NaN 哨兵是 N == 0 情形的合同输出。
实现细节由 stubs/stub.py 提供。
实践背景
「有效独立债务人数」是信贷组合风险管理里标准的相关性感知集中度度量。一旦违约相关,原始债务人数 N 就会高估分散度收益——一个挂名一百户但所有人一起违约的账面,从经济意义上根本不是百名账面。Hill 风格比例 effective_n = N / (1 + (N - 1) * rho_bar) 抓住的是:要在总损失方差上等价于实际相关账面,需要多少户两两不相关的债务人;它是对纯头数式分散度论断的自然相关性修正。effective_n 把相关性翻译成非量化人员也能直读的数:「这个账面表现得像我手里有 X 户互不相关的债务人」,与实际头数和相关性大小都无关。一个挂名 N = 100 但 rho_bar = 0.2 的账面,effective_n = 100 / (1 + 99 * 0.2) ~= 4.78 ——操作员不应当它是百名账面。solution(...) 输出的 effective_n 是信贷组合看板上的每日集中度诊断,与单户限额检查、敞口加权指标并列。本函数刻意把以下几条概念约定显式化——分母用 (N - 1) 不是 N;比例方向是 N / D 不是 D / N;两个极限情形(rho_bar = 0 返回 N,rho_bar = 1 且 N >= 2 返回 1.0)锁住公式;两个哨兵(N == 0 返回 NaN,N == 1 返回 1.0)在不抛异常的前提下覆盖空账面与单户两种退化输入——这些正是生产相关性感知集中度代码反复抓到的方向性错误。本题是 HHI-on-EAD 有效 N 的相关性版兄弟题:HHI 版本刻画敞口集中度;本版本刻画相关违约方差集中度。纯 O(1) 实现是单条算术表达式。
约束条件
- 0 <= num_obligors <= 1000
- 0.0 <= avg_pairwise_correlation <= 1.0
- 输出:float —— 当 num_obligors >= 1 时 effective_n 在 [1.0, num_obligors] 范围;当 num_obligors == 0 时为 NaN
- 浮点比较器使用 rel_tol=1e-9, abs_tol=1e-9, nan_equals_nan=true
样例
Case 1 · statement-example: ten obligors moderate correlation
输入: [10,0.5]
期望: 1.8181818181818181
分母 = 1 + 9 * 0.5 = 5.5;effective_n = 10 / 5.5 ~= 1.818。中段算例:高相关性把十户压到约 1.8 户有效。
Case 2 · statement-example: independence benchmark rho=0
输入: [10,0]
期望: 10
rho_bar = 0;分母 = 1 + 9 * 0 = 1;effective_n = 10 / 1 = 10。独立基准:有效计数等于原始计数。
Case 3 · statement-example: comonotonic limit rho=1
输入: [10,1]
期望: 1
rho_bar = 1;分母 = 1 + 9 * 1 = 10;effective_n = 10 / 10 = 1.0。同向极限:账面坍缩为一户。
Case 4 · statement-example: low realistic correlation
输入: [10,0.05]
期望: 6.896551724137931
分母 = 1 + 9 * 0.05 = 1.45;effective_n = 10 / 1.45 ~= 6.897。5% 相关性仍把 10 侵蚀到约 6.9。
Case 5 · sentinel: empty book N=0 returns NaN
输入: [0,0]
期望: "NaN"
N == 0 哨兵:空账面;指标未定义;参考合同返回 NaN。
Case 6 · sentinel: single obligor N=1 rho=0
输入: [1,0]
期望: 1
N == 1:单户即唯一户;(N-1) 因子为零;结果 = 1.0,与 rho_bar 取值无关。
Case 7 · boundary: smallest non-trivial pair N=2 rho=0
输入: [2,0]
期望: 2
N=2、rho=0:分母 = 1 + 1 * 0 = 1;effective_n = 2 / 1 = 2。两户独立债务人。
Case 8 · boundary: smallest non-trivial pair N=2 rho=1
输入: [2,1]
期望: 1
N=2、rho=1:分母 = 1 + 1 * 1 = 2;effective_n = 2 / 2 = 1。同向相关的一对当作一户。
Case 9 · typical: pair with mid correlation N=2 rho=0.5
输入: [2,0.5]
期望: 1.3333333333333333
N=2、rho=0.5:分母 = 1 + 1 * 0.5 = 1.5;effective_n = 2 / 1.5 ~= 1.333。中等相关的一对。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: ten obligors moderate correlation
输入: [10,0.5]
期望: 1.8181818181818181
分母 = 1 + 9 * 0.5 = 5.5;effective_n = 10 / 5.5 ~= 1.818。中段算例:高相关性把十户压到约 1.8 户有效。
Case 2 · statement-example: independence benchmark rho=0
输入: [10,0]
期望: 10
rho_bar = 0;分母 = 1 + 9 * 0 = 1;effective_n = 10 / 1 = 10。独立基准:有效计数等于原始计数。
Case 3 · statement-example: comonotonic limit rho=1
输入: [10,1]
期望: 1
rho_bar = 1;分母 = 1 + 9 * 1 = 10;effective_n = 10 / 10 = 1.0。同向极限:账面坍缩为一户。
Case 4 · statement-example: low realistic correlation
输入: [10,0.05]
期望: 6.896551724137931
分母 = 1 + 9 * 0.05 = 1.45;effective_n = 10 / 1.45 ~= 6.897。5% 相关性仍把 10 侵蚀到约 6.9。
Case 5 · sentinel: empty book N=0 returns NaN
输入: [0,0]
期望: "NaN"
N == 0 哨兵:空账面;指标未定义;参考合同返回 NaN。
Case 6 · sentinel: single obligor N=1 rho=0
输入: [1,0]
期望: 1
N == 1:单户即唯一户;(N-1) 因子为零;结果 = 1.0,与 rho_bar 取值无关。
Case 7 · boundary: smallest non-trivial pair N=2 rho=0
输入: [2,0]
期望: 2
N=2、rho=0:分母 = 1 + 1 * 0 = 1;effective_n = 2 / 1 = 2。两户独立债务人。
Case 8 · boundary: smallest non-trivial pair N=2 rho=1
输入: [2,1]
期望: 1
N=2、rho=1:分母 = 1 + 1 * 1 = 2;effective_n = 2 / 2 = 1。同向相关的一对当作一户。
Case 9 · typical: pair with mid correlation N=2 rho=0.5
输入: [2,0.5]
期望: 1.3333333333333333
N=2、rho=0.5:分母 = 1 + 1 * 0.5 = 1.5;effective_n = 2 / 1.5 ~= 1.333。中等相关的一对。