diff options
Diffstat (limited to 'python/intex/intex_scenarios.py')
| -rw-r--r-- | python/intex/intex_scenarios.py | 148 |
1 files changed, 99 insertions, 49 deletions
diff --git a/python/intex/intex_scenarios.py b/python/intex/intex_scenarios.py index 75da23a6..79b50639 100644 --- a/python/intex/intex_scenarios.py +++ b/python/intex/intex_scenarios.py @@ -27,8 +27,9 @@ pattern9 = re.compile("(?P<a>SEVERITY\[\w+,\d+\]=)mkt\(70\)") global_reinvfloatpercentage = 84 global_reinvfixedpercentage = 16 + def get_reinv_assets(conn, dealname, workdate): - sqlstr = 'SELECT * FROM et_historicaldealinfo(%s, %s) WHERE ReinvFlag IS TRUE' + sqlstr = "SELECT * FROM et_historicaldealinfo(%s, %s) WHERE ReinvFlag IS TRUE" d = {} with conn.cursor() as c: c.execute(sqlstr, (dealname, workdate)) @@ -37,10 +38,13 @@ def get_reinv_assets(conn, dealname, workdate): conn.commit() return d + def get_recovery(conn, dealname, workdate, defaultrecovery=50): """ compute average price of defaulted assets """ - sqlstr = ("select sum(coalesce(price, %s) * currentbalance)/sum(currentbalance) AS recov " - "from et_aggdealinfo_historical(%s, %s) where defaultedflag is True") + sqlstr = ( + "select sum(coalesce(price, %s) * currentbalance)/sum(currentbalance) AS recov " + "from et_aggdealinfo_historical(%s, %s) where defaultedflag is True" + ) with conn.cursor() as c: try: c.execute(sqlstr, (defaultrecovery, dealname, workdate)) @@ -53,8 +57,9 @@ def get_recovery(conn, dealname, workdate, defaultrecovery=50): conn.commit() return float(recovery) + def get_reinvenddate(conn, dealname, workdate): - sqlstr = 'SELECT reinv_end_date FROM historical_clo_universe(%s, %s)' + sqlstr = "SELECT reinv_end_date FROM historical_clo_universe(%s, %s)" with conn.cursor() as c: c.execute(sqlstr, (dealname, workdate)) reinvenddate, = c.fetchone() @@ -64,10 +69,13 @@ def get_reinvenddate(conn, dealname, workdate): else: raise Exception("missing reinvestment end date") + def generate_scenarios(workdate, dealname, conn): - prometheus = os.path.join(os.environ['BASE_DIR'], "Scenarios", "prometheus.sss") + prometheus = os.path.join(os.environ["BASE_DIR"], "Scenarios", "prometheus.sss") n_scenarios = 100 - basedir = os.path.join(os.environ['BASE_DIR'], "Scenarios", "Intex curves_" + workdate) + basedir = os.path.join( + os.environ["BASE_DIR"], "Scenarios", "Intex curves_" + workdate + ) defaultedprice = get_recovery(conn, dealname, workdate) replace = "\g<a>{0:.3f}".format(defaultedprice) try: @@ -76,22 +84,26 @@ def generate_scenarios(workdate, dealname, conn): except IOError: logger.error("{0}: config file doesn't exist".format(dealname)) return - reinvflag = config['reinvflag'] + reinvflag = config["reinvflag"] if reinvflag: reinvenddate = get_reinvenddate(conn, dealname, workdate) reinv_assets = get_reinv_assets(conn, dealname, workdate) - n_float_assets = len([v for v in reinv_assets.values() if v[0] == 'FLOAT']) - n_fixed_assets = len([v for v in reinv_assets.values() if v[0] == 'FIXED']) - rollingmat = config['rollingmat'] + n_float_assets = len([v for v in reinv_assets.values() if v[0] == "FLOAT"]) + n_fixed_assets = len([v for v in reinv_assets.values() if v[0] == "FIXED"]) + rollingmat = config["rollingmat"] if n_fixed_assets == 0: reinvfixedpercentage = 0 else: reinvfixedpercentage = global_reinvfixedpercentage / n_fixed_assets if n_float_assets > 0: - reinvfloatpercentage = (100 - n_fixed_assets * reinvfixedpercentage)/n_float_assets + reinvfloatpercentage = ( + 100 - n_fixed_assets * reinvfixedpercentage + ) / n_float_assets try: - with open(os.path.join(basedir, "csv", dealname + "-reinvprices.csv"), "r") as fh: + with open( + os.path.join(basedir, "csv", dealname + "-reinvprices.csv"), "r" + ) as fh: dr = csv.DictReader(fh) reinvprices = {f: [] for f in dr.fieldnames} for line in dr: @@ -99,7 +111,9 @@ def generate_scenarios(workdate, dealname, conn): try: val = float(line[f]) except ValueError: - logger.error("Incorrect value in reinvprices for {}".format(dealname)) + logger.error( + "Incorrect value in reinvprices for {}".format(dealname) + ) else: reinvprices[f].append("{0:.3f}".format(val)) @@ -119,15 +133,17 @@ def generate_scenarios(workdate, dealname, conn): cdrline = next(csvcdr) cdrline = "\t".join(["{0:.3f}".format(float(cdr)) for cdr in cdrline]) recoveryline = next(csvrecovery) - recoveryline = "\t".join(["{0:.3f}".format(float(recovery)) for recovery in recoveryline]) + recoveryline = "\t".join( + ["{0:.3f}".format(float(recovery)) for recovery in recoveryline] + ) - i=1 + i = 1 with open(prometheus) as fh: for line in fh: line = line.rstrip() if "DEAL_NAME" in line: - newline = "DEAL_NAME=" + dealname.upper() + "\r\n" + newline = "DEAL_NAME=" + dealname.upper() + "\r\n" fhsss.write(newline) continue if not reinvflag and pattern8.match(line): @@ -147,33 +163,39 @@ def generate_scenarios(workdate, dealname, conn): coupon = 4 elif fixedorfloat == "FIXED": coupon = 7 - line = "REINVEST[{0}::REINV_TBA{1}][DEAL,{2}]=".format(dealname.upper(), - reinv_number, - scen_number) - line += "COUP_SPR={0}|AMORT=Bullet|USE_REINVEST_PIP=1|MAT_DATE={1}|".format(coupon, rollingmat) + line = "REINVEST[{0}::REINV_TBA{1}][DEAL,{2}]=".format( + dealname.upper(), reinv_number, scen_number + ) + line += "COUP_SPR={0}|AMORT=Bullet|USE_REINVEST_PIP=1|MAT_DATE={1}|".format( + coupon, rollingmat + ) if liborfloor is not None: line += "|ARM_LIFE_FLOOR={}".format(liborfloor) fhsss.write(line + "\r\n") continue if reinvflag and pattern2.match(line): - line = re.sub(pattern2, r"\1{0}\2{1}", line).format(dealname.upper(), reinvenddate) + line = re.sub(pattern2, r"\1{0}\2{1}", line).format( + dealname.upper(), reinvenddate + ) fhsss.write(line + "\r\n") continue m = pattern3.match(line) if reinvflag and m: reinv_number, scen_number = m.groups() - if dealname=="litpt3" and reinv_number=="1": - line = "STANDARD_VAR[LITPT3::#REINVLOANP100,{0}]".format(scen_number) + \ - "={0}".format(" ".join(reinvprices["REINV_TBA1"])) + if dealname == "litpt3" and reinv_number == "1": + line = "STANDARD_VAR[LITPT3::#REINVLOANP100,{0}]".format( + scen_number + ) + "={0}".format(" ".join(reinvprices["REINV_TBA1"])) fhsss.write(line + "\r\n") continue reinv_name = "REINV_TBA" + reinv_number if reinv_name in reinvprices: - line = \ - "STANDARD_VAR[{0}::#PRICE100_TBA{1},{2}]={3}".format(dealname.upper(), - reinv_number, - scen_number, - " ".join(reinvprices[reinv_name])) + line = "STANDARD_VAR[{0}::#PRICE100_TBA{1},{2}]={3}".format( + dealname.upper(), + reinv_number, + scen_number, + " ".join(reinvprices[reinv_name]), + ) fhsss.write(line + "\r\n") continue m = pattern5.match(line) @@ -182,24 +204,32 @@ def generate_scenarios(workdate, dealname, conn): reinv_name = "REINV_TBA" + reinv_number if reinv_number == "1": if dealname == "litpt3": - line = "STANDARD_VAR[LITPT3::#LOANREINVPCT,{0}]=100".format(scen_number) + line = "STANDARD_VAR[LITPT3::#LOANREINVPCT,{0}]=100".format( + scen_number + ) fhsss.write(line + "\r\n") continue if dealname == "flags4": - line = "STANDARD_VAR[FLAGS4::#PCT100_TBA1,{0}]=100".format(scen_number) + line = "STANDARD_VAR[FLAGS4::#PCT100_TBA1,{0}]=100".format( + scen_number + ) fhsss.write(line + "\r\n") continue if reinv_name in reinv_assets: - if reinv_assets[reinv_name][0] == 'FIXED': - line = "STANDARD_VAR[{0}::#REINVPCT_TBA{1},{2}]={3}".format(dealname.upper(), - reinv_number, - scen_number, - reinvfixedpercentage) - elif reinv_assets[reinv_name][0] == 'FLOAT': - line = "STANDARD_VAR[{0}::#REINVPCT_TBA{1},{2}]={3}".format(dealname.upper(), - reinv_number, - scen_number, - reinvfloatpercentage) + if reinv_assets[reinv_name][0] == "FIXED": + line = "STANDARD_VAR[{0}::#REINVPCT_TBA{1},{2}]={3}".format( + dealname.upper(), + reinv_number, + scen_number, + reinvfixedpercentage, + ) + elif reinv_assets[reinv_name][0] == "FLOAT": + line = "STANDARD_VAR[{0}::#REINVPCT_TBA{1},{2}]={3}".format( + dealname.upper(), + reinv_number, + scen_number, + reinvfloatpercentage, + ) fhsss.write(line + "\r\n") continue @@ -217,10 +247,20 @@ def generate_scenarios(workdate, dealname, conn): i = i + 1 if i <= n_scenarios: cdrline = next(csvcdr) - cdrline = "\t".join(["{0:.3f}".format(float(cdr)) for cdr in cdrline]) + "\r\n" + cdrline = ( + "\t".join(["{0:.3f}".format(float(cdr)) for cdr in cdrline]) + + "\r\n" + ) recoveryline = next(csvrecovery) - recoveryline = "\t".join(["{0:.3f}".format(float(recovery)) \ - for recovery in recoveryline]) + "\r\n" + recoveryline = ( + "\t".join( + [ + "{0:.3f}".format(float(recovery)) + for recovery in recoveryline + ] + ) + + "\r\n" + ) continue if "LOSS_NONPERF_SEVERITY" in line: line = re.sub(pattern9, replace, line) @@ -230,9 +270,11 @@ def generate_scenarios(workdate, dealname, conn): fhcdr.close() logger.info("generated scenarios for: {0}".format(dealname)) + if __name__ == "__main__": sys.path.append(".") from utils.db import dbconn + if len(sys.argv) > 1: workdate = sys.argv[1] else: @@ -240,11 +282,19 @@ if __name__ == "__main__": if len(sys.argv) > 2: dealnames = sys.argv[2:] else: - dealnames = [d.split(".")[0] for d in - os.listdir(os.path.join(os.environ['BASE_DIR'], "Scenarios", - "Intex curves_" + workdate, "csv")) - if "RData" in d] - ET = dbconn('etdb') + dealnames = [ + d.split(".")[0] + for d in os.listdir( + os.path.join( + os.environ["BASE_DIR"], + "Scenarios", + "Intex curves_" + workdate, + "csv", + ) + ) + if "RData" in d + ] + ET = dbconn("etdb") for dealname in dealnames: generate_scenarios(workdate, dealname, ET) ET.close() |
