Articles

How do you calculate the population stability index (PSI)?

The PSI is ten subtractions, ten logarithms and a sum. The bands it is computed on, and what it cannot see, matter more than the threshold it is compared with.

Cut the development scores into bands, pour the new population into the same bands, and sum over the bands (new share − old share) × ln(new share / old share). On a small-business scorecard moving from its 2015-2019 development sample to 2020-2021 applications, that gives a PSI of 0.090517, under the usual 0.10 threshold, while the bad rate of the same applications doubled.

Worked in full in Machine Learning for Finance by Julian R. Sterling, with every figure reproduced in a free workbook.See the book on Amazon →

The assumptions

The card is the Brechin scorecard from Machine Learning for Finance. Its development sample is 6,000 applications decided between 2015 and 2019; the out-of-time sample is 2,400 applications from 2020 and 2021. The ten bands are cut once, on the development scores, so that each holds about 600 cases, and those boundaries are never moved. All figures are illustrative.

Inputs to the index
InputValue
Development applications, 2015-20196,000
Out-of-time applications, 2020-20212,400
Bands, cut on development scores10
Rule-of-thumb thresholds0.10 and 0.25

The calculation, step by step

For each band, compute its share of the development population and its share of the new population. Each band's term is the difference times the log of the ratio. Both factors have the same sign, so every term is positive and the index only rises with any movement, in either direction.

PSI = Σ (new% − old%) × ln(new% / old%)

Band 10: (5.33% − 10.00%) × ln(5.33 / 10.00) = −0.0467 × −0.6286 = 0.029335

Excel, per band: =(New-Old)*LN(New/Old), then =SUM() the column

Population stability on the fixed development bands, band 1 the lowest scores
BandDevelopment nOut-of-time nDevelopment shareOut-of-time shareln(ratio)PSI term
160035510.00%14.79%0.39150.0188
25993159.98%13.12%0.27360.0086
360130810.02%12.83%0.24780.0070
460028510.00%11.88%0.17190.0032
560024610.00%10.25%0.02470.0001
65982039.97%8.46%−0.16410.0025
760221910.03%9.12%−0.09490.0009
860017910.00%7.46%−0.29330.0075
960016210.00%6.75%−0.39300.0128
1060012810.00%5.33%−0.62860.0293
Total6,0002,400100%100%0.0905

The result

The index is 0.090517. On the usual reading, under 0.10 means no material shift, and a monitoring report would mark the card green. The table says more than the total. The population has moved down the scale: the bottom band grew from 10.00 to 14.79 per cent of applications and the top band shrank from 10.00 to 5.33. The two end bands contribute 53.1 per cent of the index, and band 10 alone 32.4 per cent.

It helps to know what the number is. The PSI is a symmetrised Kullback-Leibler divergence: the divergence of the new distribution from the old, 0.0441, plus the divergence of the old from the new, 0.0464. That is why it treats a band that empties and a band that fills alike, and why it has no natural unit beyond the rule-of-thumb thresholds attached to it.

The PSI measures the distribution of scores, not outcomes. Over the same period the bad rate went from 6.32 per cent in development to 12.63 per cent out of time, a doubling, and in the lowest band from 22.17 to 31.83 per cent. A stable input distribution is not a stable model. The index is an early, cheap signal that the applicant mix has changed; it is not evidence that the predictions still hold.

What if the bands or the shift differ?

The same data, read three ways, and two larger shifts
VariantPSIReading
Ten fixed development bands0.0905Under 0.10
Five fixed bands, neighbours merged0.0836Under 0.10
Deciles recut on the new population0Nothing measured
Same direction of shift, 1.5 times larger0.22210.10 to 0.25
Same direction of shift, twice as large0.5040Above 0.25

Coarser bands hide movement within them: merging pairs keeps 92.4 per cent of the index here, but the loss grows when the shift is concentrated inside a band. The index is also strongly non-linear: half as much shift again takes it from 0.0905 to 0.2221, and doubling the shift takes it to 0.5040, when the top band would hold only 0.67 per cent of applications.

The common mistake

The fatal error is recutting the bands on the new population. Deciles of the new scores hold 10 per cent each by definition, so the PSI is 0 whatever has happened, and the tool erases exactly what it is meant to detect. The bands must be the development boundaries, stored with the model. The second error is a zero count. A band with no new cases makes the logarithm infinite, and the usual patch, flooring the share at a small number, then decides the answer: emptying band 10 with a floor of 0.0001 gives 0.7611, while a single case in it gives 0.6112. Merge sparse bands instead. The third is reading 0.10 and 0.25 as statistical tests. They are conventions, and with 2,400 cases the index carries sampling noise of its own.

The cost of leaving the cut-off where development put it, on this same out-of-time population, is worked in what leaving a credit score cut-off unchanged actually costs.

Takeaway

Every term of the index appears as its own row, on the fixed boundaries, in the free workbook for this case.

Questions readers ask

What is a good PSI value?

The usual rule of thumb reads under 0.10 as no material shift, 0.10 to 0.25 as a moderate shift worth investigating, and above 0.25 as a significant change. These are conventions, not tests. A scorecard here scores 0.090517, comfortably green, while its bad rate doubles from 6.32 to 12.63 per cent.

Should PSI bands be recalculated on the new population?

No. The bands must be the development boundaries, fixed once. Recut deciles on the new population and every band holds 10 per cent by construction, so the PSI is 0 whatever has happened. On the fixed boundaries the same data gives 0.090517, with the bottom band growing to 14.79 per cent and the top band shrinking to 5.33.

How do you handle a zero count in a PSI band?

A zero share makes the logarithm infinite, so floor each share at a small value or merge the band with its neighbour. The floor drives the answer: emptying the top band of 2,400 out-of-time cases with a 0.0001 floor gives a PSI of 0.7611; one case in it gives 0.6112. Merging is usually the safer fix.

Read the whole case

This article is one calculation from Machine Learning for Finance. The book takes the same case from first principles to the decision, chapter by chapter, and every figure it prints is a live formula in the free companion workbooks.

Get the book on Amazon →Free companion files

Also on Amazon UK · Amazon Germany · Amazon France · Amazon Canada

Also on this site

Reading guide: corporate finance, valuation and markets → · All 453 articles →

If this book helped, or didn’t, a few lines on Amazon are worth more than they look: they are what the next reader goes on. Write a review. The workbook stays free either way.