返回金融系统设计
高频与风险科学 · 面试题集

HFT & 风控科学 — 面试 Q&A(20题深度版)

06-hft-risk-science/interview-qa.md

HFT & 风控科学 — 面试 Q&A(20题深度版)

适用岗位:量化风控工程师、金融风险架构师、交易系统PM、合规科技 每题包含30秒简答 + 2分钟详答 + 追问准备


📈 HFT 部分(8题)


Q1: 什么是做市策略?做市商如何盈利?库存风险怎么管理?

简短回答(30秒)

做市策略是同时在买卖两侧挂单,通过买卖价差(spread)赚取利润。做市商面临的核心风险是库存风险——持有的头寸可能因价格反向移动而亏损。管理方式包括:动态调整报价偏移(skew)、设置库存上限、以及用对冲工具管理方向性风险。

详细回答(2分钟)

做市的本质:

做市商向市场提供流动性。具体来说,做市商在订单簿上同时维护买单(bid)和卖单(ask),赚取两者之间的价差。例如,买单挂在 100.00,卖单挂在 100.05,每完成一个回合(买到又卖出)就赚 0.05。

盈利来源分解:

  1. Bid-Ask Spread 收入:这是主要盈利来源。日均做市量 1 亿美元、平均 spread 1bp,理论毛利就是 1 万美元/天。
  2. 返佣(Rebate):交易所对挂单方(maker)提供返佣,通常 0.1-0.3bp。高频做市商的返佣可能占利润的 30-50%。
  3. 信息优势:通过订单流分析预判短期价格方向,调整报价获取额外 alpha。

库存风险管理:

库存风险是做市商的头号敌人。假设做市商在下跌市场中不断买入,库存持续增加,价格进一步下跌导致浮亏。

管理手段:

策略机制效果
报价偏移(Skew)库存偏多时,卖单价格降低以加速出货自然减仓
库存上限超过阈值停止单边报价硬性止损
对冲(Delta Hedge)用期货/期权对冲方向性敞口风险转移
半衰期控制设定库存回归零的目标时间(如 5 分钟)时间约束

Avellaneda-Stoikov 模型是经典的做市模型:

  • 最优报价:δ_bid = δ_ask = γσ²(T-t) + (2/γ)·ln(1 + γ/κ)
  • 库存惩罚项 γ 越大,做市商越厌恶库存风险
  • σ²(T-t) 项说明:剩余时间越短或波动率越大,spread 越宽

追问准备

  • 做市商和流动性提供者有什么区别? → 做市商是主动管理两边报价的专业参与者;LP(如 Uniswap 的 AMM LP)是被动提供流动性。做市商有库存管理策略,AMM LP 没有(所以有无常损失)。

  • 逆向选择风险是什么? → 做市商的对手方可能是信息交易者(知道价格要涨的人来买)。做市商被"毒流"(toxic flow)不断选中错误方向。解决办法:检测毒流(VPIN 指标)、在毒流高时加宽 spread。

  • 在加密市场做市和传统市场有什么不同? → 加密市场 24/7 运行、波动率更高(BTC 年化 60-80% vs 股票 15-20%)、监管宽松。做市策略需要更宽的 spread、更低的库存上限、更快的对冲速度。


Q2: Kyle Lambda 模型说的是什么?对系统设计有什么启示?

简短回答(30秒)

Kyle Lambda(λ)衡量的是市场价格对订单流的敏感度——每多一单位买入量,价格上涨多少。λ越大说明市场越不流动(深度越浅)。对系统设计的启示是:大额订单应该拆单执行(TWAP/VWAP),并且交易时段应选择 λ 小的时候(流动性好的时段)。

详细回答(2分钟)

Kyle (1985) 模型框架:

Kyle 模型描述了一个含有三类参与者的市场:

  1. 知情交易者(Informed Trader):知道资产真实价值,想利用信息获利
  2. 噪声交易者(Noise Trader):随机交易,提供流动性
  3. 做市商(Market Maker):根据总订单流设定价格

核心结论:

Δp = λ × (买入量 - 卖出量)

λ(Kyle Lambda)的含义:

  • λ = 价格冲击系数,单位是「美元/手」
  • λ 大 → 市场浅(不流动),一点净买入就推高价格
  • λ 小 → 市场深(流动性好),大单也能温和成交

λ 的决定因素:

λ = σ_v / (2σ_u)
  • σ_v = 资产基本面的不确定性(越大→λ越大→市场越怕信息交易)
  • σ_u = 噪声交易的标准差(越大→λ越小→信息交易者更容易藏身)

对系统设计的直接启示:

  1. 算法拆单:大单如果一次性执行,价格冲击 = λ × Q,可能非常大。应该用 TWAP/VWAP 把 Q 拆成小块分时执行。
  2. 执行时段选择:λ 在开盘和收盘时通常较小(流动性好),中午较大(流动性差)。系统应该动态估计 λ 并选择低 λ 时段执行。
  3. 交易成本分析(TCA):λ 是预估交易成本的核心参数。实际冲击 vs 预估冲击的差异用于评估执行质量。
  4. 流动性监控:实时估计 λ 可以作为流动性预警指标。λ 突然飙升可能预示市场事件。

追问准备

  • 如何实时估计 Lambda? → 回归法:Δp_t = α + λ·Flow_t + ε_t,用滑动窗口(如 5 分钟)滚动估计。也可以用订单簿深度直接近似:λ ≈ 1 / Σ(bid_depth + ask_depth)。

  • Kyle Lambda 和 Amihud 非流动性指标有什么关系? → Amihud (2002) 的指标 = |return| / volume,是 λ 的日频近似。两者都在衡量"单位成交量引起的价格变动"。


Q3: 配对交易的核心原理?协整和相关性有什么区别?

简短回答(30秒)

配对交易是找两个价格走势高度关联的资产,当价差偏离均值时做空贵的、做多便宜的,等价差回归时获利。核心是协整而非相关性——相关性衡量的是两个序列波动方向是否一致,协整衡量的是两个序列的线性组合是否平稳(即价差是否会回归均值)。两个资产可以不相关但协整,也可以高度相关但不协整。

详细回答(2分钟)

配对交易流程:

  1. 选对:找到协整的资产对(如可口可乐/百事、BTC/ETH)
  2. 计算价差:spread_t = P_A - β × P_B(β 是协整回归系数)
  3. 标准化:z_t = (spread_t - mean) / std
  4. 交易信号:z > +2 → 做空 A + 做多 B;z < -2 → 做多 A + 做空 B;z 回归 0 → 平仓

协整 vs 相关性——为什么这个区别至关重要:

维度相关性(Correlation)协整(Cointegration)
衡量什么收益率方向是否一致价格差是否有均值回归
数学定义ρ = Cov(ΔX,ΔY)/σ_x·σ_yY - βX ~ I(0)(平稳)
时间维度瞬时关系长期均衡关系
可交易性低(不保证价差回归)高(价差有回归倾向)

