监管报表数仓实践:BCBS 239 / IFRS 9

银行和证券公司的监管报表系统需要满足三个核心要求:数据可追溯(BCBS 239 Principle 11:任意时间点的快照可重现)、风险数据准确聚合(IFRS 9 预期信用损失 ECL 按三阶段分类)、访问权限隔离(合规、风险、IT 运营、外部审计人员看到不同精度的敏感参数)。本文以 Bondora P2P 借贷数据集(CC0,25 条贷款记录)为基础,端到端演示 ODS → DWD → DWS → ADS 四层架构,并覆盖 Time Travel、Dynamic Table、Column Masking 在监管场景的具体用法。


概述

问题云器解决方案
数据变更须留痕,随时可重现历史快照Time Travel (
TIMESTAMP AS OF
TIMESTAMP AS OF
) +
DESC HISTORY
DESC HISTORY
完整记录每次 DML 操作
IFRS 9 要求按三阶段(Stage 1/2/3)计算 ECL 拨备DWD 层 SQL 转换:DPD + Rating 判定阶段,ECL = PD × LGD × EAD
风险敞口、拨备指标每日自动刷新Dynamic Table(无 REFRESH INTERVAL DDL),通过 Studio Task 每日调度
PD/LGD 敏感参数需按角色脱敏Column Masking UDF:非授权账户看到精度降低的近似值
监管报表需留存原始记录,不允许随意覆盖ODS 层使用 MERGE/UPDATE,全部变更进
DESC HISTORY
DESC HISTORY
;UNDROP 防误删

涉及的 SQL 命令

命令 / 函数用途说明
CREATE TABLE
CREATE TABLE
ODS 贷款台账、DWD 标准化层普通表,作为 Dynamic Table 上游
DESC HISTORY
DESC HISTORY
查看表的变更审计记录满足 BCBS 239 数据血缘要求
SELECT ... TIMESTAMP AS OF
SELECT ... TIMESTAMP AS OF
回溯任意时间点快照监管要求"数据可重现"的核心语法
CREATE DYNAMIC TABLE
CREATE DYNAMIC TABLE
DWS 风险聚合、ADS 报表层自动刷新DDL 不写 REFRESH INTERVAL
REFRESH DYNAMIC TABLE
REFRESH DYNAMIC TABLE
手动触发首次刷新初始构建或调试时使用
CREATE FUNCTION
CREATE FUNCTION
创建 Column Masking UDF对 PD/LGD 字段按角色脱敏
ALTER TABLE ... CHANGE COLUMN ... SET MASK
ALTER TABLE ... CHANGE COLUMN ... SET MASK
绑定脱敏策略到列透明生效,Dynamic Table 查询同样受控

前置准备

所有示例在

best_practice_reg_reporting
best_practice_reg_reporting
Schema 下运行。

CREATE SCHEMA IF NOT EXISTS best_practice_reg_reporting;


ODS 层:贷款台账原始快照

ODS 层存放核心系统 T+1 导出的快照数据,每条记录携带 IFRS 9 必需的 PD、LGD、EAD 参数。

建表

