diff options
Diffstat (limited to 'python/yieldcurve.py')
| -rw-r--r-- | python/yieldcurve.py | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/python/yieldcurve.py b/python/yieldcurve.py index b426c6cc..f76faa3a 100644 --- a/python/yieldcurve.py +++ b/python/yieldcurve.py @@ -10,19 +10,20 @@ from quantlib.util.converter import qldate_to_pydate, pydate_to_qldate from quantlib.market.market import libor_market, next_imm_date import numpy as np import matplotlib.pyplot as plt +from quantlib.quotes import SimpleQuote -def getMarkitIRData(date = datetime.date.today()): +def getMarkitIRData(date = datetime.date.today(), currency="USD"): basedir = os.path.join(root, "data", "Yield Curves") - filename = "InterestRates_USD_{0:%Y%m%d}.xml".format(date) - if not os.path.exists(os.path.join(basedir, filename)): - r = requests.get('http://www.markit.com/news/InterestRates_USD_{0:%Y%m%d}.zip'.format(date)) + 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 "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)) + tree = ET.parse(os.path.join(root, "data", "Yield Curves", filename + '.xml')) 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')])} @@ -37,25 +38,29 @@ def getMarkitIRData(date = datetime.date.today()): def get_futures_data(date = datetime.date.today()): futures_file = os.path.join(root, "data", "Yield Curves", - "futures-{0:%Y-%m-%d}.csv".format(date) + "futures-{0:%Y-%m-%d}.csv".format(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): +def YC(date = datetime.date.today(), currency="USD", MarkitData=None, futures = None): if not MarkitData: - MarkitData = getMarkitIRData(date) - if not futures: - futures = get_futures_data(date) - m = libor_market('USD(NY)') - cal = calendar_from_name('GBR') + MarkitData = getMarkitIRData(date, currency) + # if not futures: + # futures = get_futures_data(date) + if currency == "USD": + m = libor_market('USD(NY)', calendar='WO') + else if currency == "EUR": + m = libor_market('EUR:1Y', calendar='WO') + m.calendar = "WeekendsOnly" + m.fixed_leg_convention = 'ModifiedFollowing' # m.settle_date is not available until we set_quotes, so we compute it again # need a better way to do this - settle_date = cal.advance(pydate_to_qldate(date), 2, Days) - quotes = [('ED',i+1, v) for i, v in enumerate(futures)] - if next_imm_date(date, 9) == settle_date + Period('2Yr'): - quotes.pop(7) - quotes += [('SWAP', k, v) for k, v in MarkitData['swaps'].items()] + # quotes = [('ED', i+1, v) for i, v in enumerate(futures)] + # if next_imm_date(date, 9) == settle_date + Period('2Yr'): + # quotes.pop(7) + quotes = [('DEP', t, SimpleQuote(v)) for t, v in MarkitData['deposits'].items()] + quotes += [('SWAP', t, SimpleQuote(v)) for t, v in MarkitData['swaps'].items()] m.set_quotes(date, quotes) ts = m.bootstrap_term_structure() return ts @@ -70,7 +75,7 @@ if __name__=="__main__": p6 = Period('6Mo') p12 = Period('12Mo') sched = Schedule(ts.reference_date, ts.reference_date+Period('5Yr'), Period('3Mo'), cal) - days = [qldate_to_pydate(day) for day in sched] + days = [qldate_to_pydate(d) for d in sched] f3 = [ts.forward_rate(d, d+p3, Actual360(), 0).rate for d in sched] f6 = [ts.forward_rate(d, d+p6, Actual360(), 0).rate for d in sched] f2 = [ts.forward_rate(d, d+p2, Actual360(), 0).rate for d in sched] |
