diff options
| -rw-r--r-- | python/analytics/index.py | 18 | ||||
| -rw-r--r-- | python/yieldcurve.py | 22 |
2 files changed, 22 insertions, 18 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py index 0600deb9..70535e6f 100644 --- a/python/analytics/index.py +++ b/python/analytics/index.py @@ -5,9 +5,9 @@ import math import numpy as np import pandas as pd import warnings -import yieldcurve from dateutil.relativedelta import relativedelta + from pyisda.legs import ContingentLeg, FeeLeg from quantlib.settings import Settings from quantlib.time.api import Date, Actual365Fixed @@ -309,22 +309,10 @@ class Index(object): @trade_date.setter def trade_date(self, d): - if isinstance(d, pd.Timestamp): + if isinstance(d, datetime.datetime): d = d.date() - prebuilt_curves = getattr(yieldcurve, '_{}_curves'.format(self.currency)) self.start_date = previous_twentieth(d) - if d in prebuilt_curves: - self._yc = prebuilt_curves[d] - else: - print("cache miss for date: {}".format(d)) - settings = Settings() - settings.evaluation_date = Date.from_datetime(d) - # self._helpers = rate_helpers(self.currency) - # self._ql_yc = YC(self._helpers) - # self._yc = ql_to_jp(self._ql_yc) - ql_yc = YC(currency=self.currency) - self._yc = ql_to_jp(ql_yc) - prebuilt_curves[d] = self._yc + self._yc = get_curve(d, self.currency) # use the rolled forward curve if we price something in the future if self._yc.base_date < d: self._yc = self._yc.expected_forward_curve(d) diff --git a/python/yieldcurve.py b/python/yieldcurve.py index 934d5bc4..d1abc601 100644 --- a/python/yieldcurve.py +++ b/python/yieldcurve.py @@ -22,7 +22,7 @@ from pyisda.curve import YieldCurve, BadDay import warnings from db import dbengine, dbconn -def get_curves(currency="USD", date=None): +def load_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) @@ -40,8 +40,24 @@ def get_curves(currency="USD", date=None): return {d: YieldCurve.from_bytes(lz4.block.decompress(curve)) for d, curve in c} -_USD_curves = get_curves("USD") -_EUR_curves = get_curves("EUR") +_USD_curves = load_curves("USD") +_EUR_curves = load_curves("EUR") + +def get_curve(effective_date, currency="USD"): + curves = globals()[f'_{currency}_curves'] + if isinstance(effective_date, datetime.datetime): + effective_date = effective_date.date() + if effective_date in curves: + return curves[effective_date] + else: + warnings.warn("cache miss for date: {}".format(effective_date), + RuntimeWarning) + settings = Settings() + settings.evaluation_date = Date.from_datetime(effective_date) + ql_yc = YC(currency=currency) + jp_yc = ql_to_jp(ql_yc) + curves[d] = jp_yc + return jp_yc def getMarkitIRData(effective_date = datetime.date.today(), currency = "USD"): |
