aboutsummaryrefslogtreecommitdiffstats
path: root/python/dtcc_sdr.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/dtcc_sdr.py')
-rw-r--r--python/dtcc_sdr.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/python/dtcc_sdr.py b/python/dtcc_sdr.py
index 5722e669..e5f05bf7 100644
--- a/python/dtcc_sdr.py
+++ b/python/dtcc_sdr.py
@@ -3,6 +3,7 @@ import io
import pandas as pd
import requests
import zipfile
+from utils.db import serenitas_engine, dawn_engine
from pathlib import Path
from typing import Dict, Any
@@ -129,6 +130,45 @@ def process_tranche_data(df):
df.sort_values("EXECUTION_TIMESTAMP", inplace=True)
return df
+def map_tranche(df):
+ idx_ver = pd.read_sql_query(
+ "select index, series, redindexcode, maturity, tenor "
+ "from index_desc",
+ serenitas_engine,
+ parse_dates='maturity',
+ index_col=["redindexcode", "maturity"]
+ )
+ idx_ver = idx_ver.loc[idx_ver.index.dropna()]
+ markit = pd.read_sql_query(
+ "select * from markit_tranche_quotes a "
+ "left join (select series, index, basketid "
+ "as id from index_version) b on a.basketid=b.id",
+ serenitas_engine,
+ parse_dates='quotedate')
+ df = df.reset_index().set_index(['UNDERLYING_ASSET_1', 'END_DATE'])
+ df.rename_axis(index={'UNDERLYING_ASSET_1': 'redindexcode',
+ 'END_DATE': 'maturity'}, inplace=True)
+ df = df.merge(idx_ver, left_index=True, right_index=True, how='left')
+ df['EXECUTION_TIMESTAMP'] = df.EXECUTION_TIMESTAMP.dt.normalize()
+ #Normalize the price format
+ df.PRICE_NOTATION = (df.PRICE_NOTATION / 1e2).where(df.PRICE_NOTATION_TYPE == "Percentage", df.PRICE_NOTATION)
+ df['price'] = (df.PRICE_NOTATION / 1e2).where(df['index'].isin(['IG', 'EU', 'XO']), 1-df.PRICE_NOTATION/1e2)
+ #Allow for bigger bid/offers for equity tranche
+ markit.upfront_bid = (markit.upfront_mid-.01).where(markit.attach == 0, markit.upfront_bid)
+ markit.upfront_ask = (markit.upfront_mid+.01).where(markit.attach == 0, markit.upfront_ask)
+ df = df.merge(markit,
+ left_on=['index', 'series', 'tenor', 'EXECUTION_TIMESTAMP'],
+ right_on=['index', 'series', 'tenor', 'quotedate'],
+ how='outer')
+ df['identified'] = df.apply(lambda df:
+ (df.price > df.upfront_bid) & (df.price < df.upfront_ask)
+ if df.upfront_bid > 0
+ else (df.price < df.upfront_bid) & (df.price > df.upfront_ask),
+ axis=1)
+ df = df[df.identified]
+ df = df[~df.duplicated(['DISSEMINATION_ID'], keep=False)]
+ return df.sort_values('EXECUTION_TIMESTAMP')
+
def insert_correction(conn: connection, dissemination_id: int, **kwargs) -> None:
with conn.cursor() as c:
@@ -158,3 +198,7 @@ if __name__ == "__main__":
dr = pd.bdate_range("2018-01-01", "2019-02-11")
for d in dr:
download_cumulative_credit(d)
+ df = load_data()
+ df = process_tranche_data(df)
+ df = map_tranche(df)
+