经典反例:

  • 高相关但不协整:两只同行业股票可能相关性 0.95,但如果一只是成长股一只是价值股,价差可能持续扩大(随机游走),不会回归——做配对交易会爆仓。
  • 不相关但协整:一个资产上涨 10% 后又回落,另一个先下跌 5% 后回升——收益率相关性接近 0,但价差始终在窄幅波动。

协整检验方法:

  1. Engle-Granger 两步法:先回归 Y = α + βX + ε,再检验残差 ε 是否平稳(ADF 检验)
  2. Johansen 检验:适用于多个变量的情况
  3. Half-life 计算:价差回归到均值的半衰期 = -ln(2)/ln(φ),φ 是 AR(1) 系数。半衰期 5-30 天最适合交易。

追问准备

  • 半衰期太长或太短有什么问题? → 太长(>60天)→ 资金占用成本高,可能等不到回归;太短(<1天)→ 可能是噪声,交易成本吃掉利润。甜区是 5-30 天。

  • 配对交易最大的风险是什么? → 协整关系破裂(regime change)。比如一家公司被收购、行业政策变化。所以需要滚动检验协整关系,一旦 ADF p-value > 0.05 就停止交易。


Q4: TWAP 和 VWAP 算法的区别?各自适用什么场景?

简短回答(30秒)

TWAP(时间加权)把订单均匀分布在时间段内,每个时间片执行相同的量。VWAP(成交量加权)按照历史成交量分布来分配执行量——量大的时段多执行,量小的时段少执行。TWAP 适合流动性均匀的市场或不想暴露交易意图的场景;VWAP 适合追踪大盘节奏、需要向客户证明执行价格不偏离市场均价的场景。

详细回答(2分钟)

TWAP(Time-Weighted Average Price):

执行计划:每个时间片 k 的目标量 = Q / N
Q = 总量,N = 时间片数量

特点:

  • 实现最简单,是最基础的基准算法
  • 完全不考虑市场状态(成交量、波动率)
  • 优点:执行模式不可预测(对手方难以前置),适合信息敏感的交易
  • 缺点:在低流动性时段强行执行,冲击成本高

VWAP(Volume-Weighted Average Price):

执行计划:每个时间片 k 的目标量 = Q × (v_k / V_total)
v_k = 第 k 个时间片的预测成交量
V_total = 全天总预测成交量

特点:

  • 需要预测每个时段的成交量分布(通常用过去 20 天的历史数据)
  • 目标是使执行均价接近市场 VWAP(基金行业最常用的执行基准)
  • 优点:在流动性好的时段多执行,降低冲击成本
  • 缺点:模式可预测(量大→别人知道你在这时段执行→可被前置)

对比表:

维度TWAPVWAP
信息利用历史成交量分布
冲击成本较高(低流动性时段浪费)较低
可预测性低(均匀分布)高(跟随量曲线)
实现复杂度O(1)O(N) — 需成交量预测
适合场景暗池、小单、信息敏感大单、机构执行、被动基金
基准不常用机构标准基准

进阶算法:

  • Implementation Shortfall (IS):最小化实际执行价格与决策价格的差异。是 Almgren-Chriss 框架的核心,权衡冲击成本和时间风险。
  • POV(Participation of Volume):按实时成交量的一定比例执行(如参与率 10%),自适应性最强。

追问准备

  • 如何改进 VWAP 算法? → 自适应 VWAP:实时监测实际成交量 vs 预测成交量,如果实际量偏多就加速执行,偏少就减速。用卡尔曼滤波更新成交量预测。

  • 什么是 Implementation Shortfall? → IS = 纸面收益 - 实际收益。分解为:延迟成本(决策到开始执行)+ 冲击成本(执行过程中的滑点)+ 时机成本(未执行部分的价格变化)。IS 最小化是一个在冲击成本和时机风险之间求最优的问题。


Q5: 回测中最常见的陷阱是什么?如何避免过拟合?

简短回答(30秒)

回测最常见的陷阱是过拟合(策略在历史数据上表现好但实盘失败)和前视偏差(使用了回测时点尚不可得的数据)。避免过拟合的方法包括:样本外测试(Out-of-Sample)、Walk-forward 验证、限制参数数量、使用 Deflated Sharpe Ratio 等。核心原则是:回测越好看,越要怀疑。

详细回答(2分钟)

五大回测陷阱:

陷阱描述后果
前视偏差(Look-ahead)使用了当时不可得的数据(如用未来的价格做特征)结果虚假
幸存者偏差只用现存资产,忽略退市/归零的收益被高估
过拟合参数过多、在历史数据上"记忆"而非"学习"实盘亏损
交易成本忽略未计算滑点、手续费、冲击成本利润蒸发
数据窥探反复在同一数据集上调参,选了表现最好的统计偏差

过拟合检测和防范:

  1. 样本外测试(OOS)

    • 训练集 70% / 测试集 30%,测试集绝对不能用于参数调优
    • 如果训练集 Sharpe=3.0 但测试集 Sharpe=0.5,几乎肯定过拟合
  2. Walk-Forward 验证

    • 滚动窗口:用 [1-100天] 训练 → [101-120天] 测试 → [21-120天] 训练 → [121-140天] 测试 → ...
    • 最真实的回测方式,模拟实盘中不断重新训练
  3. Deflated Sharpe Ratio(DSR)

    • 如果你尝试了 N 个策略选了表现最好的,真实 Sharpe 需要打折
    • DSR 公式修正了多重比较偏差:你试的策略越多,打折越狠
    • 经验法则:尝试 100 个策略选 1 个,回测 Sharpe 至少要 3.0 以上才可信
  4. 参数稳定性检验

    • 好的策略对参数应该不敏感。如果 MA 周期从 20 改到 22 就大幅变差,说明过拟合
    • 画参数-收益的热力图,应该看到平滑的"高原"而非尖锐的"山峰"
  5. 样本外 Sharpe 的期望值

    • Bailey & de Prado (2014):如果样本内 Sharpe = S,尝试 N 次后,期望样本外 Sharpe ≈ S - √(2·ln(N))·σ_S
    • 试了 1000 个策略,样本内 Sharpe 2.0,真实 Sharpe 可能只有 0.5

追问准备

  • 什么是 Combinatorially Symmetric Cross-Validation (CSCV)? → de Prado 提出的方法:将回测路径随机组合成多个训练/测试集,检查策略在所有组合中的表现分布。如果分布宽且偏负,说明过拟合严重。

  • 如何在 ML 策略中防止过拟合? → 使用 Purged K-Fold Cross-Validation(去除训练/测试集之间的时间重叠),加正则化(L1/L2),限制特征数量(特征/样本比 < 1:20)。


Q6: 为什么 HFT 系统要用 C++ 而不是 Java?延迟优化有哪些层次?

简短回答(30秒)

HFT 系统用 C++ 而非 Java,核心原因是可预测的低延迟。Java 的 GC(垃圾回收)会造成不可预测的停顿(几毫秒到几十毫秒),在 HFT 中一次 GC 停顿可能错过几百个交易机会。延迟优化从上到下有五个层次:硬件(FPGA/网卡)→ OS(内核旁路/CPU 绑定)→ 网络(共线/微波)→ 代码(零分配/无锁)→ 算法(简化计算路径)。

