diff options
Diffstat (limited to 'python/markit/rates.py')
| -rw-r--r-- | python/markit/rates.py | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/python/markit/rates.py b/python/markit/rates.py new file mode 100644 index 00000000..990a95e4 --- /dev/null +++ b/python/markit/rates.py @@ -0,0 +1,43 @@ +from db import dbconn +from common import root +import datetime +from io import BytesIO +import os +import pandas as pd +import requests +import xml.etree.ElementTree as ET +import zipfile + +def downloadMarkitIRData(download_date = datetime.date.today(), + currency = "USD"): + conn = dbconn("serenitasdb") + ## T+1 rates are published in the evening + effective_date = download_date + datetime.timedelta(days = 1) + 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 downloadMarkitIRData(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()} + 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}) ON CONFLICT DO NOTHING". + 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() |
