from common import root import os import requests, zipfile from io import BytesIO import xml.etree.ElementTree as ET import datetime from quantlib.time.api import Calendar, Date, Period, Days, Schedule, today from quantlib.time import imm from quantlib.util.converter import qldate_to_pydate, pydate_to_qldate from quantlib.market.market import libor_market import numpy as np import matplotlib.pyplot as plt def getMarkitIRData(date = datetime.date.today()): 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 def get_futures_data(date = datetime.date.today()): futures_file = os.path.join(root, "data", "Yield Curves", "futures-{0}.csv".format(str(date))) with open(futures_file) as fh: quotes = [float(line.split(",")[1]) for line in fh] return quotes def YC(date = datetime.date.today(), MarkitData=None, futures = None): if not MarkitData: MarkitData = getMarkitIRData(date) if not futures: calendar = Calendar.from_name('TARGET')## need to figure out which is the right calendar to use prev_day = calendar.advance(pydate_to_qldate(date), -1, Days) futures = get_futures_data(qldate_to_pydate(prev_day).date()) m = libor_market('USD(NY)') quotes = [('ED',i+1, v) for i, v in enumerate(futures)] quotes += [('SWAP', k, v) for k, v in MarkitData['swaps'].items()] m.set_quotes(date, quotes) m.bootstrap_term_structure() return m if __name__=="__main__": m = YC() p1 = Period('1Mo') p2 = Period('2Mo') p3 = Period('3Mo') p6 = Period('6Mo') p12 = Period('12Mo') calendar = Calendar.from_name(m.calendar) sched = Schedule(m.settle_date, m.settle_date+Period('5Yr'), Period('3Mo'), calendar) days = [qldate_to_pydate(day) for day in sched] f3 = [m.forward(d, p3, 1) for d in sched] f6 = [m.forward(d, p6, 1) for d in sched] f2 = [m.forward(d, p2, 1) for d in sched] plt.plot(days, f2, days, f3, days, f6) plt.show()