详细回答(2分钟)

Java vs C++ 在 HFT 中的差异:

维度C++Java
GC 停顿无(手动内存管理)有(几ms~几十ms)
延迟可预测性高(确定性执行)低(JIT、GC 不确定)
内存控制完全控制(cache line 对齐)受 JVM 限制
系统调用直接调用需要 JNI 桥接
典型延迟1-5 μs(tick-to-trade)50-200 μs

注意:Java 并非完全不可用。Jane Street 用 OCaml,很多对冲基金用 Java(LMAX Disruptor)。关键是看延迟要求:如果是微秒级做市,必须 C++/FPGA;如果是毫秒级统计套利,Java 够用。

延迟优化五个层次(从底层到顶层):

第 1 层:硬件 (~100ns)

  • FPGA(现场可编程门阵列):把交易逻辑烧到芯片里,延迟 < 1μs
  • Kernel bypass 网卡(Solarflare/Mellanox):绕过 OS 内核直接收发包
  • 内存映射 I/O:避免内核态-用户态切换

第 2 层:操作系统 (~1μs)

  • CPU 绑定(CPU pinning):把交易线程固定在特定核心,避免上下文切换
  • 内存大页(Huge Pages):减少 TLB miss
  • 实时内核(RT Linux):降低调度抖动
  • 关闭中断:在交易核心上禁用不相关中断

第 3 层:网络 (~10μs)

  • 共线(Co-location):把服务器放在交易所机房里,物理距离 < 100 米
  • 微波链路:芝加哥-纽约用微波 vs 光纤,延迟差 2-3ms(对套利至关重要)
  • 网络栈优化:用 DPDK/RDMA 替代标准 TCP/IP 栈

第 4 层:代码 (~1μs)

  • 零堆内存分配(预分配对象池)
  • 无锁数据结构(Lock-free queue)
  • Cache-friendly 数据布局(Struct of Arrays vs Array of Structs)
  • 分支预测优化(__builtin_expect

第 5 层:算法 (可变)

  • 简化计算路径:用查表替代计算
  • 增量计算:均值/方差只更新增量,不重算全部
  • 预计算:开盘前把所有可能的决策树都算好

追问准备

  • FPGA 和 GPU 在 HFT 中各自适合什么? → FPGA 适合确定性低延迟(做市、订单路由),延迟 < 1μs 且完全可预测。GPU 适合大规模并行计算(期权定价、风险计算),延迟 ~10μs 但吞吐量巨大。

  • LMAX Disruptor 是什么? → 一个 Java 的无锁高性能队列,单线程 600 万 msg/s。证明 Java 在毫秒级低延迟场景也能用,关键是避免 GC(预分配 + Ring Buffer)。


Q7: 什么是市场冲击?Square-Root Law 说的是什么?

简短回答(30秒)

市场冲击是大额订单对价格造成的不利影响——你买得越多价格被推得越高。Square-Root Law 说市场冲击与交易量的平方根成正比,而非线性:Impact ∝ σ × √(Q/V)。这意味着把 100 万股拆成 4 次 25 万股执行,总冲击 = 4 × σ√(25万/V) = 2σ√(100万/V),只有一次性执行的一半。

详细回答(2分钟)

市场冲击的分类:

  1. 临时冲击(Temporary Impact):执行瞬间的价格偏移,执行完成后回弹。原因:订单簿上的流动性被暂时消耗。
  2. 永久冲击(Permanent Impact):执行后价格不回弹的部分。原因:市场从你的交易中推断出信息("他在买→可能知道什么→价格应该更高")。

Square-Root Law(Barra/Tower 模型):

Impact = σ × k × √(Q / ADV)
  • σ = 日波动率
  • Q = 交易量
  • ADV = 日均成交量(Average Daily Volume)
  • k = 经验常数(通常 0.5~1.5)

为什么是平方根而不是线性?

这是实证发现。直觉解释:

  • 如果冲击是线性的(Impact ∝ Q),大单会被无限惩罚,没人敢交易大单
  • 如果冲击是对数的(Impact ∝ ln(Q)),大单太便宜,市场会被操纵
  • 平方根恰好在中间,是流动性供给和需求博弈的均衡结果

Almgren-Chriss 框架:

这是最主流的最优执行模型,在 Square-Root Law 基础上求解最优执行路径:

最小化:E[执行成本] + λ × Var[执行成本]
约束:在时间 T 内执行完 Q 的量

结果是一条从匀速(TWAP)到前置(Eager)之间的曲线,λ 越大(越厌恶风险)→ 执行越前置(赶紧执行完避免不确定性)。

数值举例:

假设 σ=2%/天,Q=100万股,ADV=500万股,k=1.0:

  • 一次性执行:Impact = 2% × 1.0 × √(100/500) = 0.89%
  • 拆成 4 次:Total = 4 × 2% × √(25/500) = 4 × 0.45% × (权重) ≈ 0.45%(大幅降低)

追问准备

  • 实盘中如何测量市场冲击? → Arrival Price Benchmark:比较决策时刻的市场中间价和实际成交均价。差异 = 实际冲击。用回归分析 Impact ~ f(σ, Q/ADV, spread) 校准模型参数。

  • 暗池(Dark Pool)如何降低市场冲击? → 暗池不展示订单簿,避免信息泄露。但暗池有逆向选择风险:暗池里可能有知情交易者在等你的大单。实证研究显示暗池对小单有效,大单效果有限。


Q8: GARCH 模型捕捉了什么现象?波动率聚集是什么意思?

简短回答(30秒)

GARCH 模型捕捉的是波动率聚集现象——市场上"大波动后面跟着大波动,小波动后面跟着小波动"。具体地说,GARCH(1,1) 用 σ²_t = ω + α·r²_{t-1} + β·σ²_{t-1} 来建模条件方差随时间变化。α 捕捉的是新冲击的影响,β 捕捉的是波动率的惯性。α + β 越接近 1,波动率的持续时间越长。

详细回答(2分钟)

波动率聚集(Volatility Clustering):

这是金融市场最重要的"风格化事实"之一:

  • 2008 年金融危机:VIX 从 20 飙到 80,高波动持续了 6 个月
  • 2020 年 3 月:新冠恐慌导致连续 10 天日波动超 5%
  • 不只是极端事件:普通行情中也可以观察到"安静期"和"动荡期"交替出现

传统假设(收益率 i.i.d. 正态)完全无法解释这个现象。GARCH 就是为此而生。

GARCH(1,1) 模型详解:

σ²_t = ω + α·ε²_{t-1} + β·σ²_{t-1}
参数含义典型值作用
ω常数项(长期基准)~0.000002保证波动率有正的下限
αARCH 项系数0.05~0.15新冲击对波动率的影响权重
βGARCH 项系数0.85~0.95昨天波动率对今天的惯性

关键量:

  • 持续性 = α + β:越接近 1,波动率冲击消退越慢。典型值 0.95~0.99
  • 长期方差 VL = ω / (1 - α - β):波动率最终会回归到这个水平
  • 半衰期 = ln(0.5) / ln(α + β):波动率冲击减半所需天数。α+β=0.95 → 半衰期 14 天

N 步预测:

σ²_{t+n} = VL + (α + β)^n × (σ²_t - VL)

当 n → ∞,σ²_{t+n} → VL。这就是均值回归——短期波动率可能偏离长期水平,但最终会回归。

GARCH 的局限性:

  1. 对称性:标准 GARCH 假设正冲击和负冲击的影响相同,但实际上下跌引起的波动率上升更大(杠杆效应 / asymmetric volatility)。→ 解决方案:GJR-GARCH 或 EGARCH
  2. 正态假设:收益率的尾部比正态分布更厚。→ 解决方案:t-GARCH(用 t 分布替代正态)
  3. 单变量:只能建模一个资产。→ 解决方案:DCC-GARCH(动态条件相关多元模型)

追问准备

  • EWMA 和 GARCH 的区别? → EWMA 是 GARCH 的特例(ω=0, α=1-λ, β=λ)。EWMA 没有长期均值回归(因为 ω=0),波动率冲击永远不会完全消退。GARCH 有长期均值,更合理。

  • 如何做 GARCH 参数估计? → 极大似然估计(MLE):假设 ε_t ~ N(0, σ²_t),构造对数似然函数,用数值优化(如 L-BFGS-B)求解 (ω, α, β)。Python 的 arch 库一行代码搞定。


🛡️ 风控部分(12题)


Q9: 评分卡为什么用 WOE 编码而不是 One-Hot?IV 值怎么解读?

简短回答(30秒)

WOE(Weight of Evidence)编码相比 One-Hot 有三大优势:1)自动处理缺失值和异常值(分到独立箱);2)编码后的值直接反映特征的预测方向和强度,可解释性极强;3)将分类变量转化为连续值,适合逻辑回归。IV(Information Value)= Σ(good% - bad%)×WOE,用于衡量特征的预测力:IV < 0.02 无用,0.02-0.1 弱,0.1-0.3 中等(首选),0.3-0.5 强,> 0.5 可疑。

