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, 代码示例, 信贷风险, 商业智能, 数据分析, 数据工程, 访问控制, 逆向工具