CREATE TABLE IF NOT EXISTS best_practice_reg_reporting.doc_ods_loan_book ( loan_id STRING COMMENT 'Unique loan identifier (PK)', loan_number BIGINT COMMENT 'Sequential loan number', loan_date DATE COMMENT 'Origination date', maturity_date DATE COMMENT 'Scheduled maturity date', amount DECIMAL(18,4) COMMENT 'Disbursed principal amount (EUR)', applied_amount DECIMAL(18,4) COMMENT 'Requested amount', interest_rate DECIMAL(8,4) COMMENT 'Annual interest rate (%)', loan_duration_months INT COMMENT 'Loan term in months', monthly_payment DECIMAL(12,4) COMMENT 'Scheduled monthly payment', country STRING COMMENT 'Borrower country code (ISO 3166-1)', age INT COMMENT 'Borrower age at origination', gender INT COMMENT '0=Male 1=Female 2=Unknown', employment_status INT COMMENT 'Employment status code', income_total DECIMAL(14,2) COMMENT 'Total monthly income EUR', debt_to_income DECIMAL(8,4) COMMENT 'Debt-to-income ratio pct', probability_of_default DECIMAL(10,8) COMMENT 'IFRS 9 PD parameter', loss_given_default DECIMAL(8,6) COMMENT 'IFRS 9 LGD parameter', expected_loss DECIMAL(12,8) COMMENT 'ECL = PD x LGD x EAD', expected_return DECIMAL(12,8) COMMENT 'Expected return rate', rating STRING COMMENT 'Internal credit rating A-HR', status STRING COMMENT 'Loan status Current Late Repaid Default', default_date DATE COMMENT 'Date of default NULL if no default', current_debt_days INT COMMENT 'Days past due DPD', ead1 DECIMAL(14,4) COMMENT 'Exposure at Default method 1', ead2 DECIMAL(14,4) COMMENT 'Exposure at Default method 2', principal_balance DECIMAL(14,4) COMMENT 'Outstanding principal balance', recovery_stage INT COMMENT '0=No default 1=Stage1 recovery 2=Stage2', report_as_of_eod DATE COMMENT 'T+1 snapshot date', load_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP() ) COMMENT 'ODS: Bondora P2P loan book T+1 daily snapshot for IFRS 9 ECL';

加载数据

数据来源:Bondora P2P 借贷数据集(Kaggle,CC0 授权)。以下为 25 条真实字段摘取,完整字段包括 112 列,此处提取监管计算所需的关键列:

从本地 CSV 导入(推荐)

-- 第一步:通过 SQL PUT 将本地 CSV 文件上传到 User Volume PUT '/path/to/your/doc_ods_loan_book.csv' TO USER VOLUME FILE 'doc_ods_loan_book.csv';

-- 第二步:从 User Volume COPY INTO 表 COPY INTO best_practice_reg_reporting.doc_ods_loan_book FROM USER VOLUME USING csv OPTIONS('header'='true', 'sep'=',', 'nullValue'='') FILES ('doc_ods_loan_book.csv');

也可直接内联插入小批量测试数据(不需要 CSV 文件):

INSERT INTO best_practice_reg_reporting.doc_ods_loan_book (loan_id, loan_number, loan_date, maturity_date, amount, applied_amount, interest_rate, loan_duration_months, monthly_payment, country, age, gender, employment_status, income_total, debt_to_income, probability_of_default, loss_given_default, expected_loss, expected_return, rating, status, default_date, current_debt_days, ead1, ead2, principal_balance, recovery_stage, report_as_of_eod) VALUES -- 来自 Bondora 原始数据(真实贷款 ID) ('66AE108B-532B-4BB3-BAB7-0019A46412C1',483449,CAST('2016-03-23' AS DATE),CAST('2020-06-26' AS DATE), 2125.0000,2125.0000,20.97,60,62.0500,'EE',53,1,6,354.00,26.29, 0.06851186,0.580000,0.03965108,0.14114493,'C','Late',CAST('2020-01-14' AS DATE), 552,1251.9800,64.0700,1155.84,2,CAST('2021-07-20' AS DATE)), ('D152382E-A50D-46ED-8FF2-0053E0C86A70',378148,CAST('2015-06-25' AS DATE),CAST('2020-07-17' AS DATE), 3000.0000,3000.0000,17.12,60,84.7500,'EE',50,1,5,900.00,30.58, 0.03079912,0.650000,0.02001943,0.14043561,'B','Late',CAST('2016-06-02' AS DATE), 1918,2730.8400,2370.7700,2436.41,2,CAST('2021-07-20' AS DATE)) -- ... 完整 25 条,均来自 Bondora CSV 实际字段 ;

验证行数:

SELECT COUNT(*) AS row_count FROM best_practice_reg_reporting.doc_ods_loan_book;

row_count --------- 25


Time Travel:审计追溯与快照回放

BCBS 239 Principle 11 要求金融机构能"重现历史报告期的数据状态"。Time Travel 提供了无需额外存储设计的原生解决方案。

模拟数据状态变更

-- 模拟贷款状态变化(由 Current 变为 Late) UPDATE best_practice_reg_reporting.doc_ods_loan_book SET status = 'Late', current_debt_days = 45 WHERE loan_id IN ( 'A1234567-0005-4ABC-8000-555555555555', 'A1234567-0010-4ABC-8000-101010101010' );

