aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--R/build_scenarios.R60
-rw-r--r--R/load_cf.R6
-rw-r--r--python/intex_scenarios.py45
3 files changed, 54 insertions, 57 deletions
diff --git a/R/build_scenarios.R b/R/build_scenarios.R
index e52d9794..5b339222 100644
--- a/R/build_scenarios.R
+++ b/R/build_scenarios.R
@@ -1,4 +1,5 @@
library(doParallel)
+library(yaml)
hostname <- system("hostname", intern=TRUE)
if(hostname=="debian"){
registerDoParallel(8)
@@ -42,8 +43,10 @@ get.reinvassets <- function(dealname, workdate){
sqlstr <- sprintf("select * from et_historicaldealinfo('%s', '%s') where ReinvFlag Is true",
dealname, workdate)
data <- dbGetQuery(dbCon, sqlstr)
- for(i in 1:dim(data)[1]){
- r[[data$issuername[i]]] <- list(coupontype=data$fixedorfloat[i], liborfloor=data$liborfloor[i])
+ if(nrow(data)>0){
+ for(i in 1:nrow(data)){
+ r[[data$issuername[i]]] <- list(coupontype=data$fixedorfloat[i], liborfloor=data$liborfloor[i])
+ }
}
return( r )
}
@@ -214,26 +217,25 @@ for(j in seq_along(dealnames)){
DC <- DiscountCurve(L3m$params, L3m$tsQuotes, yearFrac(L3m$params$tradeDate, deal.datesmonthlylagged))
df <- DC$discounts
forwards <- DC$forwards
- ##we need to jack up the reinvestment prices somehow so let's add a 75bps tweak...
- ## reinvprices.tweak <- compute.reinvprices(df, forwards, cdrmonthly, recoverymonthly, reinvspread+0.0075,
- ## reinvfixed+0.0075, rollingmaturity, reinvlag)
reinvassets <- get.reinvassets(dealnames[j], workdate)
reinvprices <- list()
- for(assetname in names(reinvassets)){
- asset <- reinvassets[[assetname]]
- if(asset$coupontype=="FLOAT") {
- coupon <- reinvspread
- }else{
- coupon <- reinvfixed
- }
- #reinvest tweak
- coupon <- coupon-0.0075
+ if(reinvflags[j] && length(reinvassets)>0){
+ for(assetname in names(reinvassets)){
+ asset <- reinvassets[[assetname]]
+ if(asset$coupontype=="FLOAT") {
+ coupon <- reinvspread
+ }else{
+ coupon <- reinvfixed
+ }
+ ##reinvest tweak
+ coupon <- coupon-0.0075
- reinvprices[[assetname]] <- foreach(date = iter(deal.datesmonthly), .combine=c) %dopar% {
- 100 * forwardportfolioprice(deal.portfolio, date,
- min(date+rollingmaturity*30, deal.data$maturity),
- asset$coupontype, coupon, asset$liborfloor/100)
+ reinvprices[[assetname]] <- foreach(date = iter(deal.datesmonthly), .combine=c) %dopar% {
+ 100 * forwardportfolioprice(deal.portfolio, date,
+ min(date+rollingmaturity*30, deal.data$maturity),
+ asset$coupontype, coupon, asset$liborfloor/100)
+ }
}
}
## reinvprices <- compute.reinvprices(df, forwards, cdrmonthly, recoverymonthly, reinvspread,
@@ -286,27 +288,13 @@ for(j in seq_along(dealnames)){
write.table(100 * recoverymonthly,
file=file.path(save.dir, paste0(dealnames[j],"-recovery.csv")),
row.names=F, col.names=F, sep=",", na="NaN")
- ## write.table(100 * reinvprices$loan,
- ## file = file.path(save.dir, paste0(dealnames[j], "-floatreinvprices.csv")),
- ## row.names=F, col.names=F, sep=",")
- ## write.table(100 * reinvprices$bond,
- ## file = file.path(save.dir, paste0(dealnames[j], "-fixedreinvprices.csv")),
- ## row.names=F, col.names=F, sep=",")
write.table(reinvprices, file = file.path(save.dir, paste0(dealnames[j], "-reinvprices.csv")),
row.names=F, col.names=T, sep=",")
+
configfile <- file.path(save.dir, paste0(dealnames[j], ".config"))
- cat("[config]\n", file = configfile)
- cat(paste("rollingmat", as.integer(rollingmaturity), sep="="), "\n",
- append=TRUE, file = configfile)
-
- topythonbool <- function(x){
- stopifnot(is.logical(x))
- return(if(x) "True" else "False")
- }
-
- cat(paste("reinvflag", topythonbool(reinvflags[j]), sep="="), "\n",
- append = TRUE, file=configfile)
-
+ config <- list(rollingmat = as.integer(rollingmaturity),
+ reinvflag = reinvflags[j])
+ cat(as.yaml(config), file=configfile)
save(scenariosd, scenariosr, dist.joint, file=file.path(save.dir, paste0(dealnames[j], ".RData")),
compress="xz")
diff --git a/R/load_cf.R b/R/load_cf.R
index ff9a8d6b..a8500225 100644
--- a/R/load_cf.R
+++ b/R/load_cf.R
@@ -1,5 +1,6 @@
library(RPostgreSQL)
library(RQuantLib)
+library(yaml)
args <- commandArgs(trailingOnly=TRUE)
@@ -69,7 +70,10 @@ getdealcf <- function(dealnames, workdate=Sys.Date()){
sqldata <- dbGetQuery(dbCon, sqlstring)
cfdata[[dealname]]$mv <- mv
cfdata[[dealname]]$currbal <- sqldata$"Curr Collat Bal"
- if(is.na(sqldata$"Reinv End Date")){
+ config <- file.path(file.path(root.dir, "Scenarios", paste("Intex curves", workdate, sep="_"), "csv"),
+ paste0(dealname, ".config"))
+ config <- yaml.load_file(config)
+ if(is.na(sqldata$"Reinv End Date")||!config$reinvflag){
tranches <- "COLLAT"
}else{
tranches <- c("COLLAT_INITIAL", "COLLAT_REINVEST")
diff --git a/python/intex_scenarios.py b/python/intex_scenarios.py
index 0a4182d5..e948ead5 100644
--- a/python/intex_scenarios.py
+++ b/python/intex_scenarios.py
@@ -8,7 +8,7 @@ import re
import psycopg2
import common
import sys
-import ConfigParser
+import yaml
pattern1 = re.compile("REINVEST\[\w+::REINV_TBA(\d)\]\[DEAL,(\d+)\]=.*$")
# reinv end date
@@ -19,6 +19,7 @@ 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
@@ -57,23 +58,24 @@ 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:
- 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')
- reinv_assets = get_reinv_assets(dealname, workdate, cursor)
- n_float_assets = len([v for v in reinv_assets.values() if v == 'FLOAT'])
- n_fixed_assets = len([v for v in reinv_assets.values() if v == 'FIXED'])
- 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
+ with open(os.path.join(basedir, "csv", dealname + ".config")) as fh:
+ config = yaml.load(fh)
+ reinvflag = config['reinvflag']
+ if reinvflag:
+ reinvenddate = get_reinvenddate(dealname, cursor)
+ reinv_assets = get_reinv_assets(dealname, workdate, cursor)
+ n_float_assets = len([v for v in reinv_assets.values() if v == 'FLOAT'])
+ n_fixed_assets = len([v for v in reinv_assets.values() if v == '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
try:
with open(os.path.join(basedir, "csv", dealname + "-reinvprices.csv"), "rb") as fh:
@@ -113,8 +115,11 @@ def generate_scenarios(workdate, dealnames, conn, cursor):
line = re.sub(pattern8, r"\1{0}\2=0".format(dealname.upper()), line)
fhsss.write(line + "\r\n")
continue
+ if not reinvflag and "DO_REINV" in line:
+ fhsss.write("DO_REINV=0" + "\r\n")
+ continue
m = pattern1.match(line)
- if m:
+ if reinvflag and m:
reinv_number, scen_number = m.groups()
key = "REINV_TBA" + reinv_number
if key in reinv_assets:
@@ -129,12 +134,12 @@ def generate_scenarios(workdate, dealnames, conn, cursor):
rollingmat)
fhsss.write(line + "\r\n")
continue
- if pattern2.match(line):
+ if reinvflag and pattern2.match(line):
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 m:
+ 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) + \
@@ -151,7 +156,7 @@ def generate_scenarios(workdate, dealnames, conn, cursor):
fhsss.write(line + "\r\n")
continue
m = pattern5.match(line)
- if m:
+ if reinvflag and m:
reinv_number, scen_number = m.groups()
reinv_name = "REINV_TBA" + reinv_number
if reinv_number=="1":
@@ -160,7 +165,7 @@ def generate_scenarios(workdate, dealnames, conn, cursor):
fhsss.write(line + "\r\n")
continue
if dealname=="flags4":
- line = "STANDARD_VAR[LITPT3::#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: