← 返回编程题库
coding-christoffersen-conditional-coverage-lr-cc中等免费版1000ms未尝试

Christoffersen 条件覆盖性 LR_cc 联合统计量:VaR 回溯检验

Christoffersen Conditional Coverage LR_cc Joint Statistic for VaR Backtesting

开始编码

实现 solution(exceedance_indicator: list[int], alpha: float) -> float。某风险台每日 VaR 回溯检验看板把这一例程与 Kupiec POF(无条件覆盖性 LR_uc)、Christoffersen 独立性(LR_ind)并列运行,作为联合条件覆盖性检验。给定长度 T 的 0/1 指示序列(第 i 个元素为 1 当且仅当第 i 天发生 VaR 突破)与 VaR 置信度 alpha,返回 Christoffersen (1998) 条件覆盖性似然比统计量 LR_cc。在联合零假设下(无条件率正确突破独立),LR_cc 渐近服从 chi-square(2);当 LR_cc > 5.99 时按 95% 置信度拒绝模型。

闭式即可加分解

LR_cc = LR_uc + LR_ind

两个分量精确复用各自姊妹题的公式:

N = sum(exceedance_indicator); T = len(exceedance_indicator);
p = 1 - alpha; q = N / T

LR_uc = 2 * [ N * ln(q / p) + (T - N) * ln((1 - q) / (1 - p)) ]      # Kupiec POF
n00, n01, n10, n11 = 连续配对(i ∈ 1..T-1)的转移计数
p01 = n01 / (n00 + n01); p11 = n11 / (n10 + n11)
p_combined = (n01 + n11) / (n00 + n01 + n10 + n11)

LR_ind = 2 * [ n00*ln(1 - p01) + n01*ln(p01)
             + n10*ln(1 - p11) + n11*ln(p11)
             - (n00 + n10)*ln(1 - p_combined)
             - (n01 + n11)*ln(p_combined) ]                          # Christoffersen-Ind

约定 0 * ln(0) := 0(极限)适用于任何乘子为 0 的对数项。实现是 O(T) 单遍同时计 N 与四个转移计数;统计量计算为常数时间。

算例

solution([0, 0, 0, 0, 1, 1, 0, 0], 0.99) 返回 10.143083742865386。逐步走:

  • N = 2T = 8p = 0.01q = 0.25。Kupiec:LR_uc = 2 * [2 * ln(25) + 6 * ln(0.75 / 0.99)] 约 9.5439
  • 配对计数:n00 = 4n01 = 1n10 = 1n11 = 1。条件 MLE:p01 = 0.2p11 = 0.5p_combined = 2/7。Christoffersen-Ind:LR_ind = 2 * [4*ln(0.8) + 1*ln(0.2) + 1*ln(0.5) + 1*ln(0.5) - 5*ln(5/7) - 2*ln(2/7)] 约 0.5992
  • 联合:LR_cc = LR_uc + LR_ind 约 10.143——超过 chi-square(2) 95% 临界值 5.99。模型被拒绝,主要由 rate 分量驱动(Kupiec 占 9.54 / 10.14 约 94%)。

四个易错点

第一可加性LR_cc = LR_uc + LR_ind,不是乘积、平均或最大值。Wilks 分解定理:约束相互独立的 2 d.f. 联合 LR 统计量等于两个 1 d.f. LR 统计量之和。乘起来或平均得到的数在零假设下不收敛到 chi-square(2),破坏看板阈值标定(LR_cc > 5.99 不再代表"95% 拒绝")。交替序列 [0,1,0,1,0,1,0,1]alpha = 0.5 把这一点说清楚:LR_uc = 0LR_ind 约 9.56,正确的 LR_cc 约 9.56(求和),不是约 0(乘积),也不是约 4.78(平均)。

第二NaN 传播。若 LR_ind 为 NaN(稀疏哨兵:某 from-state 流出为 0——覆盖全零、全一、仅末位为 1),规约要求 LR_cc = NaN,即便 LR_uc 良定义。只返回良定义的分量会让有限的统计量泄漏到看板,而此时 chi-square(2) 解释已不再适用,风险台会误以为检验有效。反向同理 LR_uc 为 NaN 时(在合约 T >= 2 下不可达,因 LR_uc 在 T >= 1 时即良定义)。

