中证协的《证券公司压力测试指引》把压力测试从"建议做"变成了"必须做且有方法要求"。落到工程上,这套系统的尴尬处境是:金融工程团队关心情景设计是否严谨,而 IT 团队被问到的永远是那个朴素的问题——全量持仓在报送时限内重估得完吗?这篇两头都讲:测算引擎的工程实现,和现场检查时系统在考什么。
测算对象与情景设计
压力测试测的是:在极端但可能发生的市场情景下,公司的风险承受能力还剩多少。核心输入三样:
- 持仓与敞口快照:自营、资管、信用业务的全部头寸,含衍生品的希腊字母敞口;
- 情景库:一组预定义的市场冲击。分两类——历史情景(2015 年股灾、2020 年疫情冲击、2022 年债市调整),用真实历史行情序列重放;假设情景(沪深 300 单日下跌 15%、利率曲线平行上移 100BP、全部持仓流动性枯竭按跌停价处置);
- 汇总指标:压力情景下的净资本、流动性覆盖率、各业务线损失,对照监管红线给出安全垫。
还有一类反向压力测试值得单独说:正向是"情景 → 损失",反向是"损失 → 找情景"——问"什么情况会把公司净资本击穿",再检验这种情景是否足够极端到不用管。反向测试的计算量最大,因为它要在情景空间里搜索,实践里用梯度近似:沿各风险因子的敏感度方向做局部展开,
$$ \Delta V \approx \sum_i \frac{\partial V}{\partial f_i}\,\Delta f_i + \frac{1}{2}\sum_{i,j}\Gamma_{ij}\,\Delta f_i \Delta f_j $$
先用一阶二阶敏感度缩小搜索域,再对少数关键组合做全量重估。没有这层近似,反向测试在日终批量窗口内跑不完。
重估引擎:性能是设计出来的
全量重估的耗时大头在衍生品和信用业务。股票现货按价格乘持仓数,毫秒级;债券要按冲击后的收益率曲线重算估值(久期加凸性近似先行,全量现金流折现兜底);两融要重算担保比例和强制平仓线,违约率随情景调整;场外衍生品最狠——每个组合要重新跑定价模型,雪球、香草期权的蒙特卡洛一次就是百万级路径。
工程上三板斧。一是分层估值:先线性近似(Delta/Gamma 展开)筛出损失贡献前 5% 的组合,对这部分做全量定价,其余用近似值。精度损失可控(二次项以内误差很小),耗时能砍掉两个数量级。二是并行按组合分片:组合之间无依赖,天然 embarrassingly parallel,按组合 ID 哈希打散到计算池(《热点账户与并行清算》的分片思路同一个)。三是快照隔离:压力测试必须用 T 日收盘快照,不能读实时行情——否则重估跑一小时,行情飘一小时,报告里的数对不上任何时点。
时限的真实压力在月末和极端行情后:监管要求极端情景出现后的专项压力测试,而极端行情的当天清算本身就拖晚,留给重估的窗口更小。时限倒逼出来的一个经验:情景库和重估管道要常态演练,不能等真出事才第一次跑全链路——平时只跑简化版省成本,真专项测试时全量管道的冷启动时间可能要按小时计。
现场检查:系统在被查什么
监管现场检查对系统的考察,通俗讲就是"当场给我调出来"。典型清单:抽一笔交易,从委托到成交到清算全链路日志;抽一个压力测试报告,从情景定义到持仓快照到计算结果全链路数据;抽一个客户投诉,从双录到业务凭证到操作留痕。每个"调出来"的背后都是一条证据链:报告数字 → 计算任务 → 输入快照 → 原始流水,每一环要能逐层下钻,且时间线对得上。
这里最容易失分的不是缺系统,是缺关联。压力测试报告存成一个 PDF,计算脚本是某台服务器上的临时文件,持仓快照过期被清理——三者各自存在但串不成链,检查口径里这叫"数据留痕不完整"。解法是把每次压力测试作为一个整体工件归档:情景版本号、输入快照的哈希、代码版本、执行日志、输出结果,打包进不可变存储,关联关系写进元数据。和《审计日志》同一个主题:可信性来自可重放。
自查清单要和检查清单同源维护——每年按最新检查口径更新自查项,演练"三小时内调出任意一笔争议交易的全部证据"。这个演练年年觉得多余,年年有券商在这里丢分。