diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/yieldcurve.py | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/python/yieldcurve.py b/python/yieldcurve.py index c49b6dd1..dea4036b 100644 --- a/python/yieldcurve.py +++ b/python/yieldcurve.py @@ -1,6 +1,8 @@ from common import root -import os +from contextlib import closing import datetime +import lz4 +import os from quantlib.settings import Settings from quantlib.time.api import (WeekendsOnly, Date, Period, Days, Schedule, Annual, Semiannual, today, Actual360, Months, Years, @@ -14,9 +16,31 @@ from quantlib.time.date import pydate_from_qldate import numpy as np from quantlib.quotes import SimpleQuote -from db import dbconn +from db import dbconn, dbengine +from pickle import dumps, loads from pyisda.curve import YieldCurve, BadDay import warnings +from db import dbengine, dbconn + +def get_curves(currency="USD", date=None): + """load the prebuilt curve from the database""" + if date: + sql_str = "SELECT curve FROM {}_curves WHERE effective_date=%s".format(currency) + else: + sql_str = "SELECT * FROM {}_curves".format(currency) + with closing(dbconn('serenitasdb')) as conn: + with conn.cursor() as c: + if date: + c.execute(sql_str, (date,)) + if c: + curve, = c.fetchone() + return loads(lz4.block.decompress(bytes(curve))) + else: + c.execute(sql_str) + return {d: loads(lz4.block.decompress(bytes(curve))) + for d, curve in c} + +_USD_curves = get_curves() def getMarkitIRData(effective_date = datetime.date.today(), currency = "USD"): @@ -140,6 +164,36 @@ def ql_to_jp(ql_yc): else: raise RuntimeErrror('QuantLib curve needs to use Discount trait') +def build_curves(): + 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) + 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" + conn = dbconn('serenitasdb') + for effective_date, curve_data in USD_rates.iterrows(): + print(effective_date) + settings.evaluation_date = Date.from_datetime(effective_date) + for q, val in zip(quotes, curve_data): + q.value = val + valid_deps = [d for d in deps if not np.isnan(d.quote)] + valid_swaps = [s for s in swaps if not np.isnan(s.quote)] + ql_yc = PiecewiseYieldCurve(BootstrapTrait.Discount, Interpolator.LogLinear, + 0, calendar, valid_deps + valid_swaps, Actual365Fixed()) + jp_yc = ql_to_jp(ql_yc) + with conn.cursor() as c: + c.execute(sql_str, (effective_date, lz4.block.compress(dumps(jp_yc)))) + conn.commit() + if __name__=="__main__": #evaluation_date = Date(29, 4, 2014) Settings.instance().evaluation_date = today() |
