from pyisda.credit_index import CreditIndex from analytics import BasketIndex from pyisda.legs import FeeLeg, ContingentLeg from pyisda.logging import enable_logging import datetime import numpy as np import pandas as pd from db import dbconn def all_curves_pv(curves, today_date, jp_yc, start_date, step_in_date, value_date, maturities): r = {} for d in maturities: tenor = {} coupon_leg = FeeLeg(start_date, d, True, 1., 1.) default_leg = ContingentLeg(start_date, d, True) accrued = coupon_leg.accrued(step_in_date) tickers = [] data = [] for sc in curves: coupon_leg_pv = coupon_leg.pv(today_date, step_in_date, value_date, jp_yc, sc, False) default_leg_pv = default_leg.pv(today_date, step_in_date, value_date, jp_yc, sc, 0.4) tickers.append(sc.ticker) data.append((coupon_leg_pv-accrued, default_leg_pv)) r[pd.Timestamp(d)] = pd.DataFrame.from_records(data, index=tickers, columns=['duration', 'protection_pv']) return pd.concat(r, axis=1).swaplevel(axis=1).sort_index(axis=1,level=0) def calibrate_portfolio(index_type, series, tenors=['3yr', '5yr', '7yr', '10yr'], start_date=None): index = BasketIndex(index_type, series, tenors) r = {} if start_date: index.index_quotes = index.index_quotes[startdate:] for trade_date in index.index_quotes.index.get_level_values(0): index.trade_date = trade_date index.tweak() durations = [index.duration(m) for m in index.maturities] thetas = [index.theta(m) for m in index.maturities] r[trade_date] = pd.DataFrame({'duration': durations, 'theta': thetas, 'tweak': index.tweaks}, index=tenors) return pd.concat(r) if __name__=="__main__": enable_logging() index, series = "IG", 28 df = calibrate_portfolio(index, series, ['3yr', '5yr', '7yr', '10yr']) conn = dbconn('serenitasdb') 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)) conn.commit() conn.close()