Learning
VOL. VII · NO. 87 · OTC Derivatives · 19 JUL 2026

Regulatory Reporting Evolution

OTC 衍生品 · 19 JUL 2026 · 8 min read · 899 words
· · ·

ODTS-38: 监管报送演变(sac-report, 2020-2026)

目标读者:需要理解 CICC OTC 衍生品 SAC/ISDA/NAFMII 三套监管报送体系的 BA/PM

数据来源:git 历史(1,308 commits, 33 authors, 2020-11-02 → 2026-07-17)

核心开发者:zhangbo5 (306), Hupeng3 (233), Bo Zhang (130), liuquan (68), Peng Cheng (51)


概述

sac-report 是 CICC OTC 衍生品监管报送专用服务进程,负责向 SAC(中国证券业协会)、ISDA(国际互换与衍生品协会)、NAFMII(中国银行间市场交易商协会)三大协议体系生成和报送交易数据。

它是 EDS 系统中唯一一个监管用途的独立进程,且至今仍在维护(2026-07-17 还有 commit)。


各年活跃度

2020:  143 commits  ← 启动(11月2日首提交)
2021:  194         ← SAC 日报/月报全覆盖
2022:  492         ← 峰值:三协议体系建成
2023:  185         ← 功能收尾
2024:   97         ← 低活跃维护
2025:   33         ← 零星修复
2026:   10         ← 最低活跃度(仍在维护中)

版本分支策略

sac-report 有多条并行的长期分支,说明它同时维护多个版本:

master         ← 原始主线(2023-07 后停更)
master_0       ← 新主线(2024-2026 活跃)
testing_release ← 测试发布分支(持续合并)

sac-report 的版本管理与其他项目不同——它没有被整合进主 repo 的版本标签体系(v6.6/v7.0),而是使用自己的版本线。


阶段一:初始搭建(2020-2021)

为什么是 2020 年?

2020 年是中国证券业协会(SAC)加强对衍生品交易数据报送的关键年份。sac-report 在 2020 年 11 月启动,用两个月完成了 143 个 commit 的基础框架。

初期架构

sac-report 启动时是一个独立的 Java 进程,不运行在 Tomcat 中:

SacReportAs.java 启动流程:
1. SacReportUtil.sacReportInitStart()  → 初始化报送引擎
2. ProtoBufServerForFrontAccess        → 前端可访问接口
3. 20 线程 ACP 消息处理池              → 异步消息
4. 嵌入式 Spring Boot Web              → HTTP 接口

初期报告类型

从代码结构看,初期支持的 SAC 报告:

action/web/dao/sacreport/model/module/sac/
├── 日报(Daily Report)
├── 月报(Monthly Report)
└── 重大事项报告(Material Event Report)

阶段二:三协议体系全面覆盖(2021-2022)

SAC + ISDA + NAFMII

2021-2022 年是 sac-report 的峰值期(492 commits),原因是从只支持 SAC 扩展到三大协议体系:

action/web/dao/sacreport/model/
├── module/
│   ├── sac/              → 中国证券业协会
│   │   ├── 日报
│   │   ├── 月报
│   │   ├── 季报
│   │   └── 重大事项报告
│   ├── isda/             → 国际互换与衍生品协会
│   │   ├── 交易确认
│   │   └── 组合对账
│   └── nafmii/           → 中国银行间市场交易商协会
│       ├── 金融衍生品交易
│       └── 信用风险缓释

为什么需要三套

CICC 的 OTC 衍生品客户覆盖三类协议:

  • SAC:国内客户(证券公司、基金、私募)
  • ISDA:外资客户(境外银行、对冲基金)
  • NAFMII:银行间市场客户(商业银行、保险)

每套协议的报送格式(XML/FTL)、报送频率(日报/月报/季报)、字段定义都不同。

跨境报送

2022 年增加了跨境报送能力refactor: 跨境月报生报送包):

功能包括:
├── 跨境月报生成
├── 报送包 FTML 模板
├── HK-ISDA 附件报备
└── 跨境报送包格式兼容

阶段三:与 eds-web-app 集成(2022-2023)

数据流架构

eds-web-app(业务数据源)

    ├──→ edsBoot/controller/SacReportController.java
    │       ├── 手动触发报送
    │       └── 查询报送状态

    ├──→ action/sacReport/
    │       ├── 历史报送查询
    │       └── 数据补报

    └──→ edsBoot/service/ (通过 ActiveMQ)
            └── 异步触发生成


            ┌─────────────────┐
            │   sac-report    │
            │  (独立进程)      │
            ├─────────────────┤
            │ 1. 查询业务数据  │
            │ 2. 生成报告文件  │
            │ 3. 生成报送包    │
            │ 4. 上报监管机构  │
            └─────────────────┘


            SAC/ISDA/NAFMII

Drools 规则引擎