第三复用相同惯例0 * ln(0) := 0、自然对数(math.log 而非 math.log10)、+2 系数与各姊妹一致。若把同一数据丢进 Kupiec 姊妹得到 LR_uc、丢进 Christoffersen-Ind 姊妹得到 LR_ind,本题必须返回二者按位(浮点 abs_tol = 1e-9)相等的和。在本题混对数底或系数会让看板的三个指标互相不一致。

第四不要重复扣除。LR_uc 与 LR_ind 用同一突破序列但计算不同的统计量(速率 vs. 独立性)。按 Christoffersen 定理它们是联合 LR 的独立分量;不要扣除任何"共享信息"。试图聪明地扣除一个重叠项的写法计算的是另一个(毫无意义的)统计量。参考实现就是单遍同时跑两个公式再求和——实现就这么短。

哨兵与边界

T < 2:连续配对不足(LR_ind 未定义)、单元素窗口(LR_uc 仍可计算但联合中无意义)。返回 float('nan')。覆盖空列表与单元素列表。

(n00 + n01) == 0(n10 + n11) == 0:至少一个 from-state 没有任何观测到的流出,其条件概率为 0/0、LR_ind 为 NaN。按 NaN 传播 LR_cc 也为 NaN。覆盖全零、全一、仅末位为 1([0,...,0,1])以及最小 T 输入 [0,0][1,1][0,1][1,0]。非对称输入 [1, 0, ..., 0](长度 >= 3)触发哨兵:state 1 恰好贡献一个 (1,0) 转移,两个 from-state 都有流出,LR_ind 严格为 0,LR_cc 退化为良定义的 LR_uc。

LR_uc = 0(速率匹配:q == p)且 LR_ind = 0(独立性塌缩:p01 == p11 == p_combined)时,联合统计量严格为 0——模型同时通过两个分量检验。在 [0,0,1,1,0]alpha = 0.51 上验证:q = 0.4(与 p = 0.49 接近),n00 = n01 = n10 = n11 = 1(LR_ind = 0),故 LR_cc = LR_uc + 0 约 0.163。

当边际率近匹配但突破重度聚集时,联合检验仍在 LR_ind 分量上拒绝。[0,1,0,1,...] 交替序列配 alpha=0.51 是教科书例:q 约 0.5 实质匹配 p=0.49,Kupiec 实质通过,但 LR_ind 抓到完全反聚集,LR_cc 约 LR_ind 约 9.56——远超 5.99。严格 q == p 需要 alpha 等于观测率,但约束 alpha > 0.5 排除了 q=0.5 的情况;最接近合法的自检为 alpha 略高于 0.5,留下极小的 LR_uc 但不影响联合结论。

实践背景

Christoffersen (1998) 证明:联合假设"VaR 模型条件覆盖性正确"分解为两个独立分量——(1) 无条件率正确(Kupiec POF)、(2) 突破独立(无聚集)。该联合假设的似然比统计量按可加分解为 LR_cc = LR_uc + LR_ind,渐近服从 chi-square(2)——即两个独立 chi-square(1) 之和。

风险台每日 VaR 回溯检验看板将 LR_cc 与各自的 LR_ucLR_ind 并列列出,用于诊断式解释:联合检验拒绝时,分析师看分解归因失败模式。LR_uc 占比高 → 模型对率有误(重新标定 alpha)。LR_ind 占比高 → 速率没问题但突破在时间上聚集(重审波动率预测模型——i.i.d. 创新被违反)。两者也可同时触发;纯速率失败看 250 天里 9 个分散单点、alpha=0.99 用例,纯聚集失败看 100 天里 10 连段、alpha=0.9 用例。

