aboutsummaryrefslogtreecommitdiffstats
path: root/python/risk_insight/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/risk_insight/__init__.py')
-rw-r--r--python/risk_insight/__init__.py99
1 files changed, 99 insertions, 0 deletions
diff --git a/python/risk_insight/__init__.py b/python/risk_insight/__init__.py
new file mode 100644
index 00000000..114c1185
--- /dev/null
+++ b/python/risk_insight/__init__.py
@@ -0,0 +1,99 @@
+from flask import Flask, render_template, jsonify, request, g
+import os, csv, yaml
+import datetime
+import psycopg2
+
+app = Flask(__name__)
+
+basedir = "/home/share/CorpCDOs"
+
+def get_attach_from_name(index_type, series):
+ if index_type.lower() == "ig":
+ if series == 9:
+ attach = [0, 3, 7, 10, 15, 30, 100]
+ else:
+ attach = [0, 3, 7, 15, 100]
+ elif index_type.lower() == "hy":
+ attach = [0, 15, 25, 35, 100]
+ elif index_type.lower() == "xo":
+ attach = [0, 10, 20, 35, 100]
+ elif index_type.lower() == "eu":
+ if series == 9:
+ attach = [0, 3, 6, 9, 12, 22, 100]
+ else:
+ attach = [0, 3, 6, 12, 100]
+ return attach
+
+def get_db():
+ db = getattr(g, '_database', None)
+ if db is None:
+ db = g._database = psycopg2.connect(database="serenitasdb",
+ user="serenitas_user",
+ host="debian")
+ return db
+
+@app.teardown_appcontext
+def close_connection(exception):
+ db = getattr(g, '_database', None)
+ if db is not None:
+ db.close()
+
+@app.route("/_data_tranches")
+def get_risk_numbers():
+ index = request.args.get("i")
+ series = request.args.get("s", 0, int)
+ tenor = request.args.get("t")
+ greek = request.args.get("g")
+ data = []
+ db = get_db()
+ attach = get_attach_from_name(index, series)
+ sqlstr = "SELECT to_char(date, 'YYYY/MM/DD'), \"{0}\" from risk_numbers " \
+ "WHERE index=%s and series=%s and tenor=%s ORDER BY date".format(greek)
+ with db.cursor() as c:
+ c.execute(sqlstr, (index.upper(), series, tenor))
+ data = [[val[0]]+val[1] for val in c]
+ return jsonify(labels=["Date"] + ["{0}-{1} {2}".format(l, u, greek) for l, u in zip(attach[:-1], attach[1:])],
+ data=data)
+
+@app.route("/_data_indices")
+def get_indices_quotes():
+ index = request.args.get("i")
+ series = request.args.get("s", 0, int)
+ tenor = request.args.get("t")
+ what = request.args.get("w")
+ data = []
+ db = get_db()
+ sqlstr = "SELECT to_char(date, 'YYYY/MM/DD'), {0} " \
+ "from index_quotes WHERE index=%s and series=%s " \
+ "and tenor=%s ORDER BY date"
+ query_columns = {'quotes': "closeprice, modelprice",
+ 'adjquotes': "adjcloseprice, adjmodelprice",
+ 'basis': "closeprice-modelprice",
+ 'theta': "theta",
+ 'duration': "duration"}
+ labels = {'quotes': ["Date", "Close", "FV"],
+ 'adjquotes': ["Date", "AdjClose", "AdjFV"],
+ 'basis': ["Date", "Basis"],
+ 'theta': ["Date", "Theta"],
+ 'duration': ["Date", "Duration"]}
+ sqlstr = sqlstr.format(query_columns[what])
+ with db.cursor() as c:
+ c.execute(sqlstr, (index.upper(), series, tenor))
+ data = c.fetchall()
+ return jsonify(labels = labels[what],
+ data = data)
+
+@app.route("/tranches.html")
+def tranches():
+ with open(os.path.join(basedir, "code", "etc", "runs.yml")) as fh:
+ runs = yaml.load(fh)
+ series_list = sorted(list(set([int(name[2:]) for name in runs['name']])))
+ return render_template("tranches.html", series=series_list)
+
+@app.route("/indices.html")
+def indices():
+ return render_template("indices.html", series=[9, 10, 11, 13] + list(range(16, 25)))
+
+@app.route("/")
+def main():
+ return render_template("index.html")