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 from yieldcurve import YC, ql_to_jp from pickle import dumps 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, effective_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()} ql_yc = YC(currency=currency, MarkitData=MarkitData) jp_yc = ql_to_jp(ql_yc) sql_str = "INSERT INTO {}_curves VALUES(%s, %s) ON CONFLICT DO NOTHING".format(currency) with conn.cursor() as c: c.execute(sql_str, (MarkitData['effectiveasof'], jp_yc.__getstate__())) 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()