diff options
| -rw-r--r-- | python/yieldcurve.py | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/python/yieldcurve.py b/python/yieldcurve.py index 97b811e9..e956e216 100644 --- a/python/yieldcurve.py +++ b/python/yieldcurve.py @@ -15,31 +15,31 @@ from quantlib.termstructures.yields.api import ( from quantlib.time.date import pydate_from_qldate import numpy as np +import pandas as pd import matplotlib.pyplot as plt from quantlib.quotes import SimpleQuote -def getMarkitIRData(date = datetime.date.today(), currency="USD"): +def getMarkitIRData(date = datetime.date.today() - datetime.timedelta(days = 1), + currency="USD"): basedir = os.path.join(root, "data", "Yield Curves") 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']: + 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 getMarkitIRData(date-datetime.timedelta(days=1)) 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')])} - 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')])} + 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': deposits, - 'swaps': swaps, - 'effectiveasof': datetime.datetime.strptime(effectiveasof, "%Y-%m-%d").date()} + MarkitData = {'deposits': list(deposits), + 'swaps': list(swaps), + 'effectiveasof': pd.Timestamp(effectiveasof).date()} return MarkitData def get_futures_data(date = datetime.date.today()): @@ -57,7 +57,7 @@ def rate_helpers(currency="USD", MarkitData=None): raise RuntimeError("Yield curve effective date: {0} doesn't " \ "match the evaluation date: {1}".format( MarkitData['effectiveasof'], - qldate_to_pydate(settings.evaluation_date))) + pydate_from_qldate(settings.evaluation_date))) calendar = WeekendsOnly() if currency == "USD": isda_ibor = IborIndex("IsdaIbor", Period(3, Months), 2, USDCurrency(), calendar, @@ -68,14 +68,16 @@ def rate_helpers(currency="USD", MarkitData=None): ModifiedFollowing, False, Actual360()) fix_freq = Annual deps = [DepositRateHelper(q, Period(t), 2, calendar, ModifiedFollowing, False, Actual360()) - for t, q in MarkitData['deposits'].items()] + for t, q in MarkitData['deposits']] + # this matches with bloomberg, but according to Markit, maturity should be unadjusted swaps = [SwapRateHelper.from_tenor(q, Period(t), calendar, fix_freq, ModifiedFollowing, - Thirty360(), isda_ibor) for t, q in MarkitData['swaps'].items()] + Thirty360(), isda_ibor) for t, q in MarkitData['swaps']] return deps + swaps -def YC(currency="USD", MarkitData=None): +def YC(currency="USD", helpers = None, MarkitData=None): settings = Settings() - helpers = rate_helpers(currency, MarkitData) + if helpers is None: + helpers = rate_helpers(currency, MarkitData) curve = PiecewiseYieldCurve("discount", "loglinear", settings.evaluation_date, helpers, Actual365Fixed()) return curve |
