{
  "capacities": [
    0.05,
    0.1,
    0.2
  ],
  "cohorts": {
    "calibration": 480,
    "test": 480,
    "train": 960
  },
  "config": {
    "calibration_end": "2023-12-31",
    "calibration_start": "2023-07-01",
    "evaluation_as_of": "2025-07-01",
    "review_fraction": 0.1,
    "scenario_lgd": 0.45,
    "seed": 20260927,
    "test_end": "2024-12-31",
    "test_start": "2024-07-01",
    "train_end": "2022-12-31",
    "train_start": "2022-01-01"
  },
  "data_kind": "synthetic",
  "paired_bootstrap": {
    "intervals": [
      {
        "capacity": 0.05,
        "capture_difference_95_interval": [
          -0.040841403728001664,
          0.08823529411764706
        ],
        "method": "raw_logistic",
        "reference": "business_rule",
        "valid_replicates": 300
      },
      {
        "capacity": 0.1,
        "capture_difference_95_interval": [
          0.019405940594059406,
          0.12619318181818176
        ],
        "method": "raw_logistic",
        "reference": "business_rule",
        "valid_replicates": 300
      },
      {
        "capacity": 0.2,
        "capture_difference_95_interval": [
          -0.009433962264150943,
          0.1643984681487014
        ],
        "method": "raw_logistic",
        "reference": "business_rule",
        "valid_replicates": 300
      },
      {
        "capacity": 0.05,
        "capture_difference_95_interval": [
          -0.020138467758237313,
          0.07883906037662589
        ],
        "method": "calibrated_logistic",
        "reference": "business_rule",
        "valid_replicates": 300
      },
      {
        "capacity": 0.1,
        "capture_difference_95_interval": [
          0.028163022394639393,
          0.13525070290534202
        ],
        "method": "calibrated_logistic",
        "reference": "business_rule",
        "valid_replicates": 300
      },
      {
        "capacity": 0.2,
        "capture_difference_95_interval": [
          -0.037383177570093455,
          0.12136080430472954
        ],
        "method": "calibrated_logistic",
        "reference": "business_rule",
        "valid_replicates": 300
      },
      {
        "capacity": 0.05,
        "capture_difference_95_interval": [
          -0.052083333333333336,
          0.06097148541114056
        ],
        "method": "woe_logistic",
        "reference": "business_rule",
        "valid_replicates": 300
      },
      {
        "capacity": 0.1,
        "capture_difference_95_interval": [
          -0.019801980198019802,
          0.10594262295081963
        ],
        "method": "woe_logistic",
        "reference": "business_rule",
        "valid_replicates": 300
      },
      {
        "capacity": 0.2,
        "capture_difference_95_interval": [
          -0.03677560646900269,
          0.09600183823529401
        ],
        "method": "woe_logistic",
        "reference": "business_rule",
        "valid_replicates": 300
      },
      {
        "capacity": 0.05,
        "capture_difference_95_interval": [
          -0.07793438573883162,
          0.07017543859649122
        ],
        "method": "hist_gradient_boosting",
        "reference": "business_rule",
        "valid_replicates": 300
      },
      {
        "capacity": 0.1,
        "capture_difference_95_interval": [
          -0.06377057315358531,
          0.08181818181818182
        ],
        "method": "hist_gradient_boosting",
        "reference": "business_rule",
        "valid_replicates": 300
      },
      {
        "capacity": 0.2,
        "capture_difference_95_interval": [
          -0.039658723153868786,
          0.06697220225257602
        ],
        "method": "hist_gradient_boosting",
        "reference": "business_rule",
        "valid_replicates": 300
      }
    ],
    "replicates": 300,
    "scope": "fixed predictions; descriptive sampling uncertainty, not retraining",
    "unit": "origination_month"
  },
  "project": "CreditVintage capacity benchmark",
  "protocol": {
    "business_rule": "0.5 utilization + 0.3 DTI + 0.2 min(prior, 5) / 5; not PD",
    "explanations": "raw-logistic log odds relative to training feature means; not causal",
    "loss_proxy": "captured event principal * assumed LGD; not prevented loss",
    "model_selection": "none; fixed parameters; test never selects a winner",
    "selection": "global top ceil(N * capacity); score descending, ID ascending",
    "tree_parameters": {
      "early_stopping": false,
      "l2_regularization": 1.0,
      "learning_rate": 0.05,
      "max_iter": 100,
      "max_leaf_nodes": 7,
      "min_samples_leaf": 30,
      "random_state": 20260927
    },
    "woe": "training-only quantile bins; log(event share / non-event share); smoothing 0.5"
  },
  "review_cost_usd": 5.0,
  "test_events": 107,
  "test_metrics": {
    "business_rule": {
      "average_precision": 0.3408299249330919,
      "brier": null,
      "roc_auc": 0.6633760116258676
    },
    "calibrated_logistic": {
      "average_precision": 0.4067577993888786,
      "brier": 0.1577420158961263,
      "roc_auc": 0.735022926010373
    },
    "hist_gradient_boosting": {
      "average_precision": 0.37788636311597656,
      "brier": 0.1614945907143495,
      "roc_auc": 0.7068226804640324
    },
    "raw_logistic": {
      "average_precision": 0.43448349216809246,
      "brier": 0.15495404815353322,
      "roc_auc": 0.7473378266643281
    },
    "woe_logistic": {
      "average_precision": 0.4230083987847077,
      "brier": 0.1554340728255144,
      "roc_auc": 0.7392448197238857
    }
  },
  "train_event_rate": 0.20416666666666666,
  "woe_scorecard": {
    "baseline_points": 529.8607765813443,
    "bins": [
      {
        "coefficient_per_woe": 1.0600967497535565,
        "cuts": [
          0.22286060000000002,
          0.4125302,
          0.5912687999999999,
          0.7800852
        ],
        "events": [
          20,
          33,
          45,
          43,
          55
        ],
        "feature": "utilization",
        "non_events": [
          172,
          159,
          147,
          149,
          137
        ],
        "points_contributions": [
          22.277179002624123,
          4.858154231643693,
          -6.899313502151477,
          -5.11237892239109,
          -15.12364080972513
        ],
        "training_mean_woe": -0.05062700874222348,
        "woe": [
          -0.7789267521424282,
          -0.2094528852092547,
          0.17492974836165398,
          0.11651014344852104,
          0.44380470183038656
        ]
      },
      {
        "coefficient_per_woe": 0.9924284774217289,
        "cuts": [
          0.2157486,
          0.3506606,
          0.5068623999999999,
          0.664736
        ],
        "events": [
          30,
          36,
          36,
          46,
          48
        ],
        "feature": "debt_to_income",
        "non_events": [
          162,
          156,
          156,
          146,
          144
        ],
        "points_contributions": [
          8.825606196118454,
          2.6057734448850782,
          2.6057734448850782,
          -6.2188260397775865,
          -7.818327046111011
        ],
        "training_mean_woe": -0.013699930297938364,
        "woe": [
          -0.3219057199718024,
          -0.10469815120713827,
          -0.10469815120713827,
          0.20347248232081233,
          0.2593298885755743
        ]
      },
      {
        "coefficient_per_woe": 1.055133930078786,
        "cuts": [
          0.5,
          1.5,
          2.5
        ],
        "events": [
          103,
          61,
          24,
          8
        ],
        "feature": "prior_delinquencies",
        "non_events": [
          535,
          154,
          60,
          15
        ],
        "points_contributions": [
          7.6571219391533685,
          -14.33835369365207,
          -14.861597340386059,
          -24.09232941096594
        ],
        "training_mean_woe": -0.039205190692488213,
        "woe": [
          -0.29071413813632363,
          0.431758217520728,
          0.4489448915599415,
          0.7521412786171258
        ]
      },
      {
        "coefficient_per_woe": 1.0709688587560593,
        "cuts": [
          8.972772870509942,
          9.484551409877628,
          9.816936896911788,
          10.083020027593305
        ],
        "events": [
          40,
          38,
          35,
          42,
          41
        ],
        "feature": "log_principal_usd",
        "non_events": [
          152,
          154,
          157,
          150,
          151
        ],
        "points_contributions": [
          -0.836379387178052,
          1.1312272542011068,
          4.232419176905758,
          -2.733851090356659,
          -1.7934159535721557
        ],
        "training_mean_woe": -0.0018828907623128224,
        "woe": [
          0.02518297624965092,
          -0.03849025685943789,
          -0.13884716359969387,
          0.08658658992606436,
          0.05615340047185245
        ]
      },
      {
        "coefficient_per_woe": 1.202122307479586,
        "cuts": [
          0.5
        ],
        "events": [
          132,
          64
        ],
        "feature": "small_business",
        "non_events": [
          580,
          184
        ],
        "points_contributions": [
          3.820078755688988,
          -10.967322879236098
        ],
        "training_mean_woe": -0.010501630647978138,
        "woe": [
          -0.12063505062312203,
          0.3056878654096922
        ]
      }
    ],
    "points_to_double_odds": 20,
    "reference_good_bad_odds": 50,
    "reference_points": 600
  }
}
