aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/markit/rates.py10
-rw-r--r--python/yieldcurve.py26
-rw-r--r--sql/serenitasdb.sql4
3 files changed, 30 insertions, 10 deletions
diff --git a/python/markit/rates.py b/python/markit/rates.py
index 147ced4f..25e7ad80 100644
--- a/python/markit/rates.py
+++ b/python/markit/rates.py
@@ -7,9 +7,12 @@ import pandas as pd
import requests
import xml.etree.ElementTree as ET
import zipfile
+from yieldcurve import YC, ql_to_jp
+import lz4
+from pickle import dumps
def downloadMarkitIRData(download_date = datetime.date.today(),
- currency = "USD"):
+ currency="USD"):
conn = dbconn("serenitasdb")
## T+1 rates are published in the evening
effective_date = download_date + datetime.timedelta(days = 1)
@@ -32,6 +35,11 @@ def downloadMarkitIRData(download_date = datetime.date.today(),
MarkitData = {'deposits': list(deposits),
'swaps': list(swaps),
'effectiveasof': pd.Timestamp(effectiveasof).date()}
+ ql_yc = YC(currency=currency, MarkitData=MarkitData)
+ jp_yc = ql_to_jp(ql_yc)
+ sql_str = "INSERT INTO {}_curves VALUES(%s, %s) ON CONFLICT DO NOTHING".format(currency)
+ with conn.cursor() as c:
+ c.execute(sql_str, (effective_date, lz4.block.compress(dumps(jp_yc))))
instruments = MarkitData['deposits'] + MarkitData['swaps']
names = ",".join(['"{}"'.format(r[0]) for r in instruments])
values = ",".join(["%s"] * (len(instruments) + 1)) # +1 for effective_date
diff --git a/python/yieldcurve.py b/python/yieldcurve.py
index dea4036b..3a209f1e 100644
--- a/python/yieldcurve.py
+++ b/python/yieldcurve.py
@@ -1,8 +1,10 @@
from common import root
from contextlib import closing
+from itertools import islice
import datetime
import lz4
import os
+import pandas as pd
from quantlib.settings import Settings
from quantlib.time.api import (WeekendsOnly, Date, Period, Days, Schedule, Annual,
Semiannual, today, Actual360, Months, Years,
@@ -164,23 +166,29 @@ def ql_to_jp(ql_yc):
else:
raise RuntimeErrror('QuantLib curve needs to use Discount trait')
-def build_curves():
+def build_curves(currency="USD"):
settings = Settings()
calendar = WeekendsOnly()
- isda_ibor = IborIndex("IsdaIbor", Period(3, Months), 2, USDCurrency(), calendar,
- ModifiedFollowing, False, Actual360())
- fix_freq = Semiannual
-
- quotes = [SimpleQuote() for c in USD_rates.columns]
- gen = zip(quotes, USD_rates.columns)
+ if currency == "USD":
+ isda_ibor = IborIndex("IsdaIbor", Period(3, Months), 2, USDCurrency(), calendar,
+ ModifiedFollowing, False, Actual360())
+ fix_freq = Semiannual
+ elif currency == "EUR":
+ isda_ibor = IborIndex("IsdaIbor", Period(6, Months), 2, EURCurrency(), calendar,
+ ModifiedFollowing, False, Actual360())
+ fix_freq = Annual
+ engine = dbengine('serenitasdb')
+ rates = pd.read_sql_table('{}_rates'.format(currency.lower()), engine, index_col='effective_date')
+ quotes = [SimpleQuote() for c in rates.columns]
+ gen = zip(quotes, rates.columns)
deps = [DepositRateHelper(q, Period(t), 2, calendar, ModifiedFollowing,
False, Actual360()) for q, t in islice(gen, 6)]
swaps = [SwapRateHelper.from_tenor(q, Period(t), calendar,
fix_freq, ModifiedFollowing,
Thirty360(), isda_ibor) for q, t in gen]
- sql_str = "INSERT INTO USD_curves VALUES(%s, %s) ON CONFLICT DO NOTHING"
+ sql_str = "INSERT INTO {}_curves VALUES(%s, %s) ON CONFLICT DO NOTHING".format(currency)
conn = dbconn('serenitasdb')
- for effective_date, curve_data in USD_rates.iterrows():
+ for effective_date, curve_data in rates.iterrows():
print(effective_date)
settings.evaluation_date = Date.from_datetime(effective_date)
for q, val in zip(quotes, curve_data):
diff --git a/sql/serenitasdb.sql b/sql/serenitasdb.sql
index 40d99ca6..bb6b262e 100644
--- a/sql/serenitasdb.sql
+++ b/sql/serenitasdb.sql
@@ -510,6 +510,10 @@ CREATE TABLE USD_curves(
effective_date date PRIMARY KEY,
curve bytea)
+CREATE TABLE EUR_curves(
+ effective_date date PRIMARY KEY,
+ curve bytea)
+
CREATE TABLE swaption_quotes(
quotedate timestamptz,
index index_type,