aboutsummaryrefslogtreecommitdiffstats
path: root/python/yieldcurve.py
blob: 91a71b532414a3b0f5d801d0cf9642ab1d6e2160 (plain)
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)