diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/basket_index.py | 21 | ||||
| -rw-r--r-- | python/analytics/index_data.py | 8 | ||||
| -rw-r--r-- | python/cds_curve.py | 23 |
3 files changed, 26 insertions, 26 deletions
diff --git a/python/analytics/basket_index.py b/python/analytics/basket_index.py index f835cd61..78c353b0 100644 --- a/python/analytics/basket_index.py +++ b/python/analytics/basket_index.py @@ -52,7 +52,8 @@ class BasketIndex(CreditIndex): self._version = tuple(tuple(t) for t in r) self.issue_date = self.index_desc.issue_date[0] self.index_desc = self.index_desc.loc[tenors] - maturities = self.index_desc.maturity.sort_values().dt.to_pydatetime() + self.index_desc = self.index_desc.sort_values('maturity') + maturities = self.index_desc.maturity.dt.to_pydatetime() self.index_desc = self.index_desc.reset_index().set_index('maturity') self.index_desc.tenor = self.index_desc.tenor.astype(tenor_t) curves = get_singlenames_curves(index_type, series, value_date) @@ -168,7 +169,7 @@ class BasketIndex(CreditIndex): if theta_date is provided, computes the theta to that specific date instead of one-year theta""" if hasattr(self, "index_quotes"): - index_quotes = self.index_quotes.loc[self.value_date] + index_quotes = self._get_quotes() else: index_quotes = None if maturity is None: @@ -231,17 +232,15 @@ class MarkitBasketIndex(BasketIndex): super().__init__(index_type, series, tenors, value_date=value_date) self.index_quotes = (get_index_quotes(index_type, series, tenors, years=None, - remove_holidays=False)['closeprice']. - unstack(). - groupby(level='date', as_index=False).nth(0). - reset_index(['index', 'series', 'version'], drop=True)) - self.index_quotes.columns = (self.index_desc.reset_index(). - set_index('tenor'). - loc[self.index_quotes.columns, "maturity"]) - self.index_quotes = 1 - self.index_quotes / 100 + remove_holidays=False)[['close_price', 'id']]. + groupby(level=['date', 'tenor'], as_index=True). + nth(0)) + self.index_quotes.close_price = 1 - self.index_quotes.close_price / 100 def _get_quotes(self): - return self.index_quotes.loc[self.value_date] + quote = self.index_quotes.loc[self.value_date, "close_price"] + return {m: quote[self.index_desc.tenor[m]] + for m in self.maturities} if __name__ == "__main__": diff --git a/python/analytics/index_data.py b/python/analytics/index_data.py index 9a68f3d5..18aeaaba 100644 --- a/python/analytics/index_data.py +++ b/python/analytics/index_data.py @@ -47,7 +47,7 @@ def insert_quotes(): def get_index_quotes(index=None, series=None, tenor=None, from_date=None, - years=3, remove_holidays=True): + years=3, remove_holidays=True, source='MKIT'): args = locals().copy() del args['remove_holidays'] if args['years'] is not None: @@ -69,7 +69,7 @@ def get_index_quotes(index=None, series=None, tenor=None, from_date=None, where_clause = " AND ".join(make_str(k, v) for k, v in args.items() if v is not None) - sql_str = "SELECT * FROM index_quotes" + sql_str = "SELECT * FROM index_quotes_pre" if where_clause: sql_str = " WHERE ".join([sql_str, where_clause]) @@ -116,11 +116,11 @@ def index_returns(df=None, index=None, series=None, tenor=None, from_date=None, df = get_index_quotes(index, series, tenor, from_date, years) spread_return = (df. groupby(level=['index', 'series', 'tenor', 'version']). - closespread. + close_spread. pct_change(periods=per)) price_return = (df. groupby(level=['index', 'series', 'tenor', 'version']). - closeprice. + close_price. diff() / 100) df = pd.concat([spread_return, price_return], axis=1, keys=['spread_return', 'price_return']) diff --git a/python/cds_curve.py b/python/cds_curve.py index ab13a9ef..c833ab0b 100644 --- a/python/cds_curve.py +++ b/python/cds_curve.py @@ -31,15 +31,17 @@ def all_curves_pv(curves, today_date, jp_yc, start_date, step_in_date, value_dat def calibrate_portfolio(index_type, series, tenors=['3yr', '5yr', '7yr', '10yr'], start_date=None): index = MarkitBasketIndex(index_type, series, tenors) - r = {} + r = [] if start_date: index.index_quotes = index.index_quotes[start_date:] - for trade_date in index.index_quotes.index.get_level_values(0): - index.value_date = trade_date + for value_date, v in index.index_quotes.groupby('date')['id']: + index.value_date = value_date index.tweak() - r[trade_date] = pd.DataFrame({'duration': index.duration(), - 'theta': index.theta(), - 'tweak': index.tweaks}, index=tenors) + df = pd.concat([index.theta(), + index.duration(), + pd.Series(index.tweaks, index=tenors, name='tweak')], axis=1) + df.index = v.values + r.append(df) return pd.concat(r) @@ -67,11 +69,10 @@ if __name__ == "__main__": df = calibrate_portfolio(index, series, ['3yr', '5yr', '7yr', '10yr'], start_date) - with conn.cursor() as c: - for k, s in df.iterrows(): - c.execute("UPDATE index_quotes SET duration2=%s, theta2=%s " - "WHERE date=%s AND tenor=%s AND index=%s AND series=%s", - (s.duration, s.theta, k[0], k[1], index, series)) + for t in df.itertuples(): + c.execute("INSERT INTO index_risk2 VALUES(%s, %s, %s, %s) ON CONFLICT (id) " + "DO UPDATE SET duration=%s, theta=%s, tweak=%s", + t + t[1:]) conn.commit() conn.close() |