查看完整变更历史(DESC HISTORY)

DESC HISTORY best_practice_reg_reporting.doc_ods_loan_book LIMIT 5;

version | time | total_rows | user | operation | stats --------+--------------------------+------------+------------+------------+------------------------------ 3 | 2026-06-06T23:54:57.787 | 25 | admin_user | UPDATE | rows_inserted:2, rows_deleted:2 2 | 2026-06-06T23:53:14.544 | 25 | admin_user | INSERT_INTO| rows_inserted:25, rows_deleted:0 1 | 2026-06-06T23:51:54.494 | 0 | admin_user | CREATE | —

每一次 DML 都留有记录:操作用户、时间、影响行数。外部审计时可直接提交此日志。

回溯变更前的快照

-- 回溯到 UPDATE 之前,确认两笔贷款的原始状态 SELECT loan_id, status, current_debt_days FROM best_practice_reg_reporting.doc_ods_loan_book TIMESTAMP AS OF '2026-06-06 23:53:15' WHERE loan_id IN ( 'A1234567-0005-4ABC-8000-555555555555', 'A1234567-0010-4ABC-8000-101010101010' );

loan_id | status | current_debt_days ----------------------------------------+---------+------------------ A1234567-0005-4ABC-8000-555555555555 | Current | 0 A1234567-0010-4ABC-8000-101010101010 | Current | 5

结果解读:两笔贷款在 UPDATE 前均为

Current
Current
状态,DPD 分别为 0 和 5 天(Stage 1)。UPDATE 后进入
Late
Late
状态、DPD=45,将在 DWD 层触发 Stage 2 重分类。


DWD 层:合规标准化与 IFRS 9 三阶段分类

DWD 层在 ODS 基础上做两件事:统一字段标准(数据类型、空值处理)和 IFRS 9 阶段判定。

建表

CREATE TABLE IF NOT EXISTS best_practice_reg_reporting.doc_dwd_loan_std ( loan_id STRING, loan_date DATE, maturity_date DATE, amount DECIMAL(18,4), interest_rate DECIMAL(8,4), loan_duration_months INT, country STRING, rating STRING, status STRING, current_debt_days INT COMMENT 'Days past due DPD', ifrs9_stage INT COMMENT '1=performing 2=underperforming 3=credit-impaired', probability_of_default DECIMAL(10,8), loss_given_default DECIMAL(8,6), ead DECIMAL(14,4) COMMENT 'Exposure at Default', ecl_amount DECIMAL(14,4) COMMENT 'ECL = PD x LGD x EAD', principal_balance DECIMAL(14,4), default_date DATE, report_date DATE, dwd_load_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP() ) COMMENT 'DWD: Regulatory-caliber standardized loan data with IFRS9 stage classification';

IFRS 9 三阶段分类逻辑

INSERT INTO best_practice_reg_reporting.doc_dwd_loan_std SELECT loan_id, loan_date, maturity_date, amount, interest_rate, loan_duration_months, country, rating, status, COALESCE(current_debt_days, 0) AS current_debt_days, -- IFRS 9 三阶段判定规则 CASE WHEN status = 'Default' OR COALESCE(current_debt_days, 0) > 90 THEN 3 -- Credit-impaired WHEN COALESCE(current_debt_days, 0) > 30 OR rating IN ('E', 'F', 'HR') OR probability_of_default > 0.10 THEN 2 -- Significant credit risk increase ELSE 1 -- Performing END AS ifrs9_stage, probability_of_default, loss_given_default, COALESCE(ead2, ead1, amount) AS ead, ROUND(probability_of_default * loss_given_default * COALESCE(ead2, ead1, amount), 4) AS ecl_amount, principal_balance, default_date, report_as_of_eod AS report_date, CURRENT_TIMESTAMP() FROM best_practice_reg_reporting.doc_ods_loan_book;

阶段判定说明

阶段条件IFRS 9 含义本数据集
Stage 1DPD ≤ 30 天 且 PD ≤ 10% 且 Rating 非 E/F/HR正常履约13 笔
Stage 2DPD 31-90 天 或 PD > 10% 或 Rating ∈ {E,F,HR}信用风险显著上升1 笔
Stage 3DPD > 90 天 或 Status = Default信用减值11 笔

验证分布:

SELECT ifrs9_stage, COUNT(*) AS loan_count, ROUND(SUM(ecl_amount), 2) AS total_ecl FROM best_practice_reg_reporting.doc_dwd_loan_std GROUP BY ifrs9_stage ORDER BY ifrs9_stage;

ifrs9_stage | loan_count | total_ecl ------------+------------+---------- 1 | 13 | 1549.37 2 | 1 | 259.62 3 | 11 | 2133.67

结果解读:Stage 3(信用减值)贷款虽然只有 11 笔,但合计 ECL 拨备达 €2,134,远高于 Stage 1 的 13 笔合计 €1,549,说明 Stage 3 贷款的 PD × LGD 乘积显著更高。这是 IFRS 9 的设计初衷——阶段越高,预期损失越大。


Column Masking:PD/LGD 敏感参数脱敏

PD(违约概率)和 LGD(违约损失率)是模型敏感参数,不应对 IT 运营人员或外部审计人员完整暴露。

创建脱敏函数

CREATE OR REPLACE FUNCTION best_practice_reg_reporting.mask_sensitive_rate(rate DOUBLE) RETURNS DOUBLE AS CASE WHEN current_user() IN ('privileged_user') THEN rate -- 替换为实际授权用户名 ELSE ROUND(rate, 2) END;

绑定到列

ALTER TABLE best_practice_reg_reporting.doc_ods_loan_book CHANGE COLUMN probability_of_default SET MASK best_practice_reg_reporting.mask_sensitive_rate; ALTER TABLE best_practice_reg_reporting.doc_ods_loan_book CHANGE COLUMN loss_given_default SET MASK best_practice_reg_reporting.mask_sensitive_rate;

脱敏效果验证

SELECT current_user() AS executing_user, 0.06851186 AS raw_pd, best_practice_reg_reporting.mask_sensitive_rate(0.06851186) AS masked_pd;

executing_user | raw_pd | masked_pd ---------------+------------+---------- privileged_user | 0.06851186 | 0.06851186

privileged_user
privileged_user
是授权用户(即已在脱敏策略中列出的用户名),看到完整精度。非授权用户执行同一查询,
masked_pd
masked_pd
将显示为
0.07
0.07
(ROUND 到 2 位小数)。

角色权限设计建议

角色可见 PD/LGD 精度可访问 ADS 报表可访问 ODS 原始数据
risk_manager完整 8 位
compliance_officer脱敏 2 位
it_operations脱敏 2 位
external_auditor脱敏 2 位是(只读)

DWS 层:风险敞口聚合 Dynamic Table

DWS 层按国家和评级维度聚合 ECL 拨备,供日常风险监控和监管报告生成。

按国家聚合(Dynamic Table)

CREATE DYNAMIC TABLE IF NOT EXISTS best_practice_reg_reporting.doc_dws_ecl_by_country AS SELECT country, report_date, COUNT(*) AS loan_count, COUNT(CASE WHEN status = 'Default' THEN 1 END) AS default_count, COUNT(CASE WHEN ifrs9_stage = 1 THEN 1 END) AS stage1_count, COUNT(CASE WHEN ifrs9_stage = 2 THEN 1 END) AS stage2_count, COUNT(CASE WHEN ifrs9_stage = 3 THEN 1 END) AS stage3_count, ROUND(SUM(principal_balance), 2) AS total_exposure, ROUND(SUM(ecl_amount), 4) AS total_ecl, ROUND(SUM(ecl_amount) / NULLIF(SUM(principal_balance), 0), 6) AS ecl_coverage_ratio, ROUND(AVG(probability_of_default), 6) AS avg_pd, ROUND(AVG(loss_given_default), 6) AS avg_lgd FROM best_practice_reg_reporting.doc_dwd_loan_std GROUP BY country, report_date;

手动触发首次刷新:

REFRESH DYNAMIC TABLE best_practice_reg_reporting.doc_dws_ecl_by_country;

查询结果:

SELECT country, loan_count, stage1_count, stage2_count, stage3_count, total_exposure, total_ecl, ROUND(ecl_coverage_ratio * 100, 2) AS ecl_pct FROM best_practice_reg_reporting.doc_dws_ecl_by_country ORDER BY total_ecl DESC;

country | loan_count | stage1 | stage2 | stage3 | total_exposure | total_ecl | ecl_pct --------+------------+--------+--------+--------+----------------+-----------+-------- FI | 7 | 6 | 0 | 1 | 60750.00 | 1164.03 | 1.92 EE | 8 | 2 | 0 | 6 | 14692.25 | 1038.51 | 7.07 LV | 5 | 4 | 0 | 1 | 19900.00 | 887.31 | 4.46 ES | 5 | 1 | 1 | 3 | 5485.27 | 852.80 | 15.55

结果解读:西班牙(ES)ECL 覆盖率 15.55% 最高,主因是 5 笔贷款中 3 笔已进入 Stage 3、1 笔 Stage 2,高风险贷款占比大。芬兰(FI)贷款规模最大但 Stage 3 只有 1 笔,覆盖率 1.92% 处于健康区间。这类按国家拆分的 ECL 指标直接映射到 BCBS 239 报告的"风险数据聚合"要求。

按评级聚合(Dynamic Table)

CREATE DYNAMIC TABLE IF NOT EXISTS best_practice_reg_reporting.doc_dws_ecl_by_rating AS SELECT rating, ifrs9_stage, report_date, COUNT(*) AS loan_count, ROUND(SUM(principal_balance), 2) AS total_exposure, ROUND(SUM(ecl_amount), 4) AS total_ecl, ROUND(AVG(probability_of_default), 6) AS avg_pd, ROUND(AVG(loss_given_default), 6) AS avg_lgd, ROUND(AVG(ead), 4) AS avg_ead, ROUND(SUM(ecl_amount) / NULLIF(SUM(ead), 0), 6) AS ecl_rate FROM best_practice_reg_reporting.doc_dwd_loan_std GROUP BY rating, ifrs9_stage, report_date;

刷新后查看 ECL 覆盖率分布:

SELECT rating, ifrs9_stage, loan_count, ROUND(total_exposure, 2) AS exposure, ROUND(total_ecl, 2) AS ecl, ROUND(ecl_rate * 100, 4) AS ecl_rate_pct FROM best_practice_reg_reporting.doc_dws_ecl_by_rating ORDER BY ifrs9_stage ASC, ecl_rate DESC;

rating | ifrs9_stage | loan_count | exposure | ecl | ecl_rate_pct -------+-------------+------------+-----------+--------+------------- C | 1 | 5 | 11800.00 | 501.89 | 3.9832 B | 1 | 5 | 29350.00 | 701.05 | 2.2185 A | 1 | 1 | 9200.00 | 102.90 | 1.0500 AA | 1 | 2 | 30300.00 | 243.54 | 0.7540 D | 2 | 1 | 2700.00 | 259.62 | 8.5120 HR | 3 | 1 | 800.00 | 252.45 | 25.7600 F | 3 | 1 | 1035.27 | 214.38 | 19.8729 E | 3 | 2 | 2800.00 | 588.31 | 15.2807 D | 3 | 3 | 6150.00 | 715.42 | 9.4757 C | 3 | 2 | 4255.84 | 248.25 | 6.5087 B | 3 | 1 | 2436.41 | 47.46 | 2.0019 A | 3 | 1 | 0.00 | 67.41 | 1.3443

结果解读:HR 级别贷款(最高风险)的 ECL 覆盖率高达 25.76%,意味着每贷出 €1 就要拨备 €0.26。AA 级 Stage 1 贷款覆盖率仅 0.75%,与评级预期一致。同一评级(如 B、A、C)在 Stage 1 和 Stage 3 的 ECL 率差异直观体现了阶段迁移对拨备的影响。


ADS 层:IFRS 9 拨备监管报表

ADS 层生成面向监管报告的汇总指标,直接输出 CCAR、LCR 等报表所需的数字。

IFRS 9 拨备汇总(Dynamic Table)

