3. 量化回测基础:概念、框架与实盘差异

量化回测是风控策略上线前必须通过的“压力测试”。它利用历史数据模拟策略运行效果,计算坏账率、通过率、PSI 等核心指标,从而在投入真金白银之前发现策略缺陷。本章将建立回测的基本认知框架,为后续哨兵监控与 PSI 漂移告警打下基础。

3.1 量化回测核心概念

量化回测(Quantitative Backtesting)是指使用历史样本数据,按照预设的规则和时序逻辑,模拟风控决策引擎对每一笔申请或账户的处理过程,并统计最终的风险表现。其核心要素包括:

  • 时间序列对齐:必须按时间顺序逐笔或逐日回放,避免“未来信息”泄露。
  • 决策点模拟:在每一个决策时间点,只使用该时间点之前已知的信息。
  • 表现期窗口:设定固定的观察期(如 6 个月、12 个月),用于计算坏账标签。
  • 指标统计:汇总通过率、坏账率、PSI、KS、AUC 等量化指标。
关键原则:回测不是“跑一次数据”,而是严格模拟生产环境下的决策时序。任何对未来的“偷看”都会导致回测结果虚高,实盘时必然崩盘。

3.2 回测框架与流程

一个标准的量化回测框架通常包含以下五个阶段。下面的 SVG 图展示了从数据输入到指标输出的完整链路。

量化回测框架流程图 量化回测标准框架流程 数据准备 样本清洗·时间对齐 策略加载 规则·模型·阈值 时序模拟 逐笔决策·拒绝推断 表现期计算 坏账标签·PSI·KS 指标输出 报告·告警·决策 策略迭代反馈 说明:虚线表示策略迭代反馈回路,回测结果可用于优化规则与模型参数

各阶段的核心任务如下表所示:

阶段 输入 关键操作 输出
数据准备 原始申请/行为数据 缺失值处理、时间戳对齐、样本分区 清洗后的回测数据集
策略加载 策略配置文件 解析规则、加载模型权重、设定阈值 可执行策略对象
时序模拟 策略对象 + 数据集 逐笔决策、记录拒绝原因、拒绝推断 决策结果表
表现期计算 决策结果表 匹配表现期标签、计算坏账/PSI/KS 中间指标矩阵
指标输出 指标矩阵 汇总统计、生成报告、触发告警 回测报告 / 告警信号

3.3 回测与实盘的核心区别

许多策略在回测中表现优异,上线后却迅速恶化。理解回测与实盘的差异,是避免“回测陷阱”的第一步。以下从五个维度进行对比:

对比维度 回测环境 实盘环境 风险点
数据时效 历史固定样本,无新增 实时流入,分布动态变化 回测无法捕捉概念漂移
拒绝推断 可对拒绝样本做标签推断 拒绝样本无真实表现 回测可能高估通过率
执行延迟 零延迟,瞬间完成 存在网络、计算、排队延迟 实盘决策时间窗口更紧
样本偏差 可控制样本选择 受渠道、季节、政策影响 回测样本代表性不足
成本约束 无资金成本、无操作成本 有资金占用、催收、合规成本 回测净收益可能虚高
⚠️ 常见误区:回测坏账率低 ≠ 实盘坏账率低。回测只能证明策略在“过去”有效,而实盘面对的是“未来”。PSI 漂移哨兵的作用,就是在实盘与回测的分布差异超过阈值时及时告警。

3.4 回测在哨兵体系中的定位

在《量化回测坏账率哨兵 PSI 漂移告警教程》中,回测承担两个关键角色:

  • 基准生成器:回测输出策略的预期坏账率、预期 PSI 基线,作为哨兵监控的参考锚点。
  • 阈值校准器:通过回测中的 PSI 波动范围,设定实盘告警的阈值(如 PSI > 0.1 触发黄色告警,PSI > 0.25 触发红色告警)。

下面的 SVG 图展示了回测与实盘哨兵之间的数据流转关系:

回测与实盘哨兵关系图 回测与实盘哨兵的数据流转 量化回测引擎 历史数据 · 策略模拟 基准指标库 预期坏账率 · PSI 基线 实盘哨兵监控 实时 PSI · 漂移告警 告警反馈 → 策略迭代 → 重新回测 说明:回测提供基准,实盘哨兵检测漂移,告警触发后驱动策略迭代与重新回测

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 漂移监控的基石。