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统计, 伪数据, 信用风险模型, 合成数据生成器, 客户画像模拟, 应用安全, 批处理脚本, 数据处理管道, 数据科学, 数据隐私合规, 机器学习训练数据, 算法模型前处理, 西班牙银行, 西班牙银行数据, 财富管理, 资源验证, 违约预测, 逆向工具, 金融数据集, 金融科技