aboutsummaryrefslogtreecommitdiffstats
path: root/python/collateral_calc.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/collateral_calc.py')
-rw-r--r--python/collateral_calc.py86
1 files changed, 66 insertions, 20 deletions
diff --git a/python/collateral_calc.py b/python/collateral_calc.py
index 4d0589a0..7ad97049 100644
--- a/python/collateral_calc.py
+++ b/python/collateral_calc.py
@@ -251,13 +251,29 @@ def baml_collateral(d):
def wells_collateral(d):
account = "A5882186"
- df = pd.read_csv(DAILY_DIR / "Wells_reports" /
- f"OTC_CDS_Position_Activity_{account}_{d:%m%d%Y}.csv",
- usecols=["TENOR", "MARKET_VALUE_NPV", "STATEMENT_CLOSING_PRICE",
- "PAIR_CLIP", "BUY_SELL", "NOTIONAL",
- "MATURITY_DATE"],
- parse_dates=["MATURITY_DATE"],
- index_col=["PAIR_CLIP", "MATURITY_DATE"])
+ file_name = (DAILY_DIR / "Wells_reports" /
+ f"OTC_CDS_Position_Activity_{account}_{d:%m%d%Y}.csv")
+ try:
+ df = pd.read_csv(file_name,
+ usecols=["TENOR", "MARKET_VALUE_NPV",
+ "PAIR_CLIP", "BUY_SELL", "NOTIONAL",
+ "MATURITY_DATE"],
+ parse_dates=["MATURITY_DATE"],
+ index_col=["PAIR_CLIP", "MATURITY_DATE"])
+ except ValueError:
+ # backpopulated files have a different format...
+ df = pd.read_csv(file_name,
+ usecols=["Tenor", "NPV", "Reference_Entity_ID",
+ "Fixed_Rate_Notional_Buy", "Amount",
+ "Scheduled_Termination_Date"],
+ parse_dates=["Scheduled_Termination_Date"],
+ index_col=["Reference_Entity_ID", "Scheduled_Termination_Date"])
+ df = df.rename(columns={"Tenor": "TENOR",
+ "NPV": "MARKET_VALUE_NPV",
+ "Amount": "NOTIONAL"})
+ df["BUY_SELL"] = 1
+ df.loc[df.Fixed_Rate_Notional_Buy.isnull(), "BUY_SELL"] = 2
+ del df["Fixed_Rate_Notional_Buy"]
positions = pd.read_sql_query("SELECT security_id, security_desc, maturity, "
"folder, notional, currency "
"FROM list_cds_positions_by_strat_fcm(%s, 'WF')",
@@ -405,13 +421,20 @@ def load_citi_file(d):
return pd.read_excel(fname, skiprows=6, skipfooter=2)
-def get_dawn_trades():
+def get_dawn_trades(d):
df_cds = pd.read_sql_query("SELECT cpty_id, folder FROM cds "
- "WHERE cpty_id IS NOT NULL", dawn_engine)
+ "WHERE cpty_id IS NOT NULL AND trade_date <= %s",
+ dawn_engine,
+ params=(d,))
df_swaptions = pd.read_sql_query("SELECT cpty_id, folder FROM swaptions "
- "WHERE cpty_id IS NOT NULL", dawn_engine)
+ "WHERE cpty_id IS NOT NULL "
+ "AND trade_date <= %s",
+ dawn_engine, params=(d,))
df_caps = pd.read_sql_query("SELECT cpty_id, folder FROM capfloors "
- "WHERE cpty_id IS NOT NULL", dawn_engine)
+ "WHERE cpty_id IS NOT NULL "
+ "AND trade_date <= %s",
+ dawn_engine,
+ params=(d,))
df = pd.concat([df_cds, df_swaptions, df_caps])
df = df.replace({"folder": {'IGREC': 'COCSH',
'IGPAYER': 'COCSH',
@@ -496,14 +519,19 @@ if __name__ == "__main__":
parser.add_argument('workdate', nargs='?',
type=lambda s: pd.datetime.strptime(s, "%Y-%m-%d").date(),
default=pd.Timestamp.today().normalize())
+ parser.add_argument("-d", "--download", action="store_true",
+ help="download counterparty reports")
+ parser.add_argument("-s", "--send-email", action="store_true",
+ help="send email to Globeop")
args = parser.parse_args()
- download_ms_emails()
- download_gs_emails()
- download_citi_emails()
- #download_sftp_files(d)
- download_baml_files()
- download_wells_files()
- dawn_trades = get_dawn_trades()
+ if args.download:
+ download_ms_emails()
+ download_gs_emails()
+ download_citi_emails()
+ download_baml_files()
+ download_wells_files()
+
+ dawn_trades = get_dawn_trades(args.workdate)
df_citi = citi_collateral(args.workdate, dawn_trades)
args.workdate = args.workdate - bus_day
try:
@@ -519,5 +547,23 @@ if __name__ == "__main__":
logging.info(e)
df_gs = gs_collateral(args.workdate-busday, dawn_trades)
df_wells = wells_collateral(args.workdate)
- d = pd.Timestamp.today().normalize()
- send_email(args.workdate, [df_ms, df_baml, df_gs, df_citi, df_wells])
+ df = pd.concat([df_gs.set_index("Strategy"),
+ df_ms.set_index("Strategy"),
+ df_citi.set_index("Strategy"),
+ df_wells.set_index("Strategy"),
+ df_baml.set_index("Strategy")],
+ keys=["GS", "MS", "CITI", "WF", "BAML"],
+ names=["broker", "strategy"]).reset_index()
+ df.strategy = df.strategy.str.replace("^(M_|SER_)?", "", 1)
+ from db import dbconn
+ conn = dbconn('dawndb')
+ sql_str = ("INSERT INTO strategy_im VALUES(%s, %s, %s, %s, %s) "
+ "ON CONFLICT (date, strategy, broker) DO UPDATE "
+ "SET currency=EXCLUDED.currency, amount=EXCLUDED.amount")
+ with conn.cursor() as c:
+ for t in df.itertuples(index=False):
+ c.execute(sql_str, (args.workdate, *t))
+ conn.commit()
+ conn.close()
+ if args.send_email:
+ send_email(args.workdate, [df_ms, df_baml, df_gs, df_citi, df_wells])