diff options
Diffstat (limited to 'python/analytics')
| -rw-r--r-- | python/analytics/credit_default_swap.py | 40 | ||||
| -rw-r--r-- | python/analytics/index.py | 3 |
2 files changed, 19 insertions, 24 deletions
diff --git a/python/analytics/credit_default_swap.py b/python/analytics/credit_default_swap.py index d489f453..d0ebe2fb 100644 --- a/python/analytics/credit_default_swap.py +++ b/python/analytics/credit_default_swap.py @@ -23,7 +23,7 @@ class CreditDefaultSwap(): '_end_date', 'recovery', '_version', '_fee_leg', '_default_leg', '_value_date', '_yc', '_sc', '_risky_annuity', '_spread', '_price', 'name', 'issue_date', - '_direction', 'currency', '_step_in_date', '_accrued', + 'currency', '_step_in_date', '_accrued', '_cash_settle_date', '_dl_pv', '_pv', '_clean_pv', '_original_clean_pv', '_trade_date', '_factor') @@ -40,7 +40,7 @@ class CreditDefaultSwap(): fixed coupon (in bps) """ self.fixed_rate = fixed_rate - self.notional = abs(notional) + self.notional = notional self._start_date = start_date self._end_date = end_date self.recovery = recovery @@ -53,7 +53,6 @@ class CreditDefaultSwap(): self._spread, self._price = None, None self.name = None self.issue_date = issue_date - self._direction = -1. if notional > 0 else 1. self._factor = 1 for attr in ['currency', '_step_in_date', '_cash_settle_date', '_accrued', '_dl_pv', '_pv', '_clean_pv', @@ -108,7 +107,7 @@ class CreditDefaultSwap(): @property def direction(self): - if self._direction == -1.: + if self.notional > 0.: return "Buyer" else: return "Seller" @@ -116,9 +115,9 @@ class CreditDefaultSwap(): @direction.setter def direction(self, d): if d == "Buyer": - self._direction = -1. + self.notional = abs(self.notional) elif d == "Seller": - self._direction = 1. + self.notional = -abs(self.notional) else: raise ValueError("Direction needs to be either 'Buyer' or 'Seller'") @@ -154,17 +153,17 @@ class CreditDefaultSwap(): @property def pv(self): - return - self._direction * self.notional * self._factor * self._pv + return self.notional * self._factor * self._pv @pv.setter def pv(self, val): - self._pv = val / (self.notional * self._factor) * self._direction + self._pv = val / (self.notional * self._factor) self._clean_pv = self._pv + self._accrued * self.fixed_rate * 1e-4 self.price = 100 * (1 - self._clean_pv) @property def accrued(self): - return self._direction * self.notional * self._factor * self._accrued * \ + return -self.notional * self._factor * self._accrued * \ self.fixed_rate * 1e-4 @property @@ -173,7 +172,7 @@ class CreditDefaultSwap(): @property def clean_pv(self): - return - self._direction * self.notional * self._factor * self._clean_pv + return self.notional * self._factor * self._clean_pv @property def price(self): @@ -215,7 +214,7 @@ class CreditDefaultSwap(): with warnings.catch_warnings(): warnings.simplefilter("ignore") self.value_date = self.value_date + relativedelta(days=1) - carry = self.notional * self._direction * self.fixed_rate * 1e-4/360 + carry = self.notional * self.fixed_rate * 1e-4/360 roll_down = self.clean_pv - old_pv self.value_date = old_value_date return carry + roll_down @@ -254,8 +253,7 @@ class CreditDefaultSwap(): @property def jump_to_default(self): - return self.notional * self._direction * \ - (self.recovery + self._clean_pv - 1) + return -self.notional * (self.recovery + self._clean_pv - 1) @property def risky_annuity(self): @@ -292,9 +290,8 @@ class CreditDefaultSwap(): raise ValueError("original pv not set") else: days_accrued = (self.value_date - self._trade_date).days / 360 - return - self._direction * self.notional* \ - (self._clean_pv - self._original_clean_pv - - days_accrued * self.fixed_rate * 1e-4) + return self.notional * (self._clean_pv - self._original_clean_pv - + days_accrued * self.fixed_rate * 1e-4) def notify(self): for obj in self._observed: @@ -322,12 +319,11 @@ class CreditDefaultSwap(): else: accrued_str = "Accrued ({} Day)".format(self.days_accrued) - s = ["{:<20}\tNotional {:>5}MM {}\tFactor {:>28}".format("Buy Protection"\ - if self._direction == -1 - else "Sell Protection", - self.notional/1_000_000, - self.currency, - self._factor), + s = ["{:<20}\tNotional {:>5}MM {}\tFactor {:>28}".format( + "Buy Protection" if self.notional > 0. else "Sell Protection", + abs(self.notional)/1_000_000, + self.currency, + self._factor), "{:<20}\t{:>15}".format("CDS Index", colored(self.name, attrs=['bold'])), ""] rows = [["Trd Sprd (bp)", self.spread, "Coupon (bp)", self.fixed_rate], diff --git a/python/analytics/index.py b/python/analytics/index.py index 38d76eda..62b36508 100644 --- a/python/analytics/index.py +++ b/python/analytics/index.py @@ -120,10 +120,9 @@ class CreditIndex(CreditDefaultSwap): @property def hy_equiv(self): - risk = abs(self.notional) * self.risky_annuity / analytics._ontr.risky_annuity + risk = self.notional * self.risky_annuity / analytics._ontr.risky_annuity if self.index_type != 'HY': risk *= analytics._beta[self.index_type] - return -risk if self.direction == 'Buyer' else risk @property def ref(self): |
