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