diff options
Diffstat (limited to 'python/risk_insight/__init__.py')
| -rw-r--r-- | python/risk_insight/__init__.py | 99 |
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") |