详细回答(2分钟)

WOE 编码的核心优势:

  1. 可解释性

    • WOE > 0:该分箱的好客户占比 > 坏客户占比 → 低风险
    • WOE < 0:该分箱的坏客户占比更高 → 高风险
    • 银行监管要求:每个特征的每个分箱对最终评分的贡献必须可解释
  2. 单调性保证

    • 分箱时通常要求 WOE 单调(随特征值增大,WOE 递增或递减)
    • 如果不单调,说明特征和目标的关系不是单调的——需要合并箱或放弃特征
    • 这在 One-Hot 中无法自然实现
  3. 降维

    • 假如一个特征有 100 个类别,One-Hot 会产生 100 个维度
    • WOE 编码只产生 1 个维度(连续值),大幅降低维度灾难
  4. 自然处理缺失值

    • 缺失值分到独立的一个箱,计算自己的 WOE——不需要额外的缺失值处理策略

IV 值的解读:

IV = Σ (good_pct_i - bad_pct_i) × WOE_i
IV 范围预测力实际操作
< 0.02无预测力直接剔除
0.02 ~ 0.1可保留(看业务)
0.1 ~ 0.3中等理想范围,首选入模
0.3 ~ 0.5检查是否有信息泄露
> 0.5过强高概率有问题(穿越/标签泄露)

为什么 IV > 0.5 要警惕?

实际中 IV 超过 0.5 的特征往往有"特征穿越"问题。例如:"逾期天数"作为特征去预测是否违约——这本质上是用结果预测结果。

追问准备

  • WOE 编码有什么缺点? → 1)需要分箱,分箱方法影响结果。2)对连续变量的信息有损失(分箱后箱内值相同)。3)不适合 XGBoost/LightGBM 等树模型(树模型自带分割能力,WOE 反而丢失信息)。

  • 除了 IV,还有什么特征选择方法? → 1)基于树模型的特征重要性(feature importance)。2)SHAP 值。3)L1 正则化(Lasso)。4)前向/后向逐步回归。


Q10: AUC 和 KS 有什么区别?什么时候看哪个?

简短回答(30秒)

AUC 衡量的是模型在所有阈值下区分正负样本的综合能力(ROC 曲线下面积),KS 衡量的是模型在最优阈值处区分好坏客户的最大差距。AUC 用于模型选择(哪个模型更好),KS 用于业务落地(在哪里划线)。信贷风控中两个都看:AUC > 0.75 且 KS > 0.3 是及格线。

详细回答(2分钟)

AUC(Area Under ROC Curve):

  • ROC 曲线:X 轴 = 假阳性率(FPR),Y 轴 = 真阳性率(TPR)
  • AUC = ROC 曲线下面积,等于"随机选一个正样本和一个负样本,模型给正样本打分更高的概率"
  • 范围:0.5(随机猜)~ 1.0(完美区分)
  • 不受样本不平衡影响(这是 AUC 相比 Accuracy 的最大优势)

KS(Kolmogorov-Smirnov):

  • KS = max(|CDF_good - CDF_bad|)
  • 按模型分数排序后,好客户和坏客户的累积分布最大分离点
  • 直觉:KS 对应的分割点就是"好坏客户分得最开的地方"
  • 信贷行业标准:KS > 0.2 勉强可用,> 0.3 良好,> 0.4 优秀

两者的关系和区别:

维度AUCKS
衡量什么全局排序能力最优分割点的区分度
对阈值的依赖不依赖(综合所有阈值)依赖(找最优阈值)
应用场景模型对比、模型迭代准入阈值确定、业务分层
不平衡敏感不敏感不敏感
值域0.5 ~ 1.00 ~ 1.0
近似关系通常 AUC ≈ 0.5 + KS/2

什么时候看哪个?

  1. 模型选择阶段:主要看 AUC。两个模型 AUC 差 0.01 以上通常就有显著差异。
  2. 业务落地阶段:看 KS + 分段通过率/坏账率。KS 点对应的阈值是"初始建议值",但最终阈值要看业务指标。
  3. 模型监控阶段:两个都看。AUC 下降说明整体排序能力退化,KS 下降说明区分度退化。

追问准备

  • Gini 系数和 AUC 有什么关系? → Gini = 2 × AUC - 1。Gini 把 AUC 映射到 [0, 1],更直观。AUC=0.8 → Gini=0.6。

  • PR-AUC(Precision-Recall AUC)什么时候比 AUC 更有用? → 当正负样本极度不平衡时(如欺诈检测,欺诈率 0.1%)。ROC-AUC 可能高达 0.99 但实际精确率很低。PR-AUC 更关注正类的预测质量。


Q11: 为什么风控模型的 Accuracy 没有意义?应该看什么指标?

简短回答(30秒)

因为风控场景严重类别不平衡——坏客户只占 2-5%。一个什么都不做的模型(全部预测为"好客户")就能达到 95-98% 的 Accuracy,但它一个坏客户都没抓到。应该看:AUC/KS(排序能力)、Precision/Recall(在特定阈值下的精确率和召回率)、以及业务指标(通过率、坏账率、损失金额)。

