diff options
Diffstat (limited to 'python/exploration/dispersion.py')
| -rw-r--r-- | python/exploration/dispersion.py | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/python/exploration/dispersion.py b/python/exploration/dispersion.py index d7fb8a73..575877ba 100644 --- a/python/exploration/dispersion.py +++ b/python/exploration/dispersion.py @@ -79,9 +79,43 @@ def get_tranche_data(index_type, engine): ), exp_percentage=lambda x: x.expected_loss / x.index_expected_loss, ) + df.set_index(["index", "series", "tenor", "attach"], append=True, inplace=True) return df +def create_gini_models(df): + # Takes the output of get_tranche_data + gini_model, gini_calc = {}, {} + for attach in df.index.get_level_values("attach").unique(): + gini_calc[attach] = df.loc(axis=0)[:, :, :, "5yr", attach] + gini_model[attach] = smf.ols( + "np.log(exp_percentage) ~ " + "np.log(gini_spread) + " + "np.log(index_duration) + " + "np.log(moneyness)", + data=gini_calc[attach], + ).fit() + gini_calc[attach]["predict"] = np.exp( + gini_model[attach].predict(gini_calc[attach]) + ) + gini_calc = pd.concat(gini_calc, sort=False).reset_index(level=0, drop=True) + normalization = gini_calc.groupby(["date", "index", "series", "tenor"])[ + "predict" + ].sum() + gini_calc = gini_calc.merge( + normalization, left_index=True, right_index=True, suffixes=["_preN", "_sum"] + ) + gini_calc["predict_N"] = gini_calc["predict_preN"] / gini_calc["predict_sum"] + gini_calc["mispricing"] = ( + (gini_calc["exp_percentage"] - gini_calc["predict_N"]) + * gini_calc["index_expected_loss"] + / (gini_calc["detach_adj"] - gini_calc["attach_adj"]) + / gini_calc["indexfactor"] + * 10000 + ) + return gini_model, gini_calc + + def gini(array): """Calculate the Gini coefficient of a numpy array.""" if np.amin(array) < 0: |