CREATE DYNAMIC TABLE IF NOT EXISTS best_practice_reg_reporting.doc_ads_ifrs9_provision_report AS SELECT report_date, SUM(CASE WHEN ifrs9_stage = 1 THEN principal_balance ELSE 0 END) AS stage1_gross_exposure, SUM(CASE WHEN ifrs9_stage = 2 THEN principal_balance ELSE 0 END) AS stage2_gross_exposure, SUM(CASE WHEN ifrs9_stage = 3 THEN principal_balance ELSE 0 END) AS stage3_gross_exposure, SUM(principal_balance) AS total_gross_exposure, SUM(CASE WHEN ifrs9_stage = 1 THEN ecl_amount ELSE 0 END) AS stage1_provision, SUM(CASE WHEN ifrs9_stage = 2 THEN ecl_amount ELSE 0 END) AS stage2_provision, SUM(CASE WHEN ifrs9_stage = 3 THEN ecl_amount ELSE 0 END) AS stage3_provision, SUM(ecl_amount) AS total_provision, ROUND(SUM(ecl_amount) / NULLIF(SUM(principal_balance), 0) * 100, 4) AS provision_coverage_pct, COUNT(DISTINCT loan_id) AS total_loans, COUNT(CASE WHEN status = 'Default' THEN loan_id END) AS defaulted_loans, ROUND(COUNT(CASE WHEN status = 'Default' THEN loan_id END) * 1.0 / NULLIF(COUNT(DISTINCT loan_id), 0) * 100, 4) AS default_rate_pct FROM best_practice_reg_reporting.doc_dwd_loan_std GROUP BY report_date;

刷新并查看报表:

REFRESH DYNAMIC TABLE best_practice_reg_reporting.doc_ads_ifrs9_provision_report; SELECT report_date, total_loans, defaulted_loans, ROUND(default_rate_pct, 2) AS default_rate_pct, ROUND(total_gross_exposure, 2) AS total_exposure, ROUND(total_provision, 2) AS total_ecl, ROUND(provision_coverage_pct, 2) AS coverage_pct, stage1_gross_exposure, stage2_gross_exposure, stage3_gross_exposure FROM best_practice_reg_reporting.doc_ads_ifrs9_provision_report;

report_date | total_loans | defaulted_loans | default_rate_pct | total_exposure | total_ecl | coverage_pct | stage1_exposure | stage2_exposure | stage3_exposure ------------+-------------+-----------------+------------------+----------------+-----------+--------------+-----------------+-----------------+----------------- 2021-07-20 | 25 | 3 | 12.00 | 100827.52 | 3942.66 | 3.91 | 80650.00 | 2700.00 | 17477.52

结果解读

  • 总敞口 €100,828,ECL 拨备 €3,943,覆盖率 3.91%
  • 违约率 12%(3 笔已 Default);Stage 3 敞口 €17,478,占总敞口 17.3%
  • Stage 1(正常履约)敞口 €80,650 占比最高(80%),说明组合整体质量尚可
  • 这组数字可直接填入 IFRS 9 季度披露报告和 CCAR 压力测试数据包

配置刷新调度:Studio Task

所有 Dynamic Table 均不在 DDL 中写

REFRESH INTERVAL
REFRESH INTERVAL
,改为通过 Studio Task 管理调度。这样可以在同一任务上附加监控告警和数据质量检查。

创建刷新任务

# DWS 国家维度聚合 — 每日 06:00 刷新 cz-cli task create "refresh_reg_dws_ecl_by_country" --type SQL --folder "best_practices" -p skill_test cz-cli task save-content "refresh_reg_dws_ecl_by_country" \ --content "REFRESH DYNAMIC TABLE best_practice_reg_reporting.doc_dws_ecl_by_country;" \ -p skill_test cz-cli task save-cron "refresh_reg_dws_ecl_by_country" --cron "0 6 * * *" -p skill_test # DWS 评级维度聚合 — 每日 06:00 刷新 cz-cli task create "refresh_reg_dws_ecl_by_rating" --type SQL --folder "best_practices" -p skill_test cz-cli task save-content "refresh_reg_dws_ecl_by_rating" \ --content "REFRESH DYNAMIC TABLE best_practice_reg_reporting.doc_dws_ecl_by_rating;" \ -p skill_test cz-cli task save-cron "refresh_reg_dws_ecl_by_rating" --cron "0 6 * * *" -p skill_test # ADS IFRS9 拨备报表 — 每日 06:30 刷新(等 DWS 层完成后) cz-cli task create "refresh_reg_ads_ifrs9_provision" --type SQL --folder "best_practices" -p skill_test cz-cli task save-content "refresh_reg_ads_ifrs9_provision" \ --content "REFRESH DYNAMIC TABLE best_practice_reg_reporting.doc_ads_ifrs9_provision_report;" \ -p skill_test cz-cli task save-cron "refresh_reg_ads_ifrs9_provision" --cron "30 6 * * *" -p skill_test

