2. A/B测试基础:统计学原理与假设检验
在金融压力测试场景中,A/B测试是评估策略变更(如风控模型阈值调整、新审批规则上线)是否产生统计显著效果的核心工具。本节将系统梳理A/B测试的统计学基础,确保后续效果评估具备严谨的数学支撑。
2.1 A/B测试的统计学原理
A/B测试本质上是随机对照试验在金融领域的应用。其核心逻辑是:将实验对象(如贷款申请、交易流水)随机分为两组,分别施加不同处理(A组为对照组,B组为实验组),通过比较两组在关键指标(如违约率、通过率、收益率)上的差异,推断处理效果是否真实存在。
统计学原理建立在大数定律与中心极限定理之上:
- 大数定律:随着样本量增加,样本均值趋近于总体均值,保证实验结果的稳定性。
- 中心极限定理:无论原始数据分布如何,样本均值的抽样分布近似正态分布,为后续假设检验提供了分布基础。
金融场景提示: 在压力测试中,样本量需满足“最小可检测效应”要求。例如,若预期违约率从5%降至4.5%,需计算所需样本量,避免因样本不足导致“假阴性”。
2.2 假设检验:原假设与备择假设
假设检验是A/B效果评估的决策框架。在金融压力测试中,我们通常关心策略变更是否带来了显著改善。假设检验通过构造两个互斥的假设,并基于样本数据做出判断。
| 假设类型 | 符号 | 定义 | 金融场景示例 |
|---|---|---|---|
| 原假设(零假设) | H₀ | 处理效果不存在,差异由随机波动引起 | 新风控模型与旧模型的违约率无差异(μ_B - μ_A = 0) |
| 备择假设(对立假设) | H₁ 或 Hₐ | 处理效果真实存在,差异具有统计意义 | 新模型违约率显著低于旧模型(μ_B - μ_A < 0) |
关键原则: 原假设通常代表“无效果”或“现状”,是受保护的一方。我们通过收集证据来拒绝原假设,从而支持备择假设。在金融监管中,拒绝原假设需要足够强的证据,以避免因误判导致策略错误上线。
2.3 显著性水平与p值
显著性水平(α)和p值是假设检验中量化证据强度的核心工具。
- 显著性水平(α):预先设定的阈值,表示“原假设为真时错误拒绝它”的最大可接受概率。金融压力测试中常用 α = 0.05 或 α = 0.01。
- p值:在原假设为真的前提下,观察到当前样本结果(或更极端结果)的概率。p值越小,说明样本数据与原假设的兼容性越差。
决策规则:
- 若 p ≤ α → 拒绝 H₀,认为效果统计显著。
- 若 p > α → 无法拒绝 H₀,认为差异不显著。
2.4 两类错误与金融风控权衡
在假设检验中,错误不可避免。理解两类错误及其在金融场景中的代价至关重要。
| 错误类型 | 定义 | 统计符号 | 金融风控代价 |
|---|---|---|---|
| 第一类错误(假阳性) | 原假设为真时错误拒绝(误判有效) | α(显著性水平) | 上线无效策略,增加坏账风险或误拒优质客户 |
| 第二类错误(假阴性) | 原假设为假时错误接受(漏判有效) | β | 错过优化机会,维持低效策略,损失潜在收益 |
风控实践警示: 在压力测试中,降低α(如从0.05降至0.01)会减少假阳性,但会增加β(降低统计功效)。需根据业务风险偏好平衡:对于高风险策略(如大幅放宽授信),建议采用更严格的α;对于低风险优化(如UI调整),可适当放宽。
2.5 统计功效与样本量规划
统计功效(1 - β)表示当备择假设为真时,正确拒绝原假设的概率。金融A/B测试中,通常要求功效 ≥ 0.8。
影响功效的关键因素:
- 效应量(Effect Size):预期差异大小。效应量越大,功效越高。
- 样本量(n):样本越多,功效越高。
- 显著性水平(α):α越宽松,功效越高(但假阳性风险增加)。
- 数据变异性(σ):数据波动越小,功效越高。
样本量估算公式(两独立样本均值检验):
n = (Zα/2 + Zβ)² × 2σ² / Δ²
其中,Δ为最小可检测差异,σ为总体标准差,Z为对应分位数。
n = (Zα/2 + Zβ)² × 2σ² / Δ²
其中,Δ为最小可检测差异,σ为总体标准差,Z为对应分位数。
在金融压力测试中,建议在实验设计阶段即完成样本量计算,避免因样本不足导致结果不可靠。常见工具包括Python的statsmodels.stats.power模块或R语言的pwr包。
# Python 样本量计算示例(两样本比例检验)
from statsmodels.stats.proportion import proportion_effectsize
from statsmodels.stats.power import zt_ind_solve_power
# 参数:预期对照组违约率5%,实验组降至4%,α=0.05,功效=0.8
effect_size = proportion_effectsize(0.05, 0.04)
n = zt_ind_solve_power(effect_size=effect_size, alpha=0.05, power=0.8, alternative='smaller')
print(f"所需每组样本量: {int(n)}")
# 输出:所需每组样本量: 约 10700