diff options
Diffstat (limited to 'python/analytics/index.py')
| -rw-r--r-- | python/analytics/index.py | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/python/analytics/index.py b/python/analytics/index.py index ddb77abf..3d929cd0 100644 --- a/python/analytics/index.py +++ b/python/analytics/index.py @@ -35,7 +35,7 @@ def g(index, spread, exercise_date, forward_yc = None): class Index(object): """ minimal class to represent a credit index """ def __init__(self, start_date, end_date, recovery, fixed_rate, - notional = 10e6): + notional = 10e6, quote_is_price=False): """ start_date : :class:`datetime.date` index start_date (Could be issue date, or last imm date) @@ -61,6 +61,7 @@ class Index(object): self._spread = None self._price = None self.name = None + self._quote_is_price = quote_is_price @property def start_date(self): @@ -155,6 +156,20 @@ class Index(object): self._update() @property + def ref(self): + if self._quote_is_price: + return self.price + else: + return self.spread + + @ref.setter + def ref(self, val): + if self._quote_is_price: + self.price = val + else: + self.spread = val + + @property def DV01(self): old_pv = self.pv self.spread += 1 @@ -229,8 +244,8 @@ class Index(object): self._update() @classmethod - def from_name(cls, index, series, tenor, trade_date = datetime.date.today(), - notional = 10e6): + def from_name(cls, index, series, tenor, trade_date=datetime.date.today(), + notional=10e6): try: r = engine.execute("SELECT maturity, coupon FROM index_maturity " \ "WHERE index=%s AND series=%s AND tenor = %s", @@ -242,7 +257,8 @@ class Index(object): raise ValueError("Index not found") else: recovery = 0.4 if index.lower() == "ig" else 0.3 - instance = cls(trade_date, maturity, recovery, coupon) + instance = cls(trade_date, maturity, recovery, coupon, notional, + index=="HY") instance.name = "MARKIT CDX.NA.{}.{} {:%m/%y} ".format( index.upper(), series, @@ -309,14 +325,19 @@ class Index(object): class ForwardIndex(object): - def __init__(self, index, forward_date, ref_is_price = False): + def __init__(self, index, forward_date): self.index = index self.forward_date = forward_date self.exercise_date_settle = (pd.Timestamp(forward_date) + 3* BDay()).date() self.df = index._yc.discount_factor(self.exercise_date_settle) - self._ref_is_price = ref_is_price self._update() + @classmethod + def from_name(cls, index_type, series, tenor, forward_date, + trade_date=datetime.date.today(), notional=10e6): + index = Index.from_name(index_type, series, tenor, trade_date, notional) + return cls(index, forward_date, indextype == "HY") + @property def forward_annuity(self): return self._forward_annuity @@ -331,22 +352,12 @@ class ForwardIndex(object): @property def ref(self): - if ref_is_price: - return self.index.price - else: - return self.index.spread + return self.index.ref @ref.setter def ref(self, val): - if self._ref_is_price: - if self.index.price is None or \ - math.fabs(self.index.price - val) > 1e-6: - self.index.price = val - self._update() - else: - if self.index.spread is None or val != self.index.spread: - self.index.spread = val - self._update() + self.index.ref = val + self._update() def _update(self): if self.index._sc is not None: |