本题是题库的联合统计量——区别于:

  • coding-basel-var-traffic-light-zone-and-multiplier——分类红绿灯分区,无统计检验。
  • coding-var-backtest-exceedance-cluster-count——描述性聚集计数,无 LR。
  • coding-kupiec-pof-likelihood-ratio——仅无条件覆盖性分量。
  • coding-christoffersen-independence-lr-test——仅独立性分量。

姊妹一致性:同一输入数据,经本题与两个分量姊妹计算,必有 coding-christoffersen-conditional-coverage-lr-cc(I, alpha) == coding-kupiec-pof-likelihood-ratio(sum(I), len(I), alpha) + coding-christoffersen-independence-lr-test(I),浮点意义下成立(abs_tol = 1e-9 内)。

约束条件

  • 0 <= len(exceedance_indicator) <= 1500(T ∈ [0, 1500])
  • exceedance_indicator[i] in {0, 1}(每个元素严格为 0 或 1)
  • 0.5 < alpha < 1.0(VaR 置信度;理论突破率 p = 1 - alpha 落在 (0, 0.5))
  • 输出:float —— 非负 LR_cc 统计量,或 `float('nan')`(T<2 或某 from-state 流出为 0,即 LR_ind 稀疏哨兵传播);rel_tol=1e-9、abs_tol=1e-9;NaN 与 NaN 视为相等

样例

Case 1 · statement-example: clustered window with 2 exceedances, alpha=0.99

输入: [[0,0,0,0,1,1,0,0],0.99]

期望: 10.143083742865386

8 天窗口里有一段连续 2 个突破,99% VaR。N=2、T=8、p=0.01。Kupiec POF:q=0.25 与 p=0.01 给出 LR_uc 约 9.544。Christoffersen LR_ind 在转移计数(n00=4、n01=1、n10=1、n11=1)上给出约 0.599。按可加分解 LR_cc = LR_uc + LR_ind 约 10.143——超过 chi-square(2) 95% 临界值 5.99。联合检验拒绝模型,主要由 rate 分量(Kupiec)驱动。

Case 2 · visible: T=0 empty list returns NaN

输入: [[],0.99]

期望: "NaN"

空列表:T<2 没有任何连续配对,两个分量都未定义。返回 float('nan')。

Case 3 · visible: T=1 single element returns NaN

输入: [[1],0.99]

期望: "NaN"

单元素列表:T<2,没有连续配对,联合统计量未定义。返回 float('nan')。

Case 4 · visible: all-zeros 40d propagates NaN despite finite LR_uc

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

期望: "NaN"

40 天全零:LR_uc 良定义(= -2*T*ln(1-p) 约 0.804),但 LR_ind 因 n10+n11=0(state 1 无任何流出)而为 NaN。NaN 传播规则要求:只要任一分量为 NaN,LR_cc 即为 NaN。把缺失分量当作 0、只返回 LR_uc 的写法在此用例失败。

Case 5 · visible: all-ones 5d propagates NaN despite finite LR_uc

输入: [[1,1,1,1,1],0.99]

期望: "NaN"

每天都突破。LR_uc 良定义(= -2*T*ln(p) 约 46.05),但 LR_ind 因 n00+n01=0(state 0 无任何流出)而为 NaN。按 NaN 传播规则 LR_cc = NaN。抓那些在 LR_ind 缺失时把 LR_cc 硬写成 LR_uc 的写法。

Case 6 · visible: independence collapse with alpha=0.5

输入: [[0,0,1,1,0],0.51]

期望: 0.1633502009998885

配对计数 n00=n01=n10=n11=1,故 p01=p11=p_combined=1/2——LR_ind 严格为 0。alpha=0.51(理论 p=0.49)观测 q=2/5=0.4,LR_uc 约 0.163。LR_cc = LR_uc + 0 约 0.163。校验当 LR_ind=0 时联合统计量退化为 LR_uc。

Case 7 · visible: alternating sequence alpha=0.51 — LR_ind dominates

输入: [[0,1,0,1,0,1,0,1],0.51]

期望: 9.563914105977322

