diff options
Diffstat (limited to 'python/yieldcurve.py')
| -rw-r--r-- | python/yieldcurve.py | 63 |
1 files changed, 43 insertions, 20 deletions
diff --git a/python/yieldcurve.py b/python/yieldcurve.py index e956e216..69120d74 100644 --- a/python/yieldcurve.py +++ b/python/yieldcurve.py @@ -18,28 +18,51 @@ import numpy as np import pandas as pd import matplotlib.pyplot as plt from quantlib.quotes import SimpleQuote +from db import dbconn -def getMarkitIRData(date = datetime.date.today() - datetime.timedelta(days = 1), - currency="USD"): - basedir = os.path.join(root, "data", "Yield Curves") - filename = "InterestRates_{0}_{1:%Y%m%d}".format(currency, date) - if not os.path.exists(os.path.join(basedir, filename + '.xml')): - r = requests.get('http://www.markit.com/news/{0}.zip'.format(filename)) - if "zip" in r.headers['content-type']: - with zipfile.ZipFile(BytesIO(r.content)) as z: - z.extractall(path = os.path.join(root, "data", "Yield Curves")) - else: - return getMarkitIRData(date-datetime.timedelta(days=1)) +def getMarkitIRData(effective_date = datetime.date.today(), + currency = "USD"): + download_date = effective_date - datetime.timedelta(days = 1) + conn = dbconn("serenitasdb") + sql_str = "SELECT * FROM {}_rates WHERE effective_date = %s".format(currency) + with conn.cursor() as c: + c.execute(sql_str, (effective_date,)) + col_names = [c[0] for c in c.description] + r = c.fetchone() + if r: + MarkitData = {'effectiveasof': r[0], + 'deposits': [(t, r[i]) for i, t in \ + enumerate(col_names[1:7], 1) if r[i] is not None], + 'swaps': [(t, r[i]) for i, t in enumerate(col_names[7:], 7)]} + else: + basedir = os.path.join(root, "data", "Yield Curves") + filename = "InterestRates_{0}_{1:%Y%m%d}".format(currency, download_date) + if not os.path.exists(os.path.join(basedir, filename + '.xml')): + r = requests.get('http://www.markit.com/news/{0}.zip'.format(filename)) + if "zip" in r.headers['content-type']: + with zipfile.ZipFile(BytesIO(r.content)) as z: + z.extractall(path = os.path.join(root, "data", "Yield Curves")) + else: + return getMarkitIRData(download_date-datetime.timedelta(days=1)) - tree = ET.parse(os.path.join(root, "data", "Yield Curves", filename + '.xml')) - deposits = zip([e.text for e in tree.findall('./deposits/*/tenor')], - [float(e.text) for e in tree.findall('./deposits/*/parrate')]) - swaps = zip([e.text for e in tree.findall('./swaps/*/tenor')], - [float(e.text) for e in tree.findall('./swaps/*/parrate')]) - effectiveasof = tree.find('./effectiveasof').text - MarkitData = {'deposits': list(deposits), - 'swaps': list(swaps), - 'effectiveasof': pd.Timestamp(effectiveasof).date()} + tree = ET.parse(os.path.join(root, "data", "Yield Curves", filename + '.xml')) + deposits = zip([e.text for e in tree.findall('./deposits/*/tenor')], + [float(e.text) for e in tree.findall('./deposits/*/parrate')]) + swaps = zip([e.text for e in tree.findall('./swaps/*/tenor')], + [float(e.text) for e in tree.findall('./swaps/*/parrate')]) + effectiveasof = tree.find('./effectiveasof').text + MarkitData = {'deposits': list(deposits), + 'swaps': list(swaps), + 'effectiveasof': pd.Timestamp(effectiveasof).date()} + instruments = MarkitData['deposits'] + MarkitData['swaps'] + names = ",".join(['"{}"'.format(r[0]) for r in instruments]) + values = ",".join(["%s"] * (len(instruments) + 1)) # +1 for effective_date + insert_str = ("INSERT INTO {0}_rates(effective_date, {1}) VALUES({2})". + format(currency, names, values)) + with conn.cursor() as c: + c.execute(insert_str, [MarkitData['effectiveasof']] +[r[1] for r in instruments]) + conn.commit() + conn.close() return MarkitData def get_futures_data(date = datetime.date.today()): |
