指标展示
Vintage 调整
预估曲线数据表
预估对比曲线
DPD/ROLL RATE矩阵(基准值)
明细核对表
实际Vintage曲线
历史经验总结
一、技术差异对比
| 维度 | V2(老方法) | V3(新方法) |
|---|---|---|
| 已表现月 | 使用实际 Vintage 值 | 使用实际 Vintage 值(一致) |
| 未表现月 | Vintage 率不区分期限(本金加权汇总) | Vintage 率区分期限(各期限独立计算) |
| 本金坏账 | 无偏差(数学等价) | 无偏差(数学等价) |
| 收入坏账 | 系统性低估长期限贡献 | 准确反映各期限贡献 |
二、期限分布对比
长期限产品收入占比远高于本金占比。老方法用本金加权的汇总率计算收入坏账,低估了长期限贡献:
三、老方法 Vintage 预估示例
未表现月各期限使用相同的汇总 Vintage 率(虚线),长短期限差异被抹平:
四、新方法预估示例(分期限)
新方法按期限独立计算 Vintage 率,短期限与长期限曲线分离,差异一目了然:
五、本金坏账 vs 收入坏账差异
新旧方法切换后,本金坏账差异几乎抵消(短期限负向 + 长期限正向,汇总 +$6万 USD);收入坏账差异显著为正(汇总 +$122万 USD),根源在于长期限产品收入/本金比更高,老方法用汇总 Vintage 率系统性低估了长期限收入风险。
使用指南
01_raw_data/{YYYYMM}/input/;③ 可选复制上月 output 的 prev_estimate.csv 到当月 input;④ 运行 Python 管道(如 step7_generate_html)生成本 HTML。1. 选择业务线/客群:点击头部 biz_line 与 user_flag 标签,筛选当前视图。
2. 调整系数或绝对值:在「Vintage 调整」中通过 TAG 切换「系数调整」或「绝对值调整」。系数表填系数(1.1=涨 10%);绝对值表直接改逾期率 %。二者双向联动。已表现月置灰不可编辑;TikTok/tt-cl 汇总行只读。
3. 应用与刷新:系数表填写后点「应用系数」;绝对值表修改后点「应用系数」或失焦自动同步。曲线与卡片实时更新。
4. 导出结果:右上角「导出风险明细(经营)」导出 V3 Vintage Excel;「导出预估结果(财务)」生成财务预估 Excel。
5. 乐观/悲观:在预估曲线上方展开「乐观/悲观版系数」,按业务线设置 RR 系数(默认 0.97/1.03)。
数据流与 HTML 生成流程
按每月一个文件夹组织:01_raw_data/{YYYYMM}/ 下含 input/(当期输入)与 output/(当期落表与归档)。HTML 的「当前月」数据来自当月 input/new_export.csv,「对比月」来自上月 output/ 的 rr_data / prev_estimate。
月度文件夹结构(示例:上月 202601、当月 202602)
01_raw_data/ ├── 202601/ ← 上月(对比月) │ └── output/ ← 上月落表结果:rr_data.json、pred_curve.json、prev_estimate.csv 等(供本月对比) ├── 202602/ ← 当月(本次运行) │ ├── input/ ← 本月输入:new_export.csv(必选)、prev_estimate 可选 │ └── output/ ← 本次运行写入:落表结果 + 归档(供下月对比) 02_process_files/temp/ ← Step1~6 中间产物;03_analysis_reports/01_overview/ ← 报告 HTML 输出 04_config_files/ ← vintage_coefficients.json、rm_rr_monitor_template_ezy.html.jinja、v4_pipeline_config.json
数据流与管道(Mermaid 流程图)
图例: 需手工操作 自动/产出
flowchart TB
subgraph MANUAL_PREP["📁 数据准备 【手工】"]
direction TB
M1[将 new_export.csv 放入当月 input/]
M2[可选:复制上月 output/prev_estimate.csv 到当月 input/]
end
subgraph SQL_PIPE["🖥️ SQL 管道(ODPS) 【手工执行】"]
direction TB
S01[01 实际数据处理]
S02[02 填充 6:3:1]
S03[03 订单打标·快照·导出]
S07[07 导出 prev_estimate]
S01 --> S02 --> S03
S03 --> NEW_EXPORT[new_export.csv]
S07 --> PREV_EST[prev_estimate.csv]
end
subgraph FOLDERS["📂 月度文件夹结构"]
direction LR
subgraph PREV_M["上月 202601"]
PREV_OUT[output/]
PREV_OUT --> RR_PREV[rr_data / prev_estimate 等]
end
subgraph CUR_M["当月 202602"]
CUR_IN[input/]
CUR_OUT[output/]
CUR_IN --> NEW_CUR[new_export.csv]
CUR_IN -.-> PREV_CUR[prev_estimate 可选]
end
end
subgraph PY_PIPE["🐍 Python 管道 【手工执行】"]
direction TB
P1[Step1 数据预处理]
P2[Step2 构建 rr_data]
P3[Step3~5 mix / flow / pred_curve / fee]
P6[Step6 合并 + 系数]
P7[Step7 Jinja 渲染 HTML]
P1 --> P2 --> P3 --> P6 --> P7
end
subgraph OUT["📄 产出"]
HTML[RM_V4_standalone.html]
REPORT[03_analysis_reports/01_overview/]
end
NEW_EXPORT -->|手工放入| CUR_IN
PREV_EST -.->|可选·手工放入| CUR_IN
RR_PREV -.->|对比月数据| P1
CUR_IN --> P1
P7 --> HTML
P7 --> CUR_OUT
HTML --> REPORT
手工环节:① 在 ODPS 依次执行 01→02→03→07;② 将 new_export.csv 放入当月 input;③ 可选复制 prev_estimate 到当月 input;④ 在本地执行 Python 管道(step7 或 run_v4_pipeline)。报告「当前月」= 当月 input/new_export,「对比月」= 上月 output。
预估方法论
cashloan / lzd / luvit / OFW / PPL / SMT:Vintage =
SUM(amount × dpd30_6_rate × 系数) / SUM(amount)TikTok:Vintage =
SUM(amount × dpd30_12_rate × 系数) / SUM(amount)(TikTok 观察期为 12 个月,已完整表现月 Vintage = dpd30_12)tt-cl:Vintage =
SUM(amount × dpd30_6_rate × 系数) / SUM(amount)(与 cashloan 一致,截断到 6 个月)dpd30_6 行始终取 dpd30_6_rate(含系数),dpd30_12 行始终取 dpd30_12_rate(不含系数)。
2026-01 为未表现月(MOB1 due 2026-02),DPD 用 6:3:1 填充;RR 链首个未表现(第 1 步 dpd5→dpd30)用 6:3:1,第 2~12 步沿用第 1 步的值。
| 1. DPD5 | 6:3:1 取自同分箱 2025-12、2025-11、2025-10 的实际 dpd5_rate:0.6×5.2% + 0.3×4.9% + 0.1×4.8% = 5.07% |
| 2. RR 链 | 12 步 RR 全未表现:第 1 步用 6:3:1,第 2~12 步沿用第 1 步的值;rr_dpd5→dpd30 × … × rr_dpd5_6→dpd30_6 ≈ 1.18 |
| 3. Vintage | DPD30@6M = DPD5 × RR 链:5.07% × 1.18 ≈ 5.98% |
| 4. 客群汇总 | 用 (rating, period) 分箱的 DPD 对分箱内所有订单计算预估逾期金额;总逾期金额 / 总成交金额 → CASHLOAN 新转化老客 2026-01 的 Vintage 曲线值。 |
| 5. Roll Rate 汇总 | 用汇总客群的 DPD 再计算 Roll Rate 矩阵,用于汇总查看。 |
有效快照表(每日 ds 分区)
| 表名 | 粒度 | 主要字段 |
|---|---|---|
| rm_matrix_snapshot_fine_ezy | dealmonth × biz_line × user_flag × period_bucket × rating | list_amount_sum, dpd5_rate~dpd30_6_rate, rr_dpd5_to_dpd30~rr_dpd5_6_to_dpd30_6 |
| rm_matrix_snapshot_ezy | dealmonth × biz_line × user_flag | 同上(汇总后) |
| dpd5_prediction_result_ezy | 订单级 | order_id, dealmonth, biz_line, user_flag, rating, period_bucket, dpd5_base, dpd5_prob |
| order_dpd30_6_prediction_ezy | 订单级 | order_id, default_rate_pred, dpd30_6_pred |
03 先落 rm_matrix_snapshot_fine / rm_matrix_snapshot,再输出 rm_unified_export → new_export.csv
指标口径
| 指标 | 公式/定义 |
|---|---|
| 算数均值 | 当前月−对比月 Vintage 差异的平均值;目标:接近 0(±0.5 pp 内较优) |
| 波动率 | 当前月预估(剔除最新月)vs 对比月预估的差异方差(pp²);目标:越低越好(< 1 pp² 较优) |
| 历史本金/手续费/利息/年化风险逾期率 | 第二行四张卡片;往前推七个月剔除最新月;手续费/利息按本金口径同比例推算 |
| 逾期率卡片 | 最新月口径:预估逾期率(含系数)、基准逾期率(系数=1)、lift:xxx,逾期率vs基准 |
| 手续费/利息加权 | 同上为差值;Σ(fee/interest×default_rate)/Σ(fee/interest),与本金同受 Vintage 系数调整 |
| DPD 率分母 | 有表现金额 due_amt(非总 list_amount) |
SQL 执行与数据
01 → 02 → 03 → 04 → 05 → 06 → 07
| 01 | 01_actual_data_processing_ezy(订单特征、DPD、RR、状态矩阵) |
| 02 | 02_filling_ezy(6:3:1 填充、RR 降级、填满) |
| 03 | 03_export_and_save_ezy(订单打标、快照、统一导出 rm_unified_export_04_ezy) |
| 04 | 04_insert_vintage_coefficients_from_snapshot_ezy(可选 INSERT 系数) |
| 05 | 05_apply_coefficients_ezy(系数调整) |
| 06 | 06_insert_to_phi_risk_listing_delq_rt_rm_ezy(落表) |
| 07 | 07_export_prev_estimate_rt_rm_ezy(导出 prev_estimate.csv) |
| new_export.csv | 01_raw_data/ ← rm_unified_export_04_ezy(03 产出) |
| prev_estimate.csv | 01_raw_data/(对比月数据,07 产出 rm_prev_estimate_unified_ezy 导出) |
| fee/interest 已合并 | new_export.csv 含 principal/fee/interest 加权逾期率 |
cd 02_process_files && python -m v4_pipeline.step7_generate_html
报告模块
| 模块 | 说明 |
|---|---|
| 头部导出 | 「导出风险明细(经营)」:V3 Vintage 多 Sheet;「导出预估结果(财务)」:XLSX 六部分(当前月/对比月预估结果、差值;当前月/对比月年化逾期、差值·带条件格式) |
| 坏账计提卡片 | 菲律宾全业务汇总 + 各业务线:历史本金加权逾期率(往前推7月剔除最新月)、对比月预估、lift,与图2口径一致 |
| KPI 卡片 | 一行五张差值卡片(当前月−对比月):历史本金加权逾期率、历史收入加权逾期率、历史本金坏账、历史收入坏账、波动率;时间标签随数据动态 |
| Vintage 调整(TAG 切换) | 系数调整 / 绝对值调整 通过 TAG 切换。系数表填系数(1.1=涨 10%);绝对值表直接改逾期率 %;二者双向联动。已表现月置灰;TikTok/tt-cl 汇总行只读。填写→应用→刷新 |
| 预估曲线数据表 | 当前月/乐观版/悲观版/对比月/差异;乐观、悲观行弱化展示(浅灰背景) |
| 预估曲线 | 按 dealmonth 展示 Vintage。灰线=new_export 实际值(V3 口径、系数=1);橙线=叠加系数后的当前月预估,与明细表「本月」同源同口径;蓝线=prev_estimate,与明细表「上月」同源同口径。乐观/悲观版系数可展开按业务线调(默认 0.97/1.03) |
| DPD / RR 矩阵 | dpd5~dpd30_12;RR 链 dpd5→dpd30、dpd30→dpd5_2 等 |
常见问题
| 已表现月置灰 | Vintage 调整表中,已表现月不可编辑(灰底)。普通业务(含 tt-cl)6 个月、TikTok 12 个月 |
| TikTok/tt-cl 汇总行只读 | 汇总行由分客群(新客、新转化老客等)加权得出,与预估曲线数据表一致,不可单独编辑 |
| 系数与绝对值联动 | 改系数→绝对值表自动更新;改绝对值→点「应用系数」或失焦后系数表同步。仅未表现月参与 |
| 对比月数据无 | 放 prev_estimate.csv 于 01_raw_data;或 *预估*.xlsx;或 rr_data 与对比月有重叠月份 |
| 无数据 | 检查 new_export 含 biz_line、user_flag、dealmonth、dpd5_rate、rr_* |
| TT/LZD 客群 | Excel「存量老客/中间客」→ 新转化老客 |
| 系数应用 | 在 Vintage 调整面板填写系数 → 应用系数 → 刷新。仅未表现 dealmonth 生效 |
| 05 产出表 | rm_listing_prediction_coefficient_adjusted_ezy(listing_id, dealmonth, product_category, principal, default_rate, dt, biz_line 等),供 06 落表 |