import argparse import logging import numpy as np import pandas as pd import os import time from .cds import download_cds_data, download_composite_data from .loans import download_facility, insert_facility, download_marks, update_facility from .rates import downloadMarkitIRData from .import_quotes import insert_cds, insert_index, insert_tranche from pandas.tseries.offsets import BDay from sqlalchemy import create_engine from utils import SerenitasFileHandler from utils.db import dbconn # parse arguments parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group(required=True) group.add_argument( "-l", "--loans", action="store_true", help="download markit loan data" ) group.add_argument("-c", "--cds", action="store_true", help="download markit cds data") group.add_argument("-r", "--rates", action="store_true", help="download markit IR data") parser.add_argument( "-i", "--insert-only", action="store_true", help="do not re-download data" ) parser.add_argument( "workdate", nargs="?", type=lambda s: pd.datetime.strptime(s, "%Y-%m-%d").date() ) def default_date(): return (pd.datetime.today() - BDay(1)).date() args = parser.parse_args() historical = True if args.workdate is None: if not args.rates: historical = False workdate = default_date() else: workdate = pd.datetime.today().date() else: workdate = args.workdate if args.loans: fh = SerenitasFileHandler("markit_loans.log") elif args.cds: fh = SerenitasFileHandler("markit_cds.log") elif args.rates: fh = SerenitasFileHandler("markit_rates.log") # set up logging logger = logging.getLogger("markit") logger.addHandler(fh) logger.setLevel(logging.INFO) if args.loans: payload = {"LEGALENTITY": "lmcg", "USERNAME": "serecapuser", "PASSWORD": "Welcome1"} download_facility(workdate, payload) logger.info("facility downloaded") insert_facility(workdate) logger.info("facility inserted") payload.update({"RELATIVEVERSION": np.busday_count(default_date(), workdate)}) download_marks(workdate, payload) logger.info("marks downloaded") payload.pop("RELATIVEVERSION") update_facility(workdate, payload) logger.info("facility updated") elif args.cds: payload = { "user": "GuillaumeHorel", "password": "password", "version": "5", "format": "csv", "report": "FIXED_COUPON", "date": workdate.strftime("%Y%m%d"), "type": "CDS", } if not args.insert_only: download_cds_data(payload) payload.update({"type": "CredIndex", "version": 4}) download_composite_data(payload, historical) serenitasdb = dbconn("serenitasdb") insert_cds(serenitasdb, workdate) serenitasdb.close() if not args.insert_only: engine = create_engine("postgresql://serenitas_user@debian/serenitasdb") insert_index(engine, workdate) insert_tranche(engine, workdate) elif args.rates: for curr in ["USD", "EUR", "JPY"]: retry = 0 while retry < 10: try: downloadMarkitIRData(workdate, currency=curr) except ValueError as e: logger.error(e) logger.error(f"Could not download {curr} rates for date {workdate}") time.sleep(30) retry += 1 else: logger.info(f"Downloaded {curr} rates") break