3. 量化回测基础:概念、框架与实盘差异
量化回测是风控策略上线前必须通过的“压力测试”。它利用历史数据模拟策略运行效果,计算坏账率、通过率、PSI 等核心指标,从而在投入真金白银之前发现策略缺陷。本章将建立回测的基本认知框架,为后续哨兵监控与 PSI 漂移告警打下基础。
3.1 量化回测核心概念
量化回测(Quantitative Backtesting)是指使用历史样本数据,按照预设的规则和时序逻辑,模拟风控决策引擎对每一笔申请或账户的处理过程,并统计最终的风险表现。其核心要素包括:
- 时间序列对齐:必须按时间顺序逐笔或逐日回放,避免“未来信息”泄露。
- 决策点模拟:在每一个决策时间点,只使用该时间点之前已知的信息。
- 表现期窗口:设定固定的观察期(如 6 个月、12 个月),用于计算坏账标签。
- 指标统计:汇总通过率、坏账率、PSI、KS、AUC 等量化指标。
关键原则:回测不是“跑一次数据”,而是严格模拟生产环境下的决策时序。任何对未来的“偷看”都会导致回测结果虚高,实盘时必然崩盘。
3.2 回测框架与流程
一个标准的量化回测框架通常包含以下五个阶段。下面的 SVG 图展示了从数据输入到指标输出的完整链路。
各阶段的核心任务如下表所示:
| 阶段 | 输入 | 关键操作 | 输出 |
|---|---|---|---|
| 数据准备 | 原始申请/行为数据 | 缺失值处理、时间戳对齐、样本分区 | 清洗后的回测数据集 |
| 策略加载 | 策略配置文件 | 解析规则、加载模型权重、设定阈值 | 可执行策略对象 |
| 时序模拟 | 策略对象 + 数据集 | 逐笔决策、记录拒绝原因、拒绝推断 | 决策结果表 |
| 表现期计算 | 决策结果表 | 匹配表现期标签、计算坏账/PSI/KS | 中间指标矩阵 |
| 指标输出 | 指标矩阵 | 汇总统计、生成报告、触发告警 | 回测报告 / 告警信号 |
3.3 回测与实盘的核心区别
许多策略在回测中表现优异,上线后却迅速恶化。理解回测与实盘的差异,是避免“回测陷阱”的第一步。以下从五个维度进行对比:
| 对比维度 | 回测环境 | 实盘环境 | 风险点 |
|---|---|---|---|
| 数据时效 | 历史固定样本,无新增 | 实时流入,分布动态变化 | 回测无法捕捉概念漂移 |
| 拒绝推断 | 可对拒绝样本做标签推断 | 拒绝样本无真实表现 | 回测可能高估通过率 |
| 执行延迟 | 零延迟,瞬间完成 | 存在网络、计算、排队延迟 | 实盘决策时间窗口更紧 |
| 样本偏差 | 可控制样本选择 | 受渠道、季节、政策影响 | 回测样本代表性不足 |
| 成本约束 | 无资金成本、无操作成本 | 有资金占用、催收、合规成本 | 回测净收益可能虚高 |
⚠️ 常见误区:回测坏账率低 ≠ 实盘坏账率低。回测只能证明策略在“过去”有效,而实盘面对的是“未来”。PSI 漂移哨兵的作用,就是在实盘与回测的分布差异超过阈值时及时告警。
3.4 回测在哨兵体系中的定位
在《量化回测坏账率哨兵 PSI 漂移告警教程》中,回测承担两个关键角色:
- 基准生成器:回测输出策略的预期坏账率、预期 PSI 基线,作为哨兵监控的参考锚点。
- 阈值校准器:通过回测中的 PSI 波动范围,设定实盘告警的阈值(如 PSI > 0.1 触发黄色告警,PSI > 0.25 触发红色告警)。
下面的 SVG 图展示了回测与实盘哨兵之间的数据流转关系:
3.5 回测代码示例(Python 伪代码)
以下是一个极简的回测框架核心逻辑,展示时序模拟与指标计算的基本结构:
import pandas as pd
import numpy as np
def run_backtest(data: pd.DataFrame, strategy, performance_months=6):
"""
极简回测引擎
:param data: 包含 'apply_date', 'features', 'default_flag' 的 DataFrame
:param strategy: 策略对象,包含 predict 方法
:param performance_months: 表现期月数
"""
# 1. 按时间排序
data = data.sort_values('apply_date').reset_index(drop=True)
# 2. 时序模拟
decisions = []
for i, row in data.iterrows():
# 仅使用当前时间点之前的信息
score = strategy.predict(row['features'])
decision = 'pass' if score >= strategy.threshold else 'reject'
decisions.append(decision)
data['decision'] = decisions
# 3. 表现期过滤(仅保留通过样本)
passed = data[data['decision'] == 'pass'].copy()
# 4. 计算坏账率
bad_rate = passed['default_flag'].mean()
# 5. 计算 PSI(与回测基准分布对比)
# 此处省略具体 PSI 计算,后续章节详述
psi = 0.0
return {
'bad_rate': bad_rate,
'pass_rate': len(passed) / len(data),
'psi': psi,
'sample_size': len(passed)
}
💡 实践提示:上述代码仅为教学演示。生产级回测框架需要处理拒绝推断、样本权重、时间窗口滑动、多策略并行等复杂逻辑。建议在正式项目中使用成熟的回测库(如 backtrader、zipline 或自研框架)并配合单元测试。
3.6 本章小结
- 量化回测是风控策略上线前的必要验证环节,核心在于严格的时间序列模拟。
- 回测框架包含数据准备、策略加载、时序模拟、表现期计算、指标输出五个阶段。
- 回测与实盘在数据时效、拒绝推断、执行延迟、样本偏差、成本约束五个维度存在本质差异。
- 在哨兵体系中,回测负责生成基准指标和校准告警阈值,是 PSI 漂移监控的基石。