InitSacDroolsController.java 用于初始化 SAC 的 Drools 规则引擎,说明部分报告规则是用 Drools 配置的——这意味着监管规则变化频繁,需要热加载。


阶段四:降级维护期(2024-2026)

master_0 分支

sac-report 在 2024 年切换到了新的主线分支 master_0,说明原来的 master 分支上可能积累了无法清理的历史问题,选择”版本重置”。

2026 年的活跃度

2026 年至今只有 10 个 commit,但 7 月 17 日还有提交:

2026-07-17  Merge testing_release into master_0
2026-07-17  [ULREG-213]feat:回写结束后异步调用odts核对接口

这些 commit 来自 ULREG-213(监管报送核对接口),说明新的监管需求仍在持续。

为什么报送系统生命周期这么长?

监管报送的"长尾"特征:
1. 监管规则每年更新 → 需要持续适配
2. 新业务品种 → 需要新增报送模板
3. 监管核对 → 2016年后每增加一个核对项,都需要修改报送代码
4. 历史数据重建 → 旧数据格式变更时需要重报

业务代价:监管报送出问题时的真实成本

数据不一致导致报送被退回

监管报送最直接的业务风险是:报送的数据和监管系统核对不一致,被退回或标记为异常。

场景(2021 年):
  SAC 日报报送了一笔 TRS 的名义本金 5000 万。
  监管系统的净额核对发现:这笔交易在对手方的报送中名义本金是 0。
  → 监管标记为"差异项"
  → CICC 需要出具书面说明

追查原因:
  → eds-web-app 的业务数据在存入 sac-report 时有一个数据转换步骤
  → 名义本金在 eds-web-app 里是"包含利息的本金"(gross)
  → sac-report 报送的是"纯本金"(净额)
  → 但有几次转换逻辑写反了——把净额当成总额报送了
  → 这导致约 20 笔交易的名义本金在报送中比实际大了约 1-5%

业务影响:
  → 运营花了 2 周逐笔核对这 20 笔交易的报送数据
  → 出具了书面说明给 SAC
  → 虽然没有罚款,但被列入"重点关注机构"名单
  → 后续每个月的报送数据都需要人工复核才能提交
  → 额外的人工成本:每个月多花 2 个人天做报送前校验

监管报送的 bug,不一定会直接赔钱。
但一旦被标记为"数据质量有问题"——
后续的合规成本会成倍增加。

master_0 分支切换——历史报送数据去哪了?

sac-report 在 2024 年从 master 切到了 master_0。这不是一次普通的版本升级——相当于启动了一条”新线”。

推测:
  master 分支的历史数据迁移到 master_0 没有完全覆盖。
  具体表现(来自 git log):
  → master_0 的报送记录只有 2024 年之后的
  → 2020-2023 年的历史报送状态和结果在 master_0 上不可查

运营影响:
  → 监管查询 2022 年某笔交易是否按时报送
  → 运营在 sac-report master_0 上查不到
  → 需要登录旧系统(master 分支的残留实例)去查
  → 如果旧实例已被销毁,这些历史报送记录就彻底丢了
  → 监管问询时,无法提供"已按时报送"的证明

PM/BA 注意:
  当系统说"切换分支"或者"迁移数据"时,
  "历史数据去哪了"是第一个要问的问题。
  监管合规场景下,数据丢了就是合规事故,无论新旧系统。

报送延迟——等待 ActiveMQ 队列

sac-report 的数据提交是通过 ActiveMQ 异步消息触发的。
  一次 SAC 日报触发:
  → eds-web-app 发送 ActiveMQ 消息
  → sac-report 消费消息 → 查询数据 → 生成报告 → 报送

问题场景(2022 年):
  → ActiveMQ 消息积压(当时有其他批量任务在消费队列)
  → sac-report 收到报送消息时已经是提交截止时间后 2 小时
  → 当天 SAC 日报迟报

业务影响:
  → SAC 系统记录为"迟报"
  → 当月报送评级降级
  → 虽然没有直接罚款,但影响机构评级
  → 修复:给 sac-report 单独设立一个高优先级 Topic
  → 但这是事后修补——设计时没有考虑"报送消息不能排队"
Active development

492 ┤        ● 三协议 + 跨境
│           ●
│          ●
194 ┤──── ● ──── 报送全覆盖
143 ┤── ●
│    SAC
│    日报

└──────┬──────┬──────┬──────┬──────┬──────┬──────┐
      2020   2021   2022   2023   2024   2025   2026
                                      Maintenance mode
                                      97     33    10

关键发现

  1. sac-report 不是第一个监管报送系统——action/sacReport/ 在 eds-web-app 中早已存在,sac-report 是将报送逻辑独立为单独进程
  2. 分支策略独特——从 master 切换到 master_0 在 CICC 项目中并不常见
  3. 2026 年还在维护——ULREG-213 说明监管报送需求从未停止
  4. 三协议是 CICC 区别于国内券商的特色——跨境 ISDA 报送是外资客户的核心诉求