sushmitha-lab/Freddie-mac-mortgage-risk-analytics

GitHub: sushmitha-lab/Freddie-mac-mortgage-risk-analytics

将 Freddie Mac 抵押贷款公开数据通过 Snowflake、dbt 星型模型和 Streamlit 仪表板转化为可交互的信用风险分析平台,内置符合行业标准的违约检测逻辑。

Stars: 0 | Forks: 0

# Freddie Mac 抵押贷款风险分析 **🔗 [在线应用](https://freddie-mac-mortgage-risk-analytics.streamlit.app/) · [GitHub 仓库](https://github.com/sushmitha-lab/Freddie-mac-mortgage-risk-analytics)** 这是一个端到端的分析工程项目,旨在将 Freddie Mac 公开的单户贷款级别数据集转化为维度数据仓库,并配备一个 Streamlit 应用程序,用于在投资组合级别和贷款级别进行风险探索。 **数据处理管道:** Freddie Mac SFLLD → Snowflake(原始数据落地) → dbt(staging → marts) → Streamlit 应用 ## 本项目的作用 抵押贷款违约是消费信贷领域核心的风险问题之一。本项目构建了能够大规模回答该问题的基础设施:摄取原始的贷款级别数据,将其建模为规范的星型模型,并应用与信用风险团队实际定义违约方式相一致的违约检测规则——*即首次严重违约(逾期 90 天以上)或确认的损失事件中较早发生者*。 **数据范围:** 涵盖 2018–2020 年发放年份的 150,000 笔贷款和约 620 万条月度表现记录,直接来源于 Freddie Mac 官方公开数据集。 ## 架构 ``` Freddie Mac SFLLD (pipe-delimited text files) │ ▼ Snowflake RAW schema (setup/01_snowflake_infrastructure.sql) - 6 landing tables, all VARCHAR, loaded via PUT + COPY INTO │ ▼ dbt staging layer (models/staging/) - stg_loan_originations: unions & type-casts 3 vintage years - stg_loan_performance: unions & type-casts 3 vintage years │ ▼ dbt marts layer (models/marts/) - dim_date — calendar dimension, 1999–2026 - dim_borrower — credit score & DTI bands at loan grain - dim_loan_terms — loan purpose, occupancy, channel (decoded) - fct_loan_originations — 1 row per loan, origination-time measures - fct_loan_payments — 1 row per loan per month, incl. default flags │ ▼ Streamlit app (app/streamlit_app.py) - Portfolio Overview: default rate by credit band, vintage, purpose, occupancy - Loan Explorer: filterable search + individual loan payment history ``` ## 关键设计决策 - **原始数据以文本形式落地,在下游进行类型转换。** 每个原始列均以 `VARCHAR` 格式加载;类型转换(`try_to_number`、`try_to_date`)在 dbt 的 staging 层使用 `TRY_TO_*` 函数完成,因此格式不正确的值会变为 `NULL`,而不会导致整个加载过程失败。 - **违约检测遵循行业惯例**,而非任意阈值:如果一笔贷款在特定月份严重违约(违约状态 ≥ 3,即逾期 90 天以上),**或者**以带有损失的零余额代码退出(亏本出售/冲销或 REO 处置),则该贷款在该月被标记为违约事件。普通的提前还款和再融资被明确排除在此标记之外。 - **维度的粒度是明确且经过测试的。** `dim_borrower`、`dim_loan_terms` 和 `fct_loan_originations` 都在 `loan_sequence_number` 上进行了唯一性测试(每笔贷款对应一行)。`fct_loan_payments` 在该列上特意*未*设置唯一性——它是每笔贷款在每个报告月份对应一行——因此对其进行了非空完整性测试。 - **11 项 dbt 数据测试**强制执行了主键唯一性和整个模型中必填字段的完整性。全部通过。 ## 分析发现 - **总体贷款级别违约率:4.31%**(基于全部 150,000 笔贷款样本)。 - **信用评分对违约具有强烈的预测性**,这与信用风险理论的预期一致——最低信用分区间的违约率是最高区间的数倍。 - **不同年份的贷款发放批次(Vintage)表现出显著差异**,2018/2019 批次与 2020 批次之间的违约率存在明显不同,值得进一步调查(这可能反映了 2020 年发放贷款的表现历史较短,而非真正的低风险——这是在实际信用风险建模中需要加以考量的生存/沉淀偏差的一个典型例子)。 ## 技术栈 `Snowflake` · `dbt-core` · `dbt-snowflake` · `Python` · `Streamlit`(Streamlit in Snowflake + Streamlit Community Cloud) · `Altair` ## 项目结构 ``` setup/ Snowflake infrastructure SQL (database, schemas, stage, raw tables) models/ staging/ Source-conformed, typed staging models marts/ Dimension and fact tables (the star schema) + schema.yml tests app/ Streamlit application ``` ## 数据来源 Freddie Mac 单户贷款级别数据集(SFLLD),公开样本文件(每个发放年份 50,000 笔贷款)。可免费用于非商业/学术用途。[来源与条款](https://www.freddiemac.com/research/datasets/sf-loanlevel-dataset) ## 运行本项目 1. 设置 Snowflake 对象:运行 `setup/01_snowflake_infrastructure.sql` 2. 下载所需发放年份的 SFLLD 样本文件,通过 `PUT` + `COPY INTO` 加载(详见设置脚本中的注释) 3. 安装 dbt:`pip install dbt-snowflake` 4. 在 `~/.dbt/profiles.yml` 中配置您的 Snowflake 凭证 5. `dbt deps && dbt run && dbt test` 6. 通过 Streamlit in Snowflake 运行 Streamlit 应用,或者在本地 `.streamlit/secrets.toml` 中配置 Snowflake connector 凭证后运行
标签:dbt, Kubernetes, Snowflake, Streamlit, 代码示例, 信贷风险, 商业智能, 数据分析, 数据工程, 访问控制, 逆向工具