边际率近匹配:q=4/8=0.5 与 p=0.49,故 LR_uc 极小(约 0.0032)。配对计数 n00=0、n01=4、n10=3、n11=0 给出 p01=1、p11=0;LR_ind 约 9.561(完全反聚集)。LR_cc 约 9.564——Kupiec 实质通过但联合在聚集分量上正确拒绝。

Case 8 · visible: only-exceedance-at-end NaN propagation

输入: [[0,0,0,0,1],0.95]

期望: "NaN"

末位 1 个突破。n00=3、n01=1、n10=0、n11=0——n10+n11=0(state 1 无任何流出)。LR_ind = NaN,故 LR_cc = NaN,尽管 LR_uc 可计算。

最近提交

还没有提交记录。

编码区

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

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

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

Case 1 · statement-example: clustered window with 2 exceedances, alpha=0.99

输入: [[0,0,0,0,1,1,0,0],0.99]

期望: 10.143083742865386

8 天窗口里有一段连续 2 个突破,99% VaR。N=2、T=8、p=0.01。Kupiec POF:q=0.25 与 p=0.01 给出 LR_uc 约 9.544。Christoffersen LR_ind 在转移计数(n00=4、n01=1、n10=1、n11=1)上给出约 0.599。按可加分解 LR_cc = LR_uc + LR_ind 约 10.143——超过 chi-square(2) 95% 临界值 5.99。联合检验拒绝模型,主要由 rate 分量(Kupiec)驱动。

Case 2 · visible: T=0 empty list returns NaN

输入: [[],0.99]

期望: "NaN"

空列表:T<2 没有任何连续配对,两个分量都未定义。返回 float('nan')。

Case 3 · visible: T=1 single element returns NaN

输入: [[1],0.99]

期望: "NaN"

单元素列表:T<2,没有连续配对,联合统计量未定义。返回 float('nan')。

Case 4 · visible: all-zeros 40d propagates NaN despite finite LR_uc

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

期望: "NaN"

40 天全零:LR_uc 良定义(= -2*T*ln(1-p) 约 0.804),但 LR_ind 因 n10+n11=0(state 1 无任何流出)而为 NaN。NaN 传播规则要求:只要任一分量为 NaN,LR_cc 即为 NaN。把缺失分量当作 0、只返回 LR_uc 的写法在此用例失败。

Case 5 · visible: all-ones 5d propagates NaN despite finite LR_uc

输入: [[1,1,1,1,1],0.99]

期望: "NaN"

每天都突破。LR_uc 良定义(= -2*T*ln(p) 约 46.05),但 LR_ind 因 n00+n01=0(state 0 无任何流出)而为 NaN。按 NaN 传播规则 LR_cc = NaN。抓那些在 LR_ind 缺失时把 LR_cc 硬写成 LR_uc 的写法。

Case 6 · visible: independence collapse with alpha=0.5

输入: [[0,0,1,1,0],0.51]

期望: 0.1633502009998885

配对计数 n00=n01=n10=n11=1,故 p01=p11=p_combined=1/2——LR_ind 严格为 0。alpha=0.51(理论 p=0.49)观测 q=2/5=0.4,LR_uc 约 0.163。LR_cc = LR_uc + 0 约 0.163。校验当 LR_ind=0 时联合统计量退化为 LR_uc。

Case 7 · visible: alternating sequence alpha=0.51 — LR_ind dominates

输入: [[0,1,0,1,0,1,0,1],0.51]

期望: 9.563914105977322

边际率近匹配:q=4/8=0.5 与 p=0.49,故 LR_uc 极小(约 0.0032)。配对计数 n00=0、n01=4、n10=3、n11=0 给出 p01=1、p11=0;LR_ind 约 9.561(完全反聚集)。LR_cc 约 9.564——Kupiec 实质通过但联合在聚集分量上正确拒绝。

Case 8 · visible: only-exceedance-at-end NaN propagation

输入: [[0,0,0,0,1],0.95]

期望: "NaN"

末位 1 个突破。n00=3、n01=1、n10=0、n11=0——n10+n11=0(state 1 无任何流出)。LR_ind = NaN,故 LR_cc = NaN,尽管 LR_uc 可计算。