aboutsummaryrefslogtreecommitdiffstats
path: root/python/exploration
diff options
context:
space:
mode:
Diffstat (limited to 'python/exploration')
-rw-r--r--python/exploration/dispersion.py34
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: