diff options
| -rw-r--r-- | python/markit/rates.py | 10 | ||||
| -rw-r--r-- | python/yieldcurve.py | 26 | ||||
| -rw-r--r-- | sql/serenitasdb.sql | 4 |
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,
|
