aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/load_cf.py102
1 files changed, 61 insertions, 41 deletions
diff --git a/python/load_cf.py b/python/load_cf.py
index 13be9cd3..a4793c0f 100644
--- a/python/load_cf.py
+++ b/python/load_cf.py
@@ -8,14 +8,14 @@ import datetime
from dateutil.relativedelta import relativedelta
from db import query_db
import yaml
-from quantlib.time.api import Schedule, Actual360, Period, Months, Calendar, Unadjusted
+from quantlib.time.api import Schedule, Actual360, Period, Months, Calendar, Unadjusted, ModifiedFollowing
from quantlib.util.converter import pydate_to_qldate, qldate_to_pydate
from quantlib.settings import Settings
from yieldcurve import YC
import numpy as np
from optimization import KLfit
+import rpy2.robjects as ro
import pdb
-import ryp2.robjects as ro
if os.name =='nt':
root = "//WDsentinel/share/CorpCDOs"
@@ -33,8 +33,8 @@ def sanitize_float(string):
return string
-def processzipfiles(workdate=datetime.date.today()):
- pricesdir = os.path.join(root, "Scenarios", "Prices_" + str(workdate))
+def processzipfiles(tradedate=datetime.date.today()):
+ pricesdir = os.path.join(root, "Scenarios", "Prices_" + str(tradedate))
zipfiles = [os.path.join(pricesdir, f) for f in os.listdir(pricesdir) \
if f.endswith(".zip")]
zipfiles = sorted(zipfiles, key=lambda x: os.stat(x).st_ctime)
@@ -53,8 +53,8 @@ def processzipfiles(workdate=datetime.date.today()):
return {"dealnames": dealnames_dict, "cusips":cusips_dict, "zipfiles": zipfiles}
-def get_configfile(dealname, workdate):
- configfile = os.path.join(root, "Scenarios", "_".join(["Intex curves", str(workdate)]),
+def get_configfile(dealname, tradedate):
+ configfile = os.path.join(root, "Scenarios", "Intex curves_" + str(tradedate),
"csv", dealname + ".config")
try:
with open(configfile) as fh:
@@ -63,36 +63,34 @@ def get_configfile(dealname, workdate):
config = {"reinvflag": True}
return config
-def get_dist(workdate):
- distfile = os.path.join(root, "Scenarios", "marketdata-{0}.RData".format(str(workdate)))
+def get_dist(tradedate):
+ distfile = os.path.join(root, "Scenarios", "marketdata-{0}.RData".format(str(tradedate)))
dist = ro.r.load(distfile)
return {"L": np.array(dist[0]),"R": np.array(dist[1])}
-def get_dealdata(dealname, workdate):
+def get_dealdata(dealname, tradedate):
sqlstr = "select \"Curr Collat Bal\", \"Reinv End Date\", \"Deal Next Pay Date\"," \
"maturity, \"Principal Bal\", \"Pay Day\" from historical_clo_universe(%s, %s)"
- sqldata = query_db(sqlstr, (dealname, str(workdate)))
+ sqldata = query_db(sqlstr, (dealname, str(tradedate)))
return sqldata
-def get_cusipdata(cusip, workdate):
+def get_cusipdata(cusip, tradedate):
sqlstring = "select curr_balance, spread from historical_cusip_universe(%s, %s)"
- sqldata = query_db(sqlstr, (cusip, str(workdate)))
+ sqldata = query_db(sqlstr, (cusip, str(tradedate)))
return sqldata
-def get_dealschedule(dealdata, freq='1Mo'):
+def get_dealschedule(dealdata, freq='1Mo', adj=Unadjusted):
us_cal = Calendar.from_name('USA')
- if not dealdata["Pay Day"]:
- dealdata["Pay Day"] =dealdata["Deal Next Pay Date"] + relativedelta(months=-3)
- if abs((dealdata["Deal Next Pay Date"]- dealdata["Pay Day"]).days - 90)>10:
- dealdata["Pay Day"] = dealdata["Deal Next Pay Date"] + relativedelta(months=-6)
+ if not dealdata["Pay Day"] or abs((dealdata["Deal Next Pay Date"]- dealdata["Pay Day"]).days - 90)>10:
+ dealdata["Pay Day"] = dealdata["Deal Next Pay Date"] + relativedelta(months=-3)
return Schedule(pydate_to_qldate(dealdata["Pay Day"]), pydate_to_qldate(dealdata["maturity"]),
- Period(freq), us_cal, Unadjusted, Unadjusted)
+ Period(freq), us_cal, adj, adj)
-def getdealcf(dealnames, zipfiles, workdate = datetime.date.today()):
+def getdealcf(dealnames, zipfiles, tradedate = datetime.date.today()):
fiels = ["Cashflow", "Principal", "Interest"]
n_scenarios = 100
cfdata = {}
- m = YC(workdate)
+ m = YC(tradedate)
fields = ["Cashflow", "Principal", "Interest"]
for dealname, i in dealnames.items():
zip = zipfiles[i]
@@ -100,15 +98,15 @@ def getdealcf(dealnames, zipfiles, workdate = datetime.date.today()):
mv = query_db("select marketvalue from latest_deal_model_numbers where dealname = %s",
(dealname,))[0]
- dealdata = get_dealdata(dealname, workdate)
+ dealdata = get_dealdata(dealname, tradedate)
cfdata[dealname] = {"mv":mv, "currbal": dealdata["Curr Collat Bal"]}
- config = get_configfile(dealname, workdate)
+ config = get_configfile(dealname, tradedate)
sched = get_dealschedule(dealdata)
pd_sched = [pd.to_datetime(str(day), format="%d/%m/%Y") for day in sched]
discounts = pd.Series([m.discount(day) if day > m.settle_date else 1 for day in sched],
index = pd_sched, name='df')
- if (not sqldata["Reinv End Date"] or not config["reinvflag"]):
+ if (not dealdata["Reinv End Date"] or not config["reinvflag"]):
tranches = ["COLLAT"]
else:
tranches = ["COLLAT_INITIAL", "COLLAT_REINVEST"]
@@ -116,9 +114,9 @@ def getdealcf(dealnames, zipfiles, workdate = datetime.date.today()):
cf = {}
with ZipFile(zip) as myzip:
for tranche in tranches:
- scen = {}
- for j in range(1, n_scenarios+1):
- filename = "{0}-{1}-CF-Scen{2}.txt".format(dealname.upper(), tranche, j)
+ scen = np.zeros((100,3))
+ for j in range(n_scenarios):
+ filename = "{0}-{1}-CF-Scen{2}.txt".format(dealname.upper(), tranche, j+1)
data = pd.read_table(myzip.open(filename), skiprows=[1, 2], parse_dates=[0],
thousands=",",
date_parser = lambda x: datetime.datetime.strptime(x, "%b %d, %Y"),
@@ -128,37 +126,59 @@ def getdealcf(dealnames, zipfiles, workdate = datetime.date.today()):
if data.dtypes[c] != np.dtype('float64'):
data[c] = data[c].apply(sanitize_float)
data = data[fields].join(discounts)
- scen[j] = np.dot(data["df"], data[fields])
- cf[tranche] = pd.DataFrame(scen).T
- cf[tranche].columns = fields
- cfdata[dealname]["panel"] = pd.Panel(cf)
- cf = cfdata[dealname]["panel"].minor_xs("Cashflow").T.sum()
+ scen[j,:] = np.dot(data["df"], data[fields])
+ cf[tranche] = pd.DataFrame(scen, columns=fields)
+ cfdata[dealname]["panel"] = pd.concat(cf)
+ cf = cfdata[dealname]["panel"].Cashflow.sum(level=1)
cfdata[dealname]["wapbasis"] = (cf.mean() - mv)/mv
program = KLfit(cf.values/1e8, np.ones(n_scenarios)/n_scenarios, mv/1e8)
cfdata[dealname]["weight"] = program["weight"]
print(dealname)
return cfdata
-def getcusipcf(dealnames, cusip, cfdata, workdate):
- dist = get_dist(workdate)
+def getcusipcf(dealnames, cusip, cfdata, tradedate):
+ dist = get_dist(tradedate)
cusipdata = {}
n_scenarios = 100
- m = YC(workdate)
+ m = YC(tradedate)
+ intexfields = ["Cashflow", "Principal", "Interest", "Balance", "Accum Interest Shortfall"]
+ fields = ["Cashflow", "Principal", "Interest", "wal", "duration"]
+
for i, cusip in enumerate(cusips):
zip = zipfiles[i]
dealname = dealnames[i]
dealdata = getdealdata(dealname)
- sched = getdealschedule(dealdata)
+ sched = getdealschedule(dealdata, ModifiedFollowing)
pd_sched = [pd.to_datetime(str(day), format="%d/%m/%Y") for day in sched]
discounts = pd.Series([m.discount(day) if day > m.settle_date else 1 for day in sched],
index = pd_sched, name='df')
- for j in range(1, n_scenarios):
+ with ZipFile(zip) as myzip:
+ for j in range(n_scenarios):
+ filename = "{0}-CF-Scen{1}.txt".format(cusip, j+1)
+ data = pd.read_table(myzip.open(filename), skiprows=[1, 2], parse_dates=[0],
+ thousands = ",",
+ date_parser = lambda x: datetime.datetime.strptime(x, "%b %d, %Y"),
+ index_col = 0)
+ for c in intexfields:
+ if data.dtypes[c] != np.dtype('float64'):
+ data[c] = data[c].apply(sanitize_float)
+ data["Balance"] = np.maximum(data["Balance"]- data["Accum Interest Shortfall"], 0)
+ data = data[fields].join(discounts)
+ scen[j,:2] = np.dot(data["df"], data[fields])
+ scen[j,3] = np.dot(np.diff(data.Balance), T[1:])/deldata["curr_balance"]
+ scen[j,4] = if scen[j,0] np.dot(data.Cashflow, data.df * T)/scen[j,0] else 0
+def compute_delta(dist, dealweight, cusip_pv, tradedate, K1 = 0, K2 = 1):
+ Ngrid, nT = dist["L"].shape
+ scenariosl = np.zeros((dealweight.size, nT))
+ scenariosr = np.zeros((dealweight.size, nT))
+ for t in range(nT):
+ scenariosl[:,t] = interpvalues(dist["L"][:,t], np.linspace(0, 1, Ngrid), dealweight)
+ scenariosr[:,t] = interpvalues(dist["R"][:,t], np.linspace(0, 1, Ngrid), dealweight)
if __name__=="__main__":
- #workdate = datetime.date.today()
- workdate = datetime.datetime.strptime("2014-03-19", "%Y-%m-%d").date()
- params = processzipfiles(workdate)
- pomme = getdealcf(params["dealnames"], params["zipfiles"], workdate)
- pdb.set_trace()
+ tradedate = datetime.date.today()
+ #tradedate = datetime.datetime.strptime("2014-03-19", "%Y-%m-%d").date()
+ params = processzipfiles(tradedate)
+ pomme = getdealcf(params["dealnames"], params["zipfiles"], tradedate)