Skip to main content

From Scores to Policy

A credit score tells you how risky an entity is. Risk bands tell you what to do about it. Risk bands (also known as homogeneous risk groups) are score bins where entities within each group behave similarly, while groups are clearly distinct from each other. Unlike arbitrary deciles or fixed ranges, optimal risk bands are statistically optimized using both the model score and observed outcomes.

Why Risk Bands Matter

Use CaseHow Risk Bands Help
Policy CutoffsSet clear approve/review/deny thresholds aligned to observed outcomes
Pricing TiersMap bins directly to interest rate or limit brackets
Portfolio MonitoringTrack bin migration over time as an early warning system
Model ValidationVerify bins remain separated as new data arrives

Creating Optimal Bins

We recommend using optimal binning algorithms that maximize separation between groups. The optbinning library provides a robust implementation:
from optbinning import OptimalBinning

# Create optimal bins from score and outcome
optb = OptimalBinning(name="avra_score", dtype="numerical")
optb.fit(scores, defaults)

# Get bin boundaries and statistics
binning_table = optb.binning_table.build()
print(binning_table)

Alternative Approaches

MethodDescription
Chi-squared binningMerge adjacent bins until chi-squared threshold is met
Weight of Evidence (WoE)Optimize bins for maximum information value
Equal-frequency quantilesStarting point before optimization
Business-drivenManual boundaries based on policy requirements

Evaluating HRG Quality

What You Want to See

Track default rates per bin over time. A well-constructed HRG shows:
  • Clear separation — Default rates are distinct between adjacent bins
  • Stable PD over time — Each bin’s default rate stays consistent month-over-month
  • Balanced distribution — Reasonable volume in each bin to support policy decisions

Warning Signs

  • Line crossings — When two bins’ default rates cross over time, risk distinction is breaking down. This indicates the model may need recalibration.
  • Concentration — If 80% of entities fall in 2-3 bins, setting policy cutoffs becomes difficult. Consider adjusting bin boundaries or reviewing score distribution.
  • Drift — Systematic movement of default rates within bins signals model degradation. Monitor for gradual shifts that compound over time.

Monitoring Over Time

We recommend visualizing default rates per bin across cohorts:
import matplotlib.pyplot as plt

# Each line represents a score bin
# X-axis: time (cohort month)
# Y-axis: realized default rate

for bin_name, data in bin_cohort_data.items():
    plt.plot(data['months'], data['default_rate'], label=bin_name)

plt.xlabel('Cohort Month')
plt.ylabel('Default Rate')
plt.legend()
plt.title('HRG Stability Over Time')
Healthy pattern: Parallel lines that maintain separation over time. Concerning pattern: Lines that converge, cross, or show systematic drift.
We work with clients to define and monitor risk bands as part of model deployment. This includes tracking bin stability over time and alerting when recalibration may be needed.