aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/yieldcurve.py34
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