第三章:回溯测试理论基础

3.1 什么是回溯测试

回溯测试,说白了就是拿历史数据来检验你的风险模型。

你建了一个VaR模型,预测明天95%的概率下最多亏100万。但问题是——这个预测准不准?

回溯测试就是回答这个问题的。它把模型"放回"过去,看看如果当时用了这个模型,预测结果和实际结果有多大差距。

我个人习惯把回溯测试比作"后视镜开车"。虽然不能预测未来,但至少能告诉你:你的模型在过去表现如何。如果连过去都拟合不好,那未来就更别指望了。

核心定义:回溯测试(Backtesting)是一种统计方法,通过将风险模型的预测结果与历史实际结果进行比较,来验证模型的准确性和可靠性。

3.2 为什么需要回溯测试

你可能要问:模型建好了,直接用不就完了?干嘛还要费劲去验证?

嗯,这里有个坑。我在项目中遇到过好几次:模型在纸上看起来完美,参数调得漂漂亮亮,但一上线就出问题。

为什么会这样?因为风险模型本质上是个"概率游戏"。你预测的是分布,不是确定值。如果不验证,你根本不知道这个分布靠不靠谱。

回溯测试的必要性,我总结为三点:

  • 验证模型准确性:模型预测的VaR值,是否真的覆盖了实际损失?如果实际亏损超过VaR的次数太多,说明模型低估了风险。
  • 发现模型缺陷:模型假设是否合理?比如正态分布假设在金融数据中经常不成立。回溯测试能帮你发现这些"隐藏的炸弹"。
  • 满足监管要求:这个我下面会详细讲。巴塞尔协议明确要求银行必须做回溯测试,不是可选项,是必选项。

我的经验:曾经有个同事,建了一个看起来很漂亮的VaR模型,但回溯测试时发现异常率高达15%(理论上应该是5%)。后来一查,原来是忽略了尾部风险的肥尾效应。嗯,从那以后,我每次建完模型第一件事就是跑回溯测试。

3.3 监管要求:巴塞尔协议

说到监管,就绕不开巴塞尔协议。这是全球银行业的"基本法"。

巴塞尔协议对回溯测试的要求,说白了就是:你得证明你的模型靠谱。

具体来说,巴塞尔协议II和III都明确要求:

  • 银行必须定期对内部模型进行回溯测试
  • 测试结果要上报监管机构
  • 根据测试结果,模型会被划分到不同"交通灯"区域

这个"交通灯"机制很有意思。我直接给你看表格:

区域 异常次数(250个交易日) 监管措施
绿灯区 0-4次 模型通过,无需调整
黄灯区 5-9次 需要关注,可能调整乘数因子
红灯区 10次以上 模型不通过,必须重新校准

注意,这里的"异常次数"指的是实际亏损超过VaR预测值的次数。理论上,99%的VaR在250个交易日里应该只出现2-3次异常(250×1%=2.5次)。

避坑指南:我曾经见过一家机构,为了"通过"回溯测试,故意把VaR值调得特别高。这样异常次数确实少了,但模型完全失去了预测意义。监管机构不是傻子,他们看的是整个分布,不是单个数字。

3.4 回溯测试的统计框架

好了,理论说完了,咱们来点实际的。回溯测试的统计框架,我习惯用一张图来理解:

回溯测试统计框架 步骤1:数据准备 历史收益率数据 步骤2:模型预测 计算VaR值序列 步骤3:比较验证 实际vs预测对比 结论 核心统计方法 异常次数检验 统计实际亏损超过 VaR的次数 二项分布检验 Kupiec检验 独立性检验 检查异常事件是否 存在聚集现象 Christoffersen检验 Ljung-Box检验 损失分布检验 评估超出VaR的 损失大小分布 Lopez检验 分位数损失检验

这个框架看起来简单,但每个步骤都有讲究。我重点说说第三步的统计检验。

3.4.1 异常次数检验

这是最常用的方法。核心思想是:如果模型正确,那么异常次数应该服从二项分布。

举个例子。你建了一个99%的VaR模型,测试了250天。理论上异常次数应该是250×1%=2.5次。如果实际出现了10次异常,那模型肯定有问题。

具体怎么判断?用Kupiec检验。代码实现很简单:

import numpy as np
from scipy import stats

def kupiec_test(n, x, p):
    """
    Kupiec检验
    n: 总观测天数
    x: 异常次数
    p: 理论异常概率(1-VaR置信水平)
    """
    # 似然比统计量
    LR = -2 * np.log(((1-p)**(n-x) * p**x) / 
                     ((1-x/n)**(n-x) * (x/n)**x))
    # p值
    p_value = 1 - stats.chi2.cdf(LR, 1)
    return LR, p_value

# 示例:250天,10次异常,99%VaR
LR, p_value = kupiec_test(250, 10, 0.01)
print(f"LR统计量: {LR:.2f}")
print(f"p值: {p_value:.4f}")

如果p值小于0.05,就拒绝原假设——模型有问题。

3.4.2 独立性检验

异常次数检验只能看"数量",但没法看"分布"。如果异常事件扎堆出现,那模型也有问题。

举个例子。假设250天里出现了5次异常,看起来不多。但如果这5次异常都集中在同一个月,说明模型在市场波动大的时候失效了。

Christoffersen检验就是干这个的。它检查异常事件是否独立分布。

我的建议:实际工作中,我通常把异常次数检验和独立性检验结合起来用。先看数量对不对,再看分布是否随机。两个都通过,模型才算基本合格。

3.4.3 损失分布检验

这个相对高级一些。它不光看异常次数,还看异常的大小。

你想想看,如果模型预测最大损失100万,实际亏损了500万,那就算异常次数不多,模型也是严重低估风险的。

Lopez检验就是基于这个思路。它给每次异常赋予一个"严重程度"权重,然后综合评估。

避坑指南:我曾经见过一个案例,某机构的VaR模型通过了所有标准检验,但金融危机一来就崩了。为什么?因为他们的检验只关注了"正常市场"下的表现,忽略了极端情况。所以我现在做回溯测试,一定会加入压力场景测试。

3.5 小结

回溯测试不是走过场,它是风险模型的"质检员"。没有它,你的模型就是个黑箱。

记住三个要点:

  • 回溯测试验证模型的历史表现
  • 巴塞尔协议有明确的监管要求
  • 统计框架包括异常次数、独立性和损失分布三个维度

嗯,这一章的内容就到这里。下一章我们会动手实现一个完整的回溯测试系统,到时候你会看到这些理论是怎么落地的。


公众号:蓝海资料掘金营,微信deep3321