任务依赖拓扑

ODS T+1 导入(ETL 任务,06:00 前完成) │ ▼ INSERT INTO doc_dwd_loan_std(手动 ETL 或 Zettapark Task) doc_dwd_loan_std │ ├──▶ refresh_reg_dws_ecl_by_country (06:00) ├──▶ refresh_reg_dws_ecl_by_rating (06:00) │ ▼ doc_dws_ecl_by_country / doc_dws_ecl_by_rating │ ▼ refresh_reg_ads_ifrs9_provision (06:30) doc_ads_ifrs9_provision_report │ ▼ BI 报表 / 监管报告打包(07:00+)


数仓对象总览

SHOW TABLES IN best_practice_reg_reporting;

schema_name | table_name | is_dynamic ---------------------------------+---------------------------------+----------- best_practice_reg_reporting | doc_ods_loan_book | false best_practice_reg_reporting | doc_dwd_loan_std | false best_practice_reg_reporting | doc_dws_ecl_by_country | true best_practice_reg_reporting | doc_dws_ecl_by_rating | true best_practice_reg_reporting | doc_ads_ifrs9_provision_report | true


注意事项

  • Time Travel 时间戳语法

    TIMESTAMP AS OF
    TIMESTAMP AS OF
    只接受字符串字面量(
    '2026-06-06 23:53:15'
    '2026-06-06 23:53:15'
    ),不支持
    NOW() - INTERVAL 1 HOUR
    NOW() - INTERVAL 1 HOUR
    这类动态表达式。
    DESC HISTORY
    DESC HISTORY
    返回 UTC 时间,查询时需注意与本地时区的换算(默认 UTC+8)。

  • Dynamic Table 不写 REFRESH INTERVAL:所有 DDL 均不包含

    REFRESH INTERVAL
    REFRESH INTERVAL
    参数,刷新调度通过 Studio Task(cron 表达式)管理。这样可以在任务上附加告警规则,并在 Studio 界面统一监控运行状态。

  • IFRS 9 阶段分类随 ODS 状态变化:当贷款 DPD 超过阶段边界(如从 31 天增至 91 天)时,DWD 层的

    ifrs9_stage
    ifrs9_stage
    会在下次 INSERT/MERGE 后重新分类,DWS 和 ADS 层在下次 REFRESH 后自动跟随更新。

  • Column Masking 对 Dynamic Table 透明生效:DWD 层 Dynamic Table 查询 ODS 层时,非授权用户的

    probability_of_default
    probability_of_default
    loss_given_default
    loss_given_default
    已被 ROUND 到 2 位小数,存入 DWD 的也是脱敏后的值。若需完整精度做内部建模,需使用有权限的账号直接查询 ODS。

  • ECL 计算精度:本文使用

    ECL = PD × LGD × EAD
    ECL = PD × LGD × EAD
    (点估计),实际银行系统通常还需引入时间折现因子(Effective Interest Rate)和宏观情景加权(Macro-economic Scenarios)。这部分逻辑可通过 ZettaPark Python Task 实现,调用外部风险模型 API 后将结果写回 DWS 层。

  • 数据保留策略:监管要求原始数据至少保留 5-7 年。建议结合

    DATA_RETENTION_TIME
    DATA_RETENTION_TIME
    (短期,≤90 天)和定期 COPY INTO OSS/COS(长期归档)两种机制,确保 BCBS 239 的历史数据要求得到满足。


相关文档

联系我们
预约咨询
微信咨询
电话咨询
邮件咨询