详细回答(2分钟)

Accuracy 为什么误导?

数值例子:假设 10,000 笔贷款申请,坏客户 200 笔(2%)。

模型预测结果Accuracy漏掉坏客户
全部通过全预测为好98%200笔(全漏)
随机猜随机拒 2%96%196笔
真实模型精确拒绝92%40笔

"全部通过"的 Accuracy 最高(98%),但它是最差的模型。真正好的模型 Accuracy 反而最低(因为它主动拒绝了一些好客户来抓坏客户)。

应该看的指标体系:

第一层:模型质量指标

指标公式用途
AUCROC 曲线下面积综合排序能力
KSmax|CDF_good - CDF_bad|最优分割点的区分度
Gini2×AUC - 1AUC 的等价变换

第二层:阈值相关指标

指标公式含义
PrecisionTP/(TP+FP)拒绝的人里有多少真坏客户
RecallTP/(TP+FN)坏客户中被成功拒绝的比例
F12·P·R/(P+R)Precision 和 Recall 的调和平均

第三层:业务指标(最重要)

指标含义通常目标
通过率被批准的申请占比40-70%
坏账率通过客户中的违约比例< 2%
单客利润利息收入 - 坏账损失 - 运营成本> 0
Vintage 曲线每批次的累计坏账率随时间的变化趋于平稳

指标之间的权衡:

  • Precision ↑ → 通过率 ↓ → 业务量减少
  • Recall ↑ → 误拒率 ↑ → 客户体验差
  • 最优阈值取决于:一笔坏账的损失 vs 一个好客户的收益

追问准备

  • 如何确定最优拒绝阈值? → 计算每个阈值下的期望利润:E[Profit] = (通过的好客户 × 单客收益) - (通过的坏客户 × 单客损失)。找到 E[Profit] 最大的阈值。

  • 什么是 Type I 和 Type II 错误?在风控中哪个更严重? → Type I(假阳性)= 误拒好客户,Type II(假阴性)= 漏放坏客户。通常 Type II 更严重:一个坏客户的损失 ≈ 50 个好客户的利润。但误拒太多好客户会导致业务萎缩。


Q12: 什么是特征穿越(Feature Leakage)?如何防止?

简短回答(30秒)

特征穿越是指训练数据中包含了在预测时点实际上不可得的信息,导致模型在回测中表现极好但实盘完全失效。典型例子:用"逾期天数"预测是否违约(结果就是特征)、用未来价格计算的技术指标。防止方法:严格的时间线审查(每个特征在预测时点是否真正可用)、特征 IV > 0.5 时主动排查、建立特征元数据管理。

详细回答(2分钟)

特征穿越的三种类型:

1. 直接泄露(最容易发现):

  • 例:用"贷后催收记录"预测贷前违约概率
  • 线索:这类特征的 IV 通常 > 1.0,AUC 可能接近 1.0
  • 后果:模型上线后该特征值全部为空

2. 间接泄露(较隐蔽):

  • 例:信用卡额度在违约后会被降低。用"当前额度"预测违约→额度降低本身就是违约的后果
  • 例:用户登录频率在逾期后激增(还款/查看逾期信息)。用"近期登录次数"预测违约
  • 线索:特征 IV 不一定很高,但时间线有问题

3. 数据采集时间泄露(最难发现):

  • 例:ETL 延迟导致 T+1 的数据混入了 T 的特征快照
  • 例:数据回填——补录的数据使用了后来才知道的正确值
  • 线索:模型在新数据上的表现突然大幅下降

防止措施:

措施描述效果
特征时间线审计每个特征标注"可用时间",确认 < 预测时间根本性解决
IV 异常检测IV > 0.5 自动触发人工审查发现直接泄露
样本外验证训练/验证/测试集严格按时间分割发现时间泄露
特征元数据管理每个特征记录:数据源、采集时间、更新频率系统化防范
预测时模拟在线上用完全相同的逻辑重算特征,对比训练时的特征值发现数据流差异

检测方法:

  1. Leave-one-feature-out:逐一去掉高 IV 特征,如果 AUC 几乎不变,说明信息是冗余的(正常);如果 AUC 暴跌,说明其他特征无法替代(可疑)
  2. 时间一致性检查:用 T 的特征预测 T+1 的标签,然后用 T-1 的特征预测 T+1 的标签,两者 AUC 差异应该很小。如果差异大,说明 T 的特征里混入了 T+1 的信息
  3. 生产环境回放:把模型部署后头一个月的预测结果与回测结果对比。如果回测 AUC=0.85 但生产 AUC=0.65,大概率有泄露

追问准备

  • 你遇到过最隐蔽的特征穿越是什么? → 经典案例:一个银行用"客户最后一次主动联系客服的时间"作为特征。看起来是行为特征,但逾期客户会频繁联系客服,所以这个特征实际上是逾期的后果。上线后 KS 从 0.42 跌到 0.28。

Q13: PSI 是什么?飙升了说明什么?怎么处理?

简短回答(30秒)

PSI(Population Stability Index)衡量模型评分的分布是否随时间发生漂移。PSI = Σ(actual% - expected%) × ln(actual% / expected%)。PSI < 0.1 稳定,0.1-0.25 需关注,> 0.25 需要重新建模。PSI 飙升说明输入数据的分布发生了变化(可能是经济周期、客群变化、数据源异常),不一定是模型变差了,但一定需要排查。

详细回答(2分钟)

PSI 的计算方法:

PSI = Σ (A_i - E_i) × ln(A_i / E_i)
  • E_i = 基准分布(建模时)的第 i 箱占比
  • A_i = 当前分布的第 i 箱占比
  • 通常将评分分为 10-20 个等距箱

PSI 飙升的原因分析:

原因类别示例特征
客群变化营销策略改变引入了新客群特征分布全面偏移
经济环境衰退期/疫情/政策变化收入类特征偏移
数据源异常第三方数据供应商更新了口径单个特征突变
数据工程问题ETL 出错、缺失值增多特定特征出现大量空值
竞品行为竞品降价导致优质客户流失信用分高端客群减少

排查流程(从快到慢):

  1. 快速排查(5分钟):检查各分箱占比变化,定位哪些箱偏移最大
  2. 特征级 PSI:对每个输入特征分别算 PSI,找到漂移最严重的特征
  3. 数据质量检查:特征缺失率、异常值比例是否突增
  4. 业务核实:问营销团队是否换了渠道、风控是否调了策略
  5. 模型效果验证:看同期 KS/AUC 是否也在下降

处理方案:

PSI 范围动作
< 0.1正常,继续监控
0.1 ~ 0.25加密监控频率,做特征级排查,准备后备模型
> 0.25立即排查原因;如是客群变化→用新数据重新训练;如是数据问题→修复数据
> 0.5(持续)强制切换备用模型或规则引擎,同时启动重建项目

PSI 的监控体系:

  • 每日自动计算 PSI 并告警
  • 按周/月输出 PSI 趋势图
  • 设置三级告警阈值(0.1 / 0.2 / 0.3)
  • 定期(每季度)做 PSI 的同比分析

