from common import root import os import requests, zipfile from io import BytesIO import xml.etree.ElementTree as ET import datetime from quantlib.time.date import Date from quantlib.time import imm import pdb from quantlib.market.market import libor_market from quantlib.time.date import Date def getMarkitIRData(date): basedir = os.path.join(root, "data", "Yield Curves") datestr = datetime.datetime.strftime(date, "%Y%m%d") filename = "InterestRates_USD_{0}.xml".format(datestr) if not os.path.exists(os.path.join(basedir, filename)): r = requests.get('http://www.markit.com/news/InterestRates_USD_{0}.zip'.format(datestr)) if "x-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)) tree = ET.parse(os.path.join(root, "data", "Yield Curves", filename)) deposits = {tenor: rate for tenor, rate in \ zip([e.text for e in tree.findall('./deposits/*/tenor')], [float(e.text) for e in tree.findall('./deposits/*/parrate')])} swaps = {tenor: rate for tenor, rate in \ 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': deposits, 'swaps': swaps, 'effectiveasof': datetime.datetime.strptime(effectiveasof, "%Y-%m-%d").date()} return MarkitData if __name__=="__main__": MarkitData = getMarkitIRData(datetime.date.today()) m = libor_market('USD(NY)') quotes = [('DEP', k, v) for k, v in MarkitData['deposits'].items()] quotes += [('SWAP', k, v) for k, v in MarkitData['swaps'].items()] m.set_quotes(datetime.date.today(), quotes) m.bootstrap_term_structure() PiecewiseYieldCurve("discount", "linear", future_date = Date.from_datetime(datetime.datetime(2017, 10, 5)) p = m.discount(future_date)