🎯 Mục tiêu bài học
- Xây dựng Vintage Analysis để theo dõi chất lượng khoản vay theo thời gian
- Phân tích DPD (Days Past Due) Aging và bucket migration
- Tính Collection Efficiency Ratio (CER)
- Phân tích Loan Portfolio theo product mix, region, và size
| Thông tin | Chi tiết |
|---|---|
| ⏱️ Thời lượng | 2 giờ |
| 📖 Chủ đề chính | Vintage Analysis, DPD Aging, Collection, Portfolio Mix |
| 💡 Kiến thức cần có | Bài 04 — Credit Risk Analysis |
| 🎯 Output | Loan Portfolio Analysis Report |
📖 Thuật ngữ quan trọng
| Thuật ngữ | Tiếng Việt | Mô tả |
|---|---|---|
| Vintage | Đời khoản vay | Nhóm khoản vay theo tháng giải ngân |
| DPD | Days Past Due | Số ngày quá hạn thanh toán |
| MOB | Months on Book | Số tháng kể từ ngày giải ngân |
| Delinquency | Nợ quá hạn | Khoản vay không thanh toán đúng hạn |
| Bucket | Nhóm nợ quá hạn | Phân loại theo mức DPD (0, 1-30, 31-60, 61-90, 90+) |
| Roll Rate | Tỷ lệ xấu đi | % khoản vay chuyển từ bucket thấp sang cao |
| CER | Collection Efficiency | Tỷ lệ thu hồi = Số tiền thu được / Số tiền phải thu |
| Write-off | Xóa nợ | Xóa khoản vay khỏi sổ sách (thường DPD > 360) |
| Recovery | Thu hồi | Thu lại tiền từ khoản vay đã write-off |
| Portfolio Mix | Cơ cấu danh mục | Tỷ trọng các loại sản phẩm trong danh mục |
Checkpoint
Vintage Analysis nhóm khoản vay theo tháng giải ngân và theo dõi performance theo MOB. DPD Buckets phân loại: 0 (current), 1-30 (X), 31-60 (1), 61-90 (2), 90+ (3+ = NPL). CER = Tiền thu / Tiền phải thu — đo hiệu quả thu nợ. Roll Rate cho biết % khoản vay xấu đi mỗi tháng.
📊 Vintage Analysis
Vintage Analysis là gì?
Vintage Analysis nhóm khoản vay theo tháng giải ngân (vintage) và theo dõi default rate cộng dồn theo MOB (Months on Book). Giúp trả lời: "Khoản vay giải ngân tháng nào có chất lượng tốt nhất?"
Trục Y: Default Rate (%) | Trục X: MOB (Months on Book)
| MOB | Vintage Q1 | Vintage Q2 | Vintage Q3 | Nhận xét |
|---|---|---|---|---|
| 1 | 0.5% | 0.3% | 0.2% | Mới giải ngân |
| 3 | 1.5% | 1.0% | 0.8% | Bắt đầu có delinquency |
| 6 | 3.0% | 2.2% | 1.8% | Default tăng nhanh |
| 9 | 4.5% | 3.5% | 2.8% | |
| 12 | 5.5% | 4.2% | 3.5% | Seasoning period |
| 18 | 7.0% | 5.5% | 4.5% | |
| 24 | 8.0% | 6.5% | 5.2% | Bão hòa |
→ Vintage Q1 xấu hơn Q2, Q3 → Chính sách cho vay đã siết chặt hơn từ Q2
SQL: Vintage Analysis
1-- 1. Vintage Analysis — Default Rate theo quý giải ngân2WITH loan_vintage AS (3 SELECT 4 application_id,5 CONCAT(YEAR(application_date), '-Q', DATEPART(QUARTER, application_date)) AS vintage,6 application_date,7 default_flag,8 loan_amount9 FROM fact_loan_application10 WHERE status = 'Approved'11)12SELECT 13 vintage,14 COUNT(*) AS total_loans,15 SUM(loan_amount) AS total_amount,16 SUM(default_flag) AS defaults,17 ROUND(AVG(default_flag) * 100, 2) AS default_rate_pct,18 ROUND(AVG(loan_amount), 0) AS avg_loan_size19FROM loan_vintage20GROUP BY vintage21ORDER BY vintage;SQL: Vintage Curve (Default theo MOB)
1-- 2. Vintage curve — theo dõi default theo MOB2WITH loan_mob AS (3 SELECT 4 l.application_id,5 CONCAT(YEAR(l.application_date), '-Q', DATEPART(QUARTER, l.application_date)) AS vintage,6 DATEDIFF(MONTH, l.application_date, p.payment_date) AS mob,7 CASE WHEN p.days_past_due > 90 THEN 1 ELSE 0 END AS is_delinquent8 FROM fact_loan_application l9 JOIN fact_loan_payment p ON l.application_id = p.application_id10 WHERE l.status = 'Approved'11)12SELECT 13 vintage,14 mob,15 COUNT(DISTINCT application_id) AS active_loans,16 SUM(is_delinquent) AS delinquent_count,17 ROUND(AVG(CAST(is_delinquent AS FLOAT)) * 100, 2) AS delinquency_rate_pct18FROM loan_mob19WHERE mob BETWEEN 1 AND 2420GROUP BY vintage, mob21ORDER BY vintage, mob;🗂️ DPD Aging & Bucket Analysis
DPD Buckets
| Bucket | DPD (Ngày quá hạn) | Trạng thái | Màu sắc |
|---|---|---|---|
| Bucket 0 (Current) | DPD = 0 | ✅ Đúng hạn | 🟩 |
| Bucket X | DPD 1–30 | ⚠️ Quá hạn nhẹ | 🟨 |
| Bucket 1 | DPD 31–60 | ⚠️ Quá hạn | 🟧 |
| Bucket 2 | DPD 61–90 | ❗ Quá hạn nặng | 🟧 |
| Bucket 3 (NPL) | DPD 91–180 | ❌ Nợ xấu nhóm 3 | 🟥 |
| Bucket 4 (NPL) | DPD 181–360 | ❌ Nợ xấu nhóm 4 | 🟥 |
| Bucket 5 (Write-off) | DPD > 360 | 🚫 Xóa nợ | ⬛ |
SQL: DPD Distribution
1-- 3. DPD Aging Distribution2SELECT 3 CASE 4 WHEN p.days_past_due = 0 THEN 'Bucket 0 (Current)'5 WHEN p.days_past_due <= 30 THEN 'Bucket X (1-30 DPD)'6 WHEN p.days_past_due <= 60 THEN 'Bucket 1 (31-60 DPD)'7 WHEN p.days_past_due <= 90 THEN 'Bucket 2 (61-90 DPD)'8 ELSE 'Bucket 3+ (90+ DPD = NPL)'9 END AS dpd_bucket,10 COUNT(*) AS payment_count,11 ROUND(AVG(p.amount_due), 0) AS avg_amount_due,12 ROUND(AVG(p.amount_paid), 0) AS avg_amount_paid,13 ROUND(SUM(p.amount_due - p.amount_paid), 0) AS total_shortfall14FROM fact_loan_payment p15GROUP BY 16 CASE 17 WHEN p.days_past_due = 0 THEN 'Bucket 0 (Current)'18 WHEN p.days_past_due <= 30 THEN 'Bucket X (1-30 DPD)'19 WHEN p.days_past_due <= 60 THEN 'Bucket 1 (31-60 DPD)'20 WHEN p.days_past_due <= 90 THEN 'Bucket 2 (61-90 DPD)'21 ELSE 'Bucket 3+ (90+ DPD = NPL)'22 END23ORDER BY dpd_bucket;SQL: Roll Rate Analysis
1-- 4. Roll Rate — % khoản vay xấu đi theo tháng2-- (Simplified version using payment_status transitions)3WITH monthly_status AS (4 SELECT 5 p.application_id,6 FORMAT(p.payment_date, 'yyyy-MM') AS payment_month,7 MAX(p.days_past_due) AS max_dpd,8 CASE 9 WHEN MAX(p.days_past_due) = 0 THEN 'Current'10 WHEN MAX(p.days_past_due) <= 30 THEN 'DPD 1-30'11 WHEN MAX(p.days_past_due) <= 60 THEN 'DPD 31-60'12 WHEN MAX(p.days_past_due) <= 90 THEN 'DPD 61-90'13 ELSE 'DPD 90+'14 END AS dpd_status15 FROM fact_loan_payment p16 GROUP BY p.application_id, FORMAT(p.payment_date, 'yyyy-MM')17)18SELECT 19 dpd_status,20 COUNT(DISTINCT application_id) AS loan_count,21 ROUND(COUNT(DISTINCT application_id) * 100.0 / 22 SUM(COUNT(DISTINCT application_id)) OVER(), 2) AS pct_of_total23FROM monthly_status24GROUP BY dpd_status25ORDER BY dpd_status;💰 Collection Efficiency
Collection Efficiency Ratio (CER)
1-- 5. Collection Efficiency tổng thể và theo tháng2SELECT 3 FORMAT(payment_date, 'yyyy-MM') AS payment_month,4 COUNT(*) AS total_payments,5 SUM(amount_due) AS total_due,6 SUM(amount_paid) AS total_paid,7 ROUND(SUM(amount_paid) * 100.0 / NULLIF(SUM(amount_due), 0), 2) AS cer_pct,8 SUM(CASE WHEN payment_status = 'On-time' THEN 1 ELSE 0 END) AS on_time_count,9 ROUND(AVG(CASE WHEN payment_status = 'On-time' THEN 1.0 ELSE 0 END) * 100, 1) AS on_time_pct10FROM fact_loan_payment11GROUP BY FORMAT(payment_date, 'yyyy-MM')12ORDER BY payment_month;CER theo Product Type
1-- 6. Collection Efficiency theo loại sản phẩm2SELECT 3 pr.product_type,4 COUNT(p.payment_id) AS total_payments,5 ROUND(SUM(p.amount_paid) * 100.0 / NULLIF(SUM(p.amount_due), 0), 2) AS cer_pct,6 ROUND(AVG(CASE WHEN p.payment_status = 'On-time' THEN 1.0 ELSE 0 END) * 100, 1) AS on_time_pct,7 ROUND(AVG(p.days_past_due), 1) AS avg_dpd8FROM fact_loan_payment p9JOIN fact_loan_application l ON p.application_id = l.application_id10JOIN dim_product pr ON l.product_id = pr.product_id11GROUP BY pr.product_type12ORDER BY cer_pct DESC;Portfolio Mix Analysis
1-- 7. Portfolio mix — cơ cấu danh mục theo product type2SELECT 3 pr.product_type,4 COUNT(*) AS loan_count,5 ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 1) AS pct_count,6 SUM(l.loan_amount) AS total_amount,7 ROUND(SUM(l.loan_amount) * 100.0 / SUM(SUM(l.loan_amount)) OVER(), 1) AS pct_amount,8 ROUND(AVG(l.default_flag) * 100, 2) AS default_rate_pct9FROM fact_loan_application l10JOIN dim_product pr ON l.product_id = pr.product_id11WHERE l.status = 'Approved'12GROUP BY pr.product_type13ORDER BY total_amount DESC;Checkpoint
Vintage Analysis theo dõi chất lượng khoản vay theo tháng giải ngân — vintage nào default rate cao cần review chính sách. DPD Buckets phân loại nợ: Current → X → 1 → 2 → 3+(NPL). CER đo hiệu quả thu nợ (target > 95%). Portfolio Mix cho biết cơ cấu rủi ro: quá tập trung vào unsecured = rủi ro cao.
📋 Tổng kết
Kiến thức đã học
| Chủ đề | Nội dung chính |
|---|---|
| Vintage Analysis | Theo dõi performance theo tháng giải ngân (MOB) |
| DPD Buckets | Phân loại nợ: Current → X → 1 → 2 → 3+ |
| Collection Efficiency | CER = Amount Collected / Amount Due |
| Portfolio Mix | Cơ cấu danh mục theo sản phẩm, khu vực |
| Concentration Risk | Rủi ro tập trung quá nhiều vào 1 segment |
Key Takeaways
- ✅ Vintage Analysis phát hiện chính sách tín dụng lỏng/chặt theo từng thời kỳ
- ✅ DPD Bucket 3+ = NPL — cần theo dõi chặt chẽ flow rates giữa các bucket
- ✅ CER > 95% là target chuẩn — CER thấp báo hiệu vấn đề thu hồi nợ
- ✅ Portfolio diversification giảm concentration risk
Câu hỏi tự kiểm tra
- Vintage Analysis giúp phát hiện vấn đề gì trong chính sách tín dụng?
- DPD Bucket X khác Current như thế nào?
- CER 85% có đáng lo ngại không? Tại sao?
- Tại sao cần đa dạng hóa danh mục cho vay?
Bài tiếp theo: Customer Segmentation →
🎉 Tuyệt vời! Bạn đã thành thạo Loan Portfolio Analysis!
Nhớ: Vintage + DPD + CER = bộ 3 theo dõi sức khỏe danh mục cho vay. Mọi ngân hàng đều cần monitoring portfolio liên tục!
