1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
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)
|