追问准备

  • PSI 和 CSI 有什么区别? → PSI 看模型评分分布的整体漂移,CSI(Characteristic Stability Index)看单个特征的分布漂移。通常先看 PSI,如果 PSI 高再用 CSI 定位是哪个特征引起的。

  • PSI 低但 KS 下降了,说明什么? → 说明客群分布没变,但好坏客户的行为模式变了(概念漂移 / concept drift)。比如新型欺诈手法出现——欺诈者的特征值和以前不同了。这种情况比 PSI 高更危险,因为预警更难。


Q14: Isolation Forest 的原理是什么?为什么异常点路径更短?

简短回答(30秒)

Isolation Forest 的核心思想是:异常点因为"少且不同",只需要很少的随机分割就能被隔离出来。具体做法是随机选特征、随机选分割值,递归分割数据。异常点因为远离主体分布,很快就被"单独分到一个叶子里"——路径更短。正常点则密集聚集,需要更多次分割才能隔离。异常分数 = 2^(-平均路径长度/归一化因子),接近 1 = 异常。

详细回答(2分钟)

算法流程:

  1. 构建孤立树(Isolation Tree):

    • 从数据中随机采样 ψ 个点(通常 256)
    • 随机选一个特征 q
    • 在该特征的 [min, max] 范围内随机选一个分割值 p
    • 将数据分为 q < p 和 q ≥ p 两个子集
    • 递归,直到只剩一个点或达到最大深度 log₂(ψ)
  2. 构建森林:

    • 重复以上过程 t 次(通常 100 棵树),每次用不同的随机采样和随机分割
  3. 计算异常分数:

    score(x, n) = 2^(-E(h(x)) / c(n))
    
    • h(x) = 数据点 x 在一棵树中的路径长度
    • E(h(x)) = 所有树的平均路径长度
    • c(n) = 2H(n-1) - 2(n-1)/n(归一化因子,H 是调和数)

为什么异常点路径更短?

想象一个二维平面,99 个点聚集在中心,1 个点在远处的角落:

正常点区域(密集):需要多次分割才能隔离出单个点
    ○ ○ ○
    ○ ○ ○  ← 需要 5-7 次分割
    ○ ○ ○

异常点(孤立):
                        ★  ← 第 1 次分割就隔离出来了

直觉:密集区域的点"长得很像",随机分割很难把它们分开。异常点"长得不一样",随机分割很容易把它和其他点分开。

优势:

优势说明
无需标签完全无监督,不需要已知的异常样本
线性复杂度O(t·ψ·log(ψ)),比距离方法快很多
无需假设分布不假设数据服从某种分布
天然处理高维随机选特征分割,对高维友好
可解释可以追溯是哪个特征导致的异常

局限:

  • 对局部密度差异不敏感("全局 vs 局部异常"问题)
  • 对轴平行分割敏感(斜向异常难以检测)
  • 采样大小 ψ 影响结果——太小可能漏掉异常,太大则正常点也显短

追问准备

  • Extended Isolation Forest 解决了什么问题? → 标准 IF 只能做轴平行分割,对角线方向的异常检测效果差。Extended IF 使用随机超平面而非轴平行切分,能检测更复杂的异常模式。

  • IF 和 LOF(Local Outlier Factor)有什么区别? → LOF 基于密度,能检测局部异常(在局部区域稀疏的点);IF 基于隔离,更适合检测全局异常。IF 快很多(O(n·log n) vs O(n²)),但在异质密度分布中 LOF 更准确。


Q15: 如何处理类别不平衡?SMOTE 和 Focal Loss 分别解决什么问题?

简短回答(30秒)

类别不平衡导致模型倾向于预测多数类。SMOTE 在数据层面解决:在少数类样本之间插值生成新样本,扩充训练集。Focal Loss 在损失函数层面解决:降低易分类样本的损失权重,让模型聚焦于难分类的样本。实际中两者可以组合使用,但更推荐 Focal Loss + 下采样,因为 SMOTE 可能在噪声区域生成伪样本。

详细回答(2分钟)

不平衡的影响:

  • 欺诈检测:欺诈率 0.1%,正常 99.9%
  • 信贷违约:坏账率 2-5%
  • 模型会学到"都预测为多数类就行"→ 高 Accuracy 但无用

解决方案全景:

层面方法原理
数据层过采样(SMOTE)增加少数类样本
数据层下采样减少多数类样本
算法层类别权重class_weight = 'balanced'
损失函数层Focal Loss动态调整样本权重
评估层用 AUC/F1 替代 Accuracy避免误导性指标

SMOTE 详解:

算法步骤:
1. 对少数类样本 x_i,找到 K 个最近邻(通常 K=5)
2. 随机选一个近邻 x_nn
3. 在 x_i 和 x_nn 之间随机插值:x_new = x_i + rand(0,1) × (x_nn - x_i)
4. 重复直到达到目标比例

优点:生成的样本是"合理的"新样本,比简单复制更好 缺点:

  • 在噪声区域(少数类和多数类混合区域)会生成伪样本,增加分类难度
  • 对高维数据效果不好(维度灾难)
  • 不适用于分类变量

改进版本:BorderlineSMOTE(只在边界附近生成)、ADASYN(在稀疏区域多生成)

Focal Loss 详解:

标准交叉熵:CE = -log(p_t)
Focal Loss:FL = -(1 - p_t)^γ × log(p_t)

p_t = 模型预测的正确类别概率
γ = 聚焦参数(通常 2.0)

当 p_t = 0.9(模型很有把握的样本):

  • CE = 0.105
  • FL = (1-0.9)^2 × 0.105 = 0.00105 → 权重降低 100 倍!

当 p_t = 0.1(模型很不确定的样本):

  • CE = 2.303
  • FL = (1-0.1)^2 × 2.303 = 1.866 → 基本不变

效果:模型不再花精力在"已经学会的简单样本"上,集中力量学习困难样本。

追问准备

  • 在 XGBoost/LightGBM 中怎么处理不平衡? → 1)scale_pos_weight = neg_count / pos_count。2)自定义 Focal Loss 作为目标函数。3)分层采样的 K-Fold 验证。4)调整分类阈值(不用默认 0.5)。

  • SMOTE + ENN 是什么? → SMOTE 生成新样本后,用 Edited Nearest Neighbors(ENN)清除被错误分类的样本。效果是只保留"干净"的合成样本,减少噪声。


Q16: 图分析在反欺诈中怎么用?什么是社区发现?

简短回答(30秒)

图分析将实体(人/账户/设备/IP)建模为节点,交易/关联关系建模为边,构建关系网络。用于发现传统特征工程无法发现的团伙欺诈。社区发现是找出图中联系紧密的子图——这些"社区"可能是正常的朋友圈,也可能是欺诈团伙。常用算法:Louvain(模块度最优化)、Label Propagation(标签传播)。

详细回答(2分钟)

图分析在反欺诈中的核心价值:

传统风控看"个人特征"(收入、年龄、征信分)。但团伙欺诈的特征是:个人看起来正常,但关系网络异常

