Hoshmer Lemeshow Test
- src.meliora.core.hosmer_test(data, ratings, default_flag, predicted_pd, alpha_level=0.05)[source]
Calculate the Hosmer-Lemeshow Chi-squared test for a given probability of defaults buckets
- Parameters
data (Pandas DataFrame with at least three columns) – ratings : PD rating class of obligor default_flag : 1 (or True) for defaulted and 0 (or False) for good obligors probs_default : predicted probability of default of an obligor
ratings (column label for ratings) –
default_flag (column label for default_flag) –
probs_default (column label for probs_default) –
alpha_level (false positive rate of hypothesis test (default .05)) –
- Returns
Rating (Index) : Contains the ratings of each class/group PD : predicted default rate in each group and total N : number of obligors in each group and total D : number of defaults in each group and total Default Rate : realised default rate per each group and total p_value : overall Hosmer-Lemeshow test p-value reject : whether to reject the null hypothesis at alpha_level
- Return type
Pandas DataFrame with the following columns
Notes
The Hosmer-Lemeshow Chi-squared test calculates a standardized sum of squared differences between the number of defaults and the expected number of defaults within each rating group. Under the null hypothesis that the PDs applied in the portfolio/rating grade at the beginning of the relevant observation period are equal to the true ones, the test statistic has an approximate Chi-squared distribution. Large values of this test statistic provide evidence against the null hypothesis.
- 1
“Backtesting Framework for PD, EAD and LGD - Public Version,” Bauke Maarse, Rabobank International, p. 43, 2012.
Examples
>>> import random, numpy as np >>> buckets = ['A', 'B', 'C'] >>> ratings = random.choices(buckets, [0.4, 0.5, 0.1], k=1000) >>> bucket_pds = {'A': .1, 'B': .15, 'C': .2} >>> probs_default = [bucket_pds[r] for r in ratings] >>> default_flag = [random.uniform(0, 1) < bucket_pds[r] for r in ratings] >>> test_data = pd.DataFrame({'ratings': ratings, 'default_flag': default_flag, 'predicted_pd' : probs_default}) >>> from meliora import hosmer_test >>> hosmer_test(test_data, 'ratings', 'default_flag', 'probs_default')
PD N D Default Rate p_value reject
ratings A 0.10000 401.0 36.0 0.089776 None None B 0.15000 489.0 73.0 0.149284 None None C 0.20000 110.0 23.0 0.209091 None None total 0.13545 1000.0 132.0 0.132000 0.468902 False