diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/intex_scenarios.py | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/python/intex_scenarios.py b/python/intex_scenarios.py index db4faf96..1700d6ec 100644 --- a/python/intex_scenarios.py +++ b/python/intex_scenarios.py @@ -19,7 +19,7 @@ pattern3 = re.compile("STANDARD_VAR\[\w+::#PRICE100_TBA(\d),(\d+)\]=") pattern5 = re.compile("STANDARD_VAR\[\w+::#REINVPCT_TBA(\d),(\d+)\]=")
pattern7 = re.compile("KINGS3")
pattern8 = re.compile("(#COLLATREINV_REINV_PCT_EXT\[)\w+(::\*\]\[DEAL,\d+\])=100")
-
+pattern9 = re.compile("(?P<a>SEVERITY\[\w+,\d+\]=)mkt\(70\)")
# we use 84 so that it's both dividable by 2 and 3
global_reinvfloatpercentage = 84
global_reinvfixedpercentage = 16
@@ -33,18 +33,36 @@ def get_reinv_assets(dealname, workdate, cursor): d[line[3]] = line[22]
return d
+def get_recovery(dealname, workdate, cursor):
+ """ compute average price of defaulted assets
+ """
+ defaultrecovery = 50
+ sqlstr = "select sum(coalesce(price, {0}) * currentbalance)/sum(currentbalance) ".format(defaultrecovery) + \
+ "from et_aggdealinfo_historical(%s, %s) where defaultedflag is True"
+ cursor.execute(sqlstr, (dealname, workdate))
+ recovery = cursor.fetchone()[0]
+ if not recovery:
+ recovery = 50
+ return float(recovery)
+
+def get_reinvenddate(dealname, cursor):
+ cursor.execute('SELECT \"Reinv End Date\" from latest_clo_universe where dealname=%s', (dealname,))
+ reinvenddate = cursor.fetchone()[0]
+ if reinvenddate:
+ reinvenddate = reinvenddate.strftime("%Y%m%d")
+ return reinvenddate
+ else:
+ raise Exception("missing reinvestment end date")
+
def generate_scenarios(workdate, dealnames, conn, cursor):
prometheus = os.path.join(common.root, "Scenarios", "prometheus.sss")
n_scenarios = 100
basedir = os.path.join(common.root, "Scenarios", "Intex curves_" + workdate)
config = ConfigParser.ConfigParser()
for dealname in dealnames:
- cursor.execute('SELECT \"Reinv End Date\" from latest_clo_universe where dealname=%s', (dealname,))
- reinvenddate = cursor.fetchone()[0]
- if reinvenddate:
- reinvenddate = reinvenddate.strftime("%Y%m%d")
- else:
- print "missing reinvestment end date"
+ reinvenddate = get_reinvenddate(dealname, cursor)
+ defaultedprice = get_recovery(dealname, workdate, cursor)
+ replace = "\g<a>{0:.3f}".format(defaultedprice)
config.read(os.path.join(basedir, "csv", dealname + ".config"))
reinvflag = config.getboolean('config', 'reinvflag')
rollingmat = config.getint('config', 'rollingmat')
@@ -87,6 +105,7 @@ def generate_scenarios(workdate, dealnames, conn, cursor): with open(prometheus) as fh:
for line in fh:
line = line.rstrip()
+
if "DEAL_NAME" in line:
newline = "DEAL_NAME=" + dealname.upper() + "\r\n"
fhsss.write(newline)
@@ -149,10 +168,6 @@ def generate_scenarios(workdate, dealnames, conn, cursor): line = re.sub(pattern7, dealname.upper(), line)
fhsss.write(line + "\r\n")
continue
- # if "STANDARD_VAR" in line:
- # newline = "STANDARD_VAR[REINVEST_PRICE,1]=" + " ".join(reinvprices)
- # fh2.write(newline)
- # continue
if "LOSS_RATE[DEAL,{0}]".format(i) in line:
newcdrline = "LOSS_RATE[DEAL,{0}]=".format(i) + cdrline
fhsss.write(newcdrline + "\r\n")
@@ -168,6 +183,8 @@ def generate_scenarios(workdate, dealnames, conn, cursor): 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)
fhsss.write(line + "\r\n")
fhsss.close()
fhrecovery.close()
|