例子:10 个申请人特征各不相同,但他们都用同一个 WiFi 注册、共享同一个设备指纹、资金来自同一个账户。图分析能发现这种隐藏的关联。

图的构建:

节点类型:
  - 人/账户:申请人、收款人
  - 设备:手机 IMEI、设备指纹
  - 网络:IP 地址、WiFi SSID
  - 位置:GPS 坐标

边类型:
  - 交易关系:A 转账给 B
  - 共享关系:A 和 B 用同一个设备
  - 社交关系:A 是 B 的紧急联系人

图特征工程:

特征计算方法含义
度(Degree)节点的边数关联实体数量
PageRank迭代传播影响力在网络中的重要性
图密度实际边数/最大可能边数子图的紧密程度
三角形计数包含该节点的三角形数局部聚集程度

社区发现(Community Detection):

社区 = 内部连接密集、外部连接稀疏的子图。

Louvain 算法(最常用):

  1. 初始:每个节点是一个社区
  2. 将节点移到能最大增加模块度(modularity)的邻居社区
  3. 将社区折叠为超节点,重复步骤 2
  4. 模块度 Q = Σ(社区内实际边数 - 期望边数) / 总边数

欺诈团伙的图特征:

信号描述
异常密集社区一小群节点之间高度互联
星型结构一个核心节点连接大量边缘节点(资金归集)
快速形成社区在短时间内突然形成
资金环路A→B→C→A 的资金循环

追问准备

  • GNN(图神经网络)在反欺诈中怎么用? → GNN 能自动学习图结构特征,不需要手工设计图特征。GraphSAGE 可以对新节点做归纳推理(不需要重新训练),适合实时风控。

  • 图分析的性能挑战? → 真实金融网络有数十亿条边。解决方案:用图数据库(Neo4j/TigerGraph)存储,用 Pregel/Spark GraphX 做分布式计算。社区发现可以分层做:先粗粒度再细粒度。


Q17: 什么是概念漂移?如何检测和应对?

简短回答(30秒)

概念漂移(Concept Drift)是指数据的底层分布随时间变化,导致训练好的模型逐渐失效。和数据漂移不同:数据漂移是输入特征分布变了(用 PSI 检测),概念漂移是特征和标签之间的关系变了。例如,疫情前月薪 5000 的人违约率 5%,疫情后同样月薪的人违约率可能飙到 15%。检测方法:监控模型 KS/AUC 的时间趋势、ADWIN 算法、DDM 算法。应对方法:定期重训练、在线学习、Champion-Challenger。

详细回答(2分钟)

概念漂移的四种类型:

1. 突变(Sudden)     ──── → ────     经济危机、政策突变
2. 渐变(Gradual)    ──── ╱ ────     消费习惯缓慢变化
3. 增量(Incremental) ─────⟋──────    技术进步导致行为变化
4. 重复(Recurring)  ~~~~~~~     季节性变化(双11、圣诞)

概念漂移 vs 数据漂移:

维度数据漂移(Data Drift)概念漂移(Concept Drift)
什么变了P(X) 变了P(Y|X) 变了
例子申请人平均年龄从 35 变成 28同龄同收入的人违约率增加
检测PSI/CSIKS/AUC 下降
是否必然影响模型不一定(如果 P(Y|X) 没变)一定会影响

检测方法:

  1. 业务指标监控

    • 跟踪 KS/AUC 的月度趋势
    • 跟踪 Vintage 曲线:同批次客户的坏账率是否偏离预期
    • 跟踪实际违约率 vs 模型预测概率的校准曲线
  2. ADWIN(Adaptive Windowing)算法

    • 维护一个自适应窗口,当窗口内的均值发生显著变化时自动缩短窗口
    • 适合在线检测突变型漂移
  3. DDM(Drift Detection Method)

    • 监控模型错误率的变化
    • 如果错误率超过 mean + 2σ → 预警(Warning Level)
    • 如果超过 mean + 3σ → 确认漂移(Drift Level)
  4. Page-Hinkley 检验

    • 累积和方法,检测均值的持续偏移
    • 对渐变型漂移更敏感

应对策略:

策略适用场景复杂度
定期重训练渐变漂移
触发式重训练突变漂移(KS 下降触发)
在线学习所有类型(模型不断增量更新)
模型集成重复漂移(不同模型处理不同时期)
滑动窗口训练持续漂移(只用最近 N 个月数据)

追问准备

  • 在线学习和定期重训练哪个更好? → 在线学习理论上更好(实时适应),但实际中有标签延迟问题——信贷违约标签需要 3-12 个月才能确定。所以信贷模型通常用定期重训练(每季度或半年),交易欺诈检测可以用近在线学习(每天/每周更新)。

Q18: VaR 的三种计算方法各有什么优缺点?为什么 Basel III 要求用 ES?

简短回答(30秒)

参数法快速但依赖正态假设;历史模拟法不需要假设但受限于历史数据;蒙特卡洛法最灵活但计算量大。VaR 的根本缺陷是不满足次可加性——两个组合的 VaR 之和可能小于合并组合的 VaR,这在逻辑上不合理(分散化应该降低风险)。Basel III 改用 ES(Expected Shortfall)因为 ES 满足次可加性,且关注的是"一旦超过 VaR 后平均会亏多少",对极端风险的度量更保守。

详细回答(2分钟)

三种方法对比:

维度参数法历史模拟蒙特卡洛
分布假设需要(通常正态)不需要可选任意分布
计算速度最快(解析公式)中等最慢
尾部风险低估(正态轻尾)取决于历史是否有极端事件取决于模型设定
非线性不能处理(期权等)可以处理可以处理
数据需求均值+协方差矩阵≥250天历史数据模型参数
实现复杂度

VaR 的致命缺陷——不满足次可加性:

数值反例(期权组合):

  • 组合 A 单独的 99% VaR = $100 万
  • 组合 B 单独的 99% VaR = $100 万
  • 合并组合 A+B 的 99% VaR = $250 万 > $200 万

这意味着按 VaR 管理,交易台有动力把头寸拆开报告(分别报告 VaR 更低),导致监管失效。

ES 为什么更好:

ES = E[Loss | Loss > VaR]
   = "一旦发生超过 VaR 的损失,平均会亏多少"

ES 的优势:

  1. 次可加性:ES(A+B) ≤ ES(A) + ES(B)——始终成立,不会出现"拆分降低风险"的悖论
  2. 尾部信息:VaR 只告诉你"99% 的情况下损失不超过 X",但那 1% 里可能亏 2X 也可能亏 100X。ES 告诉你那 1% 的平均损失是多少
  3. 一致性风险度量:满足平移不变性、正齐次性、单调性、次可加性

Basel III/FRTB 要求:

  • 使用 97.5% 置信水平的 ES 替代 99% VaR
  • ES(97.5%) ≈ VaR(99%) × 1.4(对正态分布)
  • 要求使用实际历史数据的 ES(不能只用参数法)

