albertjimrod/Synthetic-banking-dataset-generator
GitHub: albertjimrod/Synthetic-banking-dataset-generator
基于西班牙官方统计数据校准的合成银行客户数据生成器,专为信用风险和违约预测模型训练场景设计。
Stars: 0 | Forks: 0
# WealthReader 合成数据生成器
这是一个基于西班牙官方统计数据(INE, Banco de España)生成大规模合成银行数据集的双脚本流水线。专为训练信用风险和违约预测模型而设计。
## 工作原理
该流水线由两个协同工作的脚本组成:
```
generate_1M.sh ──calls──► generator_wealthreader_v6_2.py
│
▼
data/wealthreader_synthetic_customers_*.csv
│
generate_1M.sh ◄────────┘
│
▼ (merge + cleanup)
data/wealthreader_combined.csv
```
`generate_1M.sh` 是编排器。它驱动整个生成过程:在三种经济场景和批次大小下重复调用 Python 生成器,然后将所有部分 CSV 输出合并为单个最终文件。
`generator_wealthreader_v6_2.py` 是数据引擎。每次调用都会生成一批合成客户,并将 CSV 写入输出目录。
## 脚本
### generator_wealthreader_v6_2.py
Python 脚本,使用根据西班牙官方数据源校准的统计分布生成合成银行客户:
- **INE** — 2024 年生活条件调查 (ECV)、2024 年家庭预算调查 (EPF)、薪资结构调查 (EES)、劳动力调查 (EPA)、2024 年人口普查
- **Banco de España** — 2022 年家庭财务调查 (EFF)
- **BCE / PwC** — 2024 年数字银行采用数据
**每条客户记录包含的内容(52 个字段):**
| 类别 | 字段 |
|----------|--------|
| 人口统计 | `edad`, `birth_date`, `estado_civil`, `categoria_laboral`, `ccaa`, `zona_postal` |
| 收入/支出 | `ingreso_medio_mensual`, `ingreso_std`, `gasto_medio_mensual`, `gasto_std`, `ahorro_medio_mensual`, `meses_ahorro_positivo` |
| 银行账户 | `n_cuentas`, `n_cuentas_corrientes`, `n_depositos_plazo`, `saldo_total`, `saldo_depositos`, `tiene_linea_credito` |
| 卡 | `n_tarjetas`, `tiene_tarjeta_credito`, `limite_credito_total`, `credito_dispuesto`, `ratio_utilizacion_credito` |
| 投资 | `tiene_inversiones`, `valor_cartera`, `n_fondos`, `tiene_plan_pensiones`, `rentabilidad_cartera`, `aportaciones_ultimo_año` |
| 贷款 | `tiene_prestamo`, `tipo_prestamo`, `capital_original`, `tipo_interes`, `porcentaje_amortizado`, `deuda_pendiente`, `años_restantes`, `cuota_mensual` |
| 保险 | `tiene_seguro`, `suma_asegurada` |
| 直接扣款 | `n_domiciliaciones`, `importe_total_domiciliaciones`, `tiene_recibos_rechazados` |
| 目标 | `default_12m` |
**违约概率模型 — 14 个校准因子:**
目标变量 `default_12m` 是通过将乘性风险因子(源自科学文献中的 Odds Ratios)应用于由经济情景定义的基础概率来计算的:
| # | 因子 | 来源 | 效果 |
|---|--------|--------|--------|
| 1 | 月储蓄历史 | FICO(占分数的 35%) | 如果正向月份 < 3,则 ×1.8 |
| 2 | 无投资 | EFF 2022 | ×1.4 |
| 3 | 活跃贷款 | Costa e Silva (2020) | ×1.15 |
| 4 | 债务收入比 (DTI) | Kim et al. (2018), Fed Reserve | 如果 DTI > 50%,则 ×2.0 |
| 5 | 直接扣款被退回 | NBER w26165 | ×3.0 |
| 6 | 信用额度使用率 | FICO(占分数的 30%) | 如果 > 80%,则 ×1.8 |
| 7 | 养老金计划 | EFF 2022 | ×0.70(保护性) |
| 8 | 定期存款 | EFF 2022 | ×0.80(保护性) |
| 9 | 稳定就业 | Costa e Silva (2020) OR=0.438 | ×0.75(保护性) |
| 10 | 失业 | EPA 2024 | ×2.2 |
| 11 | 社会经济区域 | Costa e Silva (2020) | A/B 区 ×0.85,D 区 ×1.25 |
| 12 | 年龄 + 抵押贷款 | Costa e Silva (2020) | 如果年龄 > 45 且有抵押贷款,则 ×0.80 |
| 13 | 财务缓冲(储蓄 vs 收入) | EFF 2022 | 如果余额 < 0.5× 月收入,则 ×1.5 |
| 14 | 区域 AROPE 率 | INE ECV 2024 | 如果 AROPE > 32%,则 ×1.20 |
**三种经济情景:**
| 情景 | 低风险 | 中风险 | 高风险 | 基础违约率 |
|----------|----------|----------|-----------|-------------------|
| `normal` | 30% | 50% | 20% | 2% / 15% / 40% |
| `crisis` | 15% | 45% | 40% | 10% / 35% / 65% |
| `boom` | 50% | 40% | 10% | 1% / 5% / 15% |
**CLI 用法:**
```
python generator_wealthreader_v6_2.py [OPTIONS]
```
| 选项 | 默认值 | 描述 |
|--------|---------|-------------|
| `--scenario`, `-s` | `normal` | 经济情景:`normal`, `crisis`, `boom`, `all` |
| `--customers`, `-n` | `50000` | 要生成的客户数量 |
| `--batch-size` | `50000` | 每个处理批次的客户数 |
| `--output-dir`, `-o` | `.` | CSV 文件的输出目录 |
| `--suffix`, `-x` | `` | 附加到输出文件名的后缀 |
| `--seed` | `42` | 用于可复现性的随机种子 |
| `--workers` | auto | 并行 CPU 工作进程数 |
**输出文件名格式:**
- 带后缀:`wealthreader_synthetic_customers_{suffix}.csv`
- 不带后缀:`wealthreader_synthetic_customers_{scenario}.csv`
### generate_1M.sh
Bash 编排脚本,可自动完成大型数据集(默认:1,000,000 名客户)的完整生成过程,该数据集平均分配在三种经济情景中。
**逐步操作说明:**
1. **交互式配置** — 询问客户总数(默认:1,000,000)和输出目录(默认:`data`)。如果输出目录不存在则创建。
2. **批量生成** — 将总数分为三等份(每个情景一份:normal, crisis, boom),每批 50,000 名客户进行生成,为每批调用 `generator_wealthreader_v6_2.py` 并使用不同的随机种子以确保多样性。
每个情景的种子序列:
- Normal: 142, 242, 342, ...
- Crisis: 1100, 1200, 1300, ...
- Boom: 2100, 2200, 2300, ...
3. **合并和清理** — 运行一个内嵌的 Python 脚本,该脚本:
- 从输出目录读取所有部分 CSV 文件
- 在整个数据集中按顺序重新分配 `customer_id`
- 为每条记录添加 `escenario` 列
- 删除部分文件
- 写入最终合并文件 `wealthreader_combined.csv`
- 打印汇总统计信息(总行数、全局违约率、每个情景的违约率)
**用法:**
```
chmod +x generate_1M.sh
./generate_1M.sh
```
脚本将提示:
```
¿Cuántas instancias quieres generar? [1000000]:
¿Directorio de salida? [data]:
¿Continuar? (s/n) [s]:
```
## 目录结构
```
wealthreader-synthetic-generator/
├── generator_wealthreader_v6_2.py # Data engine
├── generate_1M.sh # Orchestration script
└── data/ # Created automatically at runtime
├── wealthreader_synthetic_customers_normal_1.csv # Partial (deleted after merge)
├── wealthreader_synthetic_customers_crisis_1.csv # Partial (deleted after merge)
├── wealthreader_synthetic_customers_boom_1.csv # Partial (deleted after merge)
└── wealthreader_combined.csv # Final output
```
`data/` 目录由 `generate_1M.sh` 自动创建。合并完成后,部分 CSV 文件将被删除。仅保留 `wealthreader_combined.csv`。
如果您直接运行 `generator_wealthreader_v6_2.py` 而不指定 `--output-dir`,文件将写入当前工作目录 (`.`)。
## 环境要求
需要 Python **3.11**。运行生成器仅需两个外部库:
```
pip install pandas numpy
```
`generate_1M.sh` 合并步骤还使用了 `glob` 和 `os`,它们是 Python 标准库的一部分。
**`wealthinsights` conda 环境中使用的版本:**
| 库 | 版本 |
|---------|---------|
| Python | 3.11.14 |
| pandas | 2.3.3 |
| numpy | 2.3.5 |
所有其他导入(`datetime`, `typing`, `argparse`, `gc`, `multiprocessing`, `warnings`, `glob`, `os`)均为 Python 标准库的一部分,无需安装。
**复制精确环境:**
```
conda create -n wealthreader python=3.11
conda activate wealthreader
pip install pandas==2.3.3 numpy==2.3.5
```
## 快速开始
**生成 100,000 名客户(normal 情景):**
```
python generator_wealthreader_v6_2.py --scenario normal --customers 100000 --output-dir data
```
**生成所有三种情景,每种 50,000 名客户:**
```
python generator_wealthreader_v6_2.py --scenario all --customers 50000 --output-dir data
```
**通过编排脚本生成完整的 1M 数据集:**
```
chmod +x generate_1M.sh
./generate_1M.sh
```
**使用可复现种子进行自定义运行:**
```
python generator_wealthreader_v6_2.py -s crisis -n 200000 -o ./output --seed 123
```
标签:CSV生成, INE统计, 伪数据, 信用风险模型, 合成数据生成器, 客户画像模拟, 应用安全, 批处理脚本, 数据处理管道, 数据科学, 数据隐私合规, 机器学习训练数据, 算法模型前处理, 西班牙银行, 西班牙银行数据, 财富管理, 资源验证, 违约预测, 逆向工具, 金融数据集, 金融科技