aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/analytics/index.py18
-rw-r--r--python/yieldcurve.py22
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"):