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