追问准备

  • 97.5% ES 和 99% VaR 哪个更保守? → 对正态分布:ES(97.5%) ≈ 2.338σ,VaR(99%) = 2.326σ,几乎一样。但对厚尾分布(实际金融数据),ES(97.5%) 比 VaR(99%) 保守很多,因为 ES 考虑了尾部的具体分布。

  • Stressed VaR/ES 是什么? → Basel 要求在压力情景下(如 2008 金融危机)额外计算一次 VaR/ES,取两者的较大值。目的是避免在长期牛市中低估风险。


Q19: SHAP 和 LIME 有什么区别?在风控中为什么需要可解释性?

简短回答(30秒)

SHAP 和 LIME 都是解释机器学习黑箱模型的方法。LIME 在局部用线性模型近似黑箱(快速但不保证全局一致性),SHAP 基于博弈论的 Shapley 值分配每个特征的贡献(理论完备但计算量大)。风控需要可解释性的原因:1)监管要求(ECOA/GDPR 要求解释拒贷原因),2)风险排查(发现模型是否依赖了不合理的特征),3)业务信任(审批官和客户需要理解模型决策)。

详细回答(2分钟)

LIME(Local Interpretable Model-agnostic Explanations):

原理:
1. 在待解释样本 x 附近生成 N 个扰动样本
2. 用黑箱模型对扰动样本打分
3. 以 x 为中心加权拟合一个简单模型(线性回归 / 决策树)
4. 用简单模型的系数作为特征重要性

优点:速度快、模型无关、直观易懂 缺点:

  • 结果不稳定(随机扰动导致每次结果略有不同)
  • 局部近似可能失真(非线性区域用线性模型近似不准)
  • 不满足一些理论性质(如一致性)

SHAP(SHapley Additive exPlanations):

原理(来自博弈论的 Shapley 值):
- 将模型预测看成一个"合作博弈"
- 每个特征是一个"玩家"
- Shapley 值 = 该特征在所有可能的特征子集中的平均边际贡献

φ_i = Σ [|S|!(n-|S|-1)!/n!] × [f(S∪{i}) - f(S)]

优点:

  • 理论完备(唯一满足效率性、对称性、虚拟性、可加性的解)
  • 全局一致(同一模型同一样本结果唯一)
  • 支持全局汇总(平均 |SHAP| 得到全局特征重要性)

缺点:

  • 精确计算是 NP-hard(2^n 个子集)
  • TreeSHAP 快但只适用于树模型
  • KernelSHAP 通用但较慢

风控中可解释性的四个层面:

层面需求解决方案
监管合规必须向被拒客户解释原因(ECOA/GDPR)Top-K SHAP 特征作为拒绝理由
模型审计检查模型是否使用了种族/性别代理变量分析 SHAP 值与敏感属性的相关性
风险排查发现模型是否依赖了不稳定特征SHAP 值分布的稳定性监控
业务决策信审官理解模型判断逻辑可视化 SHAP 瀑布图

实际案例:

一个模型拒绝了一个客户。SHAP 解释:

  • 负债比率 0.85 → 扣分 -35(正常范围 < 0.5)
  • 近 6 个月新增借款笔数 8 → 扣分 -28(正常 < 3)
  • 月收入 8000 → 加分 +15
  • 总分不足准入线 → 拒绝

客户看到原因后可以改善(降低负债率),模型的可解释性反而帮助了金融普惠。

追问准备

  • TreeSHAP 的复杂度是多少? → O(TLD²),T=树的数量,L=叶子数,D=深度。对于典型的 XGBoost 模型(100棵树、深度6),计算一个样本的 SHAP 值只需几毫秒。

  • 可解释性和模型性能之间有 trade-off 吗? → 传统观点是有(逻辑回归可解释但弱,深度学习强但不可解释)。但 SHAP/LIME 让黑箱模型也能解释,缩小了这个 gap。不过在高度监管的场景(如美国信贷),有些监管机构仍然只接受逻辑回归 + 评分卡。


Q20: Champion-Challenger 和影子模式有什么区别?模型上线流程是什么?

简短回答(30秒)

影子模式(Shadow Mode)是让新模型在线上同时打分但不实际决策(只记录结果),用于验证新模型在真实流量上的表现。Champion-Challenger 是让一小部分流量(如 5-10%)使用新模型做真实决策,与主模型的效果做对照实验。影子模式是"零风险验证",Champion-Challenger 是"小规模实验"。完整上线流程:离线评估 → 影子模式 → Champion-Challenger → 全量切换。

详细回答(2分钟)

模型上线全流程(5 个阶段):

阶段 1:离线评估(1-2 周)

检查项标准
样本外 AUC> 0.75 且与训练集差距 < 0.03
KS> 0.3
PSI(跨时间)< 0.1
分群表现各客群 KS 均 > 0.2
特征稳定性所有特征 CSI < 0.25
公平性不同性别/种族的通过率差异 < 5%

阶段 2:影子模式(2-4 周)

真实流量 → [当前模型决策] → 实际结果
           ↘ [新模型打分] → 记录(不决策)

对比:
- 新旧模型评分分布差异
- 新模型的拒绝率 vs 当前模型
- 新模型在当前模型通过的客户中的排序能力

影子模式的关键价值:

  • 零风险:不影响实际业务
  • 发现线上和离线的差异(特征工程是否一致、数据是否有 gap)
  • 验证系统性能(延迟、吞吐量)

阶段 3:Champion-Challenger(4-8 周)

真实流量 ─── 90% ──→ Champion(当前模型) → 决策
           └── 10% ──→ Challenger(新模型) → 决策

对比维度:
- 审批通过率
- 首逾率(First Payment Default)
- 30/60/90 天逾期率
- 利润率

关键设计:

  • 流量分配必须随机(不能用特定客群)
  • 需要足够样本量(统计功效分析:至少需要 N 个坏样本才能检测到 X% 的差异)
  • 需要等足够长时间(信贷需要等 3-6 个月看 Vintage 曲线)

阶段 4:灰度放量(2-4 周)

  • 从 10% → 30% → 50% → 100% 逐步放量
  • 每步监控关键指标,异常立即回滚

阶段 5:全量上线 + 持续监控

监控指标频率告警阈值
PSI每日> 0.2
KS每月下降 > 5%
审批通过率每日偏离 > 10%
首逾率每周上升 > 20%

影子模式 vs Champion-Challenger 对比:

维度影子模式Champion-Challenger
风险零(不决策)低(小流量)
能验证的内容技术正确性、分布一致性业务效果(通过率、坏账率)
验证速度快(2-4 周)慢(需等标签成熟,3-6 个月)
是否产生真实业务影响
适用场景所有模型上线前效果验证阶段

追问准备

  • A/B 测试在风控中为什么特别难? → 1)标签延迟:信贷违约需要 3-12 个月才能观察到。2)样本偏差:模型本身改变了样本分布(被拒的客户没有标签)。3)伦理问题:如果新模型确实更好,让 90% 的客户用"更差的"旧模型是否道德?

  • 什么情况需要紧急回滚? → 1)首逾率(FPD30)突然上升 > 50%。2)审批通过率异常(上升/下降 > 20%)。3)模型打分出现大量极端值。4)线上特征缺失率突增。回滚后先切到规则引擎兜底,再排查问题。