aboutsummaryrefslogtreecommitdiffstats
path: root/python/markit/rates.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/markit/rates.py')
-rw-r--r--python/markit/rates.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/python/markit/rates.py b/python/markit/rates.py
new file mode 100644
index 00000000..990a95e4
--- /dev/null
+++ b/python/markit/rates.py
@@ -0,0 +1,43 @@
+from db import dbconn
+from common import root
+import datetime
+from io import BytesIO
+import os
+import pandas as pd
+import requests
+import xml.etree.ElementTree as ET
+import zipfile
+
+def downloadMarkitIRData(download_date = datetime.date.today(),
+ currency = "USD"):
+ conn = dbconn("serenitasdb")
+ ## T+1 rates are published in the evening
+ effective_date = download_date + datetime.timedelta(days = 1)
+ basedir = os.path.join(root, "data", "Yield Curves")
+ filename = "InterestRates_{0}_{1:%Y%m%d}".format(currency, download_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 "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 downloadMarkitIRData(download_date-datetime.timedelta(days=1))
+
+ tree = ET.parse(os.path.join(root, "data", "Yield Curves", filename + '.xml'))
+ 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': list(deposits),
+ 'swaps': list(swaps),
+ 'effectiveasof': pd.Timestamp(effectiveasof).date()}
+ instruments = MarkitData['deposits'] + MarkitData['swaps']
+ names = ",".join(['"{}"'.format(r[0]) for r in instruments])
+ values = ",".join(["%s"] * (len(instruments) + 1)) # +1 for effective_date
+ insert_str = ("INSERT INTO {0}_rates(effective_date, {1}) VALUES({2}) ON CONFLICT DO NOTHING".
+ format(currency, names, values))
+ with conn.cursor() as c:
+ c.execute(insert_str, [MarkitData['effectiveasof']] +[r[1] for r in instruments])
+ conn.commit()
+ conn.close()