HFT & 风控科学 — 面试 Q&A(20题深度版)
HFT & 风控科学 — 面试 Q&A(20题深度版)
适用岗位:量化风控工程师、金融风险架构师、交易系统PM、合规科技 每题包含30秒简答 + 2分钟详答 + 追问准备
📈 HFT 部分(8题)
Q1: 什么是做市策略?做市商如何盈利?库存风险怎么管理?
简短回答(30秒)
做市策略是同时在买卖两侧挂单,通过买卖价差(spread)赚取利润。做市商面临的核心风险是库存风险——持有的头寸可能因价格反向移动而亏损。管理方式包括:动态调整报价偏移(skew)、设置库存上限、以及用对冲工具管理方向性风险。
详细回答(2分钟)
做市的本质:
做市商向市场提供流动性。具体来说,做市商在订单簿上同时维护买单(bid)和卖单(ask),赚取两者之间的价差。例如,买单挂在 100.00,卖单挂在 100.05,每完成一个回合(买到又卖出)就赚 0.05。
盈利来源分解:
- Bid-Ask Spread 收入:这是主要盈利来源。日均做市量 1 亿美元、平均 spread 1bp,理论毛利就是 1 万美元/天。
- 返佣(Rebate):交易所对挂单方(maker)提供返佣,通常 0.1-0.3bp。高频做市商的返佣可能占利润的 30-50%。
- 信息优势:通过订单流分析预判短期价格方向,调整报价获取额外 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 模型描述了一个含有三类参与者的市场:
- 知情交易者(Informed Trader):知道资产真实价值,想利用信息获利
- 噪声交易者(Noise Trader):随机交易,提供流动性
- 做市商(Market Maker):根据总订单流设定价格
核心结论:
Δp = λ × (买入量 - 卖出量)
λ(Kyle Lambda)的含义:
- λ = 价格冲击系数,单位是「美元/手」
- λ 大 → 市场浅(不流动),一点净买入就推高价格
- λ 小 → 市场深(流动性好),大单也能温和成交
λ 的决定因素:
λ = σ_v / (2σ_u)
σ_v= 资产基本面的不确定性(越大→λ越大→市场越怕信息交易)σ_u= 噪声交易的标准差(越大→λ越小→信息交易者更容易藏身)
对系统设计的直接启示:
- 算法拆单:大单如果一次性执行,价格冲击 = λ × Q,可能非常大。应该用 TWAP/VWAP 把 Q 拆成小块分时执行。
- 执行时段选择:λ 在开盘和收盘时通常较小(流动性好),中午较大(流动性差)。系统应该动态估计 λ 并选择低 λ 时段执行。
- 交易成本分析(TCA):λ 是预估交易成本的核心参数。实际冲击 vs 预估冲击的差异用于评估执行质量。
- 流动性监控:实时估计 λ 可以作为流动性预警指标。λ 突然飙升可能预示市场事件。
追问准备
-
如何实时估计 Lambda? → 回归法:Δp_t = α + λ·Flow_t + ε_t,用滑动窗口(如 5 分钟)滚动估计。也可以用订单簿深度直接近似:λ ≈ 1 / Σ(bid_depth + ask_depth)。
-
Kyle Lambda 和 Amihud 非流动性指标有什么关系? → Amihud (2002) 的指标 = |return| / volume,是 λ 的日频近似。两者都在衡量"单位成交量引起的价格变动"。
Q3: 配对交易的核心原理?协整和相关性有什么区别?
简短回答(30秒)
配对交易是找两个价格走势高度关联的资产,当价差偏离均值时做空贵的、做多便宜的,等价差回归时获利。核心是协整而非相关性——相关性衡量的是两个序列波动方向是否一致,协整衡量的是两个序列的线性组合是否平稳(即价差是否会回归均值)。两个资产可以不相关但协整,也可以高度相关但不协整。
详细回答(2分钟)
配对交易流程:
- 选对:找到协整的资产对(如可口可乐/百事、BTC/ETH)
- 计算价差:spread_t = P_A - β × P_B(β 是协整回归系数)
- 标准化:z_t = (spread_t - mean) / std
- 交易信号:z > +2 → 做空 A + 做多 B;z < -2 → 做多 A + 做空 B;z 回归 0 → 平仓
协整 vs 相关性——为什么这个区别至关重要:
| 维度 | 相关性(Correlation) | 协整(Cointegration) |
|---|---|---|
| 衡量什么 | 收益率方向是否一致 | 价格差是否有均值回归 |
| 数学定义 | ρ = Cov(ΔX,ΔY)/σ_x·σ_y | Y - βX ~ I(0)(平稳) |
| 时间维度 | 瞬时关系 | 长期均衡关系 |
| 可交易性 | 低(不保证价差回归) | 高(价差有回归倾向) |
经典反例:
- 高相关但不协整:两只同行业股票可能相关性 0.95,但如果一只是成长股一只是价值股,价差可能持续扩大(随机游走),不会回归——做配对交易会爆仓。
- 不相关但协整:一个资产上涨 10% 后又回落,另一个先下跌 5% 后回升——收益率相关性接近 0,但价差始终在窄幅波动。
协整检验方法:
- Engle-Granger 两步法:先回归 Y = α + βX + ε,再检验残差 ε 是否平稳(ADF 检验)
- Johansen 检验:适用于多个变量的情况
- 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(基金行业最常用的执行基准)
- 优点:在流动性好的时段多执行,降低冲击成本
- 缺点:模式可预测(量大→别人知道你在这时段执行→可被前置)
对比表:
| 维度 | TWAP | VWAP |
|---|---|---|
| 信息利用 | 无 | 历史成交量分布 |
| 冲击成本 | 较高(低流动性时段浪费) | 较低 |
| 可预测性 | 低(均匀分布) | 高(跟随量曲线) |
| 实现复杂度 | 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) | 使用了当时不可得的数据(如用未来的价格做特征) | 结果虚假 |
| 幸存者偏差 | 只用现存资产,忽略退市/归零的 | 收益被高估 |
| 过拟合 | 参数过多、在历史数据上"记忆"而非"学习" | 实盘亏损 |
| 交易成本忽略 | 未计算滑点、手续费、冲击成本 | 利润蒸发 |
| 数据窥探 | 反复在同一数据集上调参,选了表现最好的 | 统计偏差 |
过拟合检测和防范:
-
样本外测试(OOS):
- 训练集 70% / 测试集 30%,测试集绝对不能用于参数调优
- 如果训练集 Sharpe=3.0 但测试集 Sharpe=0.5,几乎肯定过拟合
-
Walk-Forward 验证:
- 滚动窗口:用 [1-100天] 训练 → [101-120天] 测试 → [21-120天] 训练 → [121-140天] 测试 → ...
- 最真实的回测方式,模拟实盘中不断重新训练
-
Deflated Sharpe Ratio(DSR):
- 如果你尝试了 N 个策略选了表现最好的,真实 Sharpe 需要打折
- DSR 公式修正了多重比较偏差:你试的策略越多,打折越狠
- 经验法则:尝试 100 个策略选 1 个,回测 Sharpe 至少要 3.0 以上才可信
-
参数稳定性检验:
- 好的策略对参数应该不敏感。如果 MA 周期从 20 改到 22 就大幅变差,说明过拟合
- 画参数-收益的热力图,应该看到平滑的"高原"而非尖锐的"山峰"
-
样本外 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分钟)
市场冲击的分类:
- 临时冲击(Temporary Impact):执行瞬间的价格偏移,执行完成后回弹。原因:订单簿上的流动性被暂时消耗。
- 永久冲击(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 的局限性:
- 对称性:标准 GARCH 假设正冲击和负冲击的影响相同,但实际上下跌引起的波动率上升更大(杠杆效应 / asymmetric volatility)。→ 解决方案:GJR-GARCH 或 EGARCH
- 正态假设:收益率的尾部比正态分布更厚。→ 解决方案:t-GARCH(用 t 分布替代正态)
- 单变量:只能建模一个资产。→ 解决方案: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 编码的核心优势:
-
可解释性:
- WOE > 0:该分箱的好客户占比 > 坏客户占比 → 低风险
- WOE < 0:该分箱的坏客户占比更高 → 高风险
- 银行监管要求:每个特征的每个分箱对最终评分的贡献必须可解释
-
单调性保证:
- 分箱时通常要求 WOE 单调(随特征值增大,WOE 递增或递减)
- 如果不单调,说明特征和目标的关系不是单调的——需要合并箱或放弃特征
- 这在 One-Hot 中无法自然实现
-
降维:
- 假如一个特征有 100 个类别,One-Hot 会产生 100 个维度
- WOE 编码只产生 1 个维度(连续值),大幅降低维度灾难
-
自然处理缺失值:
- 缺失值分到独立的一个箱,计算自己的 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 优秀
两者的关系和区别:
| 维度 | AUC | KS |
|---|---|---|
| 衡量什么 | 全局排序能力 | 最优分割点的区分度 |
| 对阈值的依赖 | 不依赖(综合所有阈值) | 依赖(找最优阈值) |
| 应用场景 | 模型对比、模型迭代 | 准入阈值确定、业务分层 |
| 不平衡敏感 | 不敏感 | 不敏感 |
| 值域 | 0.5 ~ 1.0 | 0 ~ 1.0 |
| 近似关系 | 通常 AUC ≈ 0.5 + KS/2 | — |
什么时候看哪个?
- 模型选择阶段:主要看 AUC。两个模型 AUC 差 0.01 以上通常就有显著差异。
- 业务落地阶段:看 KS + 分段通过率/坏账率。KS 点对应的阈值是"初始建议值",但最终阈值要看业务指标。
- 模型监控阶段:两个都看。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 反而最低(因为它主动拒绝了一些好客户来抓坏客户)。
应该看的指标体系:
第一层:模型质量指标
| 指标 | 公式 | 用途 |
|---|---|---|
| AUC | ROC 曲线下面积 | 综合排序能力 |
| KS | max|CDF_good - CDF_bad| | 最优分割点的区分度 |
| Gini | 2×AUC - 1 | AUC 的等价变换 |
第二层:阈值相关指标
| 指标 | 公式 | 含义 |
|---|---|---|
| Precision | TP/(TP+FP) | 拒绝的人里有多少真坏客户 |
| Recall | TP/(TP+FN) | 坏客户中被成功拒绝的比例 |
| F1 | 2·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 自动触发人工审查 | 发现直接泄露 |
| 样本外验证 | 训练/验证/测试集严格按时间分割 | 发现时间泄露 |
| 特征元数据管理 | 每个特征记录:数据源、采集时间、更新频率 | 系统化防范 |
| 预测时模拟 | 在线上用完全相同的逻辑重算特征,对比训练时的特征值 | 发现数据流差异 |
检测方法:
- Leave-one-feature-out:逐一去掉高 IV 特征,如果 AUC 几乎不变,说明信息是冗余的(正常);如果 AUC 暴跌,说明其他特征无法替代(可疑)
- 时间一致性检查:用 T 的特征预测 T+1 的标签,然后用 T-1 的特征预测 T+1 的标签,两者 AUC 差异应该很小。如果差异大,说明 T 的特征里混入了 T+1 的信息
- 生产环境回放:把模型部署后头一个月的预测结果与回测结果对比。如果回测 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 出错、缺失值增多 | 特定特征出现大量空值 |
| 竞品行为 | 竞品降价导致优质客户流失 | 信用分高端客群减少 |
排查流程(从快到慢):
- 快速排查(5分钟):检查各分箱占比变化,定位哪些箱偏移最大
- 特征级 PSI:对每个输入特征分别算 PSI,找到漂移最严重的特征
- 数据质量检查:特征缺失率、异常值比例是否突增
- 业务核实:问营销团队是否换了渠道、风控是否调了策略
- 模型效果验证:看同期 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分钟)
算法流程:
-
构建孤立树(Isolation Tree):
- 从数据中随机采样 ψ 个点(通常 256)
- 随机选一个特征 q
- 在该特征的 [min, max] 范围内随机选一个分割值 p
- 将数据分为 q < p 和 q ≥ p 两个子集
- 递归,直到只剩一个点或达到最大深度 log₂(ψ)
-
构建森林:
- 重复以上过程 t 次(通常 100 棵树),每次用不同的随机采样和随机分割
-
计算异常分数:
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 算法(最常用):
- 初始:每个节点是一个社区
- 将节点移到能最大增加模块度(modularity)的邻居社区
- 将社区折叠为超节点,重复步骤 2
- 模块度 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/CSI | KS/AUC 下降 |
| 是否必然影响模型 | 不一定(如果 P(Y|X) 没变) | 一定会影响 |
检测方法:
-
业务指标监控:
- 跟踪 KS/AUC 的月度趋势
- 跟踪 Vintage 曲线:同批次客户的坏账率是否偏离预期
- 跟踪实际违约率 vs 模型预测概率的校准曲线
-
ADWIN(Adaptive Windowing)算法:
- 维护一个自适应窗口,当窗口内的均值发生显著变化时自动缩短窗口
- 适合在线检测突变型漂移
-
DDM(Drift Detection Method):
- 监控模型错误率的变化
- 如果错误率超过 mean + 2σ → 预警(Warning Level)
- 如果超过 mean + 3σ → 确认漂移(Drift Level)
-
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 的优势:
- 次可加性:ES(A+B) ≤ ES(A) + ES(B)——始终成立,不会出现"拆分降低风险"的悖论
- 尾部信息:VaR 只告诉你"99% 的情况下损失不超过 X",但那 1% 里可能亏 2X 也可能亏 100X。ES 告诉你那 1% 的平均损失是多少
- 一致性风险度量:满足平移不变性、正齐次性、单调性、次可加性
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)线上特征缺失率突增。回滚后先切到规则引擎兜底,再排查问题。