diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/index.py | 17 | ||||
| -rw-r--r-- | python/analytics/option.py | 16 | ||||
| -rw-r--r-- | python/analytics/utils.py | 2 | ||||
| -rw-r--r-- | python/yieldcurve.py | 9 |
4 files changed, 23 insertions, 21 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py index e7472a84..efda3cb6 100644 --- a/python/analytics/index.py +++ b/python/analytics/index.py @@ -1,6 +1,7 @@ -import array +from __future__ import division import datetime import math +import numpy as np import pandas as pd from pyisda.legs import ContingentLeg, FeeLeg @@ -18,7 +19,7 @@ from yieldcurve import YC, ql_to_jp, roll_yc, rate_helpers serenitasdb = dbconn('serenitasdb') -def g(index, spread : float, exercise_date : datetime.date, forward_yc = None): +def g(index, spread, exercise_date, forward_yc = None): """computes the strike clean price using the expected forward yield curve """ if forward_yc is None: forward_yc = index._yc @@ -26,13 +27,13 @@ def g(index, spread : float, exercise_date : datetime.date, forward_yc = None): exercise_date_settle = (pd.Timestamp(exercise_date) + 3* BDay()).date() sc = SpreadCurve(exercise_date, forward_yc, index.start_date, step_in_date, exercise_date_settle, - [index.end_date], array.array('d', [spread * 1e-4]), + [index.end_date], np.array([spread * 1e-4]), index.recovery) a = index._fee_leg.pv(exercise_date, step_in_date, exercise_date_settle, forward_yc, sc, True) return (spread - index.fixed_rate) * a *1e-4 -class Index(): +class Index(object): """ minimal class to represent a credit index """ def __init__(self, start_date, end_date, recovery, fixed_rate, notional = 10e6): @@ -122,7 +123,7 @@ class Index(): def _update(self): self._sc = SpreadCurve(self.trade_date, self._yc, self.start_date, self._step_in_date, self._value_date, - [self.end_date], array.array('d', [self._spread]), + [self.end_date], np.array([self._spread]), self.recovery) self._risky_annuity = self._fee_leg.pv(self.trade_date, self._step_in_date, self._value_date, self._yc, @@ -135,7 +136,7 @@ class Index(): self._price = 100 * (1 - self._clean_pv) @spread.setter - def spread(self, s: float): + def spread(self, s): """ s: spread in bps """ if self.spread is None or s != self.spread: self._spread = s * 1e-4 @@ -337,7 +338,7 @@ class Index(): return "\n".join(s) -class ForwardIndex(): +class ForwardIndex(object): def __init__(self, index, forward_date, ref_is_price = False): self.index = index self.forward_date = forward_date @@ -366,7 +367,7 @@ class ForwardIndex(): return self.index.spread @ref.setter - def ref(self, val : float): + def ref(self, val): if self._ref_is_price: if self.index.price is None or \ math.fabs(self.index.price - val) > 1e-6: diff --git a/python/analytics/option.py b/python/analytics/option.py index b05fe374..27ee9059 100644 --- a/python/analytics/option.py +++ b/python/analytics/option.py @@ -1,3 +1,5 @@ +from __future__ import division + import array import datetime import math @@ -14,7 +16,7 @@ from pyisda.flat_hazard import pv_vec from scipy.optimize import brentq from scipy.integrate import simps -def calib(S0, fp, exercise_date : datetime.date, exercise_date_settle :datetime.date, +def calib(S0, fp, exercise_date, exercise_date_settle, index, rolled_curve, tilt, w): S = S0 * tilt * 1e-4 pv = pv_vec(S, rolled_curve, exercise_date, exercise_date_settle, @@ -22,7 +24,7 @@ def calib(S0, fp, exercise_date : datetime.date, exercise_date_settle :datetime. index.fixed_rate * 1e-4) return np.inner(pv, w) - fp -def ATMstrike(index, exercise_date : datetime.date): +def ATMstrike(index, exercise_date): exercise_date_settle = (pd.Timestamp(exercise_date) + 3* BDay()).date() fp = index.forward_pv(exercise_date) / index.notional closure = lambda S: g(index, S, exercise_date) - fp @@ -37,7 +39,7 @@ def ATMstrike(index, exercise_date : datetime.date): class Swaption(ForwardIndex): """Swaption class""" - def __init__(self, index, exercise_date : datetime.date, strike : float, + def __init__(self, index, exercise_date, strike, option_type="payer", strike_is_price = False): ForwardIndex.__init__(self, index, exercise_date, strike_is_price) self._exercise_date = exercise_date @@ -54,7 +56,7 @@ class Swaption(ForwardIndex): return self._exercise_date @exercise_date.setter - def exercise_date(self, d : datetime.date): + def exercise_date(self, d): self._exercise_date = d ForwardIndex.__init__(self, self.index, d) self._forward_yc = roll_yc(self.index._yc, d) @@ -68,7 +70,7 @@ class Swaption(ForwardIndex): return self._strike @strike.setter - def strike(self, K : float): + def strike(self, K): if self._strike_is_price: self._G = (100 - K) / 100 # we compute the corresponding spread to the strike price @@ -127,7 +129,7 @@ class Swaption(ForwardIndex): return self.notional * simps(val, Z) * self.df @pv.setter - def pv(self, val: float): + def pv(self, val): if np.isnan(val): raise ValueError("val is nan") if val < self.intrinsic_value: @@ -161,7 +163,7 @@ class Swaption(ForwardIndex): self.sigma, self.option_type) * self.notional @pv_black.setter - def pv_black(self, val: float): + def pv_black(self, val): if np.isnan(val): raise ValueError("val is nan") if val < self.intrinsic_value: diff --git a/python/analytics/utils.py b/python/analytics/utils.py index ddfc6b23..c499c65f 100644 --- a/python/analytics/utils.py +++ b/python/analytics/utils.py @@ -3,7 +3,7 @@ from scipy.special import h_roots from dateutil.relativedelta import relativedelta import datetime -def GHquad(n : int): +def GHquad(n): """Gauss-Hermite quadrature weights""" Z, w = h_roots(n) return Z*np.sqrt(2), w/np.sqrt(np.pi) diff --git a/python/yieldcurve.py b/python/yieldcurve.py index c8d6ed01..044a5165 100644 --- a/python/yieldcurve.py +++ b/python/yieldcurve.py @@ -18,7 +18,6 @@ import matplotlib.pyplot as plt from quantlib.quotes import SimpleQuote from db import dbconn from pyisda.curve import YieldCurve -import array def getMarkitIRData(effective_date = datetime.date.today(), currency = "USD"): @@ -26,7 +25,7 @@ def getMarkitIRData(effective_date = datetime.date.today(), sql_str = "SELECT * FROM {}_rates WHERE effective_date = %s".format(currency) with conn.cursor() as c: c.execute(sql_str, (effective_date,)) - col_names = [c[0] for c in c.description] + col_names = [col[0] for col in c.description] r = c.fetchone() MarkitData = {'effectiveasof': r[0], 'deposits': [(t, r[i]) for i, t in \ @@ -100,8 +99,8 @@ def get_dates(date, currency="USD"): def roll_yc(yc, forward_date): """returns the expected forward yield cuve on a forward_date""" dates = get_dates(forward_date) - dfs = array.array('d', [yc.discount_factor(d, forward_date) for d in dates]) - return YieldCurve.from_discount_factors(forward_date, dates, array.array('d', dfs), 'ACT/365F') + dfs = np.array([yc.discount_factor(d, forward_date) for d in dates]) + return YieldCurve.from_discount_factors(forward_date, dates, dfs, 'ACT/365F') def YC(helpers = None, currency="USD", MarkitData=None): if helpers is None: @@ -112,7 +111,7 @@ def YC(helpers = None, currency="USD", MarkitData=None): def ql_to_jp(ql_yc): """convert a QuantLib yield curve to a JP's one""" if ql_yc._trait == BootstrapTrait.Discount: - dfs = array.array('d', ql_yc.data[1:]) + dfs = np.array(ql_yc.data[1:]) dates = [pydate_from_qldate(d) for d in ql_yc.dates[1:]] trade_date = pydate_from_qldate(ql_yc.dates[0]) return YieldCurve.from_discount_factors(trade_date, dates, dfs, 'ACT/365F') |
