Phân tích Vintage - Vintage Analysis
Phân tích Vintage - Vintage Analysis
Vintage Analysis được sử dụng rộng rãi trong Phân tích danh mục rủi ro. Theo tìm hiểu GG thì sự tích của bài này xuất phát từ ngành sản xuất rượu vang, người làm rượu sẽ đánh giá chất lượng rượu dựa trên niên vụ của nó.
Vay mượn khái niệm này, trong tài chính, Vintage Analysis là phương pháp đánh giá chất lượng của các khoản vay bằng cách phân nhóm chúng theo khoảng thời gian được phát hành (giải ngân). Thay vì trộn lẫn tất cả các khoản vay cũ và mới vào cùng một rổ để tính toán tỷ lệ nợ xấu, sẽ theo dõi hành vi trả nợ của từng "thế hệ" (Cohort) khoản vay qua thời gian.
1.Concept nền tảng
Phân tích Vintage nó sẽ theo dõi các khoản vay được giải ngân trong cùng một khoảng thời gian (có thể là cùng tháng hoặc cùng quý), sau đó quan sát xem sự thay đổi tỷ lệ nợ xấu theo thời gian của các rổ danh mục khoản vay này thông qua bảng Cohort.
Để làm được bài Vintage này dữ liệu sẽ phải có 4 thông tin bắt buộc:
Mã / Danh sách các khoản vay
Ngày tạo / Ngày bắt đầu của khoản vay
Thời điểm quan sát : cuối mỗi tháng hoặc cuối mỗi quý
Ngày quá hạn / Nhóm nợ của khoản vay tại thời điểm quan sát: tối thiểu có 1 trong 2 thông tin này để flag được đâu là khoản vay xấu, thông thường sẽ flag xấu theo các ngưỡng 30,60,90 ngày quá hạn để chạy thử.
Từ các thông tin có được từ dữ liệu gốc yêu cầu này sẽ phải cần xoay dữ liệu theo 3 trụ cột:
Bảng Cohort : tập hợp tất cả các khoản vay được giải ngân trong cùng một khoảng thời gian (trong cùng một tháng hoặc cùng một quý). Ví dụ: Cohort Tháng 1/2023 bao gồm toàn bộ các khoản vay được mở trong tháng 1 năm 2023.
MOB - Months on Books - Tuổi của khoản vay : Đây là thước đo thời gian kể từ khi khoản vay được giải ngân đến thời điểm quan sát. Ví dụ: Khoản vay được mở ở tháng 1/2023 thì tháng 2/2023 sẽ là MOB = 1, tháng 3/2023 là MOB = 2,... Khoản vay được mở ở tháng 3/2023 thì tháng 4/2023 có MOB = 1,...
Cumulative Default Rate - Tỷ lệ nợ xấu lũy kế : % dư nợ hoặc số lượng khoản vay trong một Cohort đã bị chuyển thành xấu tính đến một kỳ MOB nhất định.
Mô tả chay thì sẽ hơi khó hình dung, tôi sẽ ví dụ trên bộ dữ liệu Home Credit Default Risk tải trên Kaggle
2. Mô tả dữ liệu
Bộ Home Credit Default Risk là bộ data khá phức tạp và có các đủ thông tin tín dụng phục vụ 1 số bài toán trong Quản trị rủi ro, cả xây dựng model và báo cáo quản trị danh mục.
Với bài phân tích Vintage này, khi đã xác định được các thông tin cần lấy ra từ bộ dữ liệu thì chỉ cần trích lọc từ các bảng sau:
bureau_balance - key chính của bài này
Bảng này chứa thông tin trạng thái lịch sử hàng tháng của các khoản vay cũ mà khách hàng đã vay tại các tổ chức tín dụng khác - tương tự như dữ liệu CIC trên thực tế.
SK_ID_BUREAU - Mã khoản vay : trong bộ dữ liệu này có thể hiểu như mã khách hàng tại CIC, mã này sẽ cần liên kết để nối về mã khách hàng nội bộ
MONTHS_BALANCE - Thời điểm quan sát & Ngày tạo khoản vay : vì trong bộ dữ liệu này không có thể hiện cụ thể dữ liệu dạng thời gian mà chỉ để dạng số thứ tự tháng lùi tới thời điểm mới nhất, ví dụ: 0 là tháng hiện tại, -1 là tháng trước. Không vấn đề gì, vẫn có thể lấy MONTHS_BALANCE nhỏ nhất (xa nhất trong quá khứ) làm Tháng mở khoản vay (open_month) và từ đó tính ra được tuổi của khoản vay (MOB). Thông thường chỉ cần thời gian khoảng 12-24 tháng cũng đã có thể làm, trong bộ dữ liệu thời gian quan sát lại rất dài, có khoản quan sát lên tới 96 tháng. Để có thể đảm bảo đủ chiều sâu quan sát, tôi sẽ lọc chỉ lấy các khoản có trên 20 tháng quan sát.
STATUS - Nhóm nợ / Ngày quá hạn: cũng là 1 điểm đặc biệt của bộ dữ liệu này, không thể hiện sẵn số ngày quá hạn mà đã được convert về dạng status ký hiệu, trong bảng mô tả bộ dữ liệu có mô tả rất rõ và vẫn có thể quy về flag ngày quá hạn phù hợp:
STATUS = 0: khoản vay không quá hạn
STATUS = 1: khoản vay quá hạn trong khoảng từ 1-30 ngày
STATUS = 2: khoản vay quá hạn trong khoảng từ 31-60 ngày
STATUS = 3: khoản vay quá hạn trong khoảng từ 61-90 ngày
STATUS = 4: khoản vay quá hạn trong khoảng từ 91-120 ngày
STATUS = 5: khoản vay quá hạn trên 120 ngày
STATUS = C: khoản vay đã đóng
STATUS = X: không xác định được trạng thái - unknown
Trên thực tế sẽ thường chạy Vintage ở nhiều mức quy định xấu khác nhau. VD như 1 phiên bản flag lấy tất cả quá hạn trên 30 ngày rồi chạy Vintage, tương tự chạy các phiên bản khác với flag nợ quá hạn trên 60 ngày/90 ngày.
Ví dụ ở đây tôi sẽ làm mẫu flag khách hàng xấu là tất cả những khách hàng có khoản quá hạn trên 60 ngày, nghĩa là lấy tất cả các khoản có trạng thái STATUS = 3-4-5 coi là khách hàng xấu. Mọi người hoàn toàn có thể flag lại chạy theo ngưỡng khác.
bureau - thông tin khoản vay
Bảng này chứa các thông tin tĩnh của khoản vay (như loại tiền tệ, số tiền vay...). Trong bài toán này, nó đóng vai trò là cầu nối quan trọng. Nó giúp liên kết mã khoản vay (SK_ID_BUREAU) với mã khách hàng định danh (SK_ID_CURR), mục đích để biết chính xác khách hàng tại CIC là khách hàng nào trong dữ liệu nội bộ, với bài phân tích Vintage không cần thiết khai thác các thông tin khác ở bảng này.
application_train - hồ sơ khoản vay
Đây là bảng dữ liệu gốc chứa hồ sơ của người vay tại thời điểm nộp đơn (như Giới tính CODE_GENDER, Học vấn NAME_EDUCATION_TYPE, Tổng thu nhập AMT_INCOME_TOTAL...).
Với phân tích Vintage không cần thiết sử dụng các thông tin này, tuy nhiên trên thực tế khi nghiên cứu hành vi vay sẽ thường theo dõi theo sản phẩm hoặc phân khúc khác nhau. Tương tự như xây Scorecard chấm điểm có nhiều bộ thẻ điểm khác nhau chứ không phải 1 bộ dùng chung tất cả: ví dụ như thẻ điểm cho vay mua nhà, thẻ điểm cho vay sản xuất kinh doanh,...
Trong bộ Home Credit này là công ty tài chính, sản phẩm nó không thực sự đa dạng như Bank, trong bộ dữ liệu chỉ có 2 loại sản phẩm:
Cash loans: vay tiền mặt, với các công ty tài chính kiểu Home Credit thì đây là dạng vay tín chấp, tiền về thẳng tài khoản, trả dần gốc + lãi theo kỳ hạn
Revolving loans: đây là dạng vay quay vòng theo 1 hạn mức nhất định, tính lãi theo số tiền vay, kiểu thẻ tín dụng hoặc vay thấu chi. Ví dụ khoản được cấp hạn mức 100 triệu, trong tháng 15 triệu thì sẽ chỉ tính phí và lãi trong số 15 triệu đã tiêu.
Tập khách hàng của Home Credit hướng tới là các khoản vay nhỏ lẻ, vay nhanh, nó không thực sự phân hóa hành vi mạnh như các sản phẩm truyền thống. 1 phần nữa là bộ dữ liệu khá nhỏ, tôi sẽ demo bằng full tập khách hàng chứ không chia nhỏ, mọi người hoàn toàn có thể chia nhỏ hơn để test và so sánh.
Quy trình xử lý dữ liệu để lấy các thông tin phục vụ bài này :
bureau_balance inner join bureau thông qua trường SK_ID_BUREAU : Lọc MONTHS_BALANCE lấy các khoản có trên 20 tháng quan sát
bureau inner join application_train thông qua trường SK_ID_CURR : Lọc theo sản phẩm vay, giới tính ... (tùy chọn có thể làm) : demo ở đây tôi không lọc
3. Thực hành
Với sự trợ giúp của AI thì việc coding hay là sử dụng các công cụ xử lý bây giờ không phải là vấn đề quá lớn, fresher cũng hoàn toàn có thể xây dựng được 1 luồng xử lý dữ liệu đủ dùng và code được, khi hiểu rõ nguyên lý thì có thể chuyển qua các công cụ khác nhau, xử lý bằng Excel, Python, PowerBI,... đều được. Các bài toán trong rủi ro thì nặng khả năng diễn giải và biết rõ mục đích, ứng dụng của nó.
Tôi sẽ mô phỏng bằng code Python và mô phỏng trên Excel để dễ hình dung ý nghĩa và cách tính bài này
Bước 1: Import và xử lý dữ liệu
Tải dữ liệu: Đọc các bảng thô, trong đó tập trung xử lý bảng bureau_balance (lịch sử trả nợ hàng tháng).
Xác định Cohort (open_month): Gom nhóm theo từng khoản vay và tìm ra tháng đầu tiên nó xuất hiện trong lịch sử. Đây chính là "Thế hệ khoản vay" (Cohort) của chúng ta.
Lọc nhiễu: Tính thời gian tồn tại của khoản vay (window) và loại bỏ các khoản vay dưới 20 tháng vì chúng chưa đủ thời gian để bộc lộ rõ rủi ro nợ xấu
Gắn cờ Nợ xấu (status): Đánh dấu 1 (Nợ xấu) cho những tháng khách hàng chậm trả từ 60 ngày trở lên (trạng thái 3, 4, 5).
Tính Tuổi khoản vay (MOB): Đưa mọi khoản vay về chung một vạch xuất phát bằng cách lấy tháng quan sát hiện tại trừ đi tháng giải ngân (open_month).
Bước 2: Tính toán Vintage
Tính Tỷ lệ nợ xấu lũy kế. Cụ thể:
Tính Mẫu số (sta_sum): Đếm xem mỗi thế hệ (open_month) có tổng cộng bao nhiêu khoản vay được giải ngân thành công.
Xác định Nợ xấu phát sinh (first_bad_mob): Chỉ lấy tháng kinh nghiệm (MOB) đầu tiên mà khoản vay bị nợ xấu để tránh đếm trùng. Sau đó đếm xem tại mỗi tháng có bao nhiêu khoản vay mới phát sinh xấu (new_bad_count).
Tạo khung Ma trận (vintage): Lập một bộ khung chứa tất cả các tọa độ kết hợp giữa open_month và MOB.
Cộng dồn tự động (cumsum): Map số lượng khoản vay hỏng vào bộ khung, chỗ nào không có thì điền 0 (fillna(0)). Sau đó dùng hàm .cumsum() thần thánh để cộng dồn nợ xấu từ các tháng trước đó lên tháng hiện tại (due_count).
Chốt tỷ lệ (sta_rate): Lấy Nợ xấu lũy kế (Tử số) chia cho Tổng giải ngân ban đầu (Mẫu số) để ra kết quả tỷ lệ %.
Bước 3: Pivot bảng và vẽ biểu đồ
Xoay dữ liệu (Pivot): Hàm .pivot() chuyển đổi dữ liệu từ dạng bảng dài (Long format) sang dạng Ma trận lưới (Wide format), trong đó: Hàng là Tháng giải ngân (open_month), Cột là Tuổi khoản vay (month_on_book) và giá trị ở giữa là Tỷ lệ nợ xấu (sta_rate).
Vẽ biểu đồ (Line Chart): Sử dụng matplotlib để vẽ các đường Vintage. Để biểu đồ không bị rối, lấy 15 tháng MOB gần nhất vẽ lên hình
Làm mượt đường vẽ: Hàm .dropna() giúp loại bỏ các điểm dữ liệu trống (NaN), đảm bảo đường nét vẽ được nối liền mạch và không bị đứt gãy.
Có thể thấy có rất nhiều đường Vintage của các MOB khác nhau. Thay vì nhóm theo từng tháng giải ngân (open_month), code cộng dồn toàn bộ số lượng giải ngân (total_sta_sum) và gom nhóm nợ xấu phát sinh theo từng tháng tuổi (month_on_book) của tất cả các khoản vay. Kết quả là đường portfolio_curve đại diện cho cả danh mục.
Nhìn cái biểu đồ lũy kế cộng dồn tỷ lệ khách hàng xấu này có thể thấy rằng đoạn dốc thẳng đứng tới khoảng MOB 15 rồi gãy trend chuyển sang đi ngang, nghĩa là tốc độ tăng số lượng khách hàng xấu sẽ tăng mạnh trong khoảng 15 tháng đầu tiên của khoản vay, sau đó sẽ ổn định. Có thể đưa ra kết luận:
Hầu hết các khách hàng phát sinh hành vi quá hạn trên 60 ngày sẽ bộc lộ hành vi trong vòng 15 tháng đầu tiên của khoản vay, các khách hàng mà vượt qua giai đoạn 15 tháng đầu tiên này mà vẫn giữ được hành vi tốt thì sẽ là các khách hàng rất chất lượng
Hoàn toàn có thể đề xuất các bước tiếp theo:
Tập trung hỏa lực: Bộ phận thu hồi nợ (nhân sự gọi điện nhắc nợ, thu hồi nợ hiện trường) nên được phân bổ tối đa để chăm sóc và bám sát các khoản vay có tuổi đời từ MOB 1 đến MOB 15.
Tối ưu chi phí: Sau tháng thứ 15, vì tỷ lệ phát sinh nợ xấu mới rất thấp, có thể giảm bớt cường độ theo dõi định kỳ đối với các khách hàng này, qua đó tiết kiệm được đáng kể chi phí vận hành.
Hoàn toàn có thể dự báo được tỷ lệ tổn thất tối đa của toàn bộ danh mục là bao nhiêu
Nếu các khoản vay của Home Credit có kỳ hạn trung bình là 36 tháng. Nếu không có phân tích Vintage, có thể nghĩ rằng phải đợi đủ 3 năm mới biết chính sách duyệt vay có thành công hay không.
Nhưng với insight này, chỉ cần theo dõi các thế hệ khoản vay mới (Cohorts) trong khoảng 12 - 15 tháng là đã có thể kết luận mô hình chấm điểm tín dụng hiện tại có hiệu quả hay không để tiến hành Validate ngay lập tức.
Bộ phận Sản phẩm có thể cấu trúc các gói vay theo hướng: yêu cầu trả trước hoặc có thế chấp cao hơn, hoặc cơ cấu thu phí thẩm định/phí bảo hiểm ngay từ đầu kỳ để bù đắp sớm rủi ro, đảm bảo điểm hòa vốn diễn ra trước MOB 15. Tăng hạn mức vay, ưu đãi cho các khách hàng tốt sau 15 tháng.
Export kết quả bảng ra Excel cho dễ hình dung
Export ra kết quả bảng Cohort tại từng MOB cho dễ hình dung công thức của phần code kia và tôi đã vẽ hình tại đây
Mỗi hàng xem tại tháng giải ngân, mỗi cột = 1 MOB. Giá trị tại mỗi ô là tổng số khoản vay của vintage đó đã từng rơi vào nợ xấu tính đến tháng thứ mấy.
Vì là bộ này không có ngày cụ thể mà chỉ là đếm số tháng quá khứ tới hiện tại nên chỗ này hơi rối.
Ví dụ: Tại dòng open_month = -96 có 37046 khoản được tạo (đây là ngày đầu tiên xuất hiện của dữ liệu thôi nên nó không chính xác là ngày tạo của khoản vay nên tại MOB = 0 đã có nợ xấu rồi), qua MOB = 1 có 187 khoản trong số 37046 phát sinh xấu, qua MOB = 2 có 238 khoản trong số 37046 phát sinh xấu phát sinh xấu. Tương tự tại dòng open_month = -95 có 3175 khoản vay được tạo, qua MOB 1 không có khoản nào phát sinh xấu trong số 3